Schrift
[thread]10890[/thread]

bommerlunder-code (anfängerfrage an die golfer)

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
nyxx
 2007-11-25 08:40
#102970 #102970
User since
2007-11-25
2 Artikel
BenutzerIn
[default_avatar]
vorab: ich bin keine programmiererin und habe auch sonst nichts mit dem thema zu tun. als geisteswissenschaftlerin (genauer gesagt linguistin) beschäftige ich mich eigentlich eher mit der anwendung natürlicher sprachen. aus rein privatem interesse und aus spass habe ich mich nun in den letzten tagen ein klein bisschen in perl eingelesen, was nicht ganz so einfach ist, da alle tutorien, dokus und faqs, die ich im netz gefunden habe, bereits ein gewisses basiswissen in sachen programmierung bzw die kenntnis anderer programmiersprachen voraussetzen. daher sorry, falls euch meine frage zu trivial erscheint. mir geht es darum, nachvollziehen zu können, was künstliche sprachen (wie perl) von natürlichen sprachen (wie zb das deutsche) unterscheidet und welche möglichkeiten sich daraus beim "sprechen" ergeben.

okay, jedenfalls bin ich beim stöbern auf die http://www.99-bottles-of-beer.net gestossen. das lied selbst erinnerte mich durch seinen wiederholenden aufbau an den song "eisgekühlter bommerlunder" von den "toten hosen". ich denke mal, das ist eine passende deutsche variante davon, bloss dass man den bommerlunder ja endlos weitersingen kann.

Eisgekuehlter Bommerlunder -
Bommerlunder eisgekuehlt.
Eisgekuehlter Bommerlunder -
Bommerlunder eisgekuehlt.

Und dazu:
1 belegtes Brot mit Schinken - Schinken!
1 belegtes Brot mit Ei - Ei!
Das sind 2 belegte Brote,
1 mit Schinken und 1 mit Ei.

Und dazu:
Eisgekuehlter Bommerlunder -
Bommerlunder eisgekuehlt.
Eisgekuehlter Bommerlunder -
Bommerlunder eisgekuehlt.

Und dazu:
2 belegte Brot mit Schinken - Schinken!
2 belegte Brot mit Ei - Ei!
Das sind 4 belegte Brote,
2 mit Schinken und 2 mit Ei.


undsoweiter...

und genau das habe ich nun mit meinem tapsigen perl-anfängerwissen versucht umzusetzen, um in der shell eine endlose ausgabe des liedes zu bekommen:

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
24
25
26
27
#!/usr/bin/perl
use strict;
use warnings;

my $a="Bommerlunder";
my $b="Eisgekuehlter $a -\n$a eisgekuehlt.\n";
my $c="\nUnd dazu:\n";
my $d=1;
my $e="Brot";
my $f=" mit ";
my $g="Schinken";
my $h="Ei";
my $i=" - ";
my $j=" belegtes $e";
my $k="belegte";
my $l=" $k Brote";
my $m="$k $e";
my $n="!\nDas sind ";
my $o=" und ";

# erste strophe
print "$b$b$c$d$j$f$g$i$g!\n$d$j$f$h$i$h$n",$d*2,"$l,\n$d$f$g$o$d$f$h.\n$c";

# alle weiteren strophen *g*
while (++$d){
   print "$b$b$c$d $m$f$g$i$g!\n$d $m$f$h$i$h$n",$d*2,"$l,\n$d$f$g$o$d$f$h.\n$c";
}


wenn ich nun auf das use strict; use warnings; und somit auf die mys verzichte, kann ich es so verkürzen:

Code (perl): (dl )
$a="Bommerlunder";$b="Eisgekuehlter $a -\n$a eisgekuehlt.\n";$c="\nUnd dazu:\n";$d=1;$e="Brot";$f=" mit ";$g="Schinken";$h="Ei";$i=" - ";$j=" belegtes $e";$k="belegte";$l=" $k Brote";$m="$k $e";$n="!\nDas sind ";$o=" und ";print"$b$b$c$d$j$f$g$i$g!\n$d$j$f$h$i$h$n",$d*2,"$l,\n$d$f$g$o$d$f$h.\n$c";while(++$d){print"$b$b$c$d $m$f$g$i$g!\n$d $m$f$h$i$h$n",$d*2,"$l,\n$d$f$g$o$d$f$h.\n$c";}


das müssten 388 zeichen sein. meine frage ist nun: geht das auch noch kleiner? könnt ihr mir tips gehen, in welcher form ich das lied als endlosschleife noch abändern könnte, um es noch kürzer hinzukriegen?
ähnlich wie bei der letzten strophe der "99 bottles" ist auch hier ja die erste strophe grammatikalisch etwas anders als die anderen strophen ("1 belegtes brot", später "x belegte brot"), sodass ich um die zweimal print wohl nicht herumkomme, oder?
und kann ich noch irgendwas weiter verschachteln oder sonstwie umgestalten, um den code um weitere zeichen zu verringern? was kann ich da noch umbauen?
ich habe jetzt aus sportlichem ehrgeiz die halbe nacht dran rumgebastelt, komme aber nicht mehr weiter. daher würde ich mich über anregungen und hinweise von erfahrenen perl-schreibern freuen.


ps an die moderatoren: falls ihr denkt, mein posting gehört nicht in die rubrik "allgemeines zu perl", verschiebt es bitte woandershin. ich wusste nicht genau, wo ich meine frage im forum am besten stellen sollte.
Ronnie
 2007-11-25 12:19
#102971 #102971
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
$a und $b sollten in Perl nicht verwendet werden, weil sie für interne Zwecke genutzt werden (sort). Ansonsten ist es unnötig, den ganzen Text zu zerreißen:
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
#!/usr/bin/perl

use strict;
use warnings;

for (1..10) {
    my $sum = $_*2;
        print qq{
        Eisgekuehlter Bommerlunder -
        Bommerlunder eisgekuehlt.
        Eisgekuehlter Bommerlunder -
        Bommerlunder eisgekuehlt.

        Und dazu:
        $_ belegtes Brot mit Schinken - Schinken!
        $_ belegtes Brot mit Ei - Ei!
        Das sind $sum belegte Brote,
        $_ mit Schinken und $_ mit Ei.

        Und dazu:
        }
}

Jetzt kannst du noch überlegen, wie du das Problem mit dem Plural (belegtes/Brote) in den Griff bekommst ;)
styx-cc
 2007-11-25 12:21
#102972 #102972
User since
2006-05-20
533 Artikel
BenutzerIn

user image
Einmal lang:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;

my $refrain = "Eisgekuehlter Bommerlunder -\nBommerlunder eisgekuehlt.\n\n";
my $i = 0;
my $end = 'es';
for (;;) {
print "$i belegt$end Brot mit Schinken - Schinken!\n";
print "$i belegt$end Brot mit Ei - Ei!\n";
print "Das sind ".($i+$i)." belegte Brote,\n";
print "$i mit Schinken und $i mit Ei.\n\n\n";
print "$refrain" x2;
$end = 'e';
$i++;
}

und einmal kurz:
Code: (dl )
1
2
$r="Eisgekuehlter Bommerlunder -\nBommerlunder eisgekuehlt.\n";$i=0;$e='s';for(;;){print "$i belegte$e Brot mit Schinken - Schinken!\n
$i belegte$e Brot mit Ei - Ei!\nDas sind ".($i+$i)." belegte Brote,\n$i mit Schinken und $i mit Ei.\n\n\n";print"$r"x2;$e='';$i++;}

MfG
Pörl.
topeg
 2007-11-25 13:50
#102975 #102975
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Allso viel kürzer bekomme ich es nicht...
Code: (dl )
1
2
3
4
#!/usr/bin/perl
sub o{printf @_}sub p{o($_[0],$i,$i>1?'':'s',$i>1?'e':'',$_[1],$_[1])}
($w,$x,$y,$z)=('isgekühlt','Bommerlunder','Schinken','Ei');($c,$d,$e)=("E$w"."er $x -\n$x e$w.\n","\nUnd dazu:\n","%u belegte%s Brot%s mit %s - %s!\n");
$i=0;for(;;){$i++;o($c);o($c);o($d);p($e,$y);p($e,$z);o("das sind %u belegte Brote,\n%u mit $y und %u mit Ei.\n\n",$i*2,$i,$i)}
ptk
 2007-11-25 14:03
#102977 #102977
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Da kann man mindestens an einer Stelle qw() verwenden.
topeg
 2007-11-25 14:22
#102978 #102978
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
stimmt :-)
Code: (dl )
1
2
3
sub o{printf @_}
($w,$x,$y,$z)=qw(isgekühlt Bommerlunder Schinken Ei);($c,$d,$e)=("E$w"."er $x -\n$x e$w.\n","\nUnd dazu:\n","%u belegte%s Brot%s mit %s - %s!\n");$w='s';$x='';
for($i=1;;$i++){o($c.$c.$d);o($e,$i,$w,$x,$y,$y);o($e,$i,$w,$x,$z,$z);o("das sind %u belegte Brote,\n%u mit $y und %u mit $z.\n\n",$i*2,$i,$i);$w='';$x='e'}
Ronnie
 2007-11-25 15:44
#102980 #102980
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
@Topeg: Wieso hast du das Ei als Variable (bleibt doch bei zwei Buchstaben?), nicht aber das Brot?
Code (perl): (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl

for (1..10) {
$s=$_*2;my @x=$_>1?('','e'):('s','');($i,$j,$k,$l,$m)=qw(belegte Brot Schinken 
isgekuehlt Bommerlunder);print "E${l}er $m - $m e${l}.\n"x2 .qq{
Und dazu:\n$_ $i$x[0] $j$x[1] mit $k - $k!\n$_ $i$x[0] $j$x[1] mit Ei - Ei!
Das sind $s $i ${j}e,$_ mit $k und $_ mit Ei.\n\nUnd dazu:\n\n}}

prinzipiell könnte man jedes Wort mit mehr als zwei Buchstaben in eine Variable stecken, wenn es mehr wie einmal vorkommt.
topeg
 2007-11-25 16:48
#102984 #102984
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
soo noch ein paar Zeichen gespart :-)

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
sub o{return "$_ $i$x $j$y mit $_[0] - $_[0]!
"}for (1..10) {$s=$_*2;($x,$y)=$_>1?('','e'):('s','');($i,$j,$k,$l,$m)=qw(belegte Brot Schinken isgekuehlt Bommerlunder);$o='Und dazu:
';print "E${l}er $m -
$m e${l}.
"x2 ."
$o
".o($k).o('Ei')."Das sind $s $i ${j}e,
$_ mit $k und $_ mit Ei.

$o
"}
RPerl
 2007-11-25 19:00
#102986 #102986
User since
2006-11-26
384 Artikel
BenutzerIn

user image
lol.
topeg: hast Du den obfuscated perl contest gewonnen? :)
nyxx
 2007-11-25 20:56
#102988 #102988
User since
2007-11-25
2 Artikel
BenutzerIn
[default_avatar]
topeg+2007-11-25 15:48:28--
soo noch ein paar Zeichen gespart :-)


aber dafür nix mehr endlos. ;-)

vielen dank für eure bisherigen vorschläge. das war die art von anregungen, die ich gesucht hatte, um das problem mit dem singular/plural zu lösen. rechtzeitig zur abendessenszeit bin ich jetzt mit meinen belegten broten zufrieden. *g*

meine momentane version sieht so aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
while(++$n){$s=$n*2;@x=$n>1?('','e'):('s','');($i,$j,$k,$l,$m)=qw(belegte Brot Schinken isgekuehlt Bommerlunder),$d="Und dazu:\n";print "E${l}er $m -
$m e${l}.\n"x2 .qq(
$d$n $i$x[0] $j mit $k - $k!
$n $i$x[0] $j mit Ei - Ei!
Das sind $s $i ${j}e,
$n mit $k und $n mit Ei.

$d)}


285. geht da noch was?
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2007-11-25 08:40.