লেজেন্ড্রে
এই ভাষাটি কেবলমাত্র টিউরিং-সম্পূর্ণ এবং কেবলমাত্র যদি লেজেন্ড্রের অনুমানটি মিথ্যা হয়, অর্থাত্ সেখানে একটি পূর্ণসংখ্যার এন> 0 এর উপস্থিতি রয়েছে যে এন ^ 2 এবং (এন + 1) ^ 2 এর মধ্যে কোনও প্রাইম নেই। এই ভাষাটি আন্ডারলোড থেকে কিছুটা অনুপ্রেরণা নিয়েছে, যদিও কিছু দিক থেকে এটি এর থেকে পৃথক।
লেজেন্ড্রেতে প্রোগ্রামগুলি ইতিবাচক পূর্ণসংখ্যার সিরিজ নিয়ে গঠিত হয় (0 টি বিশেষত নিষিদ্ধ, কারণ এটি মূলত ভাষার পুরো উদ্দেশ্যকে উপেক্ষা করে)। প্রতিটি পূর্ণসংখ্যা লেজেন্ড্রে বা বেস সম্ভাব্য ব্যবহারকারী সংজ্ঞায়িত একটি বেস কমান্ডের সাথে সম্পর্কিত। কোন আদেশটি এটি বরাদ্দ করা হয়েছে এটির বর্গ এবং পরবর্তী পূর্ণসংখ্যার ( OEIS অনুক্রম A014085 এর সমতুল্য ) এর মধ্যে প্রাইমগুলির সংখ্যার উপর ভিত্তি করে ।
ভাষার কমান্ডগুলি একটি স্ট্যাক পরিবর্তন করে, যা নির্বিচারে বড় ধনাত্মক পূর্ণসংখ্যাকে ধরে রাখতে পারে। যদি স্ট্যাকটি কখনও 0 ধরে রাখে, 0 অবিলম্বে সরানো হবে। বিস্তারিতভাবে, কমান্ডগুলি হ'ল:
2 (এই কমান্ডটি তৈরি করা সবচেয়ে ক্ষুদ্রতম পূর্ণসংখ্যা: 1): প্রোগ্রামের পরবর্তী পূর্ণসংখ্যাটি স্ট্যাকের উপরে চাপুন।
3 (ক্ষুদ্রতম উত্পাদক পূর্ণসংখ্যা: 4): স্ট্যাকের উপরে শীর্ষ পূর্ণসংখ্যা পপ করুন এবং এর সাথে যুক্ত কমান্ডটি কার্যকর করুন।
4 (ক্ষুদ্রতম: 6): শীর্ষ পূর্ণসংখ্যা পপ করুন। যদি এটি 1 হয়, স্ট্যাকের শীর্ষের পূর্ণসংখ্যা বৃদ্ধি করুন।
5 (10): শীর্ষ দুটি স্ট্যাক আইটেম অদলবদল করুন।
6 (15): স্ট্যাকের শীর্ষ সংখ্যাটি হ্রাস করুন। যদি 0 এর ফলাফল হয় তবে 0 টি পপ করুন এবং এটি বাতিল করুন।
7 (16): স্ট্যাকের উপরের পূর্ণসংখ্যার সদৃশ করুন।
8 (25): স্থগিতাদেশ স্থগিত করুন এবং স্ট্যাকের সামগ্রীগুলি মুদ্রণ করুন।
এটি বুনিয়াদী নির্দেশিকা সেট, যা আকর্ষণীয় কিছু করতে অক্ষম, লুপকে ছেড়ে দিন। তবে, আরও একটি আদেশ আছে, যা কেবলমাত্র লেজেন্ডারের অনুমান মিথ্যা প্রমাণিত হলেই অ্যাক্সেস করা যায়।
- 0 (অজানা): স্ট্যাক থেকে সমস্ত আইটেম সরান এবং তাদের একটি নতুন ফাংশনে একত্রিত করুন, যা স্ট্যাকের মূল নীচে থেকে শুরু হওয়া এবং শীর্ষে সমাপ্ত সমস্ত কমান্ড কার্যকর করবে, যার কমান্ড হিসাবে অ্যাক্সেসযোগ্য "কমান্ড নম্বর" সমান প্রোগ্রাম সূত্রের পরবর্তী সংখ্যার সাথে সম্পর্কিত।
যদি এই আদেশটি কোনওভাবে অ্যাক্সেসযোগ্য হয় তবে ভাষাটি টুরিং-সম্পূর্ণ হয়ে যায়, কারণ এতে কোনও মিনস্কি মেশিনকে অনুকরণ করতে পারে।
8 কমান্ডটি কার্যকর হয়ে গেলে বা প্রোগ্রামের শেষ হয়, প্রোগ্রামটি সমাপ্ত হয় এবং স্ট্যাকের প্রতিটি পূর্ণসংখ্যার সাথে সম্পর্কিত (ইউনিকোড) অক্ষর মুদ্রিত হয়।
উদাহরণ প্রোগ্রাম
1 2 1 3 1 10 4
এই সাধারণ প্রোগ্রামটি 4 (কমান্ড: 3) কার্যকর করার আগে 2 এবং তারপরে 3 এবং শেষ পর্যন্ত একটি 10 ধাক্কা দেয়, যার ফলে 10 (কমান্ড: 5) পপ এবং এক্সিকিউট হয়ে যায়, 2 এবং 3 অদলবদল করে।
1 5 3 15 2 1 6 7
এই প্রোগ্রামটি পরোক্ষ পূর্ণ-টু-কমান্ডের চিঠিপত্রের ব্যবহার প্রদর্শন করে। প্রথমে একটি 5 টি পুশ করা হয়, তারপরে একটি 15 এবং একটি 1, 2 কমান্ডের এনকোডিংয়ের তিনটি পৃথক পদ্ধতি ব্যবহার করে। তারপরে, 1 টি পপড হয় এবং ফলস্বরূপ, 15 টি একটি 16 এ বাড়ানো হয় এবং শেষ পর্যন্ত সম্পাদিত হয়। প্রোগ্রামটি স্ট্যাকের 5 নম্বরের দুটি উদাহরণ দিয়ে শেষ হয়।
1 1 1 5 ? 24 1 15 1 31 ? 31 24 31
এই প্রোগ্রামটি 0 কমান্ডের ব্যবহারটি প্রদর্শন করে? স্থানধারক সংখ্যা হিসাবে। প্রোগ্রামটি 9 ফাংশনে প্রথমে '1 5' সংরক্ষণ করে, তারপর 10-এ '15 31 ', 9 ফাংশন চালানোর আগে (24 ব্যবহার করে), যা 5 স্ট্যাকের দিকে ঠেলে দেয় এবং বারবার এটি হ্রাস করে, যতক্ষণ না এটি 0 না পৌঁছায় এবং সরিয়ে না দেওয়া হয় । তারপরে, প্রোগ্রামটি থেমে আছে।
মিনস্কি মেশিন
একটি মিনস্কি মেশিনকে লেজেন্ড্রে কোডে রূপান্তর করতে, 0 কমান্ডটি ব্যবহার করা আবশ্যক । লেজেন্ডারের অনুমানটি মিথ্যা না হলে এই আদেশটি অ্যাক্সেসযোগ্য কারণ, আমি একটি স্থানধারক ব্যবহার করেছি? পরিবর্তে.
নোট করুন যে সমস্ত মিনস্কি মেশিন নির্দেশ লাইন নামের একে অপরের থেকে পৃথক A014085 চিঠিপত্র এবং বেস কমান্ড পাশাপাশি 24 (9) এবং 31 (10) এর সাথে পূর্ণসংখ্যার প্রয়োজন।
আরম্ভ:
1 1 1 1 ? 24
x INC (A / B) y:
উত্তর:
1 y 1 24 1 ? 1 6 1 1 16 1 24 ? x
B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর:
1 y 1 24 1 ? 1 10 1 6 1 1 16 1 10 1 24 ? x
এক্স ডিসি (এ / বি) ইজেড:
উত্তর:
1 4 1 10 1 15 1 10 1 31 1 1 1 10 1 z 1 1 1 16 1 24 1 31 1 ? 1 24 1 15 1 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 24 ? x
B ইংরেজী বর্ণমালার দ্বিতীয় অক্ষর:
1 4 1 10 1 15 1 10 1 31 1 1 1 10 1 z 1 1 1 16 1 24 1 31 1 ? 1 24 1 15 1 10 1 y 1 6 16 1 24 16 1 ? 1 1 16 1 10 1 1 16 1 10 1 24 ? x
এক্স হাল্ট:
1 25 ? x
চূড়ান্ত প্রোগ্রামটি তৈরি করতে, সমস্ত অংশ যুক্ত করুন (x, y, z এর সাথে প্রতিযোগিতাগুলি প্রতিস্থাপন করুন) এবং শৃঙ্খলে প্রথম নির্দেশ শুরু করার জন্য একটি একক পূর্ণসংখ্যা যুক্ত করুন। লেজেন্ড্রের অনুমানটি কাউন্টারেরেক্সামাল দ্বারা মিথ্যা প্রমাণিত হলে এটি ভাষার টুরিং-পূর্ণতা প্রমাণ করতে পারে।
অনুবাদক
এই দোভাষীটি পাইথনে লেখা হয়েছে (3) এবং উপরোক্ত তিনটি উদাহরণেই পরীক্ষা করা হয়েছে। অনুমতি দেওয়ার জন্য -a / - অনুমতিজিরো পতাকা ব্যবহার করবেন? ব্যবহার করতে হবে, -f / - ফাইলটি সরাসরি একটি ফাইল থেকে কোড চালানোর জন্য এবং -s / - স্ট্যাকআউট থেকে স্ট্যাক আউটপুট করার পরিবর্তে পাইথন তালিকা হিসাবে। যদি কোনও ফাইল দেওয়া না হয়, দোভাষী অনুবাদক এক প্রকারের REPL মোডে প্রবেশ করে, যা সর্বোপরি - স্ট্যাকআউট দিয়ে ব্যবহৃত হয়।
import sys
import argparse
import io
class I_need_missing(dict): #used to avoid try/except statements. Essentially a dict
def __missing__(self,key):
return None
def appropriate(integer,prev): #returns number of primes between the square of the integer given and the next
return_value = 0
if prev[integer]:
return prev[integer],prev
if integer == "?":
return 0,prev
for i in range(integer ** 2, (integer + 1) ** 2):
t = False
if i > 1:
t = True
for j in range(2,int(i ** 0.5)+1):
t = i/j != round(i/j)
if not t:
break
return_value += t
prev[integer] = return_value
return return_value,prev
def run_command(commandseries,stack,functions,prev): #Runs the appropriate action for each command.
command,prev = appropriate(commandseries.pop(0),prev)
halt = False
if command == 0: #store in given number
functions[appropriate(commandseries.pop(0),prev)[0]] = stack
stack = []
elif command == 2:#push
stack.append(commandseries.pop(0))
elif command == 3:#execute top instruction
commandseries.insert(0,stack.pop())
elif command == 4:#pop, add 1 to new top if popped value was 1
if stack.pop() == 1:
stack[-1] += 1
elif command == 5:#swap top two integers/?
stack[-1],stack[-2] = stack[-2],stack[-1]
elif command == 6:#subtract 1 from top of stack
stack[-1] -= 1
if stack[-1] == 0:
stack.pop()
elif command == 7:#duplicate top of stack
stack.append(stack[-1])
elif command == 8:#halt
halt = True
else:#run custom
try:
commandseries[0:0] = functions[command]
except TypeError:
print("Warning: unassigned function " + str(command) + " is unassigned", file = sys.stderr)
return commandseries,stack,functions,prev,halt
def main(stack,functions,prev):
#Parser for command line options
parser = argparse.ArgumentParser(description = "Interpreter for the Legendre esoteric programming language.")
parser.add_argument("-a","--allowZero", action = "store_true")
parser.add_argument("-f","--file")
parser.add_argument("-s","--stackOut", action = "store_true")
args = parser.parse_args()
allow_zero = bool(args.allowZero)
#Program decoding starts
pre = ""
if not args.file:
pre = input()
if pre == "":
return
else:
pre = open(args.file).read()
mid = pre.split()
final = []
for i in mid:
if i == "?" and allow_zero:
final.append("?")
elif i != 0 or allow_zero: #and allow_zero)
final.append(int(i))
halt = False
#Functional programming at its best
while final and not halt:
final,stack,functions,prev,halt = run_command(final,stack,functions,prev)
#Halting and output
else:
if args.stackOut:
print(stack)
else:
for i in stack:
print(i == "?" and "?" or chr(i),end = "")
print("")
if args.file or halt:
return
else:
main(stack,functions,prev)
if __name__ == '__main__':
main([],I_need_missing(),I_need_missing())