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