Smalltalk Squeak 4.x hương vị nhiều byte!
Tôi có thể triển khai một trong các hình thức đệ quy trong Integer trong 71 char
f:y n:n n=1or:[^(2to:y)inject:self into:[:x :i|self f:x n:n-1]].^self+y
Sau đó, đọc từ một tệp hoặc FileStream stdin sẽ khiến tôi mất một cánh tay ... Squeak rõ ràng không được thiết kế như một ngôn ngữ kịch bản. Vì vậy, tôi sẽ dành nhiều byte để tạo các tiện ích cho mục đích chung của riêng mình không liên quan đến vấn đề:
Thực hiện phương thức 21 char này trong Luồng (để bỏ qua các trình thu thập dữ liệu)
s self skipSeparators
Thực hiện phương thức 20 char này trong Hành vi (để đọc một thể hiện từ Luồng)
<s^self readFrom:s s
Sau đó, 28 ký tự trong Chuỗi (để tạo một tệp xử lý)
f^FileDirectory default/self
Sau đó, 59 ký tự trong FileDirectory (để tạo readStream)
r^FileStream concreteStream readOnlyFileNamed:self fullName
Sau đó, 33 ký tự trong BlockClences (để đánh giá nó n lần)
*n^(1to:n)collect:[:i|self value]
Sau đó, 63 ký tự trong Mảng (đánh giá đối số với người nhận và đối số được lấy từ Mảng)
`s^self first perform:s asSymbol withArguments:self allButFirst
sau đó giải quyết vấn đề bằng cách đánh giá đoạn trích 31 char này ở bất cứ đâu để đọc từ tệp có tên x
|s|s:='x'f r.[0class<s]*3`#f:n:
Ngay cả khi không tính các tiện ích, đó là 71 + 31 = 102 ký tự đã ...
Bây giờ, vì tôi chắc chắn sẽ mất codeGolf, tôi có một triển khai hài hước hơn trong 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
Phương thức này sẽ định nghĩa (biên dịch) một thông điệp nhị phân được tạo bằng n + nếu nó không tồn tại (không được người nhận tin nhắn m) hiểu và sẽ khởi động lại thực thi khi bắt đầu bối cảnh của người gửi. Tôi chèn trở lại vận chuyển bổ sung và không gian cho dễ đọc.
Lưu ý rằng đó (m selector size-2min:1)hex last
là một hình thức rút gọn của (m selector size>2)asBit printString
.
Nếu không thể chứng minh siêu năng lực tà ác của Smalltalk, câu nói cuối cùng có thể được thay thế bằng cách ngắn hơn và đơn giản hơn
^m sendTo:self
Bây giờ triển khai tiện ích 28 ký tự trong Ký tự (để lặp lại n lần trong Chuỗi)
*n^String new:n withAll:self
Sau đó đánh giá biểu thức 43 ký tự này:
|i s|i:=0class.s:='x'f r.[i<s]*2`($+*(i<s))
Chúng tôi có thể tăng tốc với 10 ký tự nữa bằng cách triển khai trong Integer:
++y^self*y
và trong trường hợp này chúng tôi cũng có mã ngắn hơn vì chúng tôi có thể thay thế ^',(m selector size-2min:1)hex last
bằng^1'
Với mức giá cao như vậy, mã làm việc với số nguyên thứ hai = 0 :)
n=1
gì Nếu nóx+y
hoặcx+1
,1 1 1
nên quay lại2