เขียนล่าม ~ ATH


12

Homestuckคอมมิวนิคยอดนิยมใช้ประโยชน์จากภาษาโปรแกรมที่เรียกว่า~ATHทำลายจักรวาล ขณะนี้ความท้าทายกอล์ฟรหัสคือไม่ได้ที่จะเขียนโปรแกรมที่จะทำลายการดำรงอยู่ของเราเราจะถูกทำลายบางส่วนเชื่องมากขึ้น (แม้จะน่าสนใจไม่น้อย) หน่วยงาน: ตัวแปร 

~ATH(ออกเสียง "til ตาย" แจ้งว่า~athเป็น "ตัวหนอน ATH") ทำงานโดยการสร้างตัวแปรที่เรียกว่าTHISการดำเนินการคำสั่งที่มีและจบโปรแกรมด้วยEXECUTE THIS.DIE()หน้าวิกิพีเดียสำหรับการใช้ภาษาใน Homestuck สามารถพบได้ที่นี่ เป้าหมายของการท้าทายนี้คือการสร้าง~ATHล่าม

เพื่อความท้าทายฉันจะสร้างรายละเอียดบางอย่าง~ATHที่ไม่มีอยู่จริง ๆ แต่ทำให้มีประโยชน์ (บ้าง)

  • import <variable name>;ภาษาเดียวที่จะทำงานร่วมกับจำนวนเต็มซึ่งจะมีการประกาศด้วย ตัวแปรจะถูกตั้งค่าเป็น 0 โดยอัตโนมัติสามารถนำเข้าตัวแปรได้ครั้งละหนึ่งตัวเท่านั้น
  • ตัวแปรxสามารถคัดลอกโดยการเขียนbifurcate x[y,z];ซึ่งจะลบตัวแปรxและแทนที่ด้วยตัวแปรที่เหมือนกันและy zโปรดทราบว่ามันไม่สามารถสร้างตัวแปรที่มีชื่อเดียวกับที่ถูกลบ โดยพื้นฐานแล้วตัวแปรจะถูกเปลี่ยนชื่อจากนั้นจะสร้างสำเนาของตัวแปรที่มีชื่อแตกต่างกัน นี้ดูเหมือนว่าคุณลักษณะโง่ แต่ความโง่เขลาถูกมากลึกฝังแน่นใน Homestuck
  • ไวยากรณ์สำหรับการเขียนโปรแกรมที่รันโค้ดบนมีx หากคุณต้องการที่จะรันโค้ดบนตัวแปรทั้งสองพร้อมกันจะกลายเป็นรหัสที่ซ้อนกันเช่นนี้~ATH(x){EXECUTE(<code>)} ~ATH(x){~ATH(y){EXECUTE(<code>)}}คำสั่งทั้งหมดใน<code>จะถูกดำเนินการทั้งในและxy
  • ทีนี้มาดูคำสั่งกันดีกว่า +เพิ่มตัวแปรที่เกี่ยวข้องทีละ 1 และ-ลดพวกมันทีละ 1 และ ... แค่นั้นแหละ
  • คุณสมบัติสุดท้ายของ~ATHมันคือมันฆ่าทุกอย่างที่มันทำงานด้วย ตัวแปรที่จะมีการพิมพ์ในรูปแบบ<name>=<value>(ตามด้วยการขึ้นบรรทัดใหม่) [<name>].DIE();ที่คำสั่ง หลังจากนั้นโปรแกรมจะพิมพ์คำDIE <name>และขึ้นบรรทัดใหม่จำนวนครั้งเท่ากับค่าสัมบูรณ์ของค่าของตัวแปร เมื่อตัวแปรถูกฆ่าพร้อมกันด้วย[<name1>,<name2>].DIE();(คุณสามารถฆ่าตัวแปรได้มากเท่าที่คุณต้องการตราบใดที่มีอยู่) DIE()คำสั่งจะถูกดำเนินการกับตัวแปรตามลำดับ

ตัวอย่างโปรแกรม

โปรแกรม 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

เอาท์พุท:

sollux=-2
DIE sollux
DIE sollux
eridan=6
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan
DIE eridan

โปรแกรม 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

เอาท์พุท:

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

นี่คือรหัสกอล์ฟดังนั้นจึงใช้กฎมาตรฐาน รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ


2
จนตาย ฉันรู้ว่าคุณทำอะไรที่นั่น.
Digital Trauma

3
@ DigitalTrauma ฉันต้องส่งเครดิตให้กับ Andrew Hussie (คนที่เขียน Homestuck) เพื่อหาชื่อ
Arcturus

1
@sysreq ~ATHใช้อัฒภาคเป็นเส้นตอนจบสำหรับimport, bifurcateและDIEคำสั่ง ทั้ง REPL และไฟล์นั้นใช้ได้ ต้องคำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ทั้งอินพุตและเอาต์พุต (ฉันพยายามจับคู่ของจริง~ATHให้มากที่สุด)
Arcturus

1
@sysreq ฉันต้องเปลี่ยนบางสิ่งดังนั้นภาษาจะทำอะไรบางอย่างในชีวิตจริงเพซที่ฉันอธิบายไว้นั้นใช้ได้
Arcturus

2
ฉันประหลาดใจโดยสุจริตคำถามนี้ไม่ได้รับการตอบสนองมากขึ้นและยิ่งแปลกใจมากขึ้นไม่มีพ่อมด Perl ที่ติดอาวุธด้วยเวทมนตร์แห่งเวทมนตร์ Regexy
cat

คำตอบ:


3

Python 2.7.6, 1244 1308 1265 1253 1073 1072 1071 1065 1064 1063 ไบต์

เอาล่ะฉันไม่ได้ทำลายสถิติใด ๆ ที่นี่ แต่นี่เป็นเรื่องเกี่ยวกับงูหลามตัวเล็กที่สุดที่จะไปตราบเท่าที่การอ่านอินพุตทั้งหมดในครั้งเดียวจากไฟล์มากกว่าเรียงตามลำดับเมื่อเวลาผ่านไป ฉันจะลองทำสิ่งต่อไปนี้ในภาษาอื่น (และล่ามไม่ใช่แค่ตัวแยกวิเคราะห์) จนกว่าจะถึงตอนนั้นเพลิดเพลินไปกับความน่ากลัวที่น่าสยดสยอง

หมายเหตุ : เปิดไฟล์ที่เรียกว่าtในไดเรกทอรีทำงาน เพื่อให้เปิดอาร์กิวเมนต์บรรทัดคำสั่งให้เพิ่มimport sysที่ด้านบนของไฟล์และเปลี่ยน't'เป็นsys.argv[1]

n=s='\n';m=',';X='[';Y=']';c=';';A='~ATH';D='import';b,g,k=[],[],[];r=range;l=len;f=open('t','r').read().split(n)
def d(j,u):
 p=[]
 for e in j:
  if e!=u:p.append(e)
 return''.join(p)
for h in r(l(f)):f[h]=f[h].split('//')[0].split()
while[]in f:f.remove([])
for h in r(l(f)):
 i=f[h]
 if i[0]==D and l(i)==2and i[1][l(i[1])-1]==c and d(i[1],c)not in b:g.append(0);b.append(d(i[1],c))
 elif i[0].startswith(A):
  i=i[0].split('){')
  for e in r(l(i)):
   if i[e].startswith(A):
    i[e]=i[e].split('(')
    if i[0][1]in b:g[b.index(i[0][1])]+=(i[1].count('+')-i[1].count('-'))
 elif i[0].startswith('bifurcate')and l(i)==2and i[1][l(i[1])-1]==c:
  i=i[1].split(X)
  if i[0] in b:
   z=d(d(i[1],c),Y).split(m)
   for e in r(l(z)):g.append(g[b.index(i[0])]);b.append(z[e])
   g.remove(g[b.index(i[0])]);b.remove(i[0])
 elif i[0].startswith(X)and i[0].endswith('.DIE();')and l(i)==1:
  z=d(i[0],X).split(Y)[0].split(m)
  for e in r(l(z)):
   k.append((z[e],g[b.index(z[e])]))
for e in r(l(k)):k0=k[e][0];k1=k[e][1];s+=k0+'='+str(k1)+n+('DIE '+k0+n)*abs(k1)
print s

2

Python 2, 447 475 463 443 ไบต์

exec("eNp1UUtrAjEQvu+vCEshiYnrxl7KbqOUVmjvCoUkxUdiG7BRkpW2iP3tTVwrReppMsx8r4l936x9A8JXoN5kmu/2WeCxK0KjrSu8mWmEs0Ad96YI27lDPu/1is7wKqcQ0kBLenM+ty0nilu4zqnPtYCSQcXL2P2LmNvl1i9mjWlBUhwKbRt14uhHjlSvjzVy1tqswO/7AjsSpKtwIpGvt2zALqyNnkf3k/FIolb2ACjlpe2jR6lk8fAUQbKNulx7YIF1IDkqwmZlGwQpxNXGW9cASyCHZKqFVVOCoJQOEhjxABKLO7N5QGmET5qOs/Qfoqq6TGUfb3ZlgKvOnOxTwJKpDq6HSLzsVfK1k7g1iB7Hd9/JWh3T9wclkYwTlY4odP0nnvk0C3RUwj95/ZUq".decode('base64').decode('zip'))

ปรากฎการซิปและการเข้ารหัสโปรแกรมพื้นฐาน 64 ยังคงบันทึกเป็นไบต์ในเวอร์ชันปกติ สำหรับการเปรียบเทียบนี่เป็นเรื่องปกติ:

import sys,re
d={}
s=sys.stdin.read()
s,n=re.subn(r"//.*?$",'',s,0,8)
s,n=re.subn(r"import (.*?);",r"d['\1']=0;",s,0,8)
s,n=re.subn(r"bifurcate (.*?)\[(.*?),(.*?)\];",r"d['\2']=d['\3']=d['\1'];del d['\1'];",s,0,8)
s,n=re.subn(r"([+-])",r"\g<1>1",s,0,8)
s,n=re.subn(r"EXECUTE\((.*?)\)",r"0\1",s,0,8)
s,n=re.subn(r"\[(.*?)\]\.DIE\(\);",r"for i in '\1'.split(','):print i+'='+`d[i]`+('\\n'+'DIE '+i)*abs(d[i])",s,0,8)
n=1
s=s[::-1]
while n:s,n=re.subn(r"\}([+-01]*);?([^}]*?)\{\)(.*?)\(HTA~",r";\g<2>0+\1=+]'\3'[d;\1",s,0,8)
exec(s[::-1])

โดยทั่วไปวิธีการแก้ปัญหา "เวทมนตร์ไม้กายสิทธิ์ regexy" ที่ต้องการ อ่านในโปรแกรมทั้งหมดจาก stdin เป็นสตริงเดี่ยวแทนที่ ~ ATH expressions ด้วย Python expressions ที่ทำซีแมนทิกส์ที่อธิบายไว้และ exec () เป็นสตริงผลลัพธ์

หากต้องการดูสิ่งที่กำลังทำอยู่ให้ดูที่โปรแกรม python ที่โปรแกรมทดสอบที่ให้สองได้รับการแปลเป็น:

d['THIS']=0;                    
0+1+1+1+1;d['THIS']+=0+1+1+1+1+0;       
d['THIS1']=d['THIS2']=d['THIS'];del d['THIS'];    
0+1+1;d['THIS1']+=0+1+1+0;        
for i in 'THIS1,THIS2'.split(','):print i+'='+`d[i]`+('\n'+'DIE '+i)*abs(d[i])            

d['THAT']=0;                                         
d['THESE']=d['THOSE']=d['THAT'];del d['THAT'];                         
0+1+1;d['THESE']+=0+1+1+00+1+1+1;d['THOSE']+=0+1+1+1+0;    
for i in 'THESE,THOSE'.split(','):print i+'='+`d[i]`+('\n'+'DIE '+i)*abs(d[i])                                 

มันเป็นสิ่งที่ดีที่00 == 0: P

เห็นได้ชัดว่าสามารถบันทึกสองสามไบต์ได้โดยการใช้ประโยชน์จากความคลุมเครือในกฎ ตัวอย่างเช่นจะไม่กล่าวว่าสิ่งที่ควรเกิดขึ้นในกรณีที่มีคนพยายามDIE()ใช้ตัวแปรที่ยังไม่ได้importแก้ไขหรือที่ได้รับการbifurcateแก้ไขแล้ว ฉันเดาตามคำอธิบายคือควรมีข้อผิดพลาด หากไม่มีข้อผิดพลาดฉันสามารถลบdelคำสั่งได้

แก้ไข: แก้ไขข้อผิดพลาดที่กรณีทดสอบให้ไม่ได้ทดสอบ อย่างที่มันเป็นทุก~ATHบล็อคจะรีเซ็ตตัวแปรเป็นศูนย์ก่อนที่จะเพิ่มขึ้น มีค่าใช้จ่ายฉัน 28 ไบต์เพื่อแก้ไข หากใครเห็นวิธีที่ดีกว่าในการเปลี่ยน~ATHบล็อกฉันชอบที่จะรู้

แก้ไข 2: บันทึก 12 bytes โดยการยกเลิกการวนลูป regex ทำให้ subns ทั้งหมดและปล่อยให้การบีบอัดดูแลการทำซ้ำ

แก้ไข 3: บันทึกอีก 20 ไบต์โดยแทนที่forลูปด้านในด้วยการคูณสตริง


เฮ้ในที่สุดเวทมนตร์แห่งเวทมนตร์! ฉันจะไม่สามารถเอาชนะสิ่งนี้ได้ แต่ทำได้ดีมาก!
แมว

การใช้งานของฉันไม่สนใจสิ่งที่ไม่ได้กล่าวถึงในกฎอย่างชัดเจนซึ่งหมายความว่าคุณไม่ควรทิ้งข้อผิดพลาดและไม่สนใจกรณีเหล่านั้นด้วย
แมว

คุณสามารถบันทึกไบต์โดยทำimport sys,reแทนimport sys;import re
cat

1
การเน้นไวยากรณ์ทำให้อ่านง่ายขึ้นมาก
cat

1
@cat ขอโทษที่ฉันลืมตอบคุณเมื่อนานมาแล้ว คุณเรียกใช้จากบรรทัดคำสั่งและpython ~ath.py < program.~ath
ไพพ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.