Thread Pythagorische Tripel (18 answers)
Opened by Ronnie at 2008-10-19 15:57

Ronnie
 2008-10-19 15:57
#115628 #115628
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
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
2
let triangles = [ (a, b ,c) | c <- [1..], b <- [1..c], a <- [1..b], a^2+b^2==c^2 ]
take 10 triangles

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?!

View full thread Pythagorische Tripel