একটি ক্ল্যাম দোভাষী লিখুন


11

ক্লেম একটি সর্বনিম্ন স্ট্যাক-ভিত্তিক প্রোগ্রামিং ভাষা যা প্রথম শ্রেণির ফাংশনগুলির বৈশিষ্ট্যযুক্ত। আপনার উদ্দেশ্য হ'ল ক্লেম ভাষার জন্য একজন দোভাষী লিখুন। এটি এখানে উপলভ্য রেফারেন্স বাস্তবায়নের অন্তর্ভুক্ত সমস্ত উদাহরণগুলি যথাযথভাবে কার্যকর করা উচিত ।

ক্লেম ভাষা

ক্লেম হ'ল প্রথম শ্রেণির ফাংশন সহ একটি স্ট্যাক ভিত্তিক প্রোগ্রামিং ভাষা। ক্লেম শিখার সর্বোত্তম উপায় হ'ল clemদোভাষী ছাড়াই দোভাষী চালানো । এটি ইন্টারেক্টিভ মোডে শুরু হবে, আপনাকে উপলভ্য কমান্ডগুলির সাথে খেলতে দেবে। উদাহরণস্বরূপ প্রোগ্রামগুলি পরিচালনা করতে, প্রোগ্রামটির clem example.clmনাম যেখানে উদাহরণটি টাইপ করুন । এই সংক্ষিপ্ত টিউটোরিয়ালটি আপনাকে শুরু করার জন্য যথেষ্ট হতে হবে।

ফাংশন দুটি প্রধান শ্রেণি আছে। পারমাণবিক ফাংশন এবং যৌগিক ফাংশন। যৌগিক ফাংশন হ'ল অন্যান্য যৌগিক ফাংশন এবং পারমাণবিক ফাংশনগুলির সমন্বিত তালিকা। মনে রাখবেন যে কোনও যৌগিক ক্রিয়ায় নিজেকে ধারণ করতে পারে না।

পারমাণবিক কার্যাদি

প্রথম ধরণের পারমাণবিক ক্রিয়াটি ধ্রুবক হয় । একটি ধ্রুবক হল একটি পূর্ণসংখ্যা মান। উদাহরণস্বরূপ, -10। দোভাষী যখন একটি ধ্রুবকের মুখোমুখি হন , তখন এটি স্ট্যাকের দিকে ঠেলে দেয়। clemএখন দৌড়াও । -10প্রম্পটে টাইপ করুন । তোমার দেখা উচিত

> -10
001: (-10)
>

মান 001স্ট্যাকের মধ্যে ফাংশনের অবস্থান বর্ণনা এবং (-10) হয় ধ্রুবক আপনি শুধু প্রবেশ করে। এখন +11প্রম্পটে প্রবেশ করুন। তোমার দেখা উচিত

> +11
002: (-10)
001: (11)
>

লক্ষ্য করুন যে (-10)স্ট্যাকের দ্বিতীয় অবস্থানে চলে গেছে এবং (11)এখন প্রথমটি দখল করে। এটাই স্ট্যাকের প্রকৃতি! আপনি লক্ষ্য করবেন যে -এটি হ্রাস আদেশও। যখনই -বা +কোনও সংখ্যার আগে, তারা সেই সংখ্যার চিহ্নটি বোঝায়, সংশ্লিষ্ট আদেশটি নয়। অন্যান্য সমস্ত পারমাণবিক ফাংশন হ'ল কমান্ড । মোট 14 জন রয়েছে:

@  Rotate the top three functions on the stack
#  Pop the function on top of the stack and push it twice
$  Swap the top two functions on top of the stack
%  Pop the function on top of the stack and throw it away
/  Pop a compound function. Split off the first function, push what's left, 
   then push the first function.
.  Pop two functions, concatenate them and push the result
+  Pop a function. If its a constant then increment it. Push it
-  Pop a function. If its a constant then decrement it. Push it
<  Get a character from STDIN and push it to the stack. Pushes -1 on EOF.
>  Pop a function and print its ASCII character if its a constant
c  Pop a function and print its value if its a constant
w  Pop a function from the stack. Peek at the top of the stack. While it is
   a non-zero constant, execute the function.

প্রম্পটে একটি কমান্ড টাইপ করলে কমান্ডটি কার্যকর হবে। #প্রম্পটে টাইপ করুন (সদৃশ আদেশ) তোমার দেখা উচিত

> #
003: (-10)
002: (11)
001: (11)
> 

লক্ষ্য করুন যে (11) সদৃশ হয়ে গেছে। এখন %প্রম্পটে টাইপ করুন (ড্রপ কমান্ড) তোমার দেখা উচিত

> %
002: (-10)
001: (11)
> 

স্ট্যাকের একটি কমান্ড ঠেলাঠেলি করার জন্য, কেবল বন্ধনীতে এটি বন্ধ করুন। (-)প্রম্পটে টাইপ করুন । এটি হ্রাস অপারেটরটিকে স্ট্যাকের দিকে ঠেলে দেবে। তোমার দেখা উচিত

> (-)
003: (-10)
002: (11)
001: (-)
> 

যৌগিক ফাংশন

যৌগিক ফাংশন গঠনের জন্য আপনি বন্ধনীতে একাধিক পারমাণবিক ফাংশন সংযুক্ত করতে পারেন। প্রম্পটে আপনি যখন কোনও যৌগিক ক্রিয়াকলাপ প্রবেশ করেন, তখন এটি স্ট্যাকের দিকে ধাক্কা দেওয়া হয়। ($+$)প্রম্পটে টাইপ করুন । তোমার দেখা উচিত

> ($+$)
004: (-10)
003: (11)
002: (-)
001: ($ + $)
>

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

> . 
003: (-10)
002: (11)
001: (- $ + $)
> 

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

> w
002: (1)
001: (0)
> 

আপনি কি এটি প্রত্যাশা করেছিলেন? স্ট্যাকের উপরে বসা দুটি সংখ্যা যুক্ত করা হয়েছিল এবং তাদের যোগফলগুলি রয়ে গেছে। এটি আবার চেষ্টা করুন। প্রথমে আমরা শূন্যটি নামব এবং টাইপ করে একটি 10 ​​টি চাপবো %10। তোমার দেখা উচিত

> %10
002: (1)
001: (10)
> 

এখন আমরা একটি শটে পুরো ফাংশনটি টাইপ করব, তবে %শূন্য থেকে মুক্তি পেতে আমরা শেষে একটি অতিরিক্ত যুক্ত করব । (-$+$)w%প্রম্পটে টাইপ করুন । তোমার দেখা উচিত

> (-$+$)w%
001: (11)
> 

(দ্রষ্টব্য এই অ্যালগরিদম কেবল তখনই কাজ করে যদি স্ট্যাকের প্রথম ধ্রুবকটি ইতিবাচক হয়)।

স্ট্রিংস

স্ট্রিংগুলিও উপস্থিত রয়েছে। এগুলি বেশিরভাগ সিনট্যাকটিক চিনি, তবে বেশ কার্যকর হতে পারে। দোভাষী যখন একটি স্ট্রিংয়ের মুখোমুখি হন, তখন এটি প্রতিটি অক্ষরকে শেষ থেকে প্রথম পর্যন্ত স্ট্যাকের দিকে ঠেলে দেয়। %পূর্ববর্তী উদাহরণ থেকে 11 টি নামানোর জন্য টাইপ করুন । এখন, 0 10 "Hi!"প্রম্পটে টাইপ করুন। 0একটি শূন্য টারমিনেটর ঢোকাব এবং 10একটি নতুন লাইন অক্ষর সন্নিবেশ করা হবে। তোমার দেখা উচিত

> 0 10 "Hi!"
005: (0)
004: (10)
003: (33)
002: (105)
001: (72)
> 

(>)wস্ট্যাক থেকে অক্ষর মুদ্রণ করতে টাইপ করুন যতক্ষণ না আমরা NULL টার্মিনেটরের মুখোমুখি হই। তোমার দেখা উচিত

> (>)w
Hi!
001: (0)
> 

উপসংহার

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

ক্লিমের জন্য esolangs.org পৃষ্ঠা

সি মধ্যে রেফারেন্স বাস্তবায়ন


আপনি বলেছেন যে আপনি এখনও ভাষাটির স্পেসিফিকেশন লেখেন নি। আমি তখন তা গ্রহণ করি যে আপনি ভাষাটির প্রবর্তক?
সিটি

পছন্দ করুন ভাষা তৈরি করেছি।
অরবি

5
খুব গুরুত্বপূর্ণ প্রশ্ন: আপনি কি এটি "ক্লিম" বা "সি-লেম" উচ্চারণ করেন?
মার্টিন ইন্ডার

4
@ মার্টিনব্যাটনার: "ক্লেম" :)
অরবি

2
@ কমান্ড 3 শীর্ষ ফাংশনটি ঘোরায় সেই দিকটি আপনি নির্দিষ্ট করতে চাইতে পারেন। (001 -> 002 -> 003 -> 001, বা 003 -> 002 -> 003 -> 003)
কোভক্কি

উত্তর:


1

হাস্কেল, 931 921 875

এটি এখনও পুরোপুরি গল্ফ হয় নি তবে এটি কখনও হবে না। তবুও, এটি অন্যান্য সমস্ত সমাধানের চেয়ে ইতিমধ্যে সংক্ষিপ্ত। আমি আরও শীঘ্রই এটি গল্ফ করব। আমি এর চেয়ে বেশি গল্ফ লাগছে বলে মনে হয় না।

সম্ভবত কয়েকটি সূক্ষ্ম বাগ রয়েছে কারণ আমি সি রেফারেন্স প্রয়োগের সাথে খেলিনি।

এই StateT [String] IO ()দ্রবণটি "চালানোর যোগ্য" ক্ল্যাম প্রোগ্রামটি সঞ্চয় করতে ধরণটি ব্যবহার করে । বেশিরভাগ প্রোগ্রামটি একটি পার্সার যা "চলমান প্রোগ্রাম" কে বিশ্লেষণ করে।

এই ব্যবহার চালানোর জন্য r "<insert clem program here>"

import Text.Parsec
import Control.Monad.State
import Control.Monad.Trans.Class
import Data.Char
'#'%(x:y)=x:x:y
'%'%(x:y)=y
'@'%(x:y:z:w)=y:z:x:w
'$'%(x:y:z)=y:x:z
'/'%((a:b):s)=[a]:b:s
'+'%(a:b)=i a(show.succ)a:b
'.'%(a:b:c)=(a++b):c
_%x=x
b=concat&between(s"(")(s")")(many$many1(noneOf"()")<|>('(':)&((++")")&b))
e=choice[s"w">>c(do p<-t;let d=h>>= \x->if x=="0"then a else u p>>d in d),m&k,s"-">>(m&(' ':)&k<|>c(o(\(a:b)->i a(show.pred)a:b))),s"c">>c(do
 d<-t
 i d(j.putStr.show)a),o&(++)&map(show.ord)&between(s"\"")(s"\"")(many$noneOf"\""),(do
 s"<"
 c$j getChar>>=m.show.ord),(do
 s">"
 c$do
 g<-t
 i g(j.putChar.chr)a),m&b,o&(%)&anyChar]
k=many1 digit
i s f g|(reads s::[(Int,String)])>[]=f$(read s::Int)|0<1=g
t=h>>=(o tail>>).c
c n=return n
a=c()
h=head&get
(&)f=fmap f
m=o.(:)
o=modify
u=(\(Right r)->r).parse(sequence_&many e)""
r=(`runStateT`[]).u
s=string
j=lift

5

পাইথন, 1684 1281 টি অক্ষর

সমস্ত বেসিক গল্ফ জিনিস শেষ। এটি সমস্ত উদাহরণ প্রোগ্রাম পরিচালনা করে এবং আউটপুট চরিত্রের জন্য চরিত্রের সাথে মেলে।

import sys,os,copy as C
L=len
S=[]
n=[S]
Q=lambda:S and S.pop()or 0
def P(o):
 if o:n[0].append(o)
def X():x=Q();P(x);P(C.deepcopy(x))
def W():S[-2::]=S[-1:-3:-1]
def R():a,b,c=Q(),Q(),Q();P(a);P(c);P(b)
def A(d):
 a=Q()
 if a and a[0]:a=[1,a[1]+d,lambda:P(a)]
 P(a)
def V():
 a=Q();P(a)
 if a and a[0]-1and L(a[2])>1:r=a[2].pop(0);P(r)
def T():
 b,a=Q(),Q()
 if a!=b:P([0,0,(a[2],[a])[a[0]]+(b[2],[b])[b[0]]])
 else:P(a);P(b)
def r():a=os.read(0,1);F(ord(a)if a else-1)
def q(f):
 a=Q()
 if a and a[0]:os.write(1,(chr(a[1]%256),str(a[1]))[f])
def e(f,x=0):f[2]()if f[0]+f[1]else([e(z)for z in f[2]]if x else P(f))
def w():
 a=Q()
 while a and S and S[-1][0]and S[-1][1]:e(a,1)
def Y():n[:0]=[[]]
def Z():
 x=n.pop(0)
 if x:n[0]+=([[0,0,x]],x)[L(x)+L(n)==2]
D={'%':Q,'#':X,'$':W,'@':R,'+':lambda:A(1),'-':lambda:A(-1),'/':V,'.':T,'<':r,'>':lambda:q(0),'c':lambda:q(1),'w':w,'(':Y,')':Z}
def g(c):D[c]()if L(n)<2or c in'()'else P([0,1,D[c]])
N=['']
def F(x):a=[1,x,lambda:P(a)];a[2]()
def E():
 if'-'==N[0]:g('-')
 elif N[0]:F(int(N[0]))
 N[0]=''
s=j=""
for c in open(sys.argv[1]).read()+' ':
 if j:j=c!="\n"
 elif'"'==c:E();s and map(F,map(ord,s[:0:-1]));s=(c,'')[L(s)>0]
 elif s:s+=c
 elif';'==c:E();j=1
 else:
    if'-'==c:E()
    if c in'-0123456789':N[0]+=c
    else:E();c in D and g(c)

পরীক্ষা :

জড়ো clemint.py , clemtest_data.py , clemtest.py , এবং একটি কম্পাইল করা clemএকটি ডিরেক্টরি ও রান মধ্যে বাইনারি clemtest.py

সম্প্রসারণ :

সবচেয়ে ungolfed সংস্করণ এই এক । যে এক সঙ্গে অনুসরণ করুন।

Sপ্রধান স্ট্যাক। স্ট্যাকের প্রতিটি আইটেম একটি 3-তালিকা, এর মধ্যে একটি:

Constant: [1, value, f]
Atomic: [0, 1, f]
Compound: [0, 0, fs]

ধ্রুবকগুলির জন্য, fএমন একটি ফাংশন যা স্ট্যাকের উপর ধ্রুবককে ধাক্কা দেয়। আত্মতত্ত্ববিদদের জন্য, fএকটি ফাংশন যা ক্রিয়াকলাপগুলির মধ্যে একটি কার্যকর করে (যেমন -, +)। যৌগগুলির জন্য, fsআইটেমগুলির একটি তালিকা।

xecএকটি আইটেম চালায়। যদি এটি একটি ধ্রুবক বা পারমাণবিক হয় তবে এটি কেবল ফাংশনটি সম্পাদন করে। যদি এটি কোনও যৌগিক হয়, যদি এখনও কোনও পুনরাবৃত্তি না ঘটে থাকে তবে এটি প্রতিটি ফাংশন সম্পাদন করে। সুতরাং নির্বাহ (10 20 - 30)ফাংশন প্রতিটি চালানো হবে 10, 20, -, এবং 30চলেই 10 19 30স্ট্যাক। যদি পুনরাবৃত্তি হয়েছে, তবে এটি কেবল স্ট্যাকের মধ্যে যৌগিক কার্যটি ধাক্কা দেয়। উদাহরণস্বরূপ, কার্যকর করার সময় (10 20 (3 4) 30), ফলাফলটি হওয়া উচিত 10 20 (3 4) 30, নয় 10 20 3 4 30

বাসা বেঁধে দেওয়া ছিল কিছুটা কৃপণ। পড়ার সময় আপনি কী করেন (1 (2 (3 4)))? সমাধানটি হ'ল স্ট্যাকের একটি স্ট্যাক থাকে। প্রতিটি নেস্টিং স্তরে, একটি নতুন স্ট্যাককে স্ট্যাকের স্ট্যাকের দিকে ঠেলে দেওয়া হয় এবং সমস্ত ধাক্কা ক্রিয়াকলাপ এই স্ট্যাকের উপরে চলে যায়। তদুপরি, যদি বাসা বাঁধতে থাকে তবে পরমাণু ফাংশনগুলি মৃত্যুদন্ডের পরিবর্তে চাপ দেওয়া হয়। সুতরাং আপনি যদি দেখেন 10 20 (- 30) 40, 10ধাক্কা দেওয়া হয়েছে, তবে 20, তারপরে একটি নতুন স্ট্যাক তৈরি হবে -এবং 30নতুন স্ট্যাকের উপরে ঠেলাঠেলি করা হবে এবং নতুন স্ট্যাকটি )পপ করে এটিকে একটি আইটেমে পরিণত করবে এবং স্ট্যাকের এক স্তরে নীচে ঠেলে দেবে। endnest()হ্যান্ডলগুলি )। এটি কিছুটা জটিল ছিল যেহেতু একটি বিশেষ কেস যখন কেবল একটি আইটেমকে ধাক্কা দেওয়া হয়েছিল এবং আমরা মূল স্ট্যাকের দিকে পিছনে ঠেলে দিচ্ছি। যে, (10)ধ্রুবক ধাক্কা উচিত10, এক ধ্রুবকের সাথে সংমিশ্রণ নয়, কারণ তখন -এবং +কাজ করে না। আমি নিশ্চিত নই যে এটি মূলত কিনা তবে এটি যেভাবে কাজ করে ...

আমার দোভাষী একজন চরিত্র অনুসারে চরিত্রের প্রসেসর - এটি টোকেন তৈরি করে না - সুতরাং সংখ্যা, স্ট্রিং এবং মন্তব্যগুলি সামলে কিছুটা বিরক্তিকর হয়েছিল। Nএকটি বর্তমানে সক্রিয় প্রক্রিয়া-সংখ্যার জন্য একটি পৃথক স্ট্যাক রয়েছে, এবং যে কোনও চরিত্র যা কোনও সংখ্যা নয় প্রক্রিয়াজাত হয়, তার জন্য endnum()আমাকে প্রথমে সেই নম্বরটি পূর্ণ করে স্ট্যাকের উপরে রাখতে হবে কিনা তা দেখতে আমাকে কল করতে হবে। আমরা কোনও স্ট্রিং এ থাকি বা কোনও মন্তব্য বুলিয়ান ভেরিয়েবল দ্বারা ট্র্যাক রাখা হয়; যখন একটি স্ট্রিং বন্ধ হয়ে যায় তখন এটি স্ট্যাকের সমস্ত আভ্যন্তরীণিকে ধাক্কা দেয়। নেতিবাচক সংখ্যাগুলির জন্য কিছু বিশেষ পরিচালনাও প্রয়োজন required

ওভারভিউ জন্য এটি প্রায়। বাকি সব বিল্ট-ইন বাস্তবায়ন করা হয় এবং গভীর কপি করতে নিশ্চিত +, -এবং #


যশ! মজা পেলেন? :)
অরবি

@ অরবি: আমি নিশ্চিত হয়েছি! এটি একটি আকর্ষণীয় ভাষা, অবশ্যই একটি অদ্ভুত ভাষা। আমি আশা করছি যে আমি <1k এর একজন দোভাষী পেতে পারি। অন্যান্য জমাগুলি থেকে কী আশা করবেন তা নিশ্চিত নয়।
ক্লাদিউ

4

সি 837

আরও ভাল (এবং সংক্ষিপ্ত) সংস্করণ খুঁজে পাওয়ার জন্য @ সেলিংক্যাটকে ধন্যবাদ Thanks

এটি সবকিছুকে সাধারণ স্ট্রিং হিসাবে বিবেচনা করে - সমস্ত স্ট্যাক আইটেমগুলি স্ট্রিং, এমনকি ধ্রুবকগুলিও স্ট্রিং।

#define Q strcpy
#define F(x)bcopy(b,f,p-b);f[p-b-x]=!Q(r,p);
#define C(x,y)Q(S[s-x],S[s-y]);
#define N[9999]
#define A Q(S[s++]
#define D sprintf(S[s++],"%d"
#define G(x)}if(*f==x){
#define H(x)G(x)s--;
#define R return
#define Z(x)T(t,u,v)-1||putchar(x);H(
char S N N;s;c;T(b,f,r)char*b,*f,*r;{char*p;strtol(b+=strspn(b," "),&p,0);if(p>b){F(0)R 1;}if(c=*b==40){for(p=++b;c;)c+=(*p==40)-(*p++==41);F(1)R-1;}p++;F(0)*r*=!!*b;R 0;}*P(char*p){if(*p==34)R++p;char*r=P(p+1);D,*p);R r;}E(char*x){char*p,c N,f N,r N,t N,u N,v N;for(Q(c,x);*c;Q(c,p)){Q(t,S[s-1]);if(T(c,f,p=r))A,f);else{{G(64)C(0,1)C(1,2)C(2,3)C(3,0)G(35)A,t);G(36)C(0,2)C(2,1)C(1,0)H(37)H(47)T(t,u,v);*v&&A,v);A,u);H(46)strcat(strcat(S[s-1]," "),t);H(43)D,atoi(t)+1);H(45)D,atoi(t)-1);G(60)D,getchar());H(62)Z(atoi(u))99)Z(*u)119)for(Q(u,t);atoi(S[s-1]);)E(u);G(34)p=P(p);}}}}

এটি অনলাইন চেষ্টা করুন!

আমার আসলটির একটি কম গল্ফযুক্ত সংস্করণ (গল্ফযুক্ত সংস্করণের বিপরীতে এটি খালি না হলে এটি স্ট্যাকটি মুদ্রণ করে এবং এটি-প্যারামিটার নেয় যাতে আপনি কোনও ফাইল থেকে পড়ার পরিবর্তে কমান্ড লাইনে স্ক্রিপ্টটি নির্দিষ্ট করতে পারেন):

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define FIRST_REST(x) memcpy(first, b, p - b); first[p - b - x] = '\0'; strcpy(rest, p);
#define COPY(dest,src) strcpy(stack[size + dest], stack[size + src]);
char stack[9999][9999]; int size = 0;
int token(char *b, char *first, char *rest)
{
    while (*b == 32) b++;
    char *p; int x = strtol(b, &p, 0);
    if (p > b) { FIRST_REST(0) return 1; }
    if (*b == '(') { int c = 1; for (p = ++b; c; ++p) c += (*p == '(') - (*p == ')'); FIRST_REST(1) return -1; }
    p++; FIRST_REST(0) if (!*b) *rest = '\0'; return 0;
}
char *push(char *pointer)
{
    if (*pointer == '\"') return pointer+1;
    char *result = push(pointer+1);
    sprintf(stack[size++], "%d", *pointer);
    return result;
}
void eval(char *x)
{
    char program[9999], first[9999], rest[9999], tos[9999], tmp1[9999], tmp2[9999];
    char *pointer;
    for (strcpy(program, x); *program; strcpy(program, pointer))
    {
        *stack[size] = '\0';
        strcpy(tos, stack[size-1]);
        if (token(program, first, rest))
        {
            pointer = rest;
            strcpy(stack[size++], first);
        }
        else
        {
            pointer = rest;
            if (*first == '@'){
                COPY(0, -1) COPY(-1, -2) COPY(-2, -3) COPY(-3, 0) }
            if (*first == '#')
                strcpy(stack[size++], tos);
            if (*first == '$'){
                COPY(0, -2) COPY(-2, -1) COPY(-1, 0) }
            if (*first == '%')
                size--;
            if (*first == '/'){
                size--; token(tos, tmp1, tmp2); if (*tmp2) strcpy(stack[size++], tmp2); strcpy(stack[size++], tmp1); }
            if (*first == '.'){
                size--; strcat(stack[size - 1], " "); strcat(stack[size - 1], tos); }
            if (*first == '+'){
                size--; sprintf(stack[size++], "%d", atoi(tos) + 1); }
            if (*first == '-'){
                size--; sprintf(stack[size++], "%d", atoi(tos) - 1); }
            if (*first == '<')
                sprintf(stack[size++], "%d", getchar());
            if (*first == '>'){
                size--; if (token(tos, tmp1, tmp2) == 1) putchar(atoi(tmp1)); }
            if (*first == 'c'){
                size--; if (token(tos, tmp1, tmp2) == 1) printf("%s", tmp1); }
            if (*first == 'w'){
                size--; strcpy(tmp1, tos); while (atoi(stack[size - 1])) eval(tmp1); }
            if (*first == '\"')
                pointer=push(pointer);
        }
    }
}
int main(int argc, char **argv)
{
    char program[9999] = "";
    int i = 0, comment = 0, quote = 0, space = 0;
    if (!strcmp(argv[1], "-e"))
        strcpy(program, argv[2]);
    else
    {
        FILE* f = fopen(argv[1], "r");
        for (;;) {
            char ch = fgetc(f);
            if (ch < 0) break;
            if (!quote) {
                if (ch == '\n') comment = 0;
                if (ch == ';') comment = 1;
                if (comment) continue;
                if (ch <= ' ') { ch = ' '; if (space++) continue; }
                else space = 0;
            }
            if (ch == '\"') quote = 1 - quote;
            program[i++] = ch;
        }
        fclose(f);
    }
    eval(program);
    for (int i = 0; i < size; i++) printf("%03d: (%s)\r\n",size-i,stack[i]);
    return 0;
}

নিস! চিত্তাকর্ষক আপনাকে আঘাত সি আমি পাইথন সমাধান আমার খাটো সংস্করণ আপলোড করতে হবে, আমি 60 বাইট বা তাই বন্ধ শেভ পরিচালিত .. আমি এখনও অবাক একটা ভিন্ন পদ্ধতি যা কম পথ উত্পাদ হবে 1000 অক্ষরের চেয়ে যদি
Claudiu

@ ক্লাডিউ আমিও ভেবেছিলাম - তবে কীভাবে তা বুঝতে পারি না।
জেরি যেরেমিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.