একটি ~ এটিএইচ ইন্টারপ্রেটার লিখুন


12

জনপ্রিয় ওয়েবকমিক হোমস্টাক একটি প্রোগ্রামিং ভাষা ব্যবহার করে যা ~ATHমহাবিশ্বকে ধ্বংস করার জন্য ডাকা হয়। যদিও এই কোড গল্ফ চ্যালেঞ্জটি আমাদের অস্তিত্বকে ধ্বংস করার জন্য কোনও প্রোগ্রাম লিখতে নয় , আমরা আরও কিছু কৌতুক (কম আকর্ষণীয় হলেও) সত্তা: ভেরিয়েবলকে ধ্বংস করব । 

~ATH( ~ath"টিলড অ্যাথ" হিসাবে চিহ্নিত "লক্ষ্য করুন কীভাবে " টিল্ড অ্যাথ "হয়) নামক একটি ভেরিয়েবল তৈরি করে THIS, একটি কমান্ড কার্যকর করে EXECUTEএবং প্রোগ্রামটি শেষ করে কাজ করে THIS.DIE()। হোমস্টাকের ভাষা ব্যবহারের জন্য একটি উইকি পৃষ্ঠা এখানে পাওয়া যাবে । এই চ্যালেঞ্জের লক্ষ্য হ'ল ~ATHদোভাষী তৈরি করা ।

চ্যালেঞ্জের স্বার্থে, আমি এমন কিছু বিশদ তৈরি করতে যাচ্ছি ~ATHযা বাস্তবে বিদ্যমান নয় তবে এটি (কিছুটা) দরকারী করে তোলা।

  • ভাষাটি কেবল পূর্ণসংখ্যার সাথে কাজ করবে, যা ঘোষিত হয়েছে import <variable name>;। ভেরিয়েবলটি স্বয়ংক্রিয়ভাবে 0 এর মানতে সেট করা হবে একবারে কেবলমাত্র একটি পরিবর্তনশীল আমদানি করা যায়।
  • একটি পরিবর্তনশীল xলিখে অনুলিপি করা যেতে পারে bifurcate x[y,z];, যা ভেরিয়েবল মুছবে xএবং এটি অভিন্ন ভেরিয়েবল yএবং এর সাথে প্রতিস্থাপন করবে z। মনে রাখবেন যে এটি মুছে ফেলা একই নামের সাথে একটি ভেরিয়েবল তৈরি করতে পারে না। মূলত, একটি ভেরিয়েবলের নতুন নামকরণ করা হয়, তারপরে ভিন্ন নামের সাথে ভেরিয়েবলের একটি অনুলিপি তৈরি করা হয়। এটি একটি নির্বোধ বৈশিষ্ট্য বলে মনে হয় তবে বোকামি খুব গভীরভাবে হোমস্টাকের মধ্যে আবদ্ধ হয়।
  • কোডটি কার্যকর করে xএমন একটি প্রোগ্রাম লেখার সিনট্যাক্সটি হল ~ATH(x){EXECUTE(<code>)}। আপনি একই সাথে দুটি ভেরিয়েবল কোডটি চালানো চান, কোড নেস্টেড হয়ে, এরকম: ~ATH(x){~ATH(y){EXECUTE(<code>)}}। সমস্ত কমান্ড <code>উভয় xএবং উভয়তেই কার্যকর করা হবে y
  • এখন কমান্ডের দিকে সরানো যাক। +প্রাসঙ্গিক পরিবর্তনশীল (গুলি) 1 দ্বারা বৃদ্ধি করে -সেগুলি 1 দ্বারা হ্রাস করে And এবং ... এটিই।
  • এর চূড়ান্ত বৈশিষ্ট্য ~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
মৃত্যু পর্যন্ত. আমি আপনি কি কি আছে দেখতে।
ডিজিটাল ট্রমা

3
@ ডিজিটালট্রামা নামটি নিয়ে আসার জন্য আমি ক্রেডিটটি অ্যান্ড্রু হুসি (হোমস্টাক লেখেন লোক) এর কাছে দিতে হবে।
আর্কটরাস

1
@sysreq ~ATHজন্য লাইন শেষা w শ যেমন সেমিকোলন ব্যবহার import, bifurcateএবং DIEকমান্ড। REPL এবং ফাইল উভয়ই ঠিক আছে। ইনপুট এবং আউটপুট উভয় ক্ষেত্রে কেস সংবেদনশীলতা প্রয়োজন (আমি ~ATHযতটা সম্ভব বাস্তবের সাথে মেলে যাবার চেষ্টা করছি )।
আর্কটরাস

1
@sysreq আমি কয়েক জিনিস পরিবর্তন করতে হয়েছে, যাতে ভাষা আসলে হবে না বাস্তব জীবনে কিছু, pecs আমি বর্ণনা জরিমানা হয়।
আর্কটরাস

2
আমি সত্যই আশ্চর্য হয়েছি যে এই প্রশ্নটি আরও প্রতিক্রিয়া অর্জন করতে পারেনি, এবং আরও আশ্চর্য হয়ে গেছি যে পার্ল উইজার্ডসের যোদ্ধার রেজक्सी ভান্ডার সজ্জিত কোনও সৈন্য নেই
বিড়াল

উত্তর:


3

পাইথন 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'))

এটি জিপিং এবং প্রোগ্রামের এনকোডিং বেস বেস 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])

মূলত "ম্যাজিকের রেজিস্টিক ভান্ডস" সমাধানটি যা পছন্দসই ছিল। স্ট্যান্ডিন থেকে পুরো প্রোগ্রামটিতে একক স্ট্রিং হিসাবে পড়ে, পাইথন এক্সপ্রেশনগুলির সাথে ~ এটিএইচ এক্সপ্রেশনগুলি প্রতিস্থাপন করে যা বর্ণিত শব্দার্থক শব্দগুলি করে এবং এক্সিকিউট () এর ফলস্বরূপ স্ট্রিং করে।

এটি কী করছে তা দেখতে, পাইথন প্রোগ্রামটি দেখুন দ্বিতীয় প্রদত্ত পরীক্ষার প্রোগ্রামটি অনুবাদ করা হয়েছে:

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: পি

স্পষ্টতই, নিয়মে অস্পষ্টতা কাজে লাগিয়ে কয়েকটি বাইট সংরক্ষণ করা যেতে পারে। উদাহরণস্বরূপ, এটি বলা হয়নি যে ইভেন্টে কেউ এমন DIE()কোনও ভেরিয়েবলের চেষ্টা করবে যা সম্পাদনা করা হয়নি import, বা এটি ইতিমধ্যে bifurcateডি হয়েছে । বর্ণনার উপর ভিত্তি করে আমার ধারণাটি ছিল একটি ত্রুটি হওয়া উচিত। যদি কোনও ত্রুটির প্রয়োজন হয় না, আমি delবিবৃতিটি সরিয়ে ফেলতে পারি ।

সম্পাদনা: প্রদত্ত পরীক্ষার কেসগুলির জন্য পরীক্ষা করা হয়নি এমন একটি বাগ সমাধান করা হয়েছে। যথা, এটি যেভাবে ছিল, প্রতিটি ~ATHব্লক ভেরিয়েবলটি বাড়ানোর আগে শূন্যে পুনরায় সেট করে। এটি ঠিক করতে আমার 28 বাইট খরচ হয়েছে। যদি কেউ ~ATHব্লকগুলি প্রতিস্থাপনের আরও ভাল উপায় দেখেন তবে আমি এটি জানতে আগ্রহী।

সম্পাদনা 2: রেগেক্স লুপটি আনারোল করে 12 টি বাইট সংরক্ষণ করা হয়েছে, সেগুলি সমস্ত সাবনে তৈরি করে এবং সংক্ষেপণের পুনরাবৃত্তির যত্ন নিতে দেয়।

সম্পাদনা 3: forএকটি স্ট্রিং গুণ দ্বারা অভ্যন্তরীণ লুপটি প্রতিস্থাপন করে আরও 20 টি বাইট সংরক্ষণ করা হয়েছে ।


আরে, অবশেষে রেজিওক্সি ম্যাজিকের ঘোরে! আমি এটি মারতে সক্ষম হবো না তবে ভাল!
বিড়াল

আমার বাস্তবায়ন বিধি দ্বারা স্পষ্টভাবে আবৃত নয় এমন বিষয়গুলিকে সম্পূর্ণভাবে উপেক্ষা করে, যার অর্থ আপনার ত্রুটি না ছড়ানো এবং কেবলমাত্র সেগুলি কে এড়িয়ে যাওয়া আপনার পক্ষে ঠিক।
বিড়াল

আপনি import sys,reতার চেয়ে কিছু বাইট বাঁচাতে পারবেনimport sys;import re
বিড়াল

1
সিনট্যাক্স হাইলাইটিং এটিকে পড়া সহজ করে তোলে
বিড়াল

1
@ কেট সরি, আমি আপনাকে এত দিন আগে উত্তর দিতে ভুলে গেছি। আপনি এটি কমান্ড লাইন থেকে চালান এবং কোনও ফাইল থেকে ইনপুটটি পাইপ করুন:python ~ath.py < program.~ath
কুইন্টোপিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.