2B के लिए एक दुभाषिया लिखें


12

2B के लिए एक दुभाषिया लिखें

मुझे डेविड केट की गूढ़ भाषा 2 बी पसंद है, जिसमें मेमोरी एक टेप में संग्रहीत है, जहां प्रत्येक सेल बाइट्स का एक अलग टेप ('उपप्रकार') है। इसके लिए एक दुभाषिया लिखें!

भाषा की विशिष्टता

आधिकारिक विनिर्देश यहां देखे जा सकते हैं । इस विनिर्देश "में, सीमा में एक संख्या का अर्थ है 0-9( 0जैसा कि व्याख्या की गई है 10), और _इसका अर्थ है किसी भी लम्बाई की एक स्ट्रिंग। प्रत्येक सेल रेंज में एक वैल्यू स्टोर करता है 0-255, और यह एक बीएफ होता है। (साभार @ मार्टिनबटनर)। पाठ को संख्याओं में बदलने के लिए 0-255, ASCII कोड का उपयोग करें । क्योंकि मुझे इस पर कोई विवरण नहीं मिल रहा है, मैं यह कहने जा रहा हूं कि टेप की लंबाई 255न्यूनतम होनी चाहिए , लेकिन अगर आप जानते हैं तो कृपया संपादित करें।

+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| Instruction |                                                              Description                                                               |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+
| 0           | Zeroes the current cell and clears the overflow/underflow flag.                                                                        |
| {           | If the current cell is zero, jump to the matching }.                                                                                   |
| }           | A placeholder for the { instruction.                                                                                                   |
| (           | Read a byte from the input stream and place it in the current cell.                                                                    |
| )           | Write the value of the current cell to the console.                                                                                    |
| x           | Store the value of the current cell in a temporary register.                                                                           |
| o           | Write the value of the temporary register to the console.                                                                              |
| !           | If the last addition overflowed, add one to the current cell. If the last subtraction underflowed, subtract one from the current cell. |
| ?           | Performs a binary NOT on the current cell.                                                                                             |
| +"          | Adds an amount to the current cell.                                                                                                    |
| -"          | Subtracts an amount from the current cell.                                                                                             |
| ^"          | Moves the subtape up a number of times.                                                                                                |
| V"          | Moves the subtape down a number of times.                                                                                              |
| <"          | Moves the tape left a number of times.                                                                                                 |
| >"          | Moves the tape right a number of times.                                                                                                |
| :_:         | Defines a label of name _.                                                                                                             |
| *_*         | Jumps to a label of name _.                                                                                                            |
| ~_~         | Defines a function of name _.                                                                                                          |
| @_@         | Calls a function of name _.                                                                                                            |
| %           | Ends a function definition.                                                                                                            |
| #_#         | Is a comment.                                                                                                                          |
| [SPACE]     | Is an NOP.                                                                                                                             |
| [NEWLINE]   | Is treated as whitespace and removed.                                                                                                  |
| [TAB]       | Is treated as whitespace and removed.                                                                                                  |
+-------------+----------------------------------------------------------------------------------------------------------------------------------------+

टेस्ट

+0+0+0+0+0+0+0+2)+0+0+9)+7))+3)-0-0-0-0-0-0-0-9)+0+0+0+0+0+0+0+0+7)-8)+3)-6)-8)-7-0-0-0-0-0-0)

आउटपुट चाहिए Hello world!


+1:i:{()*i*}

एक catकार्यक्रम की तरह, सिर्फ एक नई लाइन के बिना।


+1:loop:{@ReadChar@*loop*}@PrintHello@@WriteAll@(~ReadChar~(x-0-3<2o^1>1+1>1%~PrintHello~+0+0+0+0+0+0+0+2)-1+0+0+0)+7))+3)+1-0-0-0-0-0-0-0-0)%~WriteAll~<1x:reverse:{<1v1>1-1*reverse*}o-1:print:{-1<1)^1>1*print*}%

पहले एक नाम स्वीकार करना चाहिए, फिर, प्रेस पर Return, आउटपुट होना चाहिए Hello name(जहां नाम इनपुट किया गया था)।

उस कार्यक्रम का श्रेय डेविड कैट को जाता है ।


मैं एक पूर्ण परीक्षण कार्यक्रम पर काम कर रहा हूं।

नियम

  • मानक खामियों को मना किया जाता है
  • आपके दुभाषिया को सभी विशिष्टताओं को पूरा करना होगा, टिप्पणियों को छोड़कर, जिनकी आवश्यकता नहीं है।

स्कोरिंग

  • यह , इसलिए सबसे कम बाइट्स जीतता है!
  • -10 बाइट्स यदि आपका दुभाषिया टिप्पणियों को संभालता है।

लीडरबोर्ड

यहां एक नियमित लीडरबोर्ड और भाषा के अनुसार विजेताओं का अवलोकन करने के लिए एक स्टैक स्निपेट है।

यह सुनिश्चित करने के लिए कि आपका उत्तर दिखाई दे रहा है, कृपया अपना उत्तर शीर्षक मार्कडाउन टेम्पलेट का उपयोग करके शीर्षक के साथ शुरू करें:

# Language Name, N bytes

Nआपके प्रस्तुत करने का आकार कहां है। यदि आप अपने स्कोर में सुधार करते हैं, तो आप पुराने अंकों को हेडलाइन में रख सकते हैं , उनके माध्यम से स्ट्राइक करके। उदाहरण के लिए:

# Ruby, <s>104</s> <s>101</s> 96 bytes


4
महान विचार! यहाँ कुछ विचार हैं: कृपया प्रति उपप्रकार कोशिकाओं की संख्या को परिभाषित करें, और उपप्रकारों की संख्या को हमें अपने कार्यान्वयन में उपयोग करना चाहिए (या निर्दिष्ट करें कि क्या यह किसी प्रकार का अनुकूली / अनंत होना चाहिए)। इनपुट स्ट्रिंग को 0-255 नंबर में कैसे बदलना चाहिए? शायद ASCII कोड?
दोष

जवाबों:


4

पायथन 2, 748 736 731 709 704 691 बाइट्स

यह एक मजेदार छोटी चुनौती थी, मुझे यकीन है कि मैं इस कोड को और भी कम कर सकता हूं (हो सकता है कि मैं बाद में किसी बिंदु पर ऐसा करूंगा)।

from sys import*
w=stdout.write
p=open(argv[1],'r').read()
c,r,s,x,y,t,o=0,0,256,0,0,0,0
g=[[0]*s]*s
e=lambda d:p.find(d,c+1)
def h(i,j=0,k=0):global c,x,y;c+=1;n=1+(int(p[c])-1)%10;l=g[x][y]+n*i;g[x][y]=l%s;o=l/s;x=(x+n*j)%s;y=(y+n*k)%s
a="g[x][y]"
b="[p[c+1:i]]"
l={}
f={}
d={'0':a+"=0",'{':"if "+a+"<1:c=e('}')",'(':"i=stdin.read(1);"+a+"=ord(i)if i else 0",')':"w(chr("+a+"))",'x':"t="+a,'o':"w(chr(t))",'!':a+"+=o",'?':a+"=0if "+a+"else 1",'+':"h(1)",'-':"h(-1)",'^':"h(0,1)",'V':"h(0,-1)",'<':"h(0,0,-1)",'>':"h(0,0,1)",':':"i=e(':');l"+b+"=i;c=i",'*':"i=e('*');c=l"+b,'~':"i=e('~');f"+b+"=i;c=e('%')",'@':"i=e('@');r=i;c=f"+b,'%':"c=r"}
while c<len(p):
    if p[c]in d:exec d[p[c]]
    c+=1

इस कार्यान्वयन के लिए लेबल और कार्यों को घोषित किए जाने से पहले (कार्यान्वित) घोषित करने की आवश्यकता होती है। यह दिए गए दो परीक्षणों के साथ पूरी तरह से काम करता है लेकिन यह दुर्भाग्य से भाषा के लेखक द्वारा लिखित "SayHi.2b" कार्यक्रम के साथ काम नहीं करता है (कार्यों की घोषणा के क्रम को बदलने के बाद भी)। मुझे लगता है कि यह समस्या उस तरह से हो सकती है जिस तरह से मैंने टेप और सबटैप सिस्टम को समझा था। मुख्य टेप के साथ आगे बढ़ने पर, 0 के संगत उप-रीसेट रीसेट पर स्थिति है? फिलहाल मैं मुख्य टेप पर चलते हुए भी उपटैब पर स्थिति रख रहा हूं।

यहाँ अधिक पठनीय संस्करण है:

#!/usr/bin/python

import sys
w=sys.stdout.write
p=open(sys.argv[1],'r').read()
c,r,s,x,y,t,o=0,0,256,0,0,0,0
# c is the current index in the program string
# r is the return index (for functions)
# s is the size of the tape, subtapes and modulo for ints (max int will be 255)
# x and y are the coordinates in the grid
# t is the temporary register
# o is overflow
g=[[0]*s]*s # initialise a grid 256x256 with 0

e=lambda d:p.find(d,c+1)
def n():global c;c+=1;i=int(p[c]);return i if i>0 else 10 # get the number specified
def h(i):j=g[x][y]+i;g[x][y]=j%s;o=j/s # handle addition and substraction
def m(i,j):global x,y;x=(x+i)%s;y=(y+j)%s # move current cell

a="g[x][y]" # string of current cell
b="[p[c+1:i]]" # key for label or function
l={} # dictionary of labels
f={} # dictionary of functions
d={'0':a+"=0",
   '{':"if "+a+"<1:c=e('}')",
   '(':"i=sys.stdin.read(1);"+a+"=ord(i)if i else 0",
   ')':"w(chr("+a+"))",
   'x':"t="+a,
   'o':"w(chr(t))",
   '!':a+"+=o",
   '?':a+"=0if "+a+"else 1",
   '+':"h(n())",
   '-':"h(-n())",
   '^':"m(n(),0)",
   'V':"m(-n(),0)",
   '<':"m(0,-n())",
   '>':"m(0,n())",
   ':':"i=e(':');l"+b+"=i;c=i",
   '*':"i=e('*');c=l"+b,
   '~':"i=e('~');f"+b+"=i;c=e('%')",
   '@':"i=e('@');r=i;c=f"+b,
   '%':"c=r",
   '#':"c=e('#')"
   }

while c<len(p): # loop while c is not EOF
    # print c, p[c]
    if p[c]in d:exec d[p[c]] # execute code kept as a string
    c+=1 # increment index

संपादित करें: (-10 बाइट्स) से निपटने वाले टिप्पणियों को ध्यान में रखें, एक त्रुटि को बंद करना। यह कार्यान्वयन नेस्टेड फ़ंक्शन कॉल का समर्थन नहीं करता है (यदि यह आवश्यक विशेषता है तो मैं इसे लागू कर सकता हूं)

Edit2: हैंडलर फ़ंक्शन को जोड़ने, बदलने और सेल आंदोलन करने के लिए बदल दिया। अधिक लंबोदर! : D ("अधिक पठनीय संस्करण" अब सिंक से बाहर हो सकता है)

Edit3: मुझे बस एहसास हुआ कि टिप्पणियों को संभालने में मेरी लागत 5 बाइट्स (-10 को ध्यान में रखते हुए) है। इसलिए मैंने इसे हटा दिया, यह शर्म की बात है कि यह अब अधूरा लगता है।

Edit4: n की परिभाषा lambda से var के अंदर हैंडलर h () में ले जाया गया


इतने सारे के साथ +a+जुड़ना बेहतर हो सकता है a? यह भी आप से छुटकारा पाने के लिए यह एक var को असाइन करना होगा।
माल्टीसेन

अच्छी तरह से सिवाय इसके कि मैं एक शब्दकोश में तार को एक पूरे के रूप में शामिल नहीं कर सकता और यह प्रत्येक स्ट्रिंग के लिए अलग से ऐसा करने के लायक नहीं होगा। स्ट्रिंग को एक को सौंपना सिर्फ एक चाल है कुछ बाइट्स प्राप्त करने के लिए कोड के लिए वास्तव में उपयोगी कुछ भी नहीं है।
बेसाइल-हेनरी

मुझे लगता है कि मैं कार्यों के क्रम के बारे में शिकायत नहीं कर सकता, क्योंकि मैंने वास्तव में यह निर्दिष्ट नहीं किया था, लेकिन SayHi.2bफ़ाइल को काम करने की कोशिश करें । यदि किसी बदलाव पर उप-योग को शून्य पर रीसेट करने के लिए इसे बदल दिया जाए तो क्या होता है?
जिमबोबोह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.