Smalltalk Squeak 4.x ha un sapore di molti byte!
Potrei implementare una delle forme ricorsive in Integer in 71 caratteri
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
Quindi leggere da un file o FileStream stdin mi costerà un braccio ... Squeak ovviamente non è stato progettato come linguaggio di scripting. Quindi spenderò molti byte per creare le mie utility di uso generale non correlate al problema:
Implementa questo metodo con 21 caratteri in Stream (per saltare i seaparator)
s self skipSeparators
Implementare questo metodo con 20 caratteri in Behavior (per leggere un'istanza da uno stream)
<s^self readFrom:s s
Quindi 28 caratteri in String (per creare un handle di file)
f^FileDirectory default/self
Quindi 59 caratteri in FileDirectory (per creare un readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Quindi 33 caratteri in BlockClosure (per valutarlo n volte)
*n^(1to:n)collect:[:i|self value]
Quindi 63 caratteri nell'array (valutare l'argomento con il ricevitore e gli argomenti presi dall'array)
`s^self first perform:s asSymbol withArguments:self allButFirst
quindi risolvi il problema valutando questo frammento di 31 caratteri ovunque da leggere dal file denominato x
|s|s:='x'f r.[0class<s]*3`#f:n:
Anche senza contare le utility, sono già 71 + 31 = 102 caratteri ...
Ora, poiché sono sicuro di perdere il codeGolf, ho un'implementazione più divertente in Integer:
doesNotUnderstand:m
(m selector allSatisfy:[:c|c=$+])or:[^super doesNotUnderstand:m].
self class compile:
m selector,'y y=0or:[^(2to:y)inject:self into:[:x :i|self'
,m selector allButLast,'x]].^'
,(Character digitValue:()asBit)
,(m selector size-2min:1)hex last.
thisContext sender restart
Questo metodo definirà (compilerà) un messaggio binario fatto di n + se non esiste (non è compreso dal destinatario del messaggio m) e riavvierà l'esecuzione all'inizio del contesto del mittente. Ho inserito ulteriori ritorni a capo e spazi per la leggibilità.
Si noti che (m selector size-2min:1)hex last
è una forma abbreviata di (m selector size>2)asBit printString
.
Se non fosse per dimostrare i superpoteri malvagi di Smalltalk, l'ultima affermazione potrebbe essere sostituita da più breve e più semplice
^m sendTo:self
Ora implementa l'utilità 28 caratteri in Carattere (per ripeterlo n volte in una stringa)
*n^String new:n withAll:self
Quindi valuta questa espressione di 43 caratteri:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Possiamo accelerare con altri 10 caratteri implementando in Integer:
++y^self*y
e in questo caso abbiamo anche un codice più breve perché possiamo sostituirlo ^',(m selector size-2min:1)hex last
con^1'
Per un prezzo così alto, il codice funziona con il secondo numero intero = 0 :)
n=1
? Se èx+y
ox+1
,1 1 1
dovrebbe tornare2