Smalltalk Squeak 4.x saveur de nombreux octets!
Je pourrais implémenter l'une des formes récursives dans Integer en 71 caractères
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
La lecture d'un fichier ou d'un fichier FileStream stdin me coûtera un bras ... Squeak n'a évidemment pas été conçu comme un langage de script. Je vais donc dépenser de nombreux octets pour créer mes propres utilitaires à usage général sans rapport avec le problème:
Implémenter cette méthode de 21 caractères dans Stream (pour ignorer les Seaparators)
s self skipSeparators
Implémentez cette méthode de 20 caractères dans Behavior (pour lire une instance à partir d'un flux)
<s^self readFrom:s s
Puis 28 caractères en chaîne (pour créer un descripteur de fichier)
f^FileDirectory default/self
Puis 59 caractères dans FileDirectory (pour créer un readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Puis 33 caractères dans BlockClosure (pour l'évaluer n fois)
*n^(1to:n)collect:[:i|self value]
Puis 63 caractères dans le tableau (évaluer l'argument avec le récepteur et les arguments tirés du tableau)
`s^self first perform:s asSymbol withArguments:self allButFirst
puis résolvez le problème en évaluant cet extrait de 31 caractères n'importe où pour lire à partir du fichier nommé x
|s|s:='x'f r.[0class<s]*3`#f:n:
Même sans compter les utilitaires, c'est déjà 71 + 31 = 102 caractères ...
Maintenant, comme je suis sûr de perdre le codeGolf, j'ai une implémentation plus amusante dans 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
Cette méthode définira (compilera) un message binaire en n + s'il n'existe pas (n'est pas compris par le destinataire du message m), et recommencera l'exécution au début du contexte émetteur. J'ai inséré un retour chariot supplémentaire et des espaces pour plus de lisibilité.
Notez que (m selector size-2min:1)hex last
c'est une forme abrégée de (m selector size>2)asBit printString
.
Si ce n'était pas pour démontrer les super-pouvoirs maléfiques de Smalltalk, la dernière déclaration pourrait être remplacée par une plus courte et plus simple
^m sendTo:self
Maintenant, implémentez l'utilitaire 28 caractères dans Caractère (pour le répéter n fois dans une chaîne)
*n^String new:n withAll:self
Évaluez ensuite cette expression de 43 caractères:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Nous pouvons accélérer avec 10 caractères supplémentaires en implémentant Integer:
++y^self*y
et dans ce cas, nous avons également un code plus court, car nous pouvons remplacer ^',(m selector size-2min:1)hex last
par^1'
Pour un prix aussi élevé, le code fonctionne avec un deuxième entier = 0 :)
n=1
? Si c'estx+y
oux+1
,1 1 1
devrait revenir2