Smalltalk Squeak 4.x posmakuj wielu bajtów!
Mógłbym zaimplementować jedną z rekurencyjnych postaci w Integer w 71 znakach
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
Wtedy czytanie z pliku lub standardowego FileStream będzie mnie kosztować ramię ... Squeak oczywiście nie został zaprojektowany jako język skryptowy. Dlatego spędzę wiele bajtów, aby stworzyć własne narzędzia ogólnego przeznaczenia niezwiązane z problemem:
Zaimplementuj tę metodę 21 znaków w Streamie (aby pominąć separatory)
s self skipSeparators
Zaimplementuj tę metodę 20 znaków w zachowaniu (aby odczytać instancję ze strumienia)
<s^self readFrom:s s
Następnie 28 znaków w ciągu (aby utworzyć uchwyt pliku)
f^FileDirectory default/self
Następnie 59 znaków w FileDirectory (aby utworzyć readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Następnie 33 znaki w BlockClosure (aby ocenić to n razy)
*n^(1to:n)collect:[:i|self value]
Następnie 63 znaki w tablicy (oceń argument za pomocą odbiornika i argumenty pobrane z tablicy)
`s^self first perform:s asSymbol withArguments:self allButFirst
następnie rozwiąż problem, oceniając ten fragment 31 znaków w dowolnym miejscu do odczytu z pliku o nazwie x
|s|s:='x'f r.[0class<s]*3`#f:n:
Nawet nie licząc narzędzi, to już 71 + 31 = 102 znaków ...
Teraz, ponieważ na pewno stracę kod Golf, mam zabawniejszą implementację w 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
Ta metoda zdefiniuje (skompiluje) binarne wiadomości wykonane z n +, jeśli nie istnieje (nie jest rozumiane przez odbiorcę wiadomości m), i ponownie uruchomi wykonywanie na początku kontekstu nadawcy. Wstawiłem dodatkowy znak powrotu karetki i spacje dla czytelności.
Zauważ, że (m selector size-2min:1)hex lastjest to zwarta forma (m selector size>2)asBit printString.
Gdyby nie demonstrowanie złych supermocarstw Smalltalk, ostatnie stwierdzenie można by zastąpić krótszym i prostszym
^m sendTo:self
Teraz zaimplementuj narzędzie 28 znaków w Postaci (aby powtórzyć to n razy w ciągu)
*n^String new:n withAll:self
Następnie oceń to wyrażenie 43 znaków:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Możemy przyspieszyć z 10 dodatkowymi znakami, implementując w Integer:
++y^self*y
iw tym przypadku mamy również krótszy kod, ponieważ możemy wymienić ^',(m selector size-2min:1)hex lastz^1'
Za tak wysoką cenę kod działa z drugą liczbą całkowitą = 0 :)
n=1? Jeśli to jestx+ylubx+1,1 1 1powinien wrócić2