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 будет стоить мне руки ... Squeak явно не был разработан как язык сценариев. Поэтому я потрачу много байтов на создание собственных утилит общего назначения, не связанных с проблемой:
Реализуйте этот 21-символьный метод в Stream (чтобы пропустить seaparators)
s self skipSeparators
Реализуйте этот метод с 20 символами в поведении (для чтения экземпляра из потока)
<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 символа ...
Теперь, поскольку я уверен, что потеряю codeGolf, у меня есть более забавная реализация в 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 символов в Character (чтобы повторить ее 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