Squeak Smalltalk 4.x sabor muitos bytes!
Eu poderia implementar uma das formas recursivas em Inteiro em 71 caracteres
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
A leitura de um arquivo ou do FileStream stdin vai me custar um braço ... O Squeak obviamente não foi projetado como uma linguagem de script. Portanto, gastarei muitos bytes para criar meus próprios utilitários de uso geral não relacionados ao problema:
Implemente esse método de 21 caracteres no Stream (para pular os seaparators)
s self skipSeparators
Implemente esse método de 20 caracteres no comportamento (para ler uma instância de um fluxo)
<s^self readFrom:s s
Em seguida, 28 caracteres na String (para criar um identificador de arquivo)
f^FileDirectory default/self
Em seguida, 59 caracteres no FileDirectory (para criar um readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Em seguida, 33 caracteres no BlockClosure (para avaliar n vezes)
*n^(1to:n)collect:[:i|self value]
Em seguida, 63 caracteres na matriz (avalie o argumento com o receptor e os argumentos extraídos da matriz)
`s^self first perform:s asSymbol withArguments:self allButFirst
em seguida, resolva o problema avaliando esse snippet de 31 caracteres em qualquer lugar para ler do arquivo chamado x
|s|s:='x'f r.[0class<s]*3`#f:n:
Mesmo sem contar os utilitários, já são 71 + 31 = 102 caracteres ...
Agora, como tenho certeza de perder o codeGolf, tenho uma implementação mais divertida no 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) uma mensagem binária feita de n + se ela não existir (não é entendida pelo destinatário da mensagem m) e reiniciará a execução no início do contexto do remetente. Inseri um retorno de carro adicional e espaços para facilitar a leitura.
Observe que (m selector size-2min:1)hex lasté uma forma abreviada de (m selector size>2)asBit printString.
Se não fosse para demonstrar superpoderes do Smalltalk, a última declaração poderia ser substituída por mais curta e simples
^m sendTo:self
Agora implemente o utilitário 28 chars em Character (para repeti-lo n vezes em uma String)
*n^String new:n withAll:self
Em seguida, avalie esta expressão de 43 caracteres:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Podemos acelerar com mais 10 caracteres implementando em Inteiro:
++y^self*y
e, neste caso, também temos um código mais curto, porque podemos substituir ^',(m selector size-2min:1)hex lastpor^1'
Por um preço tão alto, o código funciona com o segundo número inteiro = 0 :)
n=1? Se éx+youx+1,1 1 1deve retornar2