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


99

99 ("निन्यानबे" उच्चारण) एक नई Esoteric प्रोग्रामिंग भाषा है ( 99 के साथ भ्रमित नहीं होना चाहिए , इटैलिक पर ध्यान दें)। इस चुनौती में आपका काम 99 के लिए एक दुभाषिया लिखना है जो जितना संभव हो उतना कम हो। सबसे कम बाइट्स के साथ सबमिशन जीत जाता है। टाईब्रेकर पहले पोस्ट किए गए सबमिशन में जाता है।

चूँकि यह प्रश्न सामान्य से कुछ अधिक गहरा है, और मैं अच्छे उत्तर देखने के लिए उत्सुक हूं, मैं अपने पसंदीदा उत्तर (जरूरी नहीं कि विजेता) को 250 प्रतिनिधि इनाम दूं।

99 कल्पना

99 एक अनिवार्य भाषा है। 99 प्रोग्राम में प्रत्येक पंक्ति एक एकल स्टेटमेंट है , और निष्पादन के दौरान, निर्देश सूचक शीर्ष रेखा पर शुरू होता है और क्रम में बाद की प्रत्येक लाइनों से गुजरता है, उन्हें रास्ते में निष्पादित करता है। अंतिम पंक्ति निष्पादित होने पर कार्यक्रम समाप्त हो जाता है। गोटो के बयान निर्देश सूचक के मार्ग को पुन: उत्पन्न कर सकते हैं।

Newline, space, और 9केवल तीन अक्षर हैं जो 99 प्रोग्राम में मायने रखते हैं । अन्य सभी पात्रों को पूरी तरह से नजरअंदाज कर दिया जाता है। इसके अतिरिक्त, प्रत्येक पंक्ति पर अनुगामी रिक्त स्थान को अनदेखा किया जाता है, और एक पंक्ति में कई स्थानों को एक स्थान के रूप में पढ़ा जाता है। ("न्यूलाइन" किसी भी सामान्य लाइन ब्रेक एन्कोडिंग को संदर्भित करता है । यह कोई फर्क नहीं पड़ता कि आपका इंटरप्रिटर कौन उपयोग करता है।)

तो यह कार्यक्रम:

   9      BLAH        99   9a9bb9c9
9 this line and the next have 6 trailing spaces 9      
      

इस कार्यक्रम के समान है:

 9 99 9999
9 9

चर

99 में चर सभी के नाम हैं जो एक या एक से अधिक 9के साथ मिलकर ( 9+रेगेक्स में) हैं। उदाहरण के लिए, 9, 99, और 9999999999सभी अलग चर हैं। स्वाभाविक रूप से, असीम रूप से कई (स्मृति सीमाओं को छोड़कर) हैं।

प्रत्येक चर का मान एक हस्ताक्षरित, मनमाना सटीक पूर्णांक है। डिफ़ॉल्ट रूप से, प्रत्येक चर को अपने स्वयं के संख्यात्मक प्रतिनिधित्व को सौंपा जाता है। इसलिए जब तक यह पुन: असाइन नहीं किया गया है, चर 9का मान 9 नंबर है, और चर 99का मान 99 नंबर है, और इसी तरह। जब तक वे स्पष्ट रूप से निर्दिष्ट नहीं हो जाते, तब तक आप चर को सादे संख्या के रूप में मान सकते हैं।

मैं नीचे Vएक मनमाना चर नाम का उल्लेख करने के लिए उपयोग करूंगा ।
के प्रत्येक उदाहरण के Vसाथ प्रतिस्थापित किया जा सकता है 9, 99, 999, 9999, आदि

बयान

99 में पांच अलग-अलग स्टेटमेंट टाइप हैं । 99 प्रोग्राम की प्रत्येक पंक्ति में ठीक एक कथन होता है।

यहाँ वर्णित वाक्यविन्यास मानता है कि सभी बाहरी वर्ण हटा दिए गए हैं, सभी अनुगामी रिक्त स्थान हटा दिए गए हैं, और कई स्थानों के सभी दृश्यों को एकल रिक्त स्थान से बदल दिया गया है।

1. कोई ऑपरेशन नहीं


एक खाली लाइन एक नो-ऑप है । यह कुछ नहीं करता है (अनुदेश सूचक को बढ़ाने के अलावा)।

2. आउटपुट

V

एक Vलाइन पर एक वैरिएबल स्टैडआउट करने के लिए वैरिएबल प्रिंट करता है।

यदि Vविषम संख्या में 9( 9,, 999आदि) है, तो V9 से विभाजित के पूर्णांक मान को मुद्रित किया जाएगा (दशमलव में)।

यदि Vसम संख्या 9( 99, 9999इत्यादि) है, तो कोड के साथ ASCII वर्ण V9, mod 128 से विभाजित होगा। (यह (V / 9) % 128मान 0 से 127 तक है।)

उदाहरण : कार्यक्रम

9
9999

छपता था 1W। पहली पंक्ति प्रिंट करती है 1क्योंकि 9/9 है 1. दूसरी लाइन प्रिंट Wक्योंकि 9999/9 1111 है, और 1111 मॉड 128 87 है, और 87 के लिए वर्ण कोड है W

ध्यान दें कि लाइन ब्रेक आउटपुट टोकन के बीच मुद्रित नहीं होते हैं। \nलाइन ब्रेक के लिए स्पष्ट रूप से मुद्रित करने की आवश्यकता है।

3. इनपुट

 V

एक अग्रणी स्थान के साथV एक लाइन पर एक एकल चर स्टड से इनपुट लेता है और उस चर में संग्रहीत करता है।

यदि Vविषम संख्या है, 9तो उपयोगकर्ता किसी भी हस्ताक्षरित पूर्णांक में टाइप कर सकता है, और Vउस मान के 9 गुना पर सेट किया जाएगा।

यदि Vसम संख्या है 9तो उपयोगकर्ता किसी भी ASCII वर्ण में टाइप कर सकता है, और Vइसके वर्ण कोड के 9 गुना पर सेट किया जाएगा।

उदाहरण : दिया -57और Aइनपुट के रूप में, यह कार्यक्रम

 9
9
 99
99

उत्पादन होगा -57A। आंतरिक रूप से, चर 9का मान -513 99होगा , और इसका मान 585 होगा।

आपका दुभाषिया यह मान सकता है कि इनपुट हमेशा वाक्यात्मक रूप से मान्य होते हैं।

4. असाइनमेंट

यह कथन मनमाने ढंग से लंबा हो सकता है। यह एक लाइन पर दो या अधिक चर हैं, जो रिक्त स्थान द्वारा अलग किए गए हैं:

V1 V2 V3 V4 V5 ...

यह सभी सूचकांकों के सम योगों को दर्शाता है, विषम सूचकांकों (छोड़कर ) के साथ ऋण का योग है । मान संदर्भ द्वारा नहीं, मान से होते हैं।V1VVV1

अधिकांश भाषाओं में इसका अनुवाद किया जा सकता है ।V1 = V2 - V3 + V4 - V5 + ...

इसलिए, यदि केवल दो चर हैं, तो यह सामान्य कार्य है:

V1 V2V1 = V2

यदि तीन हैं, तो यह घटाव है:

V1 V2 V3V1 = V2 - V3

और +/ -चिह्न प्रत्येक अतिरिक्त चर के साथ आगे और पीछे स्विच करता रहता है:

V1 V2 V3 V4V1 = V2 - V3 + V4

उदाहरण : यह कार्यक्रम आउटपुट होगा 1110123:

999           Prints triple-nine divided by nine (111).
999 9 9       Assigns triple-nine to zero (nine minus nine).
999           Prints triple-nine divided by nine (0)
9 999 9       Assigns single-nine to negative nine (zero minus nine).
999 999 9     Adds nine to triple-nine (really subtracts negative nine).
999           Prints triple-nine divided by nine (1).
999 999 9     Adds nine to triple-nine (really subtracts negative nine).
999           Prints triple-nine divided by nine (2).
999 999 9     Adds nine to triple-nine (really subtracts negative nine).
999           Prints triple-nine divided by nine (3).

5. गोटो (यदि सभी शून्य कूदें)

यह कथन मनमाने ढंग से लंबा भी हो सकता है। यह एक पंक्ति पर दो या अधिक चर है, जो अंतरिक्ष द्वारा अलग किए जाते हैं, एक अग्रणी स्थान के साथ :

 V1 V2 V3 V4 V5 ...

यदि इसके अलावा कुछ मान गैर-शून्य हैं, तो यह एक नो-ऑप की तरह व्यवहार करता है। निर्देश पॉइंटर को हमेशा की तरह अगली पंक्ति में ले जाया जाता है।V1

यदि सभी मूल्यों के अलावा हैं शून्य है, तो अनुदेश सूचक संख्या लाइन ले जाया जाता है । लाइनें शून्य-अनुक्रमित हैं, इसलिए यदि शून्य है, तो सूचक शीर्ष रेखा पर जाता है। कार्यक्रम समाप्त हो जाता है (आमतौर पर, त्रुटि के बिना) यदि नकारात्मक है या उच्चतम संभव सूचकांक (लाइनों की संख्या शून्य से एक) से बड़ा है।V1 V1V1V1

ध्यान दें कि यहां 9 से विभाजित नहीं किया गया था। और चूंकि एक चर का होना असंभव है, इसलिए यह 9 का गुणक नहीं है, केवल 9 के गुणक वाले लाइन नंबर को जंप किया जा सकता है।V1

उदाहरण:

यह कार्यक्रम 1हमेशा के लिए छपेगा:

9          Prints single-nine divided by nine (always 1).
99 9 9     Assigns double-nine to zero.
 99 99     Jumps to line zero (top line) if double-nine is zero.

यह कार्यक्रम

99999999                                              Print G.
999 99                                                Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999    Set 10-nine to zero.
99999999999 9999999999                                Set 11-nine to zero.





999                                                   Print triple-nine's value divided by nine. (This is the ninth line.)
99999999                                              Print G.
999 999 9                                             Subtract nine from triple-nine.
 99999 999                                            Jump to line 5-nines if triple-nine is zero (ends program).
 9 99999999999 9999999999                             Jump to line nine if 10-nine and 11-nine are zero (always jumps).

घटते क्रम में 11 से 1 की संख्या में उत्पादन करेगा, जो कि घिरा हुआ है G:

G11G10G9G8G7G6G5G4G3G2G1G

अतिरिक्त जानकारिया

आदर्श दुभाषिया एक तर्क के रूप में 99 प्रोग्राम फ़ाइल नाम के साथ कमांड लाइन से चलेगा । I / O कमांड लाइन में फ्लाई पर भी किया जाएगा।

हालाँकि, आप बस एक दुभाषिया फ़ंक्शन लिख सकते हैं जो प्रोग्राम में स्ट्रिंग के साथ-साथ इनपुट टोकन (जैसे ["-57", "A"]) की एक सूची के रूप में लेता है । फ़ंक्शन को आउटपुट स्ट्रिंग को प्रिंट या वापस करना चाहिए।

दुभाषिया चलाने और I / O को संभालने के कुछ अलग तरीके ठीक हैं यदि ये विकल्प आपकी भाषा में असंभव हैं।


बोनस: 99 में कुछ अच्छा लिखें और मैं इसे एक उदाहरण के रूप में ख़ुशी से इस पोस्ट में डालूँगा।


आशा है कि आपको मेरी 99 वीं चुनौती पसंद आई होगी! : डी


9
मैं upvoting करार दिया, लेकिन अपने वर्तमान स्कोर 9 है ...
wchargin

30
@Chargin अब लग रहा है कि आपको इसे 99 पाने की कोशिश करनी होगी।
trlkly

5
निश्चित रूप से स्वयं-होस्टिंग के लिए एक बोनस है ( 99 में 99 दुभाषिया लिखना ), नहीं?
गाबे

5
@ गैब जैसा जवाब शायद बाउंटी को मिलेगा, लेकिन अगर वह एकमात्र जवाब होता, तो दुभाषिया की क्या व्याख्या होती? ;)
केल्विन के शौक

1
@Optimizer यह काम करता है: pastebin.com/raw.php?i=h73q58FN
coredump

जवाबों:


16

सीजेएम, 157 बाइट्स

{:I;_N" 9"+--N/:P:,$W=){1a*Ab}%:V;{PT):T(=:LS%_{LS#\:,_,({(\{V=}%@{V-1@{2$*+0@-\}*\;t:V;}{:|T@V=9*?:T;}?}{~\{_V=\1&!{128%c}*o}{VIW):W=it:V;}?}?}R?Tg)TP,<*}g}

इसे ऑनलाइन आज़माएं:

व्याख्या

उचित इंडेंटेशन और टिप्पणियों के साथ इसे प्रारूपित करने की कोशिश शायद हमेशा के लिए होगी, इसलिए मैं सिर्फ एक एल्गोरिथम सारांश दूंगा।

कोड अनाम कार्यों के लिए एक ब्लॉक, सीजाम का एनालॉग है। ब्लॉक प्रोग्राम स्ट्रिंग और इनपुट की सूची को स्टैक पर निष्पादित होने की उम्मीद करता है।

प्रारंभ में तीन चरण होते हैं। सबसे पहले, इनपुट सूची सहेजी जाती है। फिर, प्रोग्राम का प्रत्येक वर्ण जो अर्थपूर्ण नहीं है, हटा दिया जाता है और परिणाम को लाइनों की सूची में विभाजित किया जाता है और सहेजा जाता है। अंत में, वैरिएबल सूची को प्रारंभ किया जाता है। यह सूची प्रत्येक चर का नाम देती है, जिसे नाम की लंबाई से अनुक्रमित किया जाता है, इसके मूल्य को 9 से विभाजित किया जाता है (एक चर कभी ऐसा मान नहीं रख सकता है जो 9 से अधिक नहीं हो, और इस परिवर्तन से गोटो लाभ को छोड़कर सभी ऑपरेशन)। सूची को सबसे लंबी लाइन की लंबाई तक आरंभीकृत किया जाता है, जो वर्तमान में मौजूद सबसे लंबे वेरिएबल नाम पर एक ऊपरी सीमा है। प्रारंभिक चर मानों के कारण कुछ अंतर्निहित आरोपण भी होता है: लाइन नंबर 0 है और इनपुट इंडेक्स -1 है।

दुभाषिया के रूप में कार्यान्वित किया जाता है कि कोई अपेक्षा करता है: एक लूप जो अगली पंक्ति को पढ़ता है, पंक्ति संख्या को बढ़ाता है, और रेखा को निष्पादित करता है जबकि रेखा संख्या मौजूदा रेखा को इंगित करती है। लाइन पार्सिंग पहले चेक करता है कि लाइन खाली नहीं है, फिर शाखाएं चाहे 1 या> 1 पर आधारित हों, फिर एक अग्रणी स्थान था या नहीं पर आधारित शाखाएं। इन चार शाखाओं ने चार (ज्यादातर को छोड़कर) संचालन का अनुकरण ज्यादातर सीधे-सादे तरीके से किया है, यद्यपि हर चीज की तरह एग्रेसिवली गोल्फिंग की जाती है। नोट का शायद एक अनुकूलन यह है कि, चूंकि एक वैध इनपुट अनुक्रम को हमेशा प्रोग्राम द्वारा अपेक्षित प्रकार का एक तत्व उत्पन्न करना चाहिए, इसलिए मैं चर नाम की लंबाई के आधार पर इनपुट के लिए अलग-अलग मामले बनाना छोड़ देता हूं। यह केवल माना जाता है कि इनपुट सूची से पढ़ा गया तत्व अपेक्षित प्रकार का है।


15
+1। काफी छोटा। अब, क्या आप 99 में CJam दुभाषिया लिख ​​सकते हैं ? ;-)
coredump

9
@ कॉर्डम्प *
रनर ११

धिक्कार है, मैं केवल १ ९ ५ प्राप्त कर सकता हूं और फिर मैंने आशा खो दी और छोड़ दिया: पी
ऑप्टिमाइज़र

नकारात्मक मानों को प्रिंट करते समय यह सही मोड्यूलो नहीं लेता है। यह बदलकर इसे ठीक किया जा सकता है 128%के साथ 128,=
मार्टिन एंडर

26

पायथन 3, 421 414 410 404 388 395 401 बाइट्स

golfed:

import sys,re
v,i,c,g,L={},0,[re.sub('( ?)[^9]+','\\1',l).rstrip().split(' ')for l in open(sys.argv[1])],lambda i:v.get(i,int(i)//9),len
while-1<i<L(c):
 d=c[i];l=L(d);e,*f=d;i+=1
 if l>1:
  x,*y=f
  if e:w=list(map(g,f));v[e]=sum(w[::2])-sum(w[1::2])
  elif l==2:j=input();v[x]=int(j)if L(x)%2 else ord(j)
  elif~-any(g(j)for j in y):i=g(x)*9
 elif e:w=g(e);print(w if L(e)%2 else chr(w%128),end='')

Ungolfed:

import sys, re

# Intialise variable table.
vars_ = {}
get_var = lambda i: vars_.get(i, int(i)//9)

# Parse commands.
commands=[re.sub('( ?)[^9]+','\\1',l).rstrip().split(' ') for l in open(sys.argv[1])]

# Run until the current instruction index is out of bounds.
index=0
while 0 <= index < len(commands):
    # Get the current command and increment the index.
    command = commands[index]
    l = len(command)
    first = command[0]
    index += 1

    if l > 1:
        # Handle the "assignment" command.
        if first:
            operands = [get_var(i) for i in command[1:]]
            vars_[first] = sum(operands[0::2]) - sum(operands[1::2])
        # Handle the "input" command.
        elif l==2:
            inp = input()
            vars_[command[1]] = int(inp) if len(command[1]) % 2 else ord(inp)
        # Handle the "goto" command.
        elif not any(get_var(i) for i in command[2:]):
            index = get_var(command[1]) * 9
    # Handle the "output" command.
    elif first:
        val = get_var(first)
        print(val if len(first) % 2 else chr(val % 128),end='')

बहुत ज्यादा सिर्फ कल्पना का एक शाब्दिक कार्यान्वयन, जहाँ तक मैं इसे प्राप्त कर सकता हूँ नीचे गोल्फ।

एकमात्र स्रोत के रूप में 99 स्रोत-कोड फ़ाइल की आपूर्ति करके कमांड लाइन से चलाएँ (उदाहरण के लिए ओपी से अंतिम उदाहरण):

> python3 ninetynine.py countdown.txt
G11G10G9G8G7G6G5G4G3G2G1G
>

एक अतिरिक्त बोनस के रूप में, यहाँ एक (बल्कि गरीब) में "99 बोतलें" के कार्यान्वयन है 99 : http://pastebin.com/nczmzkFs


1
@DLosc: आपके पहले बिंदु के बारे में: मैं भी हालांकि elseएक संख्या को हटा दिया जा सकता है, लेकिन जब मैंने इसे पहले कोशिश की तो मुझे एक वाक्य त्रुटि मिली। आपके अन्य सुझावों की बहुत सराहना की जाती है!
मैक

3
@coredump: जिस तरह से कल्पना लिखी जाती है, प्रत्येक चर में हमेशा एक मान होता है जो नौ से विभाज्य होता है। मैंने चर को किसी भी मूल्य पर लेने की अनुमति देने के लिए इसे और अधिक संक्षिप्त पाया , और केवल नौ से आवश्यकतानुसार गुणा / विभाजित करना (विशेष रूप से, gotoदिनचर्या में और जब चर का डिफ़ॉल्ट मूल्य प्राप्त करना होता है)। जहां तक ​​भाषा के उपयोगकर्ता का सवाल है, इससे कोई फर्क नहीं पड़ता।
मैक

2
elseइससे पहले ही नहीं , सिर्फ अंतरिक्ष। जैसे 3*n+1if n%2else n//2
DLosc

1
@ डॉस: क्षमा करें, मुझे याद है - मैं वास्तव में अंतरिक्ष का मतलब था, नहीं else। उदाहरण के लिए, मैंने print(w if L(e)%2 else chr(w%128))साथ बदलने की कोशिश की print(w if L(e)%2else chr(w%128))और एक सिंटैक्स अपवाद मिला।
मैक

1
अजीब - मैंने ideone.com पर परीक्षण किया और यह काम किया, लेकिन आप सही हैं, यह वास्तविक पायथन 3 दुभाषिया (उबंटू पर 3.4.0) में काम नहीं करता है। इस सुझाव के पोस्ट स्पष्ट: एक नंबर वर्णमाला टोकन के बाद सामान्य रूप में काम करता है, लेकिन नहीं के साथ शुरू टोकन eया E, और (टिप्पणी से) नहीं करने के लिए 0orया तो।
DLosc

16

कॉमन लिस्प, 1180 857 837 836 बाइट्स

मुझे पता है कि यह जीतने वाला नहीं है, लेकिन मैंने इस पर मज़ाक उड़ाया था। मैं 343 बाइट्स निकालने में कामयाब रहा, जो कि सीजेएम में लिखे गए दो 99 दुभाषियों से अधिक है ।

इसके अलावा, काफी मनोरंजक, जितना अधिक मैं इसे संपीड़ित करने की कोशिश करता हूं, उतना ही मैं इस बात के लिए राजी हूं कि कॉमन लिस्प के लिए, कोड को संकलन करने की तुलना में कम है कि इसे मक्खी पर व्याख्या करने की कोशिश करें।

(defmacro g(g &aux a(~ -1)> d x q(m 0)r v(n t)c(w 0)? u z)(flet((w(n p)(intern(format()"~a~a"p n))))(#1=tagbody %(case(setf c(ignore-errors(elt g(incf ~))))(#\  #2=(when(> w 0)(pushnew w v)(if u()(setq ?(oddp w)))(#5=push(w w'V)u)(setf w 0))(setf z t))(#\9(incf w)(setf >(or >(and n z))z()n()))((#\Newline())#2#(#5#(when u(setf u(reverse u)a(pop u))(if >(if u`(when(every'zerop(list,@u))(setf @,a)(go ^))`(setf,a,(if ?'(read)'(char-code(read-char)))))(if u`(setf,a,(do(p m)((not u)`(-(+,@p),@m))(#5#(pop u)p)(#5#(if u(pop u)0)m)))`(princ,(if ? a`(code-char(mod,a 128)))))))r)(incf m)(setf ?()u()z()>()n t)))(if c(go %))$(decf m)(setq d(pop r))(if d(#5# d x))(when(=(mod m 9)0)(#5#(w #3=(/ m 9)'L)x)(#5#`(,#3#(go,(w #3#'L)))q))(if(>= m 0)(go $)))`(let(@,@(mapcar(lambda(n)`(,(w n'V),(/(1-(expt 10 n))9)))v))(#1#,@x(go >)^(case @,@q)>))))
  • लेक्सिकल विश्लेषण और कोड जनरेशन इंटरलीव्ड हैं: मैं आंतरिक प्रतिनिधित्व को संग्रहीत नहीं करता हूं, लेकिन सीधे प्रत्येक पंक्ति को संसाधित करता हूं।
  • tagbody2 छोरों को करने के लिए एक एकल है:

     (... (tagbody % ... (go %) $ ... (go $)) result)
    
  • में स्थानीय चर घोषित किए जाते हैं &aux

  • एक क्लोजर उत्पन्न नहीं करते हैं, लेकिन सीधे व्याख्या किए गए कोड
  • आदि।

अपुष्ट, टिप्पणी की

(defmacro parse-99
    (string &aux
              (~ -1) ; current position in string
              a      ; first variable in a line 
              >      ; does current line starts with a leading space?
              d      ; holds a statement during code generation
              x      ; all statements (labels + expressions)
              q      ; all generated case statements 
              (m 0)  ; count program lines (first increases, then decreases) 
              r      ; list of parsed expressions (without labels)
              v      ; set of variables in program, as integers: 999 is 3
              (n t)  ; are we in a new line without having read a variable? 
              c      ; current char in string 
              (w 0)  ; currently parsed variable, as integer 
              ?      ; is first variable odd? 
              u      ; list of variables in current line, as integers
              z)     ; is the last read token a space?
  (flet((w(n p)
          ;; produce symbols for 99 variables
          ;; e.g. (10 'V) => 'V10
          ;;      (4 'L)  => 'L4
          (intern(format()"~a~a"p n))))
    (tagbody
     parse
       (case (setf c
                   ;; read current char in string,
                   ;; which can be NIL if out-of-bounds
                   (ignore-errors(aref string (incf ~))))

         ;; Space character
         (#\Space
          #2=(when(> w 0)
               (pushnew w v)            ; we were parsing a variable, add it to "v"
               (if u()(setq ?(oddp w))) ; if stack is empty, this is the first variable, determine if odd
               (push(w w'V)u)           ; add to stack of statement variable
               (setf w 0))              ; reset w for next variable

          ;; Space can either be significant (beginning of line,
          ;; preceding a variable), or not. We don't know yet.
          (setf z t))

         ;; Nine
         (#\9
          (incf w) ; increment count of nines
          (setf >(or >(and n z)) ; there is an indent if we were
                                 ; starting a newline and reading a
                                 ; space up to this variable (or if we
                                 ; already know that there is an
                                 ; indent in current line).
                ;; reset z and n
                z()n()))

         ;; Newline, or end of string
         ((#\Newline())
          #2#  ;; COPY-PASTE the above (when(> w 0)...) statement,
               ;; which adds previously read variable if necessary.

          ;; We can now convert the currently read line.
          ;; We push either NIL or a statement into variable R.

          (push(when u
                     (setf u (reverse u) ; we pushed, we must reverse
                           a (pop u))    ; a is the first element, u is popped
                     (if >
                         ;; STARTS WITH LEADING SPACE
                         (if u
                             ;; JUMP
                             `(when(every'zerop(list,@u))(setf @,a)(go ^))

                             ;; READ
                             `(setf,a,(if ?'(read)'(char-code(read-char)))))

                         ;; STARTS WITH VARIABLE
                         (if u

                             ;; ARITHMETIC
                             `(setf,a,(do(p m) ; declare p (plus) and m (minus) lists

                                         ;; stopping condition: u is empty
                                         ((not u)
                                          ;; returned value: (- (+ ....) ....)
                                          `(-(+,@p),@m))

                                        ;; alternatively push
                                        ;; variables in p and m, while
                                        ;; popping u

                                        (push(pop u)p)

                                        ;; first pop must succeed, but
                                        ;; not necessarly the second
                                        ;; one.  using a zero when u
                                        ;; is empty covers a lot of
                                        ;; corner cases.

                                        (push(if u (pop u) 0) m)))

                             ;; PRINT
                             `(princ,(if ? a`(code-char(mod,a 128)))))))
               r)
          ;; increase line count
          (incf m)
          ;; reset intermediate variables
          (setf ?()u()z()>()n t)))

       ;; loop until end of string
       (if c (go parse))


     build
       ;;; Now, we can add labels in generated code, for jumps

       ;; decrease line count M, which guards our second loop
       (decf m)

       ;; Take generated statement from R
       (setq d(pop r))

       ;; we pop from R and push in X, which means X will eventually
       ;; be in the correct sequence order. Here, we can safely
       ;; discard NIL statements.

       ;; We first push the expression, and THEN the label, so that
       ;; the label ends up being BEFORE the corresponding statement.
       (if d(push d x))

       ;; We can only jump into lines multiple of 9
       (when (=(mod m 9)0)
         ;; Push label
         (push(w #3=(/ m 9)'L)x)
         ;; Also, build a case statement for the jump table (e.g. 2(go L2))
         (push`(,#3#(go,(w #3#'L)))q))
       ;; loop
       (if(>= m 0)(go build)))

    ;; Finally, return the code
    `(let(@ ; target of a jump instruction

          ;; other variables: V3 represents 999 and has a default value of 111
          ,@(mapcar(lambda(n)`(,(w n'V),(/(1-(expt 10 n))9)))v))

       ;; build a tagbody, inject statements from X and case statements from Q
       ;; label ^ points to jump table : we go to ^ each time there is a JUMP
       ;; label > is the end of program

       ;; note that if the case does not match any authorized target
       ;; address, we simply end the programs.
       (tagbody,@x(go >)^(case @,@q)>))))

हम मूल्यांकन के दौरान मानक इनपुट / आउटपुट का उपयोग करते हैं, जिसका अर्थ है कि हम मानक readऔर princकार्यों का उपयोग करते हैं। इसलिए, परिणामी कोड को कमांड-लाइन पर निष्पादन योग्य बनाया जा सकता है, जैसा कि नीचे दिखाया गया है।

99 प्रोग्राम चलाते समय इनपुट पूरी तरह से अच्छी तरह से साफ नहीं किए जाते हैं : यह माना जाता है कि उपयोगकर्ता जानता है कि किस तरह के मूल्यों की उम्मीद है।

कूदते समय केवल संभव रनवे ओवरहेड हो सकता है, क्योंकि हमें एक चर के मूल्य का मूल्यांकन करना चाहिए और एक लेबल के लिए उस मूल्य से मेल खाना चाहिए। सिवाय इसके कि, दुभाषिया काफी कुशल होगा।

मैक से चतुर प्रेक्षक के आधार पर जिसे हमें हर बार 9 से विभाजित करने और गुणा करने की आवश्यकता नहीं है, वर्तमान संस्करण निष्पादन के दौरान कभी भी विभाजित नहीं होता है और न ही 9 से गुणा करता है।

उदाहरण

अगर हम बदलने के defmacroद्वारा defun, हम तैयार किए गए कोड को देखते हैं। उदाहरण के लिए:

(g
"99999999                                              Print G.
999 99                                                Set triple-nine to ninety-nine.
9999999999 9999999999 9999999999 99 99 9 9 999 999    Set 10-nine to zero.
99999999999 9999999999                                Set 11-nine to zero.





999                                                   Print triple-nine's value divided by nine. (This is the ninth line.)
99999999                                              Print G.
999 999 9                                             Subtract nine from triple-nine.
 99999 999                                            Jump to line 5-nines if triple-nine is zero (endsprogram).
 9 99999999999 9999999999                             Jump to line nine if 10-nine and 11-nine are zero (alwa

")

यहाँ परिणामी कोड है:

(LET (@
      (V5 11111)
      (V11 11111111111)
      (V1 1)
      (V10 1111111111)
      (V2 11)
      (V3 111)
      (V8 11111111))
  (TAGBODY
   L0
    (PRINC (CODE-CHAR (MOD V8 128)))
    (SETF V3 (- (+ V2) 0))
    (SETF V10 (- (+ V3 V1 V2 V10) V3 V1 V2 V10))
    (SETF V11 (- (+ V10) 0))
   L1
    (PRINC V3)
    (PRINC (CODE-CHAR (MOD V8 128)))
    (SETF V3 (- (+ V3) V1))
    (WHEN (EVERY 'ZEROP (LIST V3)) (SETF @ V5) (GO ^))
    (WHEN (EVERY 'ZEROP (LIST V11 V10)) (SETF @ V1) (GO ^))
    (GO >)
   ^
    (CASE @ (0 (GO L0)) (1 (GO L1)))
   >))

जब निष्पादित किया जाता है, तो "G11G10G9G8G7G6G5G4G3G2G2G" प्रिंट करता है

कमांड लाइन

हम कोर को डंप करके और toplevelफ़ंक्शन को निर्दिष्ट करके एक निष्पादन योग्य बना सकते हैं । एक फ़ाइल निर्धारित करें boot.lispजहाँ आपने नाम दिया है defmacro, और फिर निम्नलिखित लिखें:

(defun main()(parse-99 <PROGRAM>))
(save-lisp-and-die "test-99" :executable t :toplevel #'main)

रनिंग sbcl --load boot.lispनिम्न आउटपुट देता है:

$ sbcl --load boot.lisp 
This is SBCL 1.2.8.32-18c2392, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into test-99:
writing 5824 bytes from the read-only space at 0x20000000
writing 3120 bytes from the static space at 0x20100000
writing 55771136 bytes from the dynamic space at 0x1000000000
done]

फिर, संकलित 99 कार्यक्रम चल रहा है :

$ time ./test-99
G11G10G9G8G7G6G5G4G3G2G1G
real    0m0.009s
user    0m0.008s
sys     0m0.000s

99 बोतलें

यदि आप रुचि रखते हैं, तो मैक के उत्तर में लिखे गए 99 बोतलों के कार्यक्रम के लिए संकलित कोड है : http://pastebin.com/ZXe839CZ (यह पुराना संस्करण है जहां हमारे पास jmpऔर endलेबल हैं, एक आसपास का लंबोदर और प्रीबेटियर लिथमेटिक)।

यहां नए संस्करण के साथ एक निष्पादन है, यह साबित करने के लिए कि यह अभी भी काम करता है: http://pastebin.com/raw.php?i=h73x58FN


6

टीआई -84 बेसिक (कैलकुलेटर स्क्रिप्ट), 376 373 377 381 बाइट्स

यदि यह TI-84 कैलकुलेटर पर चलता है, तो आप इसे एक मानकीकृत परीक्षण पर उपयोग करने में सक्षम होंगे ... इसलिए यह उपयोगी है;)

न्यूनतम ऑपरेटिंग सिस्टम संस्करण - योग सिग्मा के कारण 2.53MP (MathPrint)

#Get input from STDIN
:Ans+":"->Str0
#Initialize instruction pointer
:1->I
#Initialize variable set
:DelVar L1999->dim(L1
#Strip out those pesky non-newline/space/9 characters
:For(J,1,length(Ans
:sub(Str0,J,1
:If not(inString(": 9",Ans
:sub(Str0,1,J-1)+sub(Str0,J+1,length(Str0)-J->Str0
:End
#Main interpreting loop
:While I<length(Str0
:sub(Str0,I+1,inString(Str0,":",I+1)-I-1->Str1
:DelVar A" "=sub(Ans,1,1->A
:inString(Str0,":",I+1->I
:If A
:sub(Str1,2,length(Str1)-1->Str1
:End
:length(Str1->L
#0 is Output, 1 is Input, 2 is Assignment, 3 is Goto
:2A+inString(Str1," ->B
:If not(Ans
:Disp L1(L
:If Ans=1
:Then
:Input C
:C->L1(L
:End
#Get those delimited variables
:If B>1
:Then
:"{"+Str1->Str2
:While inString(Ans," 
:inString(Ans," 
:sub(Str2,1,Ans-1)+sub(Str2,Ans+1,length(Str2)-Ans->Str2
:End
:log(expr(Ans)+1->L2
:End
:If B=2
#Gotta expand that -+ pattern
:Ans(2->L1(Ans(1
;Love that summation Σ
:If B=3 and Σ(L2(K),K,2,dim(L2
:Then
:DelVar IFor(K,0,9L2(1
:inString(Str0,":",I+1->I
:End
:End

पीएस एएससीआईआई दिशानिर्देशों का ठीक से पालन नहीं किया जा सका, लेकिन टीआई-बेसिक :एक नई पंक्ति है। इस प्रकार, कोड में सभी वास्तविक newlines का मतलब है कि :या #प्रत्येक पंक्ति की शुरुआत में आवश्यक नहीं है। शुरुआत टोकन से होती है: और #सिर्फ टिप्पणियों और कोड के बीच अंतर करती है।

मूल हेक्स डंप (376 बाइट्स)

49 3f bb 54 5d 20 39 39 39 04 b5 5d 20 3f 72 04 aa 09 3f d3 4a 2b 31 2b bb 2b 72 3f bb 0c aa 09 2b 4a 2b 31 3f ce b8 bb 0f 2a 3e 29 39 2a 2b 72 3f bb 0c aa 09 2b 31 2b 4a 71 31 11 70 bb 0c aa 09 2b 4a 70 31 2b 72 71 4a 04 aa 09 3f d4 3f d1 49 6b bb 2b aa 09 3f bb 0c aa 09 2b 49 70 31 2b bb 0f aa 09 2b 2a 3e 2a 2b 49 70 31 11 71 49 71 31 04 aa 20 3f bb 54 41 2a 29 2a 6a bb 0c 72 2b 31 2b 31 04 41 3f bb 0f aa 09 2b 2a 3e 2a 2b 49 70 31 04 49 3f ce 41 3f bb 0c aa 20 2b 32 2b bb 2b aa 20 11 71 31 04 aa 20 3f d4 3f bb 2b aa 20 04 4c 3f 32 41 70 bb 0f aa 20 2b 2a 29 04 42 3f ce b8 72 3f de 5d 20 10 4c 11 83 39 3f ce 72 6a 31 3f cf 3f dc 43 3f 39 43 04 5d 20 10 4c 3f d4 3f ce 42 6c 31 3f cf 3f 2a 08 2a 70 aa 20 04 aa 01 3f d1 bb 0f 72 2b 2a 29 3f bb 0f 72 2b 2a 29 3f bb 0c aa 01 2b 31 2b 72 71 31 11 70 bb 0c aa 01 2b 72 70 31 2b bb 2b aa 01 11 71 72 04 aa 01 3f d4 3f c0 bb 2a 72 11 70 31 04 5d 01 3f d4 3f ce 42 6a 32 3f 72 10 32 04 5d 20 10 72 10 31 3f ce 42 6a 33 40 ef 33 5d 01 10 4b 11 2b 4b 2b 32 2b b5 5d 01 3f cf 3f bb 54 49 d3 4b 2b 30 2b 5d 01 10 31 3f bb 0f aa 09 2b 2a 3e 2a 2b 49 70 31 04 49 3f d4 3f d4 2e 76

# 1 संपादित करें - मैक के अवलोकन संपादन # 2 & # 3 का उपयोग करके 3 बाइट्स अनुकूलित - Runer112 द्वारा स्पॉट किए गए फिक्स्ड कीड़े।


11
मानकीकृत परीक्षणों जैसी तनावपूर्ण स्थितियों में उपयोग करना आसान होने के कारण मैंने वास्तव में 99 के लिए डिज़ाइन किया था।
केल्विन के शौक

1
क्या मैं #टिप्पणियों के लिए एक अलग चरित्र, जैसे , का उपयोग करने का सुझाव दे सकता हूं ? (एनबी: वास्तविक कोड में टिप्पणियां केवल एक बिना तार के एक पंक्ति के रूप में लागू की जाती हैं, जो क्लॉबर्स Ans।)
रेकिंग

8
क्या आपने वास्तव में इसे चलाने की कोशिश की है? मैंने नहीं किया है, लेकिन बस इसे थोड़ा और देखने से, मैंने देखा है कि कम से कम आधा दर्जन कीड़े लग रहे हैं। उदाहरण के लिए: चर को उनके मानों के साथ आरंभीकृत नहीं किया जाता है, Ansइनपुट ओवरराइट किया जाता है, इसलिए Ans->Str0लाइन 6 पर त्रुटि होगी, ऐसे कई उदाहरण हैं जहां sub()कमांड की लंबाई तर्क शून्य हो सकती है जिसके परिणामस्वरूप त्रुटि Ansहो सकती है , लाइन 11 पर एक स्ट्रिंग होगी इसलिए Ans-Jत्रुटि होगी ... और मैंने केवल कार्यक्रम के पहले आधे हिस्से को देखा।
रनर

1
@Timtech कि अभी भी अन्य समस्याओं को छोड़ देता है, हालांकि। जैसा कि मैंने उल्लेख किया है, चरित्र I / O की कमी है, वैरिएबल इनिशियलाइज़ेशन की कमी है, और कई उदाहरण हैं जहां एक sub()कमांड की लंबाई शून्य हो सकती है और एक त्रुटि फेंक सकती है। और एक बार sub()इनवोकेशन तय हो जाने के बाद, मुझे डर है कि यह और मुद्दों को प्रकट कर सकता है।
रनर ११२

1
@Timtech मैं इस बात का उल्लेख कर रहा था: "डिफ़ॉल्ट रूप से, प्रत्येक चर को अपने स्वयं के संख्यात्मक प्रतिनिधित्व को सौंपा जाता है। इसलिए जब तक यह पुन: असाइन नहीं किया जाता है, चर 9का मान संख्या 9 है, और चर 99का मान 99 नंबर है, और इसी तरह।" और लंबाई 0 के तारों को जैसे-तैसे उत्पादित किया जा सकता है "", लेकिन यह एक बग की तरह है जिसमें मूल रूप से कोई स्ट्रिंग हेरफेर कमांड खाली स्ट्रिंग का उपभोग या उत्पादन नहीं कर सकता है, जिसमें शामिल है sub()
रनर ११२

5

C 426 458 481 497

संपादित शायद मैं बहुत दूर जा रहा हूँ, लेकिन यह विज़ुअल सी के साथ काम करता है: हटा stdio.h, fopen और getc के लिए फ़ाइल * के बजाय पूर्णांक का उपयोग कर

संपादित 2 पुनरावृत्ति निष्पादन कदम, अधिक अव्यवस्था, 32 वर्ण सहेजे गए

B[99999],*r,*i[9999],V[999],v,w,m,n;unsigned p,s;
main(b,a)char*a[];{r=i[0]=B;m=fopen(a[1],"r");
do if(w=getc(m),n+=w==57,w<33){
if(n){for(v=1,b=n;--b;)v=v*10+1;V[n]=v;*r++=p?-n:n;b=n=0;};
w-32?(*r=p=0,b=i[++s]=++r):(p=b,b=0);}while(w>=0);
while(p<s)if(w=0,r=i[p++],v=*r++)
if(m=v>0,*r){for(;b=*r++;m=-m)w=w+m*V[b]|!m*V[b];m?V[v]=w:(p=w?p:9*V[-v]);
}else~v&1?!m?V[-v]=getchar():putchar(V[v]&127):m?printf("%d",V[v]):scanf("%d",V-v);
}

अकेले कंसोल प्रोग्राम, कमांड लाइन पर लिया गया प्रोग्राम का नाम और कंसोल के माध्यम से इनपुट / आउटपुट।

पुरानी शैली K & R, वैश्विक संस्करण और मापदंडों के लिए डिफ़ॉल्ट प्रकार int। ईओएफ को -1 के रूप में परिभाषित किया गया है (जैसा कि मुझे पता है कि हर सी कार्यान्वयन में है)

विजुअल स्टूडियो 2010 (Win32 कंसोल C ++ प्रोजेक्ट, C के रूप में संकलित) Ideone पर संकलन के साथ चेतावनी के साथ संकलित करता है, लेकिन एक फ़ाइल की आवश्यकता के रूप में नहीं चल सकता।

पहला चरण, स्रोत कोड पढ़ा और पार्स किया गया है, प्रत्येक पंक्ति को 9 की संख्या के आधार पर पूर्णांकों के अनुक्रम के रूप में संग्रहीत किया जाता है। यदि कोई प्रमुख खाली है, तो पहली संख्या ऋणात्मक है। तो: 9 BLAH 99 9a9bb9c9( 9 99 9999) बन जाता है -1,2,4 वहाँ एक शॉर्टकट है - इतना कानूनी नहीं: सभी ascii कोड '' से कम हैं जो कि newlines माना जाता है।

इस चरण में सभी उपयोग किए गए चर प्रीइंस्टीट्यूशनल हैं।

निष्पादन चरण विनिर्देशों का पालन करता है, कोई तामझाम नहीं, 9 से विभाजित संख्याओं को सहेजना।

अधिक पठनीय एक ही कोड (मुझे आशा है), रिक्त स्थान और नए अंक जोड़े गए

B[99999],*r,*i[9999],V[999],v,w,m,n;
unsigned p,s;
main(b,a)char*a[];
{
  r=i[0]=B;
  m=fopen(a[1],"r");
  do if(w=getc(m),n+=w==57,w<33)
  {
     if(n){for(v=1,b=n;--b;)v=v*10+1;V[n]=v;*r++=p?-n:n;b=n=0;};
     w-32?(*r=p=0,b=i[++s]=++r):(p=b,b=0);
  }
  while (w>=0);
  while (p<s)
    if (w = 0, r = i[p++], v = *r++)
        if (m = v > 0, *r){
            for(; b = *r++; m = -m)
                w = w + m*V[b] | !m*V[b];
            m ? V[v]=w : (p = w ? p : 9*V[-v]);
        } else
            ~v & 1 
            ? !m ? V[-v] = getchar() : putchar(V[v] & 127)  
            : m ? printf("%d", V[v]) : scanf("%d", V - v);
}

1
जीसीसी 4.8.2 के साथ भी काम करता है। C99 के रूप में संकलन!
EMBLEM

4

हास्केल, 550 बाइट्स

import Data.List.Split
import System.Environment
a#b=takeWhile(/=a)b
(!)=map
main=do(f:_)<-getArgs;readFile f>>=e.(p!).lines
p l=(if ' '#l<'9'#l then[0]else[])++length!(wordsBy(/='9')l)
e l=(\x->div(10^x-1)9)%l where
 _%[]=return()
 v%([]:r)=v%r
 v%([n]:r)=putStr(if odd n then show(v n)else[toEnum$v n`mod`128])>>v%r
 v%([0,n]:r)=do i<-getLine;u n(if odd n then read i else fromEnum$head i)v%r
 v%((0:n:m):r)|any(/=0)(v!m)=v%r|v n<0=v%[]|1<2=v%drop(9*v n)l
 v%((n:m):r)=u n(sum$zipWith(*)(v!m)(cycle[1,-1]))v%r
u n i v= \x->if x==n then i else v x

उदाहरण फ़ाइल में संग्रहीत "उलटी गिनती" कार्यक्रम के साथ चलता है i.99

$ ./99 i.99
G11G10G9G8G7G6G5G4G3G2G1G

Ungolfed संस्करण:

import Data.List.Split
import System.Environment

-- The main function takes the first command line argument as a file name,
-- reads the content, splits it into lines, parses each line and evaluates
-- the list of parsed lines.
main = do
 (f:_)<-getArgs
 readFile f >>= eval.map parse.lines

-- each line is coverted into a list of integers, which represent the number
-- of 9s (e.g. "999 99 9999" -> [3,2,4]). If there's a space before the first
-- 9, a 0 is put in front of the list (e.g. " 9 9 999" -> [0,1,1,3]).
parse l = (if takeWhile (/=' ') l < takeWhile (/='9') l then [0] else [])
   ++ map length (wordsBy(/='9') l)

-- The work is done by the helper function 'go', which takes two arguments
--   a) a functions which takes an integer i and returns the value of the
--      variable with i 9s (e.g: input: 4, output: value of 9999). To be
--      exact, the value divided by 9 is returned.
--   b) a list of lines to work on
-- 'eval' starts the process with a function that returns i 1s for every i and
-- the list of the parsed input. 'go' checks which statement has to be
-- executed for the next line and calls itself recursively
eval list = go (\x -> div (10^x-1) 9) list
   where
   go _ []                  = return ()
   go v ([]:r)              = go v r
   go v ([n]:r)             = putStr (if odd n then show(v n) else [toEnum (v n`mod`128)]) >> go v r
   go v ([0,n]:r)           = do i<-getLine ; go (update n (if odd n then read i else fromEnum$head i) v) r
   go v ((0:n:m):r)
      | any (/=0) (map v m) = go v r
      | v n < 0             = go v []
      | otherwise           = go v (drop (9*v n) list)
   go v ((n:m):r)           = go (update n (sum $ zipWith (*) (map v m) (cycle[1,-1])) v) r

-- updates a function for retrieving variable values.
-- n = position to update
-- i = new value
-- v = the function to update
update n i v = \x->if x==n then i else v x

4

जावास्क्रिप्ट (ईएस 6) 340 352

2 मापदंडों के साथ एक फ़ंक्शन

  • एक बहुस्तरीय स्ट्रिंग के रूप में प्रोग्राम कोड
  • एक सरणी के रूप में इनपुट

तीसरा वैकल्पिक पैरामीटर (डिफ़ॉल्ट 10k) पुनरावृत्तियों की अधिकतम संख्या है - मुझे हमेशा चलने वाले प्रोग्राम पसंद नहीं है

JSFiddle परीक्षण करने के लिए

I=(c,i,k=1e5,
  V=v=>v in V?V[v]:v/9 // variable getter with default initial value
)=>(c=>{
 for(p=o='';--k&&p<c[L='length'];)
   (v=(r=c[p++].split(' '))[S='shift']())? // no leading space
      r[r.map(t=>w-=(m=-m)*V(t),w=0,m=1),0]?V[v]=w // Assign
      :o+=v[L]&1?V(v):String.fromCharCode(V(v)&127) // Output
   : // else, leading space
    (v=r[S]())&&
       (r[0]?r.some(t=>V(t))?0:p=9*V(v) // Goto
       :(t=i[S](),V[v]=v[L]&1?t:t.charCodeAt()) // Input
    )
})(c.replace(/ (?=[^9])|[^9\s]/g,'').split('\n'))  // code cleaning
||o

4

क्यू / के, 490 ४६ ९

M:mod;T:trim;R:read0;S:set;s:" "
f:(rtrim')(f:R -1!`$.z.x 0)inter\:"9 \n"
k)m:{@[x;&M[!#x;2];-:]}
b:{}
k)p:{1@$$[1=M[#x;2];(K x)%9;"c"$M[(K x)%9;128]];}
k)i:{S[(`$T x);$[1=M[#T x;2];9*"J"$R 0;*9*"i"$R 0]]}
k)K:{$[#!:a:`$x;.:a;"I"$x]}
k)v:{(S).(`$*:;+/m@K'1_)@\:T's\:x}
k)g:{$[&/0=C:K'c:1_J:s\:T x;n::-1+K@*J;|/~0=C;;(d<0)|(d:*C)<#f;exit 0]}
k)r:{`b`p`i`v`g@*&(&/x=s;q&1=c;(e~s)&1=C;(q:e~"9")&1<c:#s\:x;((e:*x)~s)&1<C:#s\:1_x)}
k)n:0;while[~n>#o:(r')f;(o n)f n;n+:1]
\\

$ q 99.q countdown.txt -q
G11G10G9G8G7G6G5G4G3G2G1G

स्क्रिप्ट q और k का मिश्रण है, इसलिए सबसे पहले मैं कुछ q कीवर्ड परिभाषित करता हूं जिन्हें मैं k फ़ंक्शन में कई बार उपयोग करना चाहता हूं। (मूल रूप से # अल्पाइन मैक्रोज़)

M:mod;T:trim;R:read0;S:set

f प्रोग्राम में पास की गई फाइल को पढ़ता है और अनावश्यक पात्रों को निकालता है

q)f
"99999999"
"999 99"
"9999999999 9999999999 9999999999 99 99 9 9 999 999"
"99999999999 9999999999"
""
""
""
""
""
"999"
"99999999"
"999 999 9"
" 99999 999"
" 9 99999999999 9999999999"

m एक सूची / वेक्टर लेता है और विषम सूचक को -1 से गुणा करता है

q)m 1 2 3 4 5
1 -2 3 -4 5

b केवल एक खाली फ़ंक्शन है, जिसका उपयोग बिना-ऑप लाइनों के लिए किया जाता है

p प्रिंट फ़ंक्शन है।

Kएक फ़ंक्शन है जो एक चर की जांच करता है। यदि चर मौजूद है, तो वह इसे वापस करता है, अन्यथा यह सिर्फ शाब्दिक रिटर्न देता है।

//999 not defined, so just return 999
q)K "999"
999
//Set 999 to 9
q)v "999 9"
//K now returns 9
q)K "999"
9

v असाइनमेंट फ़ंक्शन है।

g गोटो फ़ंक्शन है।

r एक स्ट्रिंग लेता है और निर्णय लेता है कि किस ऑपरेशन को लागू करने की आवश्यकता है।

और फिर अंत में, मैं fस्ट्रिंगर की सूची के माध्यम से पुनरावृति करता हूं, पुनरावृत्त के nरूप में। गोटो फ़ंक्शन nआवश्यकतानुसार अपडेट होगा ।


3

पर्ल, 273 266 255 244 238

स्पष्टता के लिए लाइन ब्रेक जोड़े गए।

open A,pop;
for(@c=<A>){
y/ 9//cd;s/ +/ /g;s/ $//;
$p="((99)+|9+)";$a='+';
s/^ $p$/$1='$2'?ord<>:<>/;
s/^$p$/print'$2'?chr$1%128:$1/;
s/^ $p /\$_=$1*011unless/&&y/ /|/;
s/ /=/;s/ /$a=-$a/ge;
s!9+!${x.$&}=$&/9;"\$x$&"!eg}
eval$c[$_++]until/-/|$_>@c

कमांड लाइन पर लिया गया प्रोग्राम का नाम:

$ perl 99.pl 99beers.99

कार्यक्रम की प्रत्येक पंक्ति पर्ल कोड में बदल जाती है, उदाहरण के लिए:

print'$x99'?chr$x99999999%128:$x99999999
$x999=$x99
$x9999999999=$x9999999999-$x9999999999+$x99-$x99+$x9-$x9+$x999-$x999
$x99999999999=$x9999999999





print''?chr$x999%128:$x999
print'$x99'?chr$x99999999%128:$x99999999
$x999=$x999-$x9
$_=$x99999*011unless$x999
$_=$x9*011unless$x99999999999|$x9999999999

अधिक जानकारी

open A,pop; # open the source file
for(@c=<A>){ # read all lines into @c and iterate over them
y/ 9//cd; # remove all but spaces and 9's
s/ +/ /g;s/ $//; # remove duplicate and trailing spaces
$p="((99)+|9+)";$a='+';
s/^ $p$/$1='$2'?ord<>:<>/; # convert input
s/^$p$/print'$2'?chr$1%128:$1/; # convert output
s/^ $p /\$_=$1*011unless/&&y/ /|/; # convert goto
s/ /=/;s/ /$a=-$a/ge; # convert assignment
s!9+!${x.$&}=$&/9;"\$x$&"!eg} # initialize and convert variables
eval$c[$_++]until/-/|$_>@c # run (program counter is in $_)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.