Thread Pythagorische Tripel
(18 answers)
Opened by Ronnie at 2008-10-19 15:57
Ich sammle gerade Beispiele für die Leistungsfähigkeit von Skriptsprachen. Ein Beispiel ist das Erzeugen pythagorischer Tripel. Leider gefällt mir die Perl-Lösung gar nicht, weil sie der 'klassischen' Lösung entspricht:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Carp; sub gen_triangles { my $max = shift || 10; my @set; for my $c (1..$max) { for my $b (1..$c) { for my $a (1..$b) { push @set, [$a, $b, $c] if $c**2 == $b**2 + $a**2; } } } return \@set; } print Dumper gen_triangles; Zum Vergleich mal das selbe (als ListComprehension) in Python: Code: (dl
)
print [(a,b,c) for c in range(20) for b in range(c) for a in range(b) if c**2==a**2+b**2] oder in Haskell (ghci): Code: (dl
)
1 let triangles = [ (a, b ,c) | c <- [1..], b <- [1..c], a <- [1..b], a^2+b^2==c^2 ] Die Haskell Variante nutzt lazy-evaluation, sodass die Definition tatsächlich für 1 bis unendlich möglich ist. Eine Ruby-Variante würde der obigen Perl5 Version gleichen, aber durch das yield-Statement könnte man es wenigstens als Iterator nutzen. Ich suche eine elegantere Version in Perl5, würde aber auch eine in Perl6 nehmen?! |