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 ตัวนี้ในสตรีม (เพื่อข้าม seaparators)
s self skipSeparators
ใช้วิธีการถ่าน 20 วิธีนี้ในพฤติกรรม (เพื่ออ่านตัวอย่างจากสตรีม)
<s^self readFrom:s s
จากนั้น 28 ตัวอักษรใน String (เพื่อสร้างตัวจัดการไฟล์)
f^FileDirectory default/self
จากนั้น 59 ตัวอักษรใน FileDirectory (เพื่อสร้าง readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
จากนั้น 33 ตัวอักษรใน BlockClosure (เพื่อประเมินมัน n ครั้ง)
*n^(1to:n)collect:[:i|self value]
จากนั้น 63 chars in Array (ประเมินอาร์กิวเมนต์ด้วยตัวรับและอาร์กิวเมนต์ที่นำมาจาก Array)
`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
shorted(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 ตัวอักษรโดยการใช้งานในจำนวนเต็ม:
++y^self*y
และในกรณีนี้เรายังมีรหัสที่สั้นกว่าเพราะเราสามารถแทนที่^',(m selector size-2min:1)hex last
ด้วย^1'
สำหรับราคาที่สูงเช่นนี้รหัสจะทำงานกับจำนวนเต็มที่สอง = 0 :)
n=1
อะไร ถ้ามันx+y
หรือx+1
,1 1 1
ควรกลับ2