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 NEXT
Da 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.

Top languages
Source: http://99-bottles-of-beer.net/
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.)
      END
vicino 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



Versione: 12/01/2022 - 19:23:50

Parole: 273

Pannelli

Codici                      
Hello World                 
99 bottles of beer          
Haiku                       
Apollo                      
Colossal Cave               
Zork                        
TAUmus                      
🔎