折角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をきれいに。