aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2022-12-02 09:55:11 +0100
committerFlavio Poletti <flavio@polettix.it>2022-12-02 09:55:11 +0100
commit75502ac1715e61c401fe81fa6ee61e303adece43 (patch)
tree5ae5b4f53e9e1c58b5e1a4118834391b97a696f5
parentc80093e548d1d73ed772b2f9fd2ff3ec77685745 (diff)
downloadperlweeklychallenge-club-75502ac1715e61c401fe81fa6ee61e303adece43.tar.gz
perlweeklychallenge-club-75502ac1715e61c401fe81fa6ee61e303adece43.tar.bz2
perlweeklychallenge-club-75502ac1715e61c401fe81fa6ee61e303adece43.zip
Add polettix's solution to challenge-193
-rw-r--r--challenge-193/polettix/blog.txt1
-rw-r--r--challenge-193/polettix/blog1.txt1
-rw-r--r--challenge-193/polettix/perl/ch-1.pl22
-rw-r--r--challenge-193/polettix/perl/ch-2.pl41
-rw-r--r--challenge-193/polettix/raku/ch-1.raku14
-rw-r--r--challenge-193/polettix/raku/ch-2.raku26
6 files changed, 105 insertions, 0 deletions
diff --git a/challenge-193/polettix/blog.txt b/challenge-193/polettix/blog.txt
new file mode 100644
index 0000000000..0b2b706946
--- /dev/null
+++ b/challenge-193/polettix/blog.txt
@@ -0,0 +1 @@
+https://etoobusy.polettix.it/2022/12/01/pwc193-binary-string/
diff --git a/challenge-193/polettix/blog1.txt b/challenge-193/polettix/blog1.txt
new file mode 100644
index 0000000000..66fdf6372c
--- /dev/null
+++ b/challenge-193/polettix/blog1.txt
@@ -0,0 +1 @@
+https://etoobusy.polettix.it/2022/12/02/pwc193-odd-string/
diff --git a/challenge-193/polettix/perl/ch-1.pl b/challenge-193/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..793cf6e3b3
--- /dev/null
+++ b/challenge-193/polettix/perl/ch-1.pl
@@ -0,0 +1,22 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+use Math::BigInt;
+
+my $it = binary_strings_iterator(shift // 2);
+while (defined(my $binary_string = $it->())) {
+ say $binary_string;
+}
+
+sub binary_strings_iterator ($n) {
+ my $i = Math::BigInt->bzero;
+ return sub {
+ return unless defined $i;
+ my $raw = ($i++)->to_bin;
+ my $len = length $raw;
+ return $i = undef if $len > $n;
+ return ('0' x ($n - $len)) . $raw;
+ };
+}
diff --git a/challenge-193/polettix/perl/ch-2.pl b/challenge-193/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..18205168d0
--- /dev/null
+++ b/challenge-193/polettix/perl/ch-2.pl
@@ -0,0 +1,41 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+
+my @strings = @ARGV ? @ARGV : qw< adc wzy abc >;
+say odd_string(@strings);
+
+sub odd_string (@strings) {
+ my @pre = map { ord substr $_, 0, 1 } @strings;
+ for my $i (1 .. $#strings) {
+ my %string_for;
+ my $n_different = 0;
+ my @cur;
+ my $j = 0;
+ for my $string (@strings) {
+ my $delta = ord(substr $string, $i, 1) - $pre[$j++];
+ if (! $n_different) {
+ $string_for{$delta} = $string;
+ ++$n_different;
+ }
+ elsif ($n_different == 1) {
+ if (exists $string_for{$delta}) {
+ $string_for{$delta} = [];
+ }
+ elsif (ref((values %string_for)[0])) {
+ return $string;
+ }
+ else {
+ $string_for{$delta} = $string;
+ ++$n_different;
+ }
+ }
+ elsif ($n_different == 2) {
+ delete $string_for{$delta};
+ return((values %string_for)[0]);
+ }
+ }
+ }
+}
diff --git a/challenge-193/polettix/raku/ch-1.raku b/challenge-193/polettix/raku/ch-1.raku
new file mode 100644
index 0000000000..54e6019138
--- /dev/null
+++ b/challenge-193/polettix/raku/ch-1.raku
@@ -0,0 +1,14 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (Int:D $n where * > 0 = 2) { .put for binary-strings($n) }
+
+sub binary-strings (Int:D $n where * > 0) {
+ my $prefix = '0' x ($n - 1);
+ my $i = 0;
+ return gather loop {
+ my $raw = ($i++).base(2).Str;
+ my $len = $raw.chars;
+ last if $len > $n;
+ take ('0' x ($n - $len)) ~ $raw;
+ };
+}
diff --git a/challenge-193/polettix/raku/ch-2.raku b/challenge-193/polettix/raku/ch-2.raku
new file mode 100644
index 0000000000..8cfb526090
--- /dev/null
+++ b/challenge-193/polettix/raku/ch-2.raku
@@ -0,0 +1,26 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (*@args) {
+ @args = <adc wzy abc> unless @args;
+ my %track;
+ for @args -> $string {
+ my $fp = fingerprint($string);
+ if %track.elems == 0 { %track{$fp} = $string }
+ elsif %track.elems == 1 {
+ if %track{$fp}:exists { %track{$fp} = '' }
+ elsif %track.values[0].chars { %track{$fp} = $string }
+ else { $string.put; return 0 }
+ }
+ else {
+ %track{$fp}:delete;
+ put %track.values[0];
+ return 0;
+ }
+ }
+ say fingerprint(@args[0]);
+}
+
+sub fingerprint ($string) {
+ my $reference = $string.substr(0, 1).ord;
+ return $string.comb.map({$_.ord - $reference}).join(' ');
+}