Smalltalk Squeak 4.x добавляет много байтов!
Я мог бы реализовать одну из рекурсивных форм в Integer за 71 символ.
(m selector size-2min:1)hex last
Тогда чтение из файла или стандартного ввода FileStream будет стоить мне руки... Очевидно, Squeak не был разработан как язык сценариев. Поэтому я потрачу много байтов на создание собственных утилит общего назначения, не связанных с проблемой:
Реализуйте этот метод из 21 символа в Stream (чтобы пропустить разделители)
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
Реализуйте этот 20-символьный метод в поведении (чтобы прочитать экземпляр из потока).
|s|s:='x'f r.[0class<s]*3`#f:n:
Затем 28 символов в строке (для создания дескриптора файла)
`s^self first perform:s asSymbol withArguments:self allButFirst
Затем 59 символов в FileDirectory (для создания потока чтения)
*n^(1to:n)collect:[:i|self value]
Затем 33 символа в BlockClosure (чтобы оценить его n раз)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Затем 63 символа в массиве (оцените аргумент с помощью получателя и аргументы, взятые из массива)
f^FileDirectory default/self
затем решите проблему, оценив этот фрагмент из 31 символа в любом месте для чтения из файла с именем x
<s^self readFrom:s s
Даже без учета утилит это уже 71+31=102 символа...
Теперь, поскольку я наверняка потеряю кодGolf, у меня есть более забавная реализация в Integer:
s self skipSeparators
Этот метод определит (скомпилирует) двоичное сообщение, состоящее из n +, если оно не существует (не понимается получателем сообщения m), и перезапустит выполнение в начале контекста отправителя. Я вставил дополнительный возврат каретки и пробелы для удобства чтения.
Обратите внимание, что f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
is a shorted form of 7625597484987
.
Если бы это не демонстрация злых сверхспособностей Smalltalk, последнее утверждение можно было бы заменить более коротким и простым.
3, 3, 4
Теперь реализуйте утилиту из 28 символов в символе (чтобы повторить ее n раз в строке).
def h(x,y,n):r=1;exec(n>2)*y*"r=h(x,r,n-1);";return(r,(x+y,x*y)[n>1])[n<3]
print h(*input())
Затем оцените это выражение из 43 символов:
65536
Мы можем ускориться еще на 10 символов, реализовав Integer:
2, 4, 4
и в этом случае у нас также есть более короткий код, потому что мы можем заменить def h(x,y,n):r=n>2;exec"r=h(x,r,n-1);"*y*(n>1);return(x+y,r)[n>1]
print h(*input())
with ṛ+⁵ðx’ß@ƒ>2¥ðỊ? Main program as a dyadic link.
Left = n, Right = y, 3rd arg (⁵) = x
A..ðB.......ðC? If C then A else B
Ị If n <= 1
ṛ+⁵ Then y + x
x’ß@ƒ>2¥ Else...
x’ y copies of n-1
ß@ƒ>2 Reduce with the program itself flipped, with
the default value being n>2 (1 or 0)
За такую высокую цену код работает со вторым целым числом = 0 :)