2 বি এর জন্য দোভাষী লিখুন


12

2 বি এর জন্য দোভাষী লিখুন

আমি ডেভিড ক্যাট এর রহস্যময় ভাষা 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 সংখ্যায় রূপান্তর করা উচিত? এএসসিআইআই কোড সম্ভবত?
flawr

উত্তর:


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 বাইট) একাউন্টে একটি ত্রুটি করে একটি স্থির করে নিন। এই প্রয়োগটি নেস্টেড ফাংশন কলগুলিকে সমর্থন করে না (এটি প্রয়োজনীয় বৈশিষ্ট্য হলে আমি এটি প্রয়োগ করতে পারি)

সম্পাদনা 2: সংযোজন, বিয়োগ এবং সেল চলাচল করতে হ্যান্ডলার ফাংশন পরিবর্তন করেছে। আরও লম্বা! : ডি ("আরও পঠনযোগ্য সংস্করণ" এখন সিঙ্কের বাইরে চলে যেতে পারে)

সম্পাদনা 3: আমি কেবল বুঝতে পেরেছি যে মন্তব্যগুলি পরিচালনা করার জন্য আমার 5 টি বাইট খরচ হয় (-10 বিবেচনায় নেওয়া)। সুতরাং আমি এটি সরিয়ে দিয়েছি, এটি এখন অসম্পূর্ণ মনে হচ্ছে shame

সম্পাদনা 4: এন এর সংজ্ঞাটি ল্যাম্বডা থেকে হ্যান্ডলারের h এর অভ্যন্তরে পরিবর্তিত হয়েছে


অনেকের সাথেই +a+যোগ দেওয়া ভাল a? এটি আপনাকে কোনও ভারে নির্ধারণ করা থেকে মুক্তিও দেয়।
মালটিসেন

আমি বাদ দিয়ে পুরো অভিধানে স্ট্রিংগুলিতে যোগদান করতে পারি না এবং প্রতিটি স্ট্রিংয়ের জন্য পৃথকভাবে এটি করা ভাল হবে না। স্ট্রিংটিকে একটিতে নির্ধারণ করা কোডের জন্য আসলে কিছু উপকারী কিছু বাইট অর্জনের কৌশল।
বেসিল-হেনরি

আমার ধারণা আমি ফাংশনগুলির ক্রম সম্পর্কে অভিযোগ করতে পারি না, কারণ আমি আসলে এটি নির্দিষ্ট করেছিলাম না, তবে SayHi.2bফাইলটি কাজ করার চেষ্টা করব try যদি কোনও শিফটে সাবট্যাপটি শূন্যে পুনরায় সেট করতে পরিবর্তন করা হয় তবে কী হবে?
জিম্বোবিহ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.