折角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をきれいに。
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。