Smalltalk Squeak 4.x lezzet birçok bayt!
71 karakterde Tamsayı'da özyinelemeli formlardan birini uygulayabilirim
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
Sonra bir dosya veya FileStream stdin okumak bana bir kol mal olacak ... Gıcırtı bir komut dosyası dili olarak tasarlanmamıştı. Bu nedenle, sorunla ilgisi olmayan kendi genel amaçlı yardımcı programları oluşturmak için birçok bayt harcayacağım:
Bu 21 karakter yöntemini Akışta uygulayın (depolayıcıları atlamak için)
s self skipSeparators
Bu 20 karakterlik yöntemi Davranışta uygulayın (Akıştan bir örnek okumak için)
<s^self readFrom:s s
Sonra String'de 28 karakter (bir dosya tanıtıcısı oluşturmak için)
f^FileDirectory default/self
Sonra FileDirectory içinde 59 karakter (bir readStream oluşturmak için)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Sonra BlockClosure'da 33 karakter (n kez değerlendirmek için)
*n^(1to:n)collect:[:i|self value]
Sonra Array'da 63 karakter (alıcı ile argümanı ve Array'dan alınan argümanları değerlendirin)
`s^self first perform:s asSymbol withArguments:self allButFirst
daha sonra bu 31 karakter snippet'ini x adlı dosyadan okunacak herhangi bir yerde değerlendirerek sorunu çözün
|s|s:='x'f r.[0class<s]*3`#f:n:
Yardımcı programları saymadan bile, 71 + 31 = 102 karakter zaten ...
Şimdi, codeGolf kaybetmek emin eminim, ben Integer bir daha komik bir uygulama var:
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
Bu yöntem yoksa (n iletisinin alıcısı tarafından anlaşılamazsa) n + 'dan yapılan ikili iletileri tanımlar (derler) ve gönderen bağlamının başlangıcında yürütmeyi yeniden başlatır. Ek satır başı ve okunabilirlik için boşluklar ekledim.
Bunun (m selector size-2min:1)hex lastkısa bir biçimi olduğunu unutmayın (m selector size>2)asBit printString.
Smalltalk kötü süper güçlerini göstermek olmasaydı, son ifade daha kısa ve daha basit ile değiştirilebilir
^m sendTo:self
Şimdi Karakter'e 28 karakter yardımcı programı uygulayın (bir String'de n kez tekrarlamak için)
*n^String new:n withAll:self
Sonra bu 43 karakter ifadesini değerlendirin:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Tamsayı'da uygulayarak 10 karakter daha hızlandırabiliriz:
++y^self*y
Biz yerini alabilir çünkü ve bu durumda biz de daha kısa koduna sahip ^',(m selector size-2min:1)hex lastolan^1'
Böyle yüksek bir fiyat için, kod ikinci tamsayı = 0 ile çalışır :)
n=1? E? Erx+yyax+1,1 1 1dönmelidir2