99 (phát âm là "chín mươi chín") là một ngôn ngữ lập trình bí truyền hoàn toàn mới (không bị nhầm lẫn với 99 , lưu ý chữ nghiêng). Nhiệm vụ của bạn trong thử thách này là viết một thông dịch viên cho 99 càng ngắn càng tốt. Việc gửi với ít byte nhất sẽ thắng. Tiebreaker đi đến trình được đăng đầu tiên.
Vì câu hỏi này sâu hơn một chút so với thông thường và tôi rất mong muốn được trả lời tốt, tôi sẽ trao phần thưởng 250 rep cho câu trả lời yêu thích của tôi (không nhất thiết phải là người chiến thắng).
99 Spec
99 là một ngôn ngữ bắt buộc . Mỗi dòng trong một chương trình 99 là một câu lệnh và trong khi thực hiện, con trỏ lệnh bắt đầu ở dòng trên cùng và đi qua từng dòng tiếp theo theo thứ tự, thực hiện chúng trên đường đi. Chương trình kết thúc khi dòng cuối cùng đã được thực thi. Các câu lệnh Goto có thể định tuyến lại đường dẫn của con trỏ lệnh.
Dòng mới, không gian và 9
là ba ký tự duy nhất quan trọng trong chương trình 99 . Tất cả các nhân vật khác hoàn toàn bị bỏ qua. Ngoài ra, dấu cách trên mỗi dòng được bỏ qua và nhiều khoảng trắng trong một hàng được đọc thành một khoảng trắng. ("Dòng mới" đề cập đến bất kỳ mã hóa ngắt dòng phổ biến nào . Không có vấn đề gì mà trình thông dịch của bạn sử dụng.)
Vì vậy, chương trình này:
9 BLAH 99 9a9bb9c9
9 this line and the next have 6 trailing spaces 9
Đồng nhất với chương trình này:
9 99 9999
9 9
Biến
Các biến trong 99 đều có tên là một hoặc nhiều 9
chuỗi được nối với nhau ( 9+
trong biểu thức chính quy). Ví dụ, 9
, 99
, và 9999999999
là tất cả các biến rõ rệt. Đương nhiên, có vô số (hạn chế bộ nhớ).
Giá trị của mỗi biến là một số nguyên chính xác được ký, tùy ý . Theo mặc định, mỗi biến được gán cho biểu diễn số riêng của nó. Vì vậy, trừ khi nó đã được gán lại, giá trị của biến 9
là số 9 và giá trị của biến 99
là số 99, v.v. Bạn có thể nghĩ về nó như coi các biến là số đơn giản cho đến khi chúng được gán rõ ràng.
Tôi sẽ sử dụng V
để chỉ một tên biến tùy ý bên dưới.
Mỗi thể hiện của V
có thể được thay thế bằng 9
, 99
, 999
, 9999
vv
Các câu lệnh
Có năm loại tuyên bố khác nhau trong 99 . Mỗi dòng trong một chương trình 99 chứa chính xác một câu lệnh.
Cú pháp được mô tả ở đây giả sử tất cả các ký tự không liên quan đã bị xóa, tất cả các khoảng trắng ở cuối đã bị xóa và tất cả các chuỗi của nhiều khoảng trắng đã được thay thế bằng các khoảng trắng đơn.
1. Không hoạt động
Một dòng trống là không có op . Nó không làm gì cả (ngoài việc tăng con trỏ lệnh).
2. Đầu ra
V
Một biến duy nhất V
trên một dòng in biến đó thành thiết bị xuất chuẩn.
Nếu V
có một số lẻ của 9
's ( 9
, 999
, vv) thì giá trị số nguyên của V
chia cho 9 sẽ được in (trong hệ thập phân).
Nếu V
có số chẵn 9
( 99
, 9999
v.v.) thì ký tự ASCII có mã V
chia cho 9, mod 128 sẽ được in. (Đó là (V / 9) % 128
giá trị từ 0 đến 127.)
Ví dụ : Chương trình
9
9999
sẽ in 1W
. Dòng đầu tiên in 1
vì 9/9 là 1. Dòng thứ hai in W
vì 9999/9 là 1111 và 1111 mod 128 là 87 và 87 là mã ký tự cho W
.
Lưu ý rằng ngắt dòng không được in giữa các mã thông báo đầu ra. \n
cần phải được in rõ ràng để ngắt dòng.
3. Đầu vào
V
Một biến duy nhất V
trên một dòng có không gian hàng đầu lấy đầu vào từ stdin và lưu nó trong biến đó.
Nếu V
có số lẻ 9
thì người dùng có thể nhập bất kỳ số nguyên đã ký nào và V
sẽ được đặt thành 9 lần giá trị đó.
Nếu V
có số chẵn 9
thì người dùng có thể nhập bất kỳ ký tự ASCII nào và V
sẽ được đặt thành 9 lần mã ký tự của nó.
Ví dụ : Cho -57
và A
làm đầu vào, chương trình này
9
9
99
99
sẽ đầu ra -57A
. Trong nội bộ, biến 9
sẽ có giá trị -513 và 99
sẽ có giá trị 585.
Thông dịch viên của bạn có thể cho rằng các đầu vào luôn có giá trị cú pháp.
4. Chuyển nhượng
Tuyên bố này có thể dài tùy ý. Đó là hai hoặc nhiều biến trên một dòng, cách nhau bởi khoảng trắng:
V1 V2 V3 V4 V5 ...
Điều này gán cho tổng của tất cả các chỉ số chẵn, trừ tổng của các chỉ số lẻ (không bao gồm ). Bài tập là theo giá trị, không phải bằng tham chiếu.V1
V
V
V1
Nó có thể được dịch trong hầu hết các ngôn ngữ như .V1 = V2 - V3 + V4 - V5 + ...
Vì vậy, nếu chỉ có hai biến, thì đó là phép gán bình thường:
V1 V2
→ V1 = V2
Nếu có ba, thì đó là phép trừ:
V1 V2 V3
→ V1 = V2 - V3
Và dấu +
/ -
tiếp tục chuyển đổi qua lại với mỗi biến bổ sung:
V1 V2 V3 V4
→ V1 = V2 - V3 + V4
Ví dụ : Chương trình này sẽ xuất ra 1110123
:
999 Prints triple-nine divided by nine (111).
999 9 9 Assigns triple-nine to zero (nine minus nine).
999 Prints triple-nine divided by nine (0)
9 999 9 Assigns single-nine to negative nine (zero minus nine).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (1).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (2).
999 999 9 Adds nine to triple-nine (really subtracts negative nine).
999 Prints triple-nine divided by nine (3).
5. Goto (nhảy nếu tất cả bằng không)
Tuyên bố này cũng có thể dài tùy ý. Đó là hai hoặc nhiều biến trên một dòng, cách nhau bởi khoảng trắng, với khoảng trắng ở đầu :
V1 V2 V3 V4 V5 ...
Nếu một số giá trị bên cạnh khác không, thì giá trị này hoạt động giống như một số không. Con trỏ lệnh được chuyển sang dòng tiếp theo như bình thường.V1
Nếu tất cả các giá trị bên cạnh là không, sau đó con trỏ lệnh được chuyển đến dòng số . Các dòng được lập chỉ mục bằng 0, vì vậy nếu bằng 0, thì con trỏ di chuyển đến dòng trên cùng. Chương trình chấm dứt (thông thường, không có lỗi) nếu âm hoặc lớn hơn chỉ số cao nhất có thể (số dòng trừ một).V1
V1
V1
V1
Lưu ý rằng không được chia cho 9 ở đây. Và vì không thể có một biến là một giá trị không phải là bội của 9, nên chỉ các số dòng là bội số của 9 có thể được nhảy tới.V1
Ví dụ:
Chương trình này sẽ in 1
mãi mãi:
9 Prints single-nine divided by nine (always 1).
99 9 9 Assigns double-nine to zero.
99 99 Jumps to line zero (top line) if double-nine is zero.
Chương trình này
99999999 Print G.
999 99 Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999 Set 10-nine to zero.
99999999999 9999999999 Set 11-nine to zero.
999 Print triple-nine's value divided by nine. (This is the ninth line.)
99999999 Print G.
999 999 9 Subtract nine from triple-nine.
99999 999 Jump to line 5-nines if triple-nine is zero (ends program).
9 99999999999 9999999999 Jump to line nine if 10-nine and 11-nine are zero (always jumps).
sẽ xuất các số từ 11 xuống 1, theo thứ tự giảm dần, được bao quanh bởi G
's:
G11G10G9G8G7G6G5G4G3G2G1G
Chi tiết bổ sung
Trình thông dịch lý tưởng sẽ chạy từ dòng lệnh với tên tệp chương trình 99 làm đối số. I / O cũng sẽ được thực hiện khi đang bay trong dòng lệnh.
Tuy nhiên, bạn có thể chỉ cần viết một hàm thông dịch có trong chương trình dưới dạng chuỗi cũng như danh sách các mã thông báo đầu vào (ví dụ ["-57", "A"]
). Hàm sẽ in hoặc trả về chuỗi đầu ra.
Các cách khác nhau để chạy trình thông dịch và xử lý I / O đều ổn nếu các tùy chọn này là không thể trong ngôn ngữ của bạn.
Phần thưởng: Viết một cái gì đó tuyệt vời vào năm 99 và tôi sẽ vui lòng đưa nó vào bài viết này làm ví dụ.
- Đây là một Pastebin của chương trình "99 chai bia" gọn gàng từ câu trả lời của Mac .
Hy vọng bạn thích thử thách thứ 99 của tôi ! :CƯỜI MỞ MIỆNG