diff options
| author | 冯昶 <fengchang@novel-supertv.com> | 2019-06-10 22:05:06 +0800 |
|---|---|---|
| committer | 冯昶 <fengchang@novel-supertv.com> | 2019-06-10 22:05:06 +0800 |
| commit | cce2da00bcb2edec7bb8ab7ce1d1cef1e4cdade1 (patch) | |
| tree | 189c2b1d93fa3f43927eb9dade91c89dbd9e37d7 | |
| parent | 16e00a3701bcfc45420dbe0b93ff8093e28ff7ac (diff) | |
| download | perlweeklychallenge-club-cce2da00bcb2edec7bb8ab7ce1d1cef1e4cdade1.tar.gz perlweeklychallenge-club-cce2da00bcb2edec7bb8ab7ce1d1cef1e4cdade1.tar.bz2 perlweeklychallenge-club-cce2da00bcb2edec7bb8ab7ce1d1cef1e4cdade1.zip | |
challenge 010 #1 and #2(unfinished)
| -rw-r--r-- | challenge-010/feng-chang/README | 1 | ||||
| -rwxr-xr-x | challenge-010/feng-chang/perl6/01.p6 | 33 | ||||
| -rwxr-xr-x | challenge-010/feng-chang/perl6/02.p6 | 37 | ||||
| -rwxr-xr-x | challenge-010/feng-chang/perl6/t01.p6 | 29 |
4 files changed, 100 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"; +} |
