aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-010/feng-chang/README1
-rwxr-xr-xchallenge-010/feng-chang/perl6/01.p633
-rwxr-xr-xchallenge-010/feng-chang/perl6/02.p637
-rwxr-xr-xchallenge-010/feng-chang/perl6/t01.p629
-rwxr-xr-xchallenge-012/feng-chang/perl5/ch-2.pl27
-rw-r--r--challenge-012/feng-chang/perl5/paths.txt4
-rwxr-xr-xchallenge-012/feng-chang/perl6/ch-2.p617
-rw-r--r--challenge-012/feng-chang/perl6/paths.txt4
8 files changed, 152 insertions, 0 deletions
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";
+}
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