Smalltalk Squeak 4.x sabor muchos bytes!
Podría implementar una de las formas recursivas en Integer en 71 char
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
Luego, leer desde un archivo o FileStream stdin me costará un brazo ... Squeak obviamente no fue diseñado como un lenguaje de script. Así que gastaré muchos bytes para crear mis propias utilidades de propósito general no relacionadas con el problema:
Implemente este método de 21 caracteres en Stream (para omitir los seaparators)
s self skipSeparators
Implemente este método de 20 caracteres en Comportamiento (para leer una instancia de un Stream)
<s^self readFrom:s s
Luego 28 caracteres en String (para crear un identificador de archivo)
f^FileDirectory default/self
Luego 59 caracteres en FileDirectory (para crear un readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Luego 33 caracteres en BlockClosure (para evaluarlo n veces)
*n^(1to:n)collect:[:i|self value]
Luego 63 caracteres en la matriz (evalúe el argumento con el receptor y los argumentos tomados de la matriz)
`s^self first perform:s asSymbol withArguments:self allButFirst
luego resuelva el problema evaluando este fragmento de 31 caracteres en cualquier lugar para leer desde el archivo llamado x
|s|s:='x'f r.[0class<s]*3`#f:n:
Incluso sin contar las utilidades, ya son 71 + 31 = 102 caracteres ...
Ahora, como estoy seguro de perder el codeGolf, tengo una implementación más divertida en 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
Este método definirá (compilará) un mensaje binario hecho de n + si no existe (no lo entiende el receptor del mensaje m) y reiniciará la ejecución al comienzo del contexto del remitente. Inserté un retorno de carro adicional y espacios para facilitar la lectura.
Tenga en cuenta que (m selector size-2min:1)hex lastes una forma abreviada de (m selector size>2)asBit printString.
Si no fuera para demostrar los superpoderes malvados de Smalltalk, la última declaración podría ser reemplazada por más corta y simple
^m sendTo:self
Ahora implemente la utilidad de 28 caracteres en el Carácter (para repetirlo n veces en una Cadena)
*n^String new:n withAll:self
Luego evalúa esta expresión de 43 caracteres:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Podemos acelerar con 10 caracteres más implementando en Integer:
++y^self*y
y en este caso también tenemos un código más corto porque podemos reemplazarlo ^',(m selector size-2min:1)hex lastcon^1'
Por un precio tan alto, el código funciona con el segundo entero = 0 :)
n=1? Si esx+yox+1,1 1 1debería devolver2