Smalltalk Squeak 4.x schmeckt vielen Bytes!
Ich könnte eine der rekursiven Formen in Integer in 71 Zeichen implementieren
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
Dann kostet mich das Lesen aus einer Datei oder einem FileStream-Standard einen Arm ... Squeak wurde offensichtlich nicht als Skriptsprache entwickelt. Daher werde ich viele Bytes ausgeben, um meine eigenen allgemeinen Dienstprogramme zu erstellen, die nichts mit dem Problem zu tun haben:
Implementieren Sie diese 21-Zeichen-Methode in Stream (um Seaparatoren zu überspringen).
s self skipSeparators
Implementieren Sie diese 20-Zeichen-Methode in Behavior (um eine Instanz aus einem Stream zu lesen).
<s^self readFrom:s s
Dann 28 Zeichen in String (um ein Dateihandle zu erstellen)
f^FileDirectory default/self
Dann 59 Zeichen in FileDirectory (um einen readStream zu erstellen)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Dann 33 Zeichen in BlockClosure (um es n-mal auszuwerten)
*n^(1to:n)collect:[:i|self value]
Dann 63 Zeichen im Array (bewerten Sie das Argument mit dem Empfänger und die Argumente aus dem Array)
`s^self first perform:s asSymbol withArguments:self allButFirst
Lösen Sie dann das Problem, indem Sie dieses 31-Zeichen-Snippet an einer beliebigen Stelle auswerten, um es aus der Datei mit dem Namen x zu lesen
|s|s:='x'f r.[0class<s]*3`#f:n:
Auch ohne die Dienstprogramme zu zählen, sind das bereits 71 + 31 = 102 Zeichen ...
Jetzt, da ich sicher bin, den CodeGolf zu verlieren, habe ich eine lustigere Implementierung 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
Diese Methode definiert (kompiliert) eine binäre Nachricht aus n +, wenn sie nicht existiert (wird vom Empfänger der Nachricht m nicht verstanden), und startet die Ausführung zu Beginn des Senderkontexts neu. Ich habe zusätzlichen Wagenrücklauf und Leerzeichen zur besseren Lesbarkeit eingefügt.
Beachten Sie, dass dies (m selector size-2min:1)hex last
eine Kurzschlussform von ist (m selector size>2)asBit printString
.
Wenn Smalltalk keine bösen Supermächte demonstrieren sollte, könnte die letzte Aussage durch kürzere und einfachere ersetzt werden
^m sendTo:self
Implementieren Sie nun das Dienstprogramm mit 28 Zeichen in Character (um es n-mal in einem String zu wiederholen).
*n^String new:n withAll:self
Bewerten Sie dann diesen Ausdruck mit 43 Zeichen:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Wir können mit 10 weiteren Zeichen beschleunigen, indem wir in Integer implementieren:
++y^self*y
und in diesem Fall sind wir auch kürzeren Code haben , weil wir ersetzen können ^',(m selector size-2min:1)hex last
mit^1'
Für einen so hohen Preis arbeitet der Code mit der zweiten Ganzzahl = 0 :)
n=1
? Wenn esx+y
oder istx+1
,1 1 1
sollte zurückkehren2