~ ATH 통역사 작성


12

인기있는 웹 코믹 홈 스턱 (Homecomuck)~ATH우주를 파괴하기 위해 불리는 프로그래밍 언어를 사용 합니다. 이 코드 골프 도전은 우리의 존재를 전멸시키기위한 프로그램을 작성하는 것이 아니지만 , 좀 더 길들인 (더 흥미롭지는 않지만) 엔티티를 파멸시킬 것입니다 : variables

~ATH( "죽음까지"로 발음 됨 ~ath) "tilde 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, bifurcateDIE명령. REPL과 파일 모두 괜찮습니다. 입력과 출력 모두 대소 문자 감도가 필요합니다 ( ~ATH가능한 한 실제 와 일치 시키려고 합니다).
Arcturus

1
언어가 실제로 할 수 있도록 @sysreq 내가 몇 가지를 변경했다 실제 생활에서 무언가를, 내가 설명 근육이 잘입니다.
Arcturus

2
나는이 질문이 더 많은 반응을 얻지 못했다는 사실에 정직하게 놀랐으며, 정규식 마법 지팡이로 무장 한 펄 마법사가 없다는 것에 더 놀랐다
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

파이썬 2, 447 475 463 443 바이트

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

압축을 해제하고 프로그램 base64를 인코딩하면 여전히 일반 버전보다 바이트가 절약됩니다. 비교를 위해 다음은 일반적인 것입니다.

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])

기본적으로 원하는 "마법의 마법 지팡이"솔루션. stdin에서 전체 프로그램을 단일 문자열로 읽고 ~ ATH 표현식을 설명 된 의미론을 수행하는 Python 표현식으로 바꾸고 결과 문자열을 exec ()합니다.

그것이 무엇을하고 있는지 보려면 두 번째 제공된 테스트 프로그램이 다음과 같이 번역 된 파이썬 프로그램을보십시오

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

분명히 규칙의 모호성을 악용하여 몇 바이트를 절약 할 수 있습니다. 예를 들어, 누군가 ed DIE()되지 않았 import거나 이미 bifurcated 인 변수에 대해 시도 할 때 어떤 일이 발생해야하는지에 대해서는 언급 되어 있지 않습니다 . 설명을 기반으로 한 추측은 오류가 있어야한다는 것입니다. 오류가 필요하지 않으면 del문을 제거 할 수 있습니다.

편집 : 제공된 테스트 사례가 테스트하지 않은 버그가 수정되었습니다. 즉, 모든 ~ATH블록은 변수를 증가시키기 전에 변수를 0으로 재설정합니다. 그 문제를 해결하는 데 28 바이트가 소요되었습니다. 누구든지 ~ATH블록 을 교체하는 더 좋은 방법을 발견 하면 알고 싶습니다.

편집 2 : 정규식 루프를 풀고 모든 자막을 만들고 압축을 반복하여 12 바이트를 절약했습니다.

편집 3 : 내부 for루프를 문자열 곱셈 으로 대체하여 20 바이트를 더 절약했습니다 .


이봐, 마침내 마법의 마법 지팡이! 나는 이것을 이길 수 없지만 잘했습니다!
고양이

내 구현은 규칙에서 명시 적으로 다루지 않은 것을 완전히 무시하므로 오류를 발생시키지 않고 이러한 경우도 무시해도됩니다.
고양이

import sys,reimport sys;import re
cat

1
구문 강조 읽을이 훨씬 쉬워집니다
고양이

1
@cat 죄송합니다. 너무 오래 전에 답변을 잊어 버렸습니다. 명령 행에서 실행하고 파일에서 입력을 파이프합니다.python ~ath.py < program.~ath
quintopia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.