Codici
99 bottles of beer
99 bottiglie di birra
Nel 1994 in una mailing list scherzosa (una specia di social network dell'epoca) qualcuno invia il testo di questa canzoncina:
99 bottles of beer on the wall, 99 bottles of beer. Take one down and pass it around, 98 bottles of beer on the wall. 98 bottles of beer on the wall, 98 bottles of beer. Take one down and pass it around, 97 bottles of beer on the wall. ... 1 bottle of beer on the wall, 1 bottle of beer. Take one down and pass it around, no more bottles of beer on the wall. No more bottles of beer on the wall, no more bottles of beer. Go to the store and buy some more, 99 bottles of beer on the wall.E' il tipo di canzone che si canta tra scout mentre si va in pullman verso il campo. Solo che nella mailing list qualuno nota che vista la ripetitività del testo scriverla esplicitamente è un spreco enorme di spazio e di banda, perché lo stesso risultato si poteva ottenere con cinque righe di BASIC (più una per il titolo):
10 REM BASIC Version of 99 Bottles of beer 20 FOR X=100 TO 1 STEP -1 30 PRINT X;"Bottle(s) of beer on the wall,";X;"bottle(s) of beer" 40 PRINT "Take one down and pass it around," 50 PRINT X-1;"bottle(s) of beer on the wall" 60 NEXTDa quel momento è iniziata una gara nello scrivere una versione di questo programma in uno o più linguaggi di programmazione.
I risultati sono stati raccolti prima da Tim Robinson, poi da tre programmatori tedeschi: Oliver Schade, Gregor Scheithauer e Stefan Scheler. Il sito 99 bottle of beer raccoglie 1500 diverse versioni.
I codici sono organizzati per linguaggio, data, autore e voti.
Ci sono versioni in linguaggi storici come FORTRAN-IV:
C C FORTRAN-IV VERSION OF 99 BOTTLES OF BEER C DAVE PITTS, DPITTS AT COZX.COM C DO 30 J = 1, 98 I = 100 - J WRITE (6,100) I, I WRITE (6,110) I = I - 1 IF (I .GE. 2) GO TO 20 WRITE (6,125) I GO TO 30 20 WRITE (6,120) I 30 CONTINUE I = 1 WRITE (6,105) I, I WRITE (6,110) WRITE (6,130) CALL EXIT C 100 FORMAT (1H0,I2,30H BOTTLES OF BEER ON THE WALL, 1,I2,16H BOTTLES OF BEER) 105 FORMAT (1H0,I2,29H BOTTLE OF BEER ON THE WALL, 1,I2,15H BOTTLE OF BEER) 110 FORMAT (33H TAKE ONE DOWN AND PASS IT AROUND) 120 FORMAT (1H ,I2,17H BOTTLES OF BEER.) 125 FORMAT (1H ,I2,16H BOTTLE OF BEER.) 130 FORMAT (20H NO BOTTLES OF BEER.) ENDvicino a versioni in dialetti Lisp come Scheme:
;;; Tim Goodwin (tim@pipex.net) (define bottles (lambda (n) (cond ((= n 0) (display "No more bottles")) ((= n 1) (display "One bottle")) (else (display n) (display " bottles"))) (display " of beer"))) (define beer (lambda (n) (if (> n 0) (begin (bottles n) (display " on the wall") (newline) (bottles n) (newline) (display "Take one down, pass it around") (newline) (bottles (- n 1)) (display " on the wall") (newline) (newline) (beer (- n 1)))))) (beer 99)Una versione in Haskell, basata sull'applicazione di una sola funzione su una lista di numeri:
bottles 0 = "no more bottles" bottles 1 = "1 bottle" bottles n = show n ++ " bottles" verse 0 = "No more bottles of beer on the wall, no more bottles of beer.\n" ++ "Go to the store and buy some more, 99 bottles of beer on the wall." verse n = bottles n ++ " of beer on the wall, " ++ bottles n ++ " of beer.\n" ++ "Take one down and pass it around, " ++ bottles (n-1) ++ " of beer on the wall.\n" main = mapM (putStrLn . verse) [99,98..0]fino a versioni in stile IOCCC come questa in Perl:
''=~( '(?{' .('`' |'%') .('[' ^'-') .('`' |'!') .('`' |',') .'"'. '\\$' .'==' .('[' ^'+') .('`' |'/') .('[' ^'+') .'||' .(';' &'=') .(';' &'=') .';-' .'-'. '\\$' .'=;' .('[' ^'(') .('[' ^'.') .('`' |'"') .('!' ^'+') .'_\\{' .'(\\$' .';=('. '\\$=|' ."\|".( '`'^'.' ).(('`')| '/').').' .'\\"'.+( '{'^'['). ('`'|'"') .('`'|'/' ).('['^'/') .('['^'/'). ('`'|',').( '`'|('%')). '\\".\\"'.( '['^('(')). '\\"'.('['^ '#').'!!--' .'\\$=.\\"' .('{'^'['). ('`'|'/').( '`'|"\&").( '{'^"\[").( '`'|"\"").( '`'|"\%").( '`'|"\%").( '['^(')')). '\\").\\"'. ('{'^'[').( '`'|"\/").( '`'|"\.").( '{'^"\[").( '['^"\/").( '`'|"\(").( '`'|"\%").( '{'^"\[").( '['^"\,").( '`'|"\!").( '`'|"\,").( '`'|(',')). '\\"\\}'.+( '['^"\+").( '['^"\)").( '`'|"\)").( '`'|"\.").( '['^('/')). '+_,\\",'.( '{'^('[')). ('\\$;!').( '!'^"\+").( '{'^"\/").( '`'|"\!").( '`'|"\+").( '`'|"\%").( '{'^"\[").( '`'|"\/").( '`'|"\.").( '`'|"\%").( '{'^"\[").( '`'|"\$").( '`'|"\/").( '['^"\,").( '`'|('.')). ','.(('{')^ '[').("\["^ '+').("\`"| '!').("\["^ '(').("\["^ '(').("\{"^ '[').("\`"| ')').("\["^ '/').("\{"^ '[').("\`"| '!').("\["^ ')').("\`"| '/').("\["^ '.').("\`"| '.').("\`"| '$')."\,".( '!'^('+')). '\\",_,\\"' .'!'.("\!"^ '+').("\!"^ '+').'\\"'. ('['^',').( '`'|"\(").( '`'|"\)").( '`'|"\,").( '`'|('%')). '++\\$="})' );$:=('.')^ '~';$~='@'| '(';$^=')'^ '[';$/='`';Qual è il senso di questi giochi? Divertimento, voglia di dimostrare la propria abilità, ma anche l'esigenza di tenere in vita linguaggi ormai morti e sepolti. E' un po' come se oggi ci si mettesse a scrivere poesie in greco antico. E' un omaggio, una forma di rispetto per tutte le persone che hanno creato questi linguaggi che, in un certo momento della storia, sono stati innovativi e vincenti. Uno dei partecipanti scrive nell'intestazione del suo codice Assembly per il processore 8008:
0006 000 000 ; Functioning 8008 machines were rare in the 1970s, and 0007 000 000 ; are practically non-existent now, but thanks to a few 0008 000 000 ; wise men like Steve Loboyko, Jim Kearney, and Bryan 0009 000 000 ; Blackburn, some hardware, software and documentation 0010 000 000 ; have survived.
Prossimo pannello: ⇨ Haiku
© Codexpo.org - Content released under Creative Commons 4.0 BY/SA/NC
Versione: 12/01/2022 - 19:23:50
Parole: 273Pannelli
Codici |
Hello World |
99 bottles of beer |
Haiku |
Apollo |
Colossal Cave |
Zork |
TAUmus |