Smalltalk Squeak 4.x смакує багато байтів!
Я міг реалізувати одну з рекурсивних форм у Integer у 71 графі
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
Тоді читання з файлу або FileStream stdin обійдеться мені за руку ... Скрип явно не розглядався як сценарій мови. Тому я витрачу багато байт, щоб створити власні утиліти загального призначення, не пов'язані з проблемою:
Запровадьте цей метод 21-ти чарівників у потоці (щоб пропустити мореплавці)
s self skipSeparators
Реалізуйте цей метод 20 char у поведінці (для читання екземпляра з потоку)
<s^self readFrom:s s
Потім 28 символів у рядку (щоб створити обробку файлу)
f^FileDirectory default/self
Потім 59 символів у FileDirectory (для створення readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Потім 33 символи в BlockClosure (щоб оцінити його n разів)
*n^(1to:n)collect:[:i|self value]
Потім 63 символи в масиві (оцініть аргумент із приймачем та аргументи, взяті з масиву)
`s^self first perform:s asSymbol withArguments:self allButFirst
потім вирішіть проблему, оцінивши цей фрагмент 31 символу де-небудь, щоб прочитати його з файлу з назвою x
|s|s:='x'f r.[0class<s]*3`#f:n:
Навіть не рахуючи комунальних послуг, це вже 71 + 31 = 102 символи ...
Тепер, оскільки я впевнено втрачаю кодGolf, у мене є смішніша реалізація в 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
Цей метод визначає (компілює) двійкові повідомлення, зроблені з n +, якщо його немає (не розуміється одержувачем повідомлення m), і відновить виконання на початку контексту відправника. Я вставив додаткове повернення каретки та пробіли для читабельності.
Зауважте, що (m selector size-2min:1)hex lastце скорочена форма (m selector size>2)asBit printString.
Якби не демонстрація злих наддержав Smalltalk злих сил, остання заява могла б бути замінена коротшою та простішою
^m sendTo:self
Тепер реалізуйте утиліту 28 символів у символі (повторити її n разів у рядку)
*n^String new:n withAll:self
Потім оцініть цей вираз 43 символи:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Ми можемо прискорити ще 10 символів, застосувавши в Integer:
++y^self*y
і в цьому випадку ми також маємо короткий код , тому що ми можемо замінити ^',(m selector size-2min:1)hex lastз^1'
За такої високої ціни код працює з другим цілим числом = 0 :)
n=1? Якщо цеx+yабоx+1,1 1 1слід повернутися2