From cce2da00bcb2edec7bb8ab7ce1d1cef1e4cdade1 Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Mon, 10 Jun 2019 22:05:06 +0800 Subject: challenge 010 #1 and #2(unfinished) --- challenge-010/feng-chang/README | 1 + challenge-010/feng-chang/perl6/01.p6 | 33 +++++++++++++++++++++++++++++++ challenge-010/feng-chang/perl6/02.p6 | 37 +++++++++++++++++++++++++++++++++++ challenge-010/feng-chang/perl6/t01.p6 | 29 +++++++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 challenge-010/feng-chang/README create mode 100755 challenge-010/feng-chang/perl6/01.p6 create mode 100755 challenge-010/feng-chang/perl6/02.p6 create mode 100755 challenge-010/feng-chang/perl6/t01.p6 diff --git a/challenge-010/feng-chang/README b/challenge-010/feng-chang/README new file mode 100644 index 0000000000..74e56de3ed --- /dev/null +++ b/challenge-010/feng-chang/README @@ -0,0 +1 @@ +Solutions by Feng Chang. diff --git a/challenge-010/feng-chang/perl6/01.p6 b/challenge-010/feng-chang/perl6/01.p6 new file mode 100755 index 0000000000..5b928bdb80 --- /dev/null +++ b/challenge-010/feng-chang/perl6/01.p6 @@ -0,0 +1,33 @@ +#!/bin/env perl6 + +sub d2r(Int $i where 0 <= * <= 9, Str $c1, Str $c5, Str $c10) returns Str { + given ($i) { + when (9) { return $c1 ~ $c10 } + when (* ~~ 5..8) { return $c5 ~ $c1 x ($i - 5) } + when (4) { return $c1 ~ $c5 } + when (* ~~ 0..3) { return $c1 x $i } + } +} + +multi sub MAIN(Str $p where * ~~ /^ <[IVXLCDM]>+ $/) { + my %r2a = 'I' => 1, 'V' => 5, 'X' => 10, 'L' => 50, 'C' => 100, 'D' => 500, 'M' => 1000; + my @a = $p.comb.map:{ %r2a{ $_ } }; + + my $sum = [+] (0 .. (@a.elems - 2)).map:{ @a[$_] < @a[$_ + 1] ?? -@a[$_] !! @a[$_] }; + $sum += @a[* - 1]; + + say $sum; +} + +multi sub MAIN(UInt $p) { + my Str $s = 'M' x ($p div 1000); + my Int $n = $p mod 1000; + + $s ~= d2r($n div 100, 'C', 'D', 'M'); + $n %= 100; + + $s ~= d2r($n div 10, 'X', 'L', 'C'); + $s ~= d2r($n mod 10, 'I', 'V', 'X'); + + say $s; +} diff --git a/challenge-010/feng-chang/perl6/02.p6 b/challenge-010/feng-chang/perl6/02.p6 new file mode 100755 index 0000000000..7773c07831 --- /dev/null +++ b/challenge-010/feng-chang/perl6/02.p6 @@ -0,0 +1,37 @@ +#!/bin/env perl6 + +sub jaro-similarity(Str $s1, Str $s2) returns Num { + my Int $s1-len = $s1.chars; + my Int $s2-len = $s2.chars; + my Int $d = max($s1-len, $s2-len) div 2 - 1; + + my Int $m = 0; # matching characters + my Str @as1 = $s1.comb; + my Str $ms1 = ''; # string made up of matching characters from s1 + for 0 .. $s1-len - 1 -> Int $i { + if $s2.substr(max(0, $i - $d) .. min($s2-len, $i + $d)).contains(@as1[$i]) { + ++$m; + $ms1 ~= @as1[$i]; + } + } + + return 0e0 if $m == 0; + + my Str @as2 = $s2.comb; + my Str $ms2 = ''; # string made up of matching characters from s2 + for 0 .. $s2-len - 1 -> Int $i { + $ms2 ~= @as2[$i] if $s1.substr(max(0, $i - $d) .. min($s1-len, $i + $d)).contains(@as2[$i]); + } + + my Int $nt = 0; + for $ms1.comb Z $ms2.comb -> $p { + ++$nt if $p[0] eq $p[1]; + } + + return 1e0 / 3 * ($m / $s1-len + $m / $s2-len + $nt / $m); +} + +sub jaro-winkler-similarity(Str $s1, Str $s2) returns Num { +} + +my $sim-j = jaro-similarity('CRATE', 'TRACE'); diff --git a/challenge-010/feng-chang/perl6/t01.p6 b/challenge-010/feng-chang/perl6/t01.p6 new file mode 100755 index 0000000000..316b72ec90 --- /dev/null +++ b/challenge-010/feng-chang/perl6/t01.p6 @@ -0,0 +1,29 @@ +#!/bin/env perl6 + +use Test; +plan 24; + +dec-vs-rom(39, 'XXXIX'); + +dec-vs-rom(160, 'CLX'); +dec-vs-rom(207, 'CCVII'); +dec-vs-rom(246, 'CCXLVI'); +dec-vs-rom(789, 'DCCLXXXIX'); + +dec-vs-rom(1009, 'MIX'); +dec-vs-rom(1066, 'MLXVI'); +dec-vs-rom(1776, 'MDCCLXXVI'); +dec-vs-rom(1954, 'MCMLIV'); +dec-vs-rom(2014, 'MMXIV'); +dec-vs-rom(2019, 'MMXIX'); +dec-vs-rom(2421, 'MMCDXXI'); + +sub dec-vs-rom(Int $n, Str $s) { + my $script = './01.p6'; + + my $res = run $script, $n, :out; + is $res.out.get, $s, "$n => $s"; + + $res = run $script, $s, :out; + is $res.out.get, $n, "$s => $n"; +} -- cgit From cd6a8c78563eb772cd386dc58ab901bb5e78ec6d Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Tue, 11 Jun 2019 18:53:42 +0800 Subject: challenge 009 #1 solutions --- challenge-012/feng-chang/perl5/ch-1.pl | 72 ++++++++++++++++++++++++++++++++++ challenge-012/feng-chang/perl6/ch-1.p6 | 12 ++++++ 2 files changed, 84 insertions(+) create mode 100755 challenge-012/feng-chang/perl5/ch-1.pl create mode 100755 challenge-012/feng-chang/perl6/ch-1.p6 diff --git a/challenge-012/feng-chang/perl5/ch-1.pl b/challenge-012/feng-chang/perl5/ch-1.pl new file mode 100755 index 0000000000..21129a546b --- /dev/null +++ b/challenge-012/feng-chang/perl5/ch-1.pl @@ -0,0 +1,72 @@ +#!/bin/env perl + +use Modern::Perl; +use List::Util qw(min max); +use POSIX; + +my @primes = (2, 3); + +sub more_primes { + my $to = shift; + my $from = $primes[-1] + 1; + my $P; + + do { + $P = $primes[-1]; + my @a = ($P + 1) .. min($to, $P * $P); + + for my $p (@primes) { + for (my $i = ceil($from / $p) * $p - $from; $i <= $to; $i += $p) { + $a[$i] = 0; + } + } + + for my $i (@a) { + push(@primes, $i) if $i; + } + } while ($P * $P < $to); +} + +sub is_prime { + my $n = shift; + + my $e = int(sqrt($n)); + more_primes($e) if $e > $primes[-1]; + + for my $p (@primes) { + last if $p > $e; + return 0 if $n % $p == 0; + } + + return 1; +} + +sub get_prime { + my $idx = shift; + return $primes[$idx] if $idx + 1 <= @primes; + + do { + my $n = $primes[-1]; + more_primes($n * $n); + } while ($idx + 1 > @primes); + + return $primes[$idx]; +} + +if (@ARGV) { + my $n = $ARGV[0]; + say "$n is ", is_prime($n) ? '' : 'not ', 'prime'; + exit 0; +} + +my $prod = 1; +my $i = 0; +while (1) { + $prod *= get_prime($i); + print $primes[$i], ' '; + last unless is_prime($prod + 1); + + ++$i; +} + +say $prod + 1; diff --git a/challenge-012/feng-chang/perl6/ch-1.p6 b/challenge-012/feng-chang/perl6/ch-1.p6 new file mode 100755 index 0000000000..5e58b20b50 --- /dev/null +++ b/challenge-012/feng-chang/perl6/ch-1.p6 @@ -0,0 +1,12 @@ +#!/bin/env perl6 + +my $euc = (^∞).grep: *.is-prime; + +my $prod = 1; +for 0 .. ∞ -> Int $i { + $prod *= $euc[$i]; + print $euc[$i], ' '; + last unless ($prod + 1).is-prime; + + LAST { say $prod + 1 } +} -- cgit From b8d4ba46cfd21a36c9939ea950666141888a258b Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Sun, 16 Jun 2019 00:53:13 +0800 Subject: challenge 012 #2 --- challenge-012/feng-chang/perl5/ch-2.pl | 27 +++++++++++++++++++++++++++ challenge-012/feng-chang/perl5/paths.txt | 4 ++++ challenge-012/feng-chang/perl6/ch-2.p6 | 17 +++++++++++++++++ challenge-012/feng-chang/perl6/paths.txt | 4 ++++ 4 files changed, 52 insertions(+) create mode 100755 challenge-012/feng-chang/perl5/ch-2.pl create mode 100644 challenge-012/feng-chang/perl5/paths.txt create mode 100755 challenge-012/feng-chang/perl6/ch-2.p6 create mode 100644 challenge-012/feng-chang/perl6/paths.txt diff --git a/challenge-012/feng-chang/perl5/ch-2.pl b/challenge-012/feng-chang/perl5/ch-2.pl new file mode 100755 index 0000000000..c3c26e5f79 --- /dev/null +++ b/challenge-012/feng-chang/perl5/ch-2.pl @@ -0,0 +1,27 @@ +#!/bin/env perl + +use Modern::Perl; +use List::Util qw(reduce); + +sub common_prefix { + my ($a, $b) = @_; + my @a = split //, $a; + my @b = split //, $b; + + my $r = ''; + my $i = 0; + while ($a[$i] && $b[$i] && $a[$i] eq $b[$i]) { + $r .= $a[$i++]; + } + + return $r; +} + +chomp(my @paths = <>); +my $common_path = reduce { common_prefix($a, $b) } @paths; + +my @c = split //, $common_path; +pop @c while $c[-1] ne '/'; +pop @c if @c > 1; + +say 'common directory path: ', join('', @c); diff --git a/challenge-012/feng-chang/perl5/paths.txt b/challenge-012/feng-chang/perl5/paths.txt new file mode 100644 index 0000000000..1427e2dbc8 --- /dev/null +++ b/challenge-012/feng-chang/perl5/paths.txt @@ -0,0 +1,4 @@ +/a/b/c/d +/a/b/cd +/a/b/cc +/a/b/c/d/e diff --git a/challenge-012/feng-chang/perl6/ch-2.p6 b/challenge-012/feng-chang/perl6/ch-2.p6 new file mode 100755 index 0000000000..1ea095468d --- /dev/null +++ b/challenge-012/feng-chang/perl6/ch-2.p6 @@ -0,0 +1,17 @@ +#!/bin/env perl6 + +sub common_prefix(Str $a, Str $b) { + my @a = $a.comb; + my @b = $b.comb; + + for 0..∞ -> $i { + last unless @a[$i].defined && @b[$i].defined && @a[$i] eq @b[$i]; + LAST { return @a[0 .. $i - 1].join } + } +} + +my @c = ([[&common_prefix]] 'paths.txt'.IO.lines).comb; +@c.pop while @c[* - 1] ne '/'; +@c.pop if @c.elems > 1; + +say 'common directory path: ', @c.join; diff --git a/challenge-012/feng-chang/perl6/paths.txt b/challenge-012/feng-chang/perl6/paths.txt new file mode 100644 index 0000000000..1427e2dbc8 --- /dev/null +++ b/challenge-012/feng-chang/perl6/paths.txt @@ -0,0 +1,4 @@ +/a/b/c/d +/a/b/cd +/a/b/cc +/a/b/c/d/e -- cgit From 3108eb9b454aa145f154dea0060c99097b1efe67 Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Sun, 16 Jun 2019 01:07:41 +0800 Subject: rename challenge 010 perl6 scripts --- challenge-010/feng-chang/perl6/01.p6 | 33 ------------------------- challenge-010/feng-chang/perl6/02.p6 | 37 ----------------------------- challenge-010/feng-chang/perl6/ch-1.p6 | 33 +++++++++++++++++++++++++ challenge-010/feng-chang/perl6/ch-2.p6 | 37 +++++++++++++++++++++++++++++ challenge-010/feng-chang/perl6/t01.p6 | 29 ---------------------- challenge-010/feng-chang/perl6/test-ch-1.p6 | 29 ++++++++++++++++++++++ 6 files changed, 99 insertions(+), 99 deletions(-) delete mode 100755 challenge-010/feng-chang/perl6/01.p6 delete mode 100755 challenge-010/feng-chang/perl6/02.p6 create mode 100755 challenge-010/feng-chang/perl6/ch-1.p6 create mode 100755 challenge-010/feng-chang/perl6/ch-2.p6 delete mode 100755 challenge-010/feng-chang/perl6/t01.p6 create mode 100755 challenge-010/feng-chang/perl6/test-ch-1.p6 diff --git a/challenge-010/feng-chang/perl6/01.p6 b/challenge-010/feng-chang/perl6/01.p6 deleted file mode 100755 index 5b928bdb80..0000000000 --- a/challenge-010/feng-chang/perl6/01.p6 +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/env perl6 - -sub d2r(Int $i where 0 <= * <= 9, Str $c1, Str $c5, Str $c10) returns Str { - given ($i) { - when (9) { return $c1 ~ $c10 } - when (* ~~ 5..8) { return $c5 ~ $c1 x ($i - 5) } - when (4) { return $c1 ~ $c5 } - when (* ~~ 0..3) { return $c1 x $i } - } -} - -multi sub MAIN(Str $p where * ~~ /^ <[IVXLCDM]>+ $/) { - my %r2a = 'I' => 1, 'V' => 5, 'X' => 10, 'L' => 50, 'C' => 100, 'D' => 500, 'M' => 1000; - my @a = $p.comb.map:{ %r2a{ $_ } }; - - my $sum = [+] (0 .. (@a.elems - 2)).map:{ @a[$_] < @a[$_ + 1] ?? -@a[$_] !! @a[$_] }; - $sum += @a[* - 1]; - - say $sum; -} - -multi sub MAIN(UInt $p) { - my Str $s = 'M' x ($p div 1000); - my Int $n = $p mod 1000; - - $s ~= d2r($n div 100, 'C', 'D', 'M'); - $n %= 100; - - $s ~= d2r($n div 10, 'X', 'L', 'C'); - $s ~= d2r($n mod 10, 'I', 'V', 'X'); - - say $s; -} diff --git a/challenge-010/feng-chang/perl6/02.p6 b/challenge-010/feng-chang/perl6/02.p6 deleted file mode 100755 index 7773c07831..0000000000 --- a/challenge-010/feng-chang/perl6/02.p6 +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/env perl6 - -sub jaro-similarity(Str $s1, Str $s2) returns Num { - my Int $s1-len = $s1.chars; - my Int $s2-len = $s2.chars; - my Int $d = max($s1-len, $s2-len) div 2 - 1; - - my Int $m = 0; # matching characters - my Str @as1 = $s1.comb; - my Str $ms1 = ''; # string made up of matching characters from s1 - for 0 .. $s1-len - 1 -> Int $i { - if $s2.substr(max(0, $i - $d) .. min($s2-len, $i + $d)).contains(@as1[$i]) { - ++$m; - $ms1 ~= @as1[$i]; - } - } - - return 0e0 if $m == 0; - - my Str @as2 = $s2.comb; - my Str $ms2 = ''; # string made up of matching characters from s2 - for 0 .. $s2-len - 1 -> Int $i { - $ms2 ~= @as2[$i] if $s1.substr(max(0, $i - $d) .. min($s1-len, $i + $d)).contains(@as2[$i]); - } - - my Int $nt = 0; - for $ms1.comb Z $ms2.comb -> $p { - ++$nt if $p[0] eq $p[1]; - } - - return 1e0 / 3 * ($m / $s1-len + $m / $s2-len + $nt / $m); -} - -sub jaro-winkler-similarity(Str $s1, Str $s2) returns Num { -} - -my $sim-j = jaro-similarity('CRATE', 'TRACE'); diff --git a/challenge-010/feng-chang/perl6/ch-1.p6 b/challenge-010/feng-chang/perl6/ch-1.p6 new file mode 100755 index 0000000000..5b928bdb80 --- /dev/null +++ b/challenge-010/feng-chang/perl6/ch-1.p6 @@ -0,0 +1,33 @@ +#!/bin/env perl6 + +sub d2r(Int $i where 0 <= * <= 9, Str $c1, Str $c5, Str $c10) returns Str { + given ($i) { + when (9) { return $c1 ~ $c10 } + when (* ~~ 5..8) { return $c5 ~ $c1 x ($i - 5) } + when (4) { return $c1 ~ $c5 } + when (* ~~ 0..3) { return $c1 x $i } + } +} + +multi sub MAIN(Str $p where * ~~ /^ <[IVXLCDM]>+ $/) { + my %r2a = 'I' => 1, 'V' => 5, 'X' => 10, 'L' => 50, 'C' => 100, 'D' => 500, 'M' => 1000; + my @a = $p.comb.map:{ %r2a{ $_ } }; + + my $sum = [+] (0 .. (@a.elems - 2)).map:{ @a[$_] < @a[$_ + 1] ?? -@a[$_] !! @a[$_] }; + $sum += @a[* - 1]; + + say $sum; +} + +multi sub MAIN(UInt $p) { + my Str $s = 'M' x ($p div 1000); + my Int $n = $p mod 1000; + + $s ~= d2r($n div 100, 'C', 'D', 'M'); + $n %= 100; + + $s ~= d2r($n div 10, 'X', 'L', 'C'); + $s ~= d2r($n mod 10, 'I', 'V', 'X'); + + say $s; +} diff --git a/challenge-010/feng-chang/perl6/ch-2.p6 b/challenge-010/feng-chang/perl6/ch-2.p6 new file mode 100755 index 0000000000..7773c07831 --- /dev/null +++ b/challenge-010/feng-chang/perl6/ch-2.p6 @@ -0,0 +1,37 @@ +#!/bin/env perl6 + +sub jaro-similarity(Str $s1, Str $s2) returns Num { + my Int $s1-len = $s1.chars; + my Int $s2-len = $s2.chars; + my Int $d = max($s1-len, $s2-len) div 2 - 1; + + my Int $m = 0; # matching characters + my Str @as1 = $s1.comb; + my Str $ms1 = ''; # string made up of matching characters from s1 + for 0 .. $s1-len - 1 -> Int $i { + if $s2.substr(max(0, $i - $d) .. min($s2-len, $i + $d)).contains(@as1[$i]) { + ++$m; + $ms1 ~= @as1[$i]; + } + } + + return 0e0 if $m == 0; + + my Str @as2 = $s2.comb; + my Str $ms2 = ''; # string made up of matching characters from s2 + for 0 .. $s2-len - 1 -> Int $i { + $ms2 ~= @as2[$i] if $s1.substr(max(0, $i - $d) .. min($s1-len, $i + $d)).contains(@as2[$i]); + } + + my Int $nt = 0; + for $ms1.comb Z $ms2.comb -> $p { + ++$nt if $p[0] eq $p[1]; + } + + return 1e0 / 3 * ($m / $s1-len + $m / $s2-len + $nt / $m); +} + +sub jaro-winkler-similarity(Str $s1, Str $s2) returns Num { +} + +my $sim-j = jaro-similarity('CRATE', 'TRACE'); diff --git a/challenge-010/feng-chang/perl6/t01.p6 b/challenge-010/feng-chang/perl6/t01.p6 deleted file mode 100755 index 316b72ec90..0000000000 --- a/challenge-010/feng-chang/perl6/t01.p6 +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/env perl6 - -use Test; -plan 24; - -dec-vs-rom(39, 'XXXIX'); - -dec-vs-rom(160, 'CLX'); -dec-vs-rom(207, 'CCVII'); -dec-vs-rom(246, 'CCXLVI'); -dec-vs-rom(789, 'DCCLXXXIX'); - -dec-vs-rom(1009, 'MIX'); -dec-vs-rom(1066, 'MLXVI'); -dec-vs-rom(1776, 'MDCCLXXVI'); -dec-vs-rom(1954, 'MCMLIV'); -dec-vs-rom(2014, 'MMXIV'); -dec-vs-rom(2019, 'MMXIX'); -dec-vs-rom(2421, 'MMCDXXI'); - -sub dec-vs-rom(Int $n, Str $s) { - my $script = './01.p6'; - - my $res = run $script, $n, :out; - is $res.out.get, $s, "$n => $s"; - - $res = run $script, $s, :out; - is $res.out.get, $n, "$s => $n"; -} diff --git a/challenge-010/feng-chang/perl6/test-ch-1.p6 b/challenge-010/feng-chang/perl6/test-ch-1.p6 new file mode 100755 index 0000000000..316b72ec90 --- /dev/null +++ b/challenge-010/feng-chang/perl6/test-ch-1.p6 @@ -0,0 +1,29 @@ +#!/bin/env perl6 + +use Test; +plan 24; + +dec-vs-rom(39, 'XXXIX'); + +dec-vs-rom(160, 'CLX'); +dec-vs-rom(207, 'CCVII'); +dec-vs-rom(246, 'CCXLVI'); +dec-vs-rom(789, 'DCCLXXXIX'); + +dec-vs-rom(1009, 'MIX'); +dec-vs-rom(1066, 'MLXVI'); +dec-vs-rom(1776, 'MDCCLXXVI'); +dec-vs-rom(1954, 'MCMLIV'); +dec-vs-rom(2014, 'MMXIV'); +dec-vs-rom(2019, 'MMXIX'); +dec-vs-rom(2421, 'MMCDXXI'); + +sub dec-vs-rom(Int $n, Str $s) { + my $script = './01.p6'; + + my $res = run $script, $n, :out; + is $res.out.get, $s, "$n => $s"; + + $res = run $script, $s, :out; + is $res.out.get, $n, "$s => $n"; +} -- cgit