~ ATH Tercüman yaz


12

Popüler webcomic Homestuck , ~ATHevreni yok etmek için adlandırılan bir programlama dilini kullanıyor . Bu kod golf zorluğu varlığımızı yok etmek için bir program yazmak olmasa da, biraz daha uysal (daha az ilginç olsa da) varlıkları: değişkenleri yok edeceğiz . 

~ATH("ölüm kadar telaffuz edilir" ~ath, "tilde ath" nin nasıl olduğunu fark edin ) adlı bir değişken oluşturarak THIS, komut vererek EXECUTEve programı bitirerek çalışır THIS.DIE(). Homestuck'ta dil kullanımı için bir wiki sayfası burada bulunabilir . Bu zorluğun amacı bir ~ATHtercüman yaratmak olacaktır .

Zorluk uğruna, ~ATHbunun gerçekte var olmayan ama onu (biraz) faydalı kılan bazı ayrıntılarını yaratacağım .

  • Dil yalnızca ile bildirilen tamsayılarla çalışır import <variable name>;. Değişken otomatik olarak 0 değerine ayarlanır. Bir seferde yalnızca bir değişken içe aktarılabilir.
  • Bir değişken xyazı ile kopyalanabilir. bifurcate x[y,z];Bu değişken değişkeni siler xve aynı değişkenlerle değiştirir yve z. Silinenle aynı ada sahip bir değişken oluşturamayacağını unutmayın. Temel olarak, bir değişken yeniden adlandırılır, daha sonra değişkenin farklı bir ada sahip bir kopyası oluşturulur. Bu aptalca bir özellik gibi görünüyor, ancak aptallık Homestuck'ta çok derinden kökleşmiş .
  • Kod çalıştırır bir program yazmak için sözdizimi xolduğunu ~ATH(x){EXECUTE(<code>)}. Aynı anda iki değişkene kodu çalıştırmak istiyorsanız, kodu şöyle, iç içe olur: ~ATH(x){~ATH(y){EXECUTE(<code>)}}. Tüm komutlar içinde <code>hem yürütülecektir xve y.
  • Şimdi komutlara geçelim. +ilgili değişken (ler) i 1 -arttırır ve onları 1 azaltır. Ve ... bu kadar.
  • Nihai özelliği, ~ATHçalıştığı her şeyi öldürmesidir. Değişkenler <name>=<value>komutta (ardından bir satırsonu) biçiminde yazdırılır [<name>].DIE();. Daha sonra, program kelimeyi DIE <name>ve bir satırsonunu değişkenin değerinin mutlak değerine eşit sayıda yazdırır . Değişkenler ile eşzamanlı olarak öldürüldüğünde [<name1>,<name2>].DIE();(var oldukları sürece, istediğiniz kadar çok değişkeni öldürebilirsiniz), DIE()komut değişkenler üzerinde sırayla yürütülür.

Örnek programlar

Program 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

Çıktı:

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

Program 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

Çıktı:

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

Bu kod golf, bu yüzden standart kurallar geçerlidir. Bayt cinsinden en kısa kod kazanır.


2
Ölene kadar. Orada ne yaptığınızı görüyorum.
Dijital Travma

3
@DigitalTrauma Bu adla geldiği için Andrew Hussie'ye (Homestuck yazan adam) geçmeliyim.
Arcturus

1
@sysreq ~ATHiçin hat uçlarının olarak virgül kullanır import, bifurcateve DIEkomutlar. Hem REPL hem de dosyalar iyidir. Büyük / küçük harf duyarlılığı hem giriş hem de çıkışta gereklidir (Gerçek olanı ~ATHmümkün olduğunca eşleştirmeye çalışıyorum ).
Arcturus

1
dil aslında diye @sysreq bir kaç şey değiştirmek zorunda yapmak gerçek hayatta bir şeyi, ben tarif Pecs iyidir.
Arcturus

2
Dürüst olmak gerekirse bu soruya daha fazla yanıt gelmediği için şaşırdım ve daha da şaşırtıcı bir şekilde regexy magic wands ile silahlandırılmış Perl sihirbazlarının sürüsü yok
kedi

Yanıtlar:


3

Python 2.7.6, 1244 1308 1265 1253 1073 1072 1071 1065 1064 1063 bayt

Tamam, burada herhangi bir kayıt kırmıyorum ama bu en küçük Python zaman içinde sıralı olarak yerine bir dosyadan bir kerede giriş okumak kadar gidecek ilgili. Bunu daha sonra farklı bir dilde bir araya getirmeye çalışacağım (ve sadece bir ayrıştırıcı değil, bir tercüman). O zamana kadar, iğrenç derecede korkunç canavarlığın tadını çıkarın.

Not : tçalışma dizininde çağrılan bir dosyayı açar . Bir komut satırı argümanı açmak yapmak için, eklemek import sysdosya ve değişim üstüne 't'kadarsys.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 bayt

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

Programlama64'ün sıkıştırılması ve kodlanması normal bayttan hala bayt tasarrufu sağlar. Karşılaştırma için, normal olan:

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

Temel olarak istenen "sihirli regexy değneklerini" çözümü. Tüm programda stdin'den tek bir dize olarak okur, ~ ATH ifadelerini açıklanan semantiği yapan Python ifadeleri ile değiştirir ve sonuçta elde edilen dizeyi exec () s.

Ne yaptığını görmek için, sağlanan ikinci test programının çevrildiği python programına bakın:

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

İyi bir şey 00 == 0: P

Açıkçası, kurallardaki belirsizlikten yararlanarak birkaç bayt kurtarılabilir. Örneğin, birisinin DIE()henüz değiştirilmemiş importya da daha önce yapılmış bir değişkeni denemesi durumunda ne olması gerektiği söylenmez bifurcate. Açıklamaya dayanan tahminim bir hata olması gerektiğiydi. Hata gerekmiyorsa, delifadeyi kaldırabilirim .

DÜZENLEME: Sağlanan test senaryolarının test etmediği bir hata düzeltildi. Yani, her ~ATHblok, değişmeden önce değişkeni sıfıra sıfırlar. Bunu düzeltmek için bana 28 byte mal oldu. Birisi ~ATHblokları değiştirmek için daha iyi bir yol görürse , bunu bilmek isterim.

DÜZENLEME 2: Regex döngüsünü açarak, tüm subns'leri yaparak ve sıkıştırmanın tekrarı halletmesine izin vererek 12 bayt kaydedildi.

DÜZENLEME 3: İç fordöngüyü bir dize çarpımı ile değiştirerek 20 bayt daha kaydetti .


Hey, nihayet regexy sihir asaları! Bunu yenemeyeceğim ama aferin!
kedi

Uygulamam, kuralların açıkça kapsamadığı şeyleri tamamen göz ardı eder, bu da bir hata atmamanız ve sadece bu durumları görmezden gelmeniz anlamına gelir.
kedi

import sys,reyerine yapmak için bazı baytlar kaydedebilirsinizimport sys;import re
kedi

1
sözdizimi vurgulama bu okumayı çok daha kolay hale getiriyor
cat

1
@cat üzgünüm sana çok uzun zaman önce cevap vermeyi unuttum. komut satırından çalıştırın ve girdiyi bir dosyadan aktarın:python ~ath.py < program.~ath
quintopia
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.