Smalltalk Squeak 4.x风味很多字节!
我可以在71 char中实现Integer中的一种递归形式
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
然后从文件或FileStream stdin中读取将花费我一臂之力...显然,Squeak并非设计为脚本语言。因此,我将花费很多字节来创建自己的与该问题无关的通用实用程序:
在Stream中实现此21 char方法(以跳过分隔符)
s self skipSeparators
在行为中实现此20 char方法(以从Stream读取实例)
<s^self readFrom:s s
然后在String中输入28个字符(以创建文件句柄)
f^FileDirectory default/self
然后在FileDirectory中添加59个字符(用于创建readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
然后在BlockClosure中将33个字符(进行n次评估)
*n^(1to:n)collect:[:i|self value]
然后在数组中添加63个字符(用接收者和从数组中获取的参数评估参数)
`s^self first perform:s asSymbol withArguments:self allButFirst
然后通过评估此31个char片段的位置以从名为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
如果该方法不存在(消息m的接收者无法理解),则该方法将定义(编译)由n +组成的二进制消息,并将在发送者上下文的开头重新开始执行。我插入了附加的回车符和空格以提高可读性。
请注意,这(m selector size-2min:1)hex last
是的缩写形式(m selector size>2)asBit printString
。
如果不是要证明Smalltalk邪恶的超级大国,可以用更短和更简单的语句代替最后一个语句
^m sendTo:self
现在在Character中实现28个字符的实用程序(在String中重复n次)
*n^String new:n withAll:self
然后评估此43个字符的表达式:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
通过在Integer中实现,我们可以再增加10个字符:
++y^self*y
在这种情况下,我们的代码也较短,因为我们可以^',(m selector size-2min:1)hex last
用^1'
对于这么高的价格,代码使用第二个整数= 0 :)
n=1
啊 如果是x+y
或x+1
,1 1 1
则应返回2