क्लीम दुभाषिया लिखें


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 बिट्स होने चाहिए, सभी संदर्भ कार्यक्रमों को चलाने के लिए स्टैक काफी बड़ा होना चाहिए, आदि कई विवरणों को तराशा नहीं गया है। यहाँ क्योंकि पूर्ण विकसित भाषा विनिर्देश पोस्ट करने के लिए निषेधात्मक रूप से बड़ा होगा (और मैंने अभी तक एक भी नहीं लिखा है: पी)। जब संदेह हो, तो संदर्भ कार्यान्वयन की नकल करें।

क्लेम के लिए esolangs.org पेज

C में संदर्भ कार्यान्वयन


आप कहते हैं कि आपने अभी तक भाषा विनिर्देश नहीं लिखा है। मैं इसे तब लेता हूं कि आप भाषा के प्रवर्तक हैं?
COTO

@ कोटो यह सही है। मैंने भाषा बनाई।
Orby

5
बहुत महत्वपूर्ण प्रश्न: क्या आप इसे "केलेम" या "सी-लेम" उच्चारण करते हैं?
मार्टिन एंडर

4
@ MartinBüttner: "क्लेम" :)
Örby

2
आप उस दिशा को निर्दिष्ट करना चाह सकते हैं जिसमें @ कमांड 3 शीर्ष फ़ंक्शन को घुमाता है। (001 -> 002 -> 003 -> 001, या 003 -> 002 -> 001 -> 003)
kwokkie

जवाबों:


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एक फ़ंक्शन है जो स्टैक पर स्थिरांक को धक्का देता है। Atmoics के लिए, 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()देखने के लिए कॉल करना होगा कि क्या मुझे पहले उस नंबर को पूरा करना चाहिए और इसे स्टैक पर रखना चाहिए। चाहे हम एक स्ट्रिंग में हों या एक टिप्पणी को बूलियन चर द्वारा ट्रैक रखा गया हो; जब एक तार बंद हो जाता है तो यह स्टैक पर सभी सराय को धकेल देता है। नकारात्मक संख्याओं के साथ-साथ कुछ विशेष हैंडलिंग की आवश्यकता होती है।

यह अवलोकन के लिए इसके बारे में है। बाकी सब बनाया-इन को लागू किया गया था, और में गहरी प्रतियां करने के लिए सुनिश्चित करने के +, -और #


कुडोस! क्या आपको मजा आया? :)
ओर्बी

@ ओबी: मुझे यकीन है कि किया था! यह एक दिलचस्प भाषा है, निश्चित रूप से एक अजीब है। मुझे उम्मीद है कि मुझे एक दुभाषिया मिल सकता है जो <1k है। निश्चित नहीं कि अन्य सबमिशन से क्या उम्मीद की जाए।
क्लाउडीयू

4

C 837

बहुत बेहतर (और कम) संस्करण खोजने के लिए @ceilingcat का धन्यवाद

यह सब कुछ सरल तारों के रूप में मानता है - सभी स्टैक आइटम तार हैं, यहां तक ​​कि स्थिरांक भी तार हैं।

#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 से कम पात्रों का उत्पादन करेगा
क्लाउडी

@ कोलियु मैंने भी ऐसा सोचा था - लेकिन मैं यह पता नहीं लगा सका कि कैसे।
जेरी जेरेमिया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.