aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-195/dave-jacoby/perl/ch-1.pl26
-rw-r--r--challenge-195/dave-jacoby/perl/ch-2.pl29
-rw-r--r--challenge-195/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-195/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-195/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-195/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-195/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-195/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-195/luca-ferrari/postgresql/ch-1.plperl40
-rw-r--r--challenge-195/luca-ferrari/postgresql/ch-1.sql31
-rw-r--r--challenge-195/luca-ferrari/postgresql/ch-2.plperl29
-rw-r--r--challenge-195/luca-ferrari/postgresql/ch-2.sql42
-rw-r--r--challenge-195/luca-ferrari/raku/ch-1.p613
-rw-r--r--challenge-195/luca-ferrari/raku/ch-2.p615
-rw-r--r--challenge-195/mark-anderson/raku/ch-1.raku22
-rw-r--r--challenge-195/mark-anderson/raku/ch-2.raku11
-rwxr-xr-xchallenge-195/roger-bell-west/javascript/ch-1.js37
-rwxr-xr-xchallenge-195/roger-bell-west/javascript/ch-2.js45
-rw-r--r--challenge-195/roger-bell-west/kotlin/ch-1.kt30
-rw-r--r--challenge-195/roger-bell-west/kotlin/ch-2.kt38
-rwxr-xr-xchallenge-195/roger-bell-west/lua/ch-1.lua34
-rwxr-xr-xchallenge-195/roger-bell-west/lua/ch-2.lua51
-rwxr-xr-xchallenge-195/roger-bell-west/perl/ch-1.pl26
-rwxr-xr-xchallenge-195/roger-bell-west/perl/ch-2.pl30
-rw-r--r--challenge-195/roger-bell-west/postscript/ch-1.ps66
-rw-r--r--challenge-195/roger-bell-west/postscript/ch-2.ps180
-rwxr-xr-xchallenge-195/roger-bell-west/python/ch-1.py28
-rwxr-xr-xchallenge-195/roger-bell-west/python/ch-2.py30
-rwxr-xr-xchallenge-195/roger-bell-west/raku/ch-1.p622
-rwxr-xr-xchallenge-195/roger-bell-west/raku/ch-2.p626
-rwxr-xr-xchallenge-195/roger-bell-west/ruby/ch-1.rb29
-rwxr-xr-xchallenge-195/roger-bell-west/ruby/ch-2.rb34
-rwxr-xr-xchallenge-195/roger-bell-west/rust/ch-1.rs34
-rwxr-xr-xchallenge-195/roger-bell-west/rust/ch-2.rs38
-rwxr-xr-xchallenge-195/zapwai/perl/ch-1.pl28
-rwxr-xr-xchallenge-195/zapwai/perl/ch-2.pl27
-rw-r--r--stats/pwc-challenge-194.json631
-rw-r--r--stats/pwc-current.json638
-rw-r--r--stats/pwc-language-breakdown-summary.json62
-rw-r--r--stats/pwc-language-breakdown.json2651
-rw-r--r--stats/pwc-leaders.json312
-rw-r--r--stats/pwc-summary-1-30.json42
-rw-r--r--stats/pwc-summary-121-150.json96
-rw-r--r--stats/pwc-summary-151-180.json92
-rw-r--r--stats/pwc-summary-181-210.json96
-rw-r--r--stats/pwc-summary-211-240.json98
-rw-r--r--stats/pwc-summary-241-270.json46
-rw-r--r--stats/pwc-summary-271-300.json54
-rw-r--r--stats/pwc-summary-31-60.json40
-rw-r--r--stats/pwc-summary-61-90.json108
-rw-r--r--stats/pwc-summary-91-120.json46
-rw-r--r--stats/pwc-summary.json602
52 files changed, 3949 insertions, 2762 deletions
diff --git a/challenge-195/dave-jacoby/perl/ch-1.pl b/challenge-195/dave-jacoby/perl/ch-1.pl
new file mode 100644
index 0000000000..189613873e
--- /dev/null
+++ b/challenge-195/dave-jacoby/perl/ch-1.pl
@@ -0,0 +1,26 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use experimental qw{ fc say postderef signatures state };
+
+my @examples = ( 15, 35 );
+for my $n (@examples) {
+ my $o = special_list($n);
+ say <<"END";
+ Input: \$n = $n
+ Output: $o
+END
+}
+
+sub special_list ( $n ) {
+ return scalar grep { is_special($_) } 1 .. $n;
+}
+
+sub is_special ( $n ) {
+ my %hash;
+ for my $i ( split //, $n ) {
+ return 0 if ++$hash{$i} > 1;
+ }
+ return 1;
+}
diff --git a/challenge-195/dave-jacoby/perl/ch-2.pl b/challenge-195/dave-jacoby/perl/ch-2.pl
new file mode 100644
index 0000000000..9a704a2c63
--- /dev/null
+++ b/challenge-195/dave-jacoby/perl/ch-2.pl
@@ -0,0 +1,29 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use experimental qw{ say postderef signatures state };
+
+use List::Util qw{ min max };
+
+my @examples = ( [ 1, 1, 2, 6, 2 ], [ 1, 3, 5, 7 ], [ 6, 4, 4, 6, 1 ] );
+
+for my $e (@examples) {
+ my $list = join ',', $e->@*;
+ my $o = most_frequent_even( $e->@* );
+ say <<"END";
+ Input: \@list = $list
+ Output: $o
+END
+}
+
+sub most_frequent_even( @list ) {
+ my %hash;
+ map { $hash{$_}++ } grep { 0 == $_ % 2 } @list;
+ if ( scalar keys %hash ) {
+ my $max = max values %hash;
+ return min grep { $hash{$_} == $max } keys %hash;
+ }
+ return -1;
+}
+
diff --git a/challenge-195/luca-ferrari/blog-1.txt b/challenge-195/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..2afdd83ab8
--- /dev/null
+++ b/challenge-195/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/12/12/PerlWeeklyChallenge195.html#task1
diff --git a/challenge-195/luca-ferrari/blog-2.txt b/challenge-195/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..124f33a97c
--- /dev/null
+++ b/challenge-195/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/12/12/PerlWeeklyChallenge195.html#task2
diff --git a/challenge-195/luca-ferrari/blog-3.txt b/challenge-195/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..fb3572a632
--- /dev/null
+++ b/challenge-195/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/12/12/PerlWeeklyChallenge195.html#task1plperl
diff --git a/challenge-195/luca-ferrari/blog-4.txt b/challenge-195/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..d8193434ac
--- /dev/null
+++ b/challenge-195/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/12/12/PerlWeeklyChallenge195.html#task2plperl
diff --git a/challenge-195/luca-ferrari/blog-5.txt b/challenge-195/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..1864572ac2
--- /dev/null
+++ b/challenge-195/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/12/12/PerlWeeklyChallenge195.html#task1plpgsql
diff --git a/challenge-195/luca-ferrari/blog-6.txt b/challenge-195/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..bc5e6b6762
--- /dev/null
+++ b/challenge-195/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/12/12/PerlWeeklyChallenge195.html#task2plpgsql
diff --git a/challenge-195/luca-ferrari/postgresql/ch-1.plperl b/challenge-195/luca-ferrari/postgresql/ch-1.plperl
new file mode 100644
index 0000000000..3ea8594add
--- /dev/null
+++ b/challenge-195/luca-ferrari/postgresql/ch-1.plperl
@@ -0,0 +1,40 @@
+-- Perl Weekly Challenge 195
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc195;
+
+CREATE OR REPLACE FUNCTION
+pwc195.task1_plperl( int, bool default true )
+RETURNS int
+AS $CODE$
+ my ( $n, $verbose ) = @_;
+ my @special_integers;
+
+ my $baggify = sub {
+ my ( $n ) = @_;
+ my $bag = {};
+ for my $digit ( split '', $n ) {
+ $bag->{ $digit }++;
+ }
+
+ return $bag;
+ };
+
+ my $has_no_repetitions = sub {
+ my ( $bag ) = @_;
+ for ( keys $bag->%* ) {
+ return 0 if $bag->{ $_ } != 1;
+ }
+
+ return 1;
+ };
+
+ for ( 1 .. $n ) {
+ push @special_integers, $_ if ( $has_no_repetitions->( $baggify->( $_ ) ) );
+ }
+
+ elog( INFO, "Found: " . join( ',', @special_integers ) ) if ( $ verbose );
+ return scalar @special_integers;
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-195/luca-ferrari/postgresql/ch-1.sql b/challenge-195/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..c6cbc28437
--- /dev/null
+++ b/challenge-195/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,31 @@
+-- Perl Weekly Challenge 195
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc195;
+
+CREATE OR REPLACE FUNCTION
+pwc195.task1_plpgsql( n int )
+RETURNS int
+AS $CODE$
+DECLARE
+ i int;
+ freq int;
+ counter int := 0;
+BEGIN
+ FOR i IN 1 .. n LOOP
+ SELECT count(*)
+ INTO freq
+ FROM regexp_split_to_table( i::text, '' ) as n(d)
+ GROUP BY d
+ ORDER BY 1 DESC;
+
+ IF freq = 1 THEN
+ counter := counter + 1;
+ END IF;
+
+ END LOOP;
+
+ RETURN counter;
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-195/luca-ferrari/postgresql/ch-2.plperl b/challenge-195/luca-ferrari/postgresql/ch-2.plperl
new file mode 100644
index 0000000000..b15f6b215b
--- /dev/null
+++ b/challenge-195/luca-ferrari/postgresql/ch-2.plperl
@@ -0,0 +1,29 @@
+-- Perl Weekly Challenge 195
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc195;
+
+CREATE OR REPLACE FUNCTION
+pwc195.task2_plperl( int[] )
+RETURNS int
+AS $CODE$
+ my ( $array ) = @_;
+ # extract only evens
+ my @evens = grep { $_ % 2 == 0 } $array->@*;
+ # classify frequency
+ my $bag = {};
+ $bag->{ $_ }++ for ( @evens );
+
+
+ # sort by frequency and value
+ my @sorted_bag =
+ map { $_->[1] }
+ sort { $a->[0] <=> $b->[0] || $a->[1] <=> $b->[1] }
+ map { [ $bag->{ $_ }, $_ ] } keys $bag->%*;
+
+
+ # the first value in the list is the
+ # one with the max frequency and the lowest value
+ return $sorted_bag[ 0 ];
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-195/luca-ferrari/postgresql/ch-2.sql b/challenge-195/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..633ffc8c4f
--- /dev/null
+++ b/challenge-195/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,42 @@
+-- Perl Weekly Challenge 195
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc195;
+
+/*
+testdb=> select pwc195.task2_plpgsql( array[1,2,2,3,4,4,4,5,6,6,6,6]::int[] );
+NOTICE: relation "nums" already exists, skipping
+ task2_plpgsql
+---------------
+ 6
+
+*/
+
+CREATE OR REPLACE FUNCTION
+pwc195.task2_plpgsql( list int[] )
+RETURNS int
+AS $CODE$
+DECLARE
+ current int;
+BEGIN
+ CREATE TEMPORARY TABLE IF NOT EXISTS nums( v int, f int default 1, primary key( v ) );
+ TRUNCATE TABLE nums;
+
+ FOREACH current IN ARRAY list LOOP
+ INSERT INTO nums AS frequency
+ SELECT current, 1
+ ON CONFLICT (v)
+ DO UPDATE SET f = frequency.f + 1;
+ END LOOP;
+
+ SELECT v
+ INTO current
+ FROM nums
+ WHERE v % 2 = 0
+ ORDER BY f DESC, v ASC
+ LIMIT 1;
+
+ RETURN current;
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-195/luca-ferrari/raku/ch-1.p6 b/challenge-195/luca-ferrari/raku/ch-1.p6
new file mode 100644
index 0000000000..15012afdf2
--- /dev/null
+++ b/challenge-195/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,13 @@
+#!raku
+
+# Perl Weekly Challenge 195
+
+sub MAIN( Int $n where { $n > 0 }, Bool :$verbose = False ) {
+ my @special-integers;
+ for 1 .. $n {
+ @special-integers.push: $_ if $_.comb.Bag.values.max <= 1;
+ }
+
+ @special-integers.join( ',' ).say if ( $verbose );
+ @special-integers.elems.say;
+}
diff --git a/challenge-195/luca-ferrari/raku/ch-2.p6 b/challenge-195/luca-ferrari/raku/ch-2.p6
new file mode 100644
index 0000000000..707f429ed1
--- /dev/null
+++ b/challenge-195/luca-ferrari/raku/ch-2.p6
@@ -0,0 +1,15 @@
+#!raku
+
+# Perl Weekly Challenge 195
+
+sub MAIN( *@list where { @list.grep( * ~~ Int ).elems == @list.elems } ) {
+ my $bag = @list.grep( * %% 2 ).Bag;
+ my $most-frequency = $bag.values.max;
+ my @most-frequent-evens;
+ for $bag.keys {
+ next if $bag{ $_ } != $most-frequency;
+ @most-frequent-evens.push: $_;
+ }
+
+ @most-frequent-evens.min.say;
+}
diff --git a/challenge-195/mark-anderson/raku/ch-1.raku b/challenge-195/mark-anderson/raku/ch-1.raku
new file mode 100644
index 0000000000..f71c30c3b8
--- /dev/null
+++ b/challenge-195/mark-anderson/raku/ch-1.raku
@@ -0,0 +1,22 @@
+#!/usr/bin/env raku
+use Test;
+
+is special-integers(15), 14;
+is special-integers(35), 32;
+is special-integers(9_999_999), 712890;
+
+sub special-integers($n)
+{
+ my $i;
+
+ for (^10).combinations(1..$n.chars)
+ {
+ for .permutations
+ {
+ next unless .head;
+ $i++ unless $_ > $n given .join
+ }
+ }
+
+ $i
+}
diff --git a/challenge-195/mark-anderson/raku/ch-2.raku b/challenge-195/mark-anderson/raku/ch-2.raku
new file mode 100644
index 0000000000..574f857543
--- /dev/null
+++ b/challenge-195/mark-anderson/raku/ch-2.raku
@@ -0,0 +1,11 @@
+#!/usr/bin/env raku
+use Test;
+
+is most-frequent-even(1,1,2,6,2), 2;
+is most-frequent-even(1,3,5,7), Inf;
+is most-frequent-even(6,4,4,6,1), 4;
+
+sub most-frequent-even(*@list)
+{
+ @list.grep(* %% 2).Bag.maxpairs>>.key.min
+}
diff --git a/challenge-195/roger-bell-west/javascript/ch-1.js b/challenge-195/roger-bell-west/javascript/ch-1.js
new file mode 100755
index 0000000000..728340ef1c
--- /dev/null
+++ b/challenge-195/roger-bell-west/javascript/ch-1.js
@@ -0,0 +1,37 @@
+#! /usr/bin/node
+
+"use strict"
+
+function specialintegers(n) {
+ let o = 0;
+ for (let i = 1; i <= n; i++) {
+ let f = new Set();
+ let s = true;
+ for (let c of i.toString()) {
+ if (f.has(c)) {
+ s = false;
+ break;
+ } else {
+ f.add(c);
+ }
+ }
+ if (s == 1) {
+ o++;
+ }
+ }
+ return o;
+}
+
+if (specialintegers(15) == 14) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (specialintegers(35) == 32) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-195/roger-bell-west/javascript/ch-2.js b/challenge-195/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..0fdfce7898
--- /dev/null
+++ b/challenge-195/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,45 @@
+#! /usr/bin/node
+
+"use strict"
+
+function mostfrequenteven(l) {
+ let f = new Map();
+ for (let n of l) {
+ if (n % 2 == 0) {
+ if (f.has(n)) {
+ f.set(n, f.get(n) + 1);
+ } else {
+ f.set(n, 1);
+ }
+ }
+ }
+ if (f.size > 0) {
+ let m = Math.max(...f.values());
+ let l = Array.from(f.keys()).filter(i => f.get(i) == m);
+ l.sort();
+ return l[0];
+ } else {
+ return -1;
+ }
+}
+
+if (mostfrequenteven([1, 1, 2, 6, 2]) == 2) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (mostfrequenteven([1, 3, 5, 7]) == -1) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (mostfrequenteven([6, 4, 4, 6, 1]) == 4) {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-195/roger-bell-west/kotlin/ch-1.kt b/challenge-195/roger-bell-west/kotlin/ch-1.kt
new file mode 100644
index 0000000000..205f2994ac
--- /dev/null
+++ b/challenge-195/roger-bell-west/kotlin/ch-1.kt
@@ -0,0 +1,30 @@
+fun specialintegers(n: Int): Int {
+ var o = 0
+ for (i in 1..n) {
+ var f = mutableMapOf<Char, Int>()
+ for (c in i.toString()) {
+ var l = f.getOrDefault(c, 0)
+ f.set(c, l + 1)
+ }
+ if (f.values.maxOrNull()!! == 1) {
+ o += 1
+ }
+ }
+ return o
+}
+
+fun main() {
+ if (specialintegers(15) == 14) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+
+ if (specialintegers(35) == 32) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-195/roger-bell-west/kotlin/ch-2.kt b/challenge-195/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..14d82ddc2a
--- /dev/null
+++ b/challenge-195/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,38 @@
+fun mostfrequenteven(l: List<Int>): Int {
+ var f = mutableMapOf<Int, Int>()
+ for (n in l) {
+ if (n % 2 == 0) {
+ var k = f.getOrDefault(n, 0);
+ f.set(n, k + 1);
+ }
+ }
+ if (f.size > 0) {
+ val m = f.values.maxOrNull()!!
+ var ll = ArrayList(f.keys.filter{f[it] == m})
+ ll.sort()
+ return ll[0]
+ } else {
+ return -1
+ }
+}
+
+fun main() {
+ if (mostfrequenteven(listOf(1, 1, 2, 6, 2)) == 2) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (mostfrequenteven(listOf(1, 3, 5, 7)) == -1) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (mostfrequenteven(listOf(6, 4, 4, 6, 1)) == 4) {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-195/roger-bell-west/lua/ch-1.lua b/challenge-195/roger-bell-west/lua/ch-1.lua
new file mode 100755
index 0000000000..598da06a7b
--- /dev/null
+++ b/challenge-195/roger-bell-west/lua/ch-1.lua
@@ -0,0 +1,34 @@
+#! /usr/bin/lua
+
+function specialintegers(n)
+ local o = 0
+ for i = 1, n do
+ local f = {}
+ local s = true
+ for c in string.gmatch(i, ".") do
+ if f[c] == nil then
+ f[c] = 1
+ else
+ s = false
+ break
+ end
+ end
+ if s then
+ o = o + 1
+ end
+ end
+ return o
+end
+
+if specialintegers(15) == 14 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+if specialintegers(35) == 32 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-195/roger-bell-west/lua/ch-2.lua b/challenge-195/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..f661eb83d5
--- /dev/null
+++ b/challenge-195/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,51 @@
+#! /usr/bin/lua
+
+function mostfrequenteven(l)
+ local f = {}
+ local mx
+ for i, n in ipairs(l) do
+ if n % 2 == 0 then
+ if f[n] == nil then
+ f[n] = 1
+ else
+ f[n] = f[n]+1
+ end
+ if mx == nil or f[n] > mx then
+ mx = f[n]
+ end
+ end
+ end
+ if mx ~= nil then
+ local l = {}
+ for k, v in pairs(f) do
+ if v == mx then
+ table.insert(l, k)
+ end
+ end
+ table.sort(l)
+ return l[1]
+ else
+ return -1
+ end
+end
+
+if mostfrequenteven({1, 1, 2, 6, 2}) == 2 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if mostfrequenteven({1, 3, 5, 7}) == -1 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if mostfrequenteven({6, 4, 4, 6, 1}) == 4 then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-195/roger-bell-west/perl/ch-1.pl b/challenge-195/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..92f77b56ad
--- /dev/null
+++ b/challenge-195/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,26 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 2;
+
+is(specialintegers(15), 14, 'example 1');
+is(specialintegers(35), 32, 'example 2');
+
+use List::Util qw(max);
+
+sub specialintegers($n) {
+ my $o = 0;
+ foreach my $i (1..$n) {
+ my %f;
+ foreach my $c (split('', $i)) {
+ $f{$c}++;
+ }
+ if (max(values %f) == 1) {
+ $o++;
+ }
+ }
+ return $o;
+}
diff --git a/challenge-195/roger-bell-west/perl/ch-2.pl b/challenge-195/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..6c5d99c7f7
--- /dev/null
+++ b/challenge-195/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,30 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Test::More tests => 3;
+
+is(mostfrequenteven([1, 1, 2, 6, 2]), 2, 'example 1');
+is(mostfrequenteven([1, 3, 5, 7]), -1, 'example 2');
+is(mostfrequenteven([6, 4, 4, 6, 1]), 4, 'example 3');
+
+use List::Util qw(max);
+
+sub mostfrequenteven($l) {
+ my %f;
+ foreach my $n (@{$l}) {
+ if ($n % 2 == 0) {
+ $f{$n}++;
+ }
+ }
+ if (scalar %f > 0) {
+ my $m = max(values %f);
+ my @l = grep