折角Audreyがいるので、Pugs向きの問題を探していたら、hyukiさんの既約分数クイズに対する答えがあったので。
すでにPerlによる解答もhyuki版があるのだけど、失礼ながらあまりPerlish でないので。他の人の解答も見たのだけど、なぜかHashを使った解答が皆無なので まずはPerl5版から。
use strict; use warnings; my $max = shift || 4; my %result; for my $denominator (1..$max){ for my $numerator (0..$denominator){ $result{ $numerator/$denominator } ||= "$numerator/$denominator"; } } print join(", ", map { $result{$_} } sort keys %result), "\n";
解答の表示部分がSAT(Sufficiently Advanced Technology -- by Damian Conway) な感じがしますが、これがPerl6だと、こうもすっきりと書けます。
use v6; my $max = @*ARGS.pop || 4; my %result; for (1..$max) -> $denominator { for (0..$denominator) -> $numerator { %result{ $numerator/$denominator } ||= qq($numerator/$denominator); } } %result.keys.sort.map:{ %result{$_} }.join(", ").say;
strictとwarningsはPerl6ではデフォルトです。Yay!
$*ARGSを$*ARGVと書いて首をかしげていたら、すぐAudreyが 助け舟を出してくれました。$*ARGVを$*ARGSのaliasにするという提案も 出してくれるとの事。map:{block}という記法もついでに教えてもらいました。
JavaScriptに衣食、もとい移植するのもちょちょいのちょいです。 ただ、表示部のlogicはあまりきれいじゃないけど、それはJavascriptが いかんのです。
function $(id){ return document.getElementById(id) } function irreducible_fractions(max){ var result = {}; for(var d = 1; d <= max; d++){ for(var n = 0; n <= d; n++){ if (! result[ n/d ]) result[ n/d ] = [n,d].join("/"); } } return result; } function doit(max){ var o = irreducible_fractions(max); var a = []; for (var k in o){ a.push( o[k] ); } $('result').innerHTML = a.sort().join(", "); }
hyukiさん、Perlクイズ復活しません?
Dan the Scripter
追記:Javascriptの方にbugがあったので修正ついでにちょっとcodeをきれいに。
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。