Homestuck webcomic phổ biến sử dụng một ngôn ngữ lập trình được gọi là ~ATH
để tiêu diệt vũ trụ. Trong khi thử thách chơi gôn mã này không phải là viết một chương trình để tiêu diệt sự tồn tại của chúng ta, chúng ta sẽ phá hủy một số thực thể thuần hóa (mặc dù ít thú vị hơn): các biến .
~ATH
(phát âm là "til death", chú ý cách ~ath
"tilde ath") hoạt động bằng cách tạo một biến được gọi THIS
, thực hiện một lệnh với EXECUTE
và hoàn thành chương trình với THIS.DIE()
. Một trang wiki cho việc sử dụng ngôn ngữ trong Homestuck có thể được tìm thấy ở đây . Mục tiêu của thử thách này sẽ là tạo ra một ~ATH
phiên dịch viên.
Vì lợi ích của thử thách, tôi sẽ tạo ra một số chi tiết ~ATH
không thực sự tồn tại nhưng làm cho nó (phần nào) hữu ích.
- Ngôn ngữ sẽ chỉ hoạt động với số nguyên, được khai báo với
import <variable name>;
. Biến sẽ tự động được đặt thành giá trị 0. Chỉ có thể nhập một biến tại một thời điểm. - Một biến
x
có thể được sao chép bằng cách viếtbifurcate x[y,z];
, nó sẽ xóa biến đóx
và thay thế nó bằng các biến giống nhauy
vàz
. Lưu ý rằng nó không thể tạo một biến có cùng tên với biến đã bị xóa. Về cơ bản, một biến được đổi tên, sau đó một bản sao của biến có tên khác được tạo. Điều này có vẻ giống như một tính năng ngu ngốc, nhưng ngu dốt được rất sâu ăn sâu trong Homestuck. - Cú pháp để viết một chương trình thực thi mã trên
x
là~ATH(x){EXECUTE(<code>)}
. Nếu bạn muốn thực thi mã trên hai biến đồng thời, mã sẽ được lồng vào nhau, như thế này :~ATH(x){~ATH(y){EXECUTE(<code>)}}
. Tất cả các lệnh trong<code>
sẽ được thực hiện trên cảx
vày
. - Bây giờ hãy chuyển sang các lệnh.
+
tăng (các) biến có liên quan lên 1 và-
giảm chúng đi 1. Và ... đó là nó. - Tính năng cuối cùng
~ATH
là nó giết bất cứ thứ gì nó hoạt động. Các biến được in theo định dạng<name>=<value>
(theo sau là một dòng mới) tại lệnh[<name>].DIE();
. Sau đó, chương trình in từDIE <name>
và dòng mới một số lần bằng giá trị tuyệt đối của giá trị của biến. Khi các biến được giết đồng thời với[<name1>,<name2>].DIE();
(bạn có thể có bao nhiêu biến bị giết như bạn muốn, miễn là chúng tồn tại),DIE()
lệnh được thực thi trên các biến liên tục.
Chương trình ví dụ
Chương trình 1:
import sollux; //calls variable "sollux"
import eridan; //calls variable "eridan"
~ATH(sollux){EXECUTE(--)} //sets the value of "sollux" to -2
~ATH(eridan){EXECUTE(+++++)} //sets the value of "eridan" to 5
[sollux].DIE(); //kills "sollux", prints "DIE sollux" twice
~ATH(eridan){EXECUTE(+)} //sets the value of "eridan" to 6
[eridan].DIE(); //kills "eridan", prints "DIE eridan" 6 times
Đầu ra:
sollux=-2
DIE sollux
DIE sollux
eridan=6
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
Chương trình 2:
import THIS; //calls variable "THIS"
~ATH(THIS){EXECUTE(++++)} //sets the value of "THIS" to 4
bifurcate THIS[THIS1,THIS2]; //deletes "THIS", creates variables "THIS1" and "THIS2" both equal to 4
~ATH(THIS1){EXECUTE(++)} //sets the value of "THIS1" to 6
[THIS1,THIS2].DIE(); //kills "THIS1" and "THIS2", prints "DIE THIS1" 6 times then "DIE THIS2" 4 times
import THAT; //calls variable "THAT"
bifurcate THAT[THESE,THOSE]; //deletes "THAT", creates variables "THESE" and "THOSE"
~ATH(THESE){~ATH(THOSE){EXECUTE(+++)}EXECUTE(++)} //sets the value of "THESE" and "THOSE" to 3, then sets the value of "THESE" to 5
[THESE,THOSE].DIE(); //kills "THESE" and "THOSE", prints "DIE THESE" 5 times then "DIE THOSE" 3 times
Đầu ra:
THIS1=6
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
DIE THIS1
THIS2=4
DIE THIS2
DIE THIS2
DIE THIS2
DIE THIS2
THESE=5
DIE THESE
DIE THESE
DIE THESE
DIE THESE
DIE THESE
THOSE=3
DIE THOSE
DIE THOSE
DIE THOSE
Đây là mã golf, vì vậy các quy tắc tiêu chuẩn được áp dụng. Mã ngắn nhất trong byte thắng.
~ATH
sử dụng dấu chấm phẩy như dòng kết thúc cho import
, bifurcate
và DIE
lệnh. Cả REPL và tập tin đều ổn. Độ nhạy trường hợp được yêu cầu ở cả đầu vào và đầu ra (Tôi đang cố gắng khớp với thực tế ~ATH
càng nhiều càng tốt).