Starry là một ngôn ngữ lập trình bí truyền vui nhộn trong đó mã chỉ bao gồm +*.,`'
nơi lệnh thực tế được đại diện bởi mỗi ký tự đó được xác định bởi số lượng khoảng trắng ở phía trước nó. Điều đó làm cho nó trở nên khó khăn ngay cả với những thách thức đầu ra cố định golf, bởi vì các lệnh khác nhau có thể chiếm số lượng byte khác nhau rất lớn. Cụ thể, chữ số có một biểu diễn đơn nhất khiến cho việc xây dựng số lớn hơn bằng cách vận hành trên các số nhỏ hơn là cần thiết.
Do đó, thách thức này là về việc viết một chương trình có thể chơi các chương trình Starry như vậy.
Starry hoạt động như thế nào?
(Một vài chi tiết không được chỉ định trên esolang, vì vậy tôi sẽ xử lý hành vi của trình thông dịch Ruby .)
Starry là một ngôn ngữ dựa trên ngăn xếp, với một chồng các giá trị nguyên chính xác tùy ý (ban đầu là trống).
Các nhân vật có ý nghĩa duy nhất là:
+*.,`'
và không gian. Tất cả các nhân vật khác được bỏ qua. Mỗi chuỗi không gian theo sau bởi một trong những ký tự không phải không gian đó đại diện cho một lệnh. Loại hướng dẫn phụ thuộc vào ký tự không phải không gian và số lượng khoảng trắng.
Các hướng dẫn là:
Spaces Symbol Meaning
0 + Invalid opcode.
1 + Duplicate top of stack.
2 + Swap top 2 stack elements.
3 + Rotate top 3 stack elements. That is, send the top stack element
two positions down. [... 1 2 3] becomes [... 3 1 2].
4 + Pop and discard top of stack.
n ≥ 5 + Push n − 5 to stack.
0 mod 5 * Pop y, pop x, push x + y.
1 mod 5 * Pop y, pop x, push x − y.
2 mod 5 * Pop y, pop x, push x * y.
3 mod 5 * Pop y, pop x, push x / y, rounded towards -∞.
4 mod 5 * Pop y, pop x, push x % y. The sign of the result matches the sign of y.
0 mod 2 . Pop a value and print it as a decimal number.
1 mod 2 . Pop a value and print it as an ASCII character. This throws an error
if the value is not in the range [0, 255].
n ` Mark label n.
n ' Pop a value; if non-zero, jump to label n.
Lưu ý rằng trình thông dịch sẽ quét mã nguồn cho các nhãn trước khi bắt đầu thực thi, do đó có thể nhảy về phía trước cũng như lùi lại.
Tất nhiên, Starry cũng có các lệnh đầu vào (sử dụng ,
tương tự .
), nhưng những lệnh này không liên quan đến thử thách này.
Các thách thức
Đưa ra một chuỗi, tạo một chương trình Starry không có đầu vào và in chính xác chuỗi đó sang STDOUT.
Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).
Bạn có thể giả sử rằng chuỗi không dài hơn 128 ký tự và nó sẽ chỉ bao gồm các ký tự ASCII có thể in được (mã điểm 0x20 đến 0x7E).
Giải pháp của bạn sẽ xử lý bất kỳ đầu vào nào như vậy trong vòng chưa đầy 5 phút trên một máy tính để bàn hợp lý (có một chút chậm trễ trong vấn đề này; nếu mất thêm vài phút trên máy tính xách tay của tôi thì tôi không phiền, nhưng nếu mất 15, tôi sẽ không đủ điều kiện nó).
Giải pháp của bạn sẽ được kiểm tra trên một số chuỗi khác nhau được liệt kê dưới đây. Điểm của bạn là tổng số byte của các chương trình Starry tương ứng. Trong trường hợp hòa, người metagolfer ngắn nhất sẽ thắng. Đó là, đừng bận tâm đến việc chơi mã của riêng bạn trừ khi có một sự ràng buộc (mà tôi nghĩ sẽ chỉ xảy ra trong trường hợp có thể có một giải pháp tối ưu).
Bạn không được tối ưu hóa mã của mình đối với các trường hợp thử nghiệm cụ thể được liệt kê bên dưới. Cụ thể, bạn không nên sử dụng giải pháp thủ công hardcode cho chúng. Tối ưu hóa đối với các lớp của chuỗi có cấu trúc tương tự như các chuỗi đã cho là ổn. Nếu tôi nghi ngờ bất kỳ ai về các giải pháp mã hóa cứng, tôi có quyền thay thế một số hoặc tất cả các trường hợp thử nghiệm (bằng các chuỗi cấu trúc có thể so sánh được).
Các trường hợp thử nghiệm
Mỗi dòng là một trường hợp thử nghiệm riêng biệt:
Hello, World!
pneumonoultramicroscopicsilicovolcanoconiosis
.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
Hickory, dickory, dock. The mouse ran up the clock. The clock struck 1. The mouse ran down. Hickory, dickory, dock.
36912059868043514648560046917066768694455682545071266675083273015450033938555319356951628735735013250100789433961153496780296165
bVZ48121347GLtpYnt76CZSxTpMDs6791EJE808077eySXldY162424ddTB90707UupwlWGb63618542VhA252989453TXrWgqGm85899uHOAY2oAKE198GOVUttvW63
7MYxoWBNt180CDHS5xBGvU70HHVB17bh8jYzIIiU6n6g98Rose1nOe8Svcg56nax20q30kT3Ttb2jHl5q2Iuf1vPbjPxm9cyKXwxc0OUK8pr13b2n7U9Y7RwQTc26A1I
n9}unwxVa}[rj+5em6K#-H@= p^X/:DS]b*Jv/_x4.a5vT/So2R`yKy=in7-15B=g _BD`Bw=Z`Br;UwwF[{q]cS|&i;Gn4)q=`!G]8"eFP`Mn:zt-#mfCV2AL2^fL"A
Tín dụng cho trường hợp thử nghiệm thứ hai đi đến Dennis . Tín dụng cho trường hợp thử nghiệm thứ tư đi đến Sp3000.
Giải pháp tham khảo
Đây là một giải pháp tham khảo thực sự cơ bản trong CJam:
q{S5*\iS*'+S'.}%
Bạn có thể chạy nó với toàn bộ bộ thử nghiệm ở đây. Điểm số là:
1233
5240
4223
11110
7735
10497
11524
11392
Total: 62954
Đó là cách tiếp cận đơn giản nhất có thể: đẩy điểm mã của mỗi ký tự thành một chữ và sau đó in nó. Nó không sử dụng các khác biệt nhỏ giữa các ký tự liên tiếp, in số nguyên, các phần lặp lại của chuỗi, v.v. Tôi sẽ để lại những thứ đó cho bạn.
Tôi tin rằng có rất nhiều chỗ để cải thiện. Để tham khảo, thủ công ngắn nhất "Xin chào, thế giới!" chỉ dài 169 byte.