कोड गोल्फ: फोर मैजिक है


88

पहेली

हाई स्कूल में रहते हुए मैंने जो थोड़ी पहेली सुनी वह कुछ इस तरह थी ...

  • प्रश्नकर्ता मुझे एक नंबर देने के लिए कहेगा;
  • संख्या को सुनने पर, प्रश्नकर्ता बार-बार उस पर किसी प्रकार का परिवर्तन करेगा (उदाहरण के लिए, वह कह सकता है कि दस तीन हैं ) जब तक कि वह संख्या 4 पर नहीं पहुंच जाता (अंत में वह चार के साथ समाप्त होगा जादू है )।
  • कोई भी संख्या अंततः चार में बदलने योग्य लगती है, फिर चाहे वह कोई भी हो।

लक्ष्य परिवर्तन फ़ंक्शन का पता लगाने की कोशिश करना था और फिर इस पहेली को मज़बूती से अपने आप को आगे बढ़ाने में सक्षम होना चाहिए।

समाधान

किसी भी चरण में परिवर्तन समारोह था

  • प्रश्न में संख्या लें,
  • अपने अंग्रेजी शब्द प्रतिनिधित्व में अक्षरों की संख्या की गणना करें, एक हाइफ़न या रिक्त स्थान या "और" जैसे "दस" में 3 अक्षर हैं, "तीस-चालीस" में 10 अक्षर हैं, "एक सौ सैंतालीस" इसमें 20 अक्षर हैं)।
  • उस पत्र की संख्या लौटाओ।

उन सभी नंबरों के लिए जिनकी मैंने कभी जांच की है, यह 4 में परिवर्तित होता है। चूंकि "चार" में भी चार अक्षर हैं, इसलिए यहां एक अनंत लूप होगा; इसके बजाय यह केवल अनुक्रम को समाप्त करने के लिए सम्मेलन द्वारा जादू के रूप में संदर्भित किया जाता है ।

चुनौती

आपकी चुनौती कोड का एक टुकड़ा बनाना है जो उपयोगकर्ता से एक नंबर पढ़ेगा और फिर "चार जादू है" तक परिवर्तन फ़ंक्शन को बार-बार लागू किए जाने वाले प्रिंट लाइनों को दिखाएगा।

विशेष रूप से:

  1. समाधान में और स्वयं के पूरे कार्यक्रम होने चाहिए। वे केवल ऐसे कार्य नहीं कर सकते हैं जो इनपुट में एक संख्या कारक में लेते हैं।
  2. इनपुट को मानक इनपुट से पढ़ा जाना चाहिए। ("इको" से पाइप करना या इनपुट पुनर्निर्देशन का उपयोग करना ठीक है क्योंकि यह स्टड से भी जाता है)
  3. इनपुट संख्यात्मक रूप में होना चाहिए।
  4. परिवर्तन फ़ंक्शन के प्रत्येक अनुप्रयोग के लिए, एक पंक्ति मुद्रित की जानी चाहिए: a is b.जहां a और b परिवर्तन में संख्याओं के संख्यात्मक रूप हैं।
  5. पूर्ण विराम (अवधियों) की आवश्यकता है!
  6. अंतिम पंक्ति स्वाभाविक रूप से, कहना चाहिए 4 is magic.
  7. कोड को 0 से 99 तक सभी नंबरों के लिए सही आउटपुट का उत्पादन करना चाहिए ।

उदाहरण:

> 4
4 is magic.

> 12
12 is 6.
6 is 3.
3 is 5.
5 is 4.
4 is magic.

> 42
42 is 8.
8 is 5.
5 is 4.
4 is magic.

> 0
0 is 4.
4 is magic.

> 99
99 is 10.
10 is 3.
3 is 5.
5 is 4.
4 is magic.

विजेता स्रोत कोड वर्ण गणना द्वारा सबसे छोटा सबमिशन है जो सही भी है

बक्शीश

आप उस कोड का एक संस्करण भी लिखने का प्रयास कर सकते हैं जो परिवर्तन फ़ंक्शन के प्रत्येक अनुप्रयोग के साथ संख्याओं के लिए अंग्रेजी नामों को प्रिंट करता है। मूल इनपुट अभी भी संख्यात्मक है, लेकिन आउटपुट लाइनों में संख्या का शब्द रूप होना चाहिए।

(अपने कोड के साथ आकृतियों के लिए डबल बोनस)

(EDIT) कुछ स्पष्टीकरण:

  1. मैं चाहता हूं कि यह शब्द सभी लागू मामलों में दोनों तरफ दिखाई दे, जैसे Nine is four. Four is magic.
  2. मैं पूंजीकरण के बारे में परवाह नहीं करता, हालांकि। और मुझे परवाह नहीं है कि आप टोकन शब्द को कैसे अलग करते हैं, हालांकि उन्हें अलग किया जाना चाहिए: ninety-nineठीक है, ninety nineठीक है, ninetynineठीक नहीं है।

मैं चुनौती के संबंध में बोनस प्रतियोगिता के लिए एक अलग श्रेणी पर विचार कर रहा हूं, इसलिए यदि आप इसके लिए जाते हैं, तो अपने कोड के संख्यात्मक संस्करण की तुलना में अधिक लंबे समय तक चिंता न करें।

प्रत्येक संस्करण के लिए एक समाधान प्रस्तुत करने के लिए स्वतंत्र महसूस करें।


1
हमें कितनी संख्या में हैंडल करना चाहिए? <100? <1000? <1000000? <२ ** ३१?
पी डैडी

1
चूंकि यह केवल 0 से 99 तक जाना है, मुझे संदेह है कि एक त्वरित, लघु समाधान उन मूल्यों को हार्डकोड करेगा जो 0-99 मैप को करते हैं, और तब तक लूप करते हैं जब तक आप 4. 4 तक नहीं पहुंच जाते। उसके बाद, माइक्रोटेकिंग शुरू होता है।
बिसका जूल

@P डैडी ... भाग 6 केवल 0-99 कहता है।
बिसका जूल

7
इन्हें भी देखें: stackoverflow.com/questions/309884/code-golf-number-to-words
भीड़

14
4 केवल जादू है क्योंकि यह एक उचित पासा रोल द्वारा चुना गया था।
सदाचारियोमीडिया

जवाबों:


57

गोल्फस्क्रिप्ट - 101 96 93 92 91 90 94 86 बाइट्स

90 → 94: 10. के गुणकों के लिए निश्चित आउटपुट
94 → 86: पुनर्निर्मित कोड। गैर-मुद्रण योग्य वर्णों को निकालने के लिए आधार 100 का उपयोग करना।
86 → 85: शॉर्ट को स्ट्रिंग करने के लिए।

{n+~."+#,#6$DWOXB79Bd")base`1/10/~{~2${~1$+}%(;+~}%++=" is "\".
"1$4$4-}do;;;"magic."

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

36
मुझे पसंद है कि कैसे कोड के साथ समाप्त होता है "magic.", यह बहुत ज्यादा इसे तैयार करता है।
आइस्टिना

@ आइस्टिना: इस चुनौती में ऐसा करना आसान है, मुझे लगता है। :-)
प्लैटिनम एज़्योर

9
@ आइस्टिना: हाहा, यह थोड़े मजाकिया है। "मुंबो जंबो यदा यादा..गैमी"
Vol7ron

1
@P डैडी dद्वारा निकाला जाता है )के रूप में 100और आधार रूपांतरण के लिए मूलांक के रूप में प्रयोग किया जाता है।
नब जूल

85

पर्ल, लगभग 147 चार

प्लेटिनम एज़्योर के समाधान पर आधारित ढीली:

               chop
              ($_.=
              <>);@
             u="433
            5443554
           366  887
          798   866
         555    766
        "=~     /\d
       /gx      ;#4
      sub       r{4
     -$_        ?$_
    <20         ?$u
   [$_          ]:(
  $'?           $u[
 $']            :0)
+$u[18+$&]:magic}print"
$_ is ",$_=r(),'.'while
                /\d
                /x;
                444

1
@ प्लैटिनम अज़ूर जिस तरह से इसे इनपुट करता है वह popकिसी भी तर्क के बिना, के उपयोग के माध्यम से है। एक सबरूटीन के बाहर pop, और अंतिम मान लौटाता है, @ARGVजो पर्ल प्रोग्राम के तर्कों की सूची है। यह बस के रूप में आसानी से बदला जा सकता है shift, लेकिन यह एक और 2 अक्षर जोड़ता है। देखें: p3rl.org/pop
ब्रैड गिल्बर्ट

ऐसा लगता है कि आपको एक नए वर्ण की आवश्यकता है '.', जो 2 के लिए है \nया 1 के लिए यदि आप '. '
व्हॉट्सएप की

थोड़ा लंबा, लेकिन रचनात्मकता मेरी किताब में एक लंबा रास्ता तय करती है।
बेस्का जूल

@ प्लैटिनम एज़्योर एट अल: उन्हें स्टड से उनका इनपुट मिल रहा है। यह पर्ल में करने का तरीका है। (शायद आपकी टिप्पणी के बाद उन्होंने इसे बदल दिया?)
फ्रैंक

@P डैडी: वैसे भी अपनी टिप्पणी के लिए कराहना लेकिन +1
प्लैटिनम

30

आम लिस्प 157 चार्ट

नया अधिक अनुरूप संस्करण, अब पठन मानक इनपुट और स्थान और हाइफ़न को अनदेखा करना:

(labels((g (x)(if(= x 4)(princ"4 is magic.")(let((n(length(remove-if(lambda(x)(find x" -"))(format nil"~r"x)))))(format t"~a is ~a.~%"x n)(g n)))))(g(read)))

मानव-पठनीय रूप में:

 (labels ((g (x)
           (if (= x 4)
            (princ "4 is magic.")
            (let ((n (length (remove-if (lambda(x) (find x " -"))
                                        (format nil "~r" x)))))
               (format t"~a is ~a.~%" x n)
               (g n)))))
    (g (read)))

और कुछ परीक्षण चलता है:

>24
24 is 10.
10 is 3.
3 is 5.
5 is 4.
4 is magic.

>23152436
23152436 is 64.
64 is 9.
9 is 4.
4 is magic.

और 165 संस्करण में बोनस संस्करण:

 (labels((g(x)(if(= x 4)(princ"four is magic.")(let*((f(format nil"~r"x))(n(length(remove-if(lambda(x)(find x" -"))f))))(format t"~a is ~r.~%"f n)(g n)))))(g(read)))

देते हुए

>24
twenty-four is ten.
ten is three.
three is five.
five is four.
four is magic.

>234235
two hundred thirty-four thousand two hundred thirty-five is forty-eight.
forty-eight is ten.
ten is three.
three is five.
five is four.
four is magic.

5
मैंने सोचा कि "चौबीस" में केवल 10 अक्षर हैं?
kennytm

1
"Is" के बाद का नंबर टेक्स्ट होना चाहिए।
माइक डीस्मोन

5
यह इतना ऊपर क्यों है? अन्य लोग बिल्ट-इन प्रारूप फ़ंक्शन का उपयोग नहीं करते हैं और वे कम वर्ण हैं
क्लाउडी

3
@ कोलियु क्योंकि कॉमन लिस्प कमाल का है।
मोर्नेडेल

3
इससे कोई फर्क नहीं पड़ता कि यदि आप गेंद को छेद में नहीं लाते हैं तो आप कितने स्ट्रोक लेते हैं। लोग भूल जाते हैं कि जब वे गलत समाधान करते हैं।
मार्क पीटर्स

21

पायथन 2.x, 144 150 154 166 घर का काम

यह संख्या को दसियों और लोगों में अलग करता है और उन्हें योग करता है। छद्म-टर्नरी ऑपरेटर की अवांछनीय संपत्ति a and b or cजो 0 है, cतो bयहां पर दुरुपयोग किया जाता है।

n=input()
x=0x4d2d0f47815890bd2
while n-4:p=n<20and x/10**n%10or 44378/4**(n/10-2)%4+x/10**(n%10)%10+4;print n,"is %d."%p;n=p
print"4 is magic."

पिछला भोला संस्करण (150 वर्ण)। बस एक पूर्णांक के रूप में सभी लंबाई सांकेतिक शब्दों में बदलना।

n=input()
while n-4:p=3+int('1yrof7i9b1lsi207bozyzg2m7sclycst0zsczde5oks6zt8pedmnup5omwfx56b29',36)/10**n%10;print n,"is %d."%p;n=p
print"4 is magic."

क्षमा करें, मैं विशेष रूप से इस तरह की चीजों के कारण पूर्ण विराम चाहता था। :-) हालांकि अच्छी प्रविष्टि! (संपादित करें: मैं अजगर को नहीं जानता, लेकिन क्या आप कर सकते हैं n,"is",p,"."? मुझे लगता है कि आप अभी भी कुछ करैक्टर को बचा रहे हैं, अगर मैं सही गिनती कर रहा हूं)
प्लैटिनम

2
@Plat: इससे पहले एक अतिरिक्त स्थान होगा .
kennytm

@ केनीटीएम: ओह, दुआ, मुझे ध्यान देना चाहिए कि स्निपेट से भी। ऊप्स! खैर, वैसे भी, जैसा कि मैंने कहा, कुछ विनिर्देशों को विशेष रूप से चीजों को थोड़ा जटिल करने के लिए डिज़ाइन किया गया था। :-)
प्लैटिनम एज़्योर

क्या हम 36 की तुलना में अधिक आधार का उपयोग करके इसे छोटा कर सकते हैं?
माइक डी जूल

@ माइक: नोप। पायथन डॉक्स से: " आधार पैरामीटर रूपांतरण के लिए आधार देता है (जो डिफ़ॉल्ट रूप से 10 है) और सीमा [2, 36], या शून्य में कोई पूर्णांक हो सकता है।" अब आप इसके अलावा किसी फ़ंक्शन का उपयोग करने में सक्षम हो सकते हैं int(), structया base64मॉड्यूल से बाहर कुछ कह सकते हैं ...
माइक डीसिमोन

20

सी - संख्या शब्दों के साथ

445 431 427 421 399 386 371 359 * 356 354 27 348 347 पात्रों

बस। मुझे नहीं लगता कि मैं इसे कोई छोटा कर सकता हूं।

सभी नई पठनीयता के लिए हैं और उन्हें हटाया जा सकता है:

i;P(x){char*p=",one,two,three,four,five,six,sM,eight,nine,tL,elM,twelve,NP,4P,
fifP,6P,7P,8O,9P,twLQ,NQ,forQ,fifQ,6Q,7Q,8y,9Q,en,evL,thir,eL,tO,ty, is ,.\n,
4RmagicS,zero,";while(x--)if(*++p-44&&!x++)*p>95|*p<48?putchar(*p),++i:P(*p-48);
}main(c){for(scanf("%d",&c);c+(i=-4);P(34),P(c=i),P(35))P(c?c>19?P(c/10+18),
(c%=10)&&putchar(45):0,c:37);P(36);}

नीचे, यह कुछ हद तक निर्विवाद है, लेकिन अभी भी पढ़ने के लिए बहुत कठिन है। अधिक पठनीय संस्करण के लिए नीचे देखें।

i;
P(x){
    char*p=",one,two,three,four,five,six,sM,eight,nine,tL,elM,twelve,NP,4P,fifP,6P,7P,8O,9P,twLQ,NQ,forQ,fifQ,6Q,7Q,8y,9Q,en,evL,thir,eL,tO,ty, is ,.\n,4RmagicS,zero,";
    while(x--)
        if(*++p-44&&!x++)
            *p>95|*p<48?putchar(*p),++i:P(*p-48);
}
main(c){
    for(scanf("%d",&c);c+(i=-4);P(34),P(c=i),P(35))
        P(c?
            c>19?
                P(c/10+18),
                (c%=10)&&
                    putchar(45)
            :0,
            c
        :37);
    P(36);
}

विस्तृत और टिप्पणी:

int count; /* type int is assumed in the minified version */

void print(int index){ /* the minified version assumes a return type of int, but it's ignored */
    /* see explanation of this string after code */
    char *word =
        /* 1 - 9 */
        ",one,two,three,four,five,six,sM,eight,nine,"
        /* 10 - 19 */
        "tL,elM,twelve,NP,4P,fifP,6P,7P,8O,9P,"
        /* 20 - 90, by tens */
        "twLQ,NQ,forQ,fifQ,6Q,7Q,8y,9Q,"
        /* lookup table */
        "en,evL,thir,eL,tO,ty, is ,.\n,4RmagicS,zero,";

    while(index >= 0){
        if(*word == ',')
            index--;
        else if(index == 0) /* we found the right word */
            if(*word >= '0' && *word < 'a') /* a compression marker */
                print(*word - '0'/*convert to a number*/);
            else{
                putchar(*word); /* write the letter to the output */
                ++count;
            }
        ++word;
    }
}
int main(int argc, char **argv){ /* see note about this after code */
    scanf("%d", &argc); /* parse user input to an integer */

    while(argc != 4){
        count = 0;
        if(argc == 0)
            print(37/*index of "zero"*/);
        else{
            if(argc > 19){
                print(argc / 10/*high digit*/ + 20/*offset of "twenty"*/ - 2/*20 / 10*/);
                argc %= 10; /* get low digit */

                if(argc != 0) /* we need a hyphen before the low digit */
                    putchar('-');
            }
            print(argc/* if 0, then nothing is printed or counted */);
        }
        argc = count;
        print(34/*" is "*/);
        print(argc); /* print count as word */
        print(35/*".\n"*/);
    }
    print(36/*"four is magic.\n"*/);
}

शुरुआत के पास एन्कोडेड स्ट्रिंग के बारे में

संख्याओं के नाम एक बहुत ही सरल योजना का उपयोग करके संपीड़ित होते हैं। अक्सर उपयोग किए जाने वाले सबस्ट्रिंग को नाम सरणी में एक-चरित्र सूचक के साथ बदल दिया जाता है। पहले सेट में अपनी संपूर्णता में उपयोग नहीं किए गए सबस्ट्रिंग के लिए अतिरिक्त नाम प्रविष्टियों की एक "लुकअप टेबल" को अंत में जोड़ा गया है। लुकअप पुनरावर्ती हैं: प्रविष्टियाँ अन्य प्रविष्टियों को संदर्भित कर सकती हैं।

उदाहरण के लिए, 11 के लिए संकुचित नाम है elMprint()समारोह वर्ण आउटपुट eऔर l(लोअर केस 'एल', नहीं संख्या '1') शब्दशः, लेकिन तब यह पाता है Mतो वह खुद को 29 वीं प्रविष्टि (ASCII 'एम' - ASCII '0') के सूचकांक के साथ कहता है, देखने की मेज में। यह स्ट्रिंग है evL, इसलिए यह आउटपुट करता है eऔर vफिर लुकअप टेबल में 28 वीं प्रविष्टि के सूचकांक के साथ फिर से कॉल करता है, जो कि है en, और आउटपुट वर्बेटिम है। क्योंकि यह उपयोगी है enभी प्रयोग किया जाता है eLके लिए een(बाद इस्तेमाल eightमें eighteen) है, जो प्रयोग किया जाता है tOके लिए teen(हर दूसरे के लिए इस्तेमाल किया -teenनाम)।

यह योजना संख्या नामों के काफी महत्वपूर्ण संपीड़न के परिणामस्वरूप होती है, जबकि कोड की एक छोटी मात्रा को डिकम्प्रेस करने की आवश्यकता होती है।

इस स्ट्रिंग के भीतर सरलता के लिए स्ट्रिंग खाते की शुरुआत और अंत में अल्पविराम इस प्रकार पाए जाते हैं। यहां दो पात्रों को जोड़ने से बाद में अधिक वर्ण सहेजे जाते हैं।

के दुरुपयोग के बारे में main()

argvको अनदेखा किया जाता है (और संपीड़ित संस्करण में घोषित नहीं किया जाता है), argc के मूल्य को अनदेखा कर दिया जाता है, लेकिन वर्तमान संख्या को रखने के लिए भंडारण का पुन: उपयोग किया जाता है। यह सिर्फ मुझे एक अतिरिक्त चर घोषित करने से बचाता है।

की कमी के बारे में #include

कुछ शिकायत करेंगे कि चूक #include <stdio.h>धोखा है। ऐसा बिल्कुल नहीं है। दी गई एक पूरी तरह से कानूनी सी प्रोग्राम है जो मेरे द्वारा ज्ञात किसी भी सी कंपाइलर (चेतावनी के साथ) पर सही ढंग से संकलित करेगा। Stdio फ़ंक्शन के लिए प्रोटॉयल्स को खोना, संकलक मान लेगा कि वे cdecl फ़ंक्शन वापस लौट रहे हैं int, और यह विश्वास करेंगे कि आप जानते हैं कि क्या तर्क पास करना है। इस कार्यक्रम में रिटर्न मानों को वैसे भी अनदेखा किया जाता है, और वे सभी cdecl ("C" कॉलिंग कन्वेंशन) फ़ंक्शन हैं, और हम वास्तव में जानते हैं कि क्या तर्क पारित करना है।

उत्पादन

आउटपुट अपेक्षित है:

0
शून्य चार है।
चार जादू है।
1
एक तीन है।
तीन पाँच है।
पाँच चार है।
चार जादू है।
4
चार जादू है।
20
छब्बीस है।
छह तीन है।
तीन पाँच है।
पाँच चार है।
चार जादू है।
21
इक्कीस नौ है।
नौ चार है।
चार जादू है।

* पिछले संस्करण ने कल्पना के दो हिस्सों पर निशान छोड़ दिया: यह शून्य को संभाल नहीं पाया, और इसने गति के बजाय कमांड लाइन पर इनपुट लिया। शून्य को संभालते हुए पात्रों को जोड़ा गया, लेकिन कमांड लाइन आर्ग के बजाय स्टडिन का उपयोग करने के साथ-साथ अन्य ऑप्टिमाइज़ेशन के कुछ जोड़े ने समान वर्णों को बचाया, जिसके परिणामस्वरूप एक धुलाई हुई।

Number यह स्पष्ट करने के लिए आवश्यकताओं को बदल दिया गया है कि संख्या शब्द को "is" के दोनों ओर मुद्रित किया जाना चाहिए। यह नया संस्करण उस आवश्यकता को पूरा करता है, और अतिरिक्त आकार के लिए एक जोड़े को (अधिक से अधिक) खाते के लिए और अधिक अनुकूलन लागू करता है।


यह आसानी से शब्द का मेरा पसंदीदा है ... ब्रावो, अच्छी तरह से किया। आपके लिए +1, और यदि मैं दो चेकमार्क दे सकता / सकती हूं।
प्लैटिनम एज़्योर

5
यह पढ़ने के लिए मजेदार है, मुझे लगता है कि मैं इन नंबरों का उपयोग दैनिक जीवन में अब से करूंगा। छह, सेमेस्टर, आठ, नौ, टेल, हाथी, बारह, एंपी, फोरपी, फोरपी, सिक्सपी, सेवेनपी, आठो, नौपी, ट्वेल्स्की ... =)
धोखे

10

जे, १० ११२ अक्षर

'4 is magic.',~}:('.',~":@{.,' is ',":@{:)"1]2&{.\.
(]{&(#.100 4$,#:3 u:ucp'䌵䐵吶梇禈榛ꪛ멩鮪鮺墊馊꥘誙誩墊馊ꥺ겻곋榛ꪛ멩鮪鮺'))^:a:

(केवल पठनीयता की नई रूपरेखा)

उपयोग और उत्पादन:

    '4 is magic.',~}:('.',~":@{.,' is ',":@{:)"1]2&{.\.(]{&(#.100 4$,#:3 u:ucp'䌵䐵吶梇禈榛ꪛ멩鮪鮺墊馊꥘誙誩墊馊ꥺ겻곋榛ꪛ멩鮪鮺'))^:a:12
12 is 6.    
6 is 3.     
3 is 5.     
5 is 4.     
4 is magic. 

15
इसे चीनी में संकलित किया गया है
डॉ। बेलिसरीस

3
कृपया एक गैर-चीनी रेफरी चुनें
डॉ। बेलिसरीस

3
@ बेली: b, 겻, eli, Korean कोरियाई हैं।
kennytm

1
मेरी पत्नी (एक मूल चीनी वक्ता) का कहना है कि यह चीनी और कोरियाई का मिश्रण है।
लोरेन Pechtel

3
@ अविष्कार: 1) वह कोरियाई नहीं जानती। 2) चाइनीज जिबरिश है।
लोरेन Pechtel

10

टी-एसक्यूएल, 413 451 499 चार्ट

CREATE FUNCTION d(@N int) RETURNS int AS BEGIN
Declare @l char(50), @s char(50)
Select @l='0066555766',@s='03354435543668877987'
if @N<20 return 0+substring(@s,@N+1,1) return 0+substring(@l,(@N/10)+1,1) + 0+(substring(@s,@N%10+1,1))END
GO
CREATE proc M(@x int) as BEGIN
WITH r(p,n)AS(SELECT p=@x,n=dbo.d(@x) UNION ALL SELECT p=n,n=dbo.d(n) FROM r where n<>4)Select p,'is',n,'.' from r print '4 is magic.'END

(ऐसा नहीं है कि मैं गंभीरता से सुझाव दे रहा हूं कि आप ऐसा करेंगे ... वास्तव में मैं सिर्फ सीटीई लिखना चाहता था)

काम में लाना:

M 95

रिटर्न

p                n
----------- ---- -----------
95          is   10.
10          is   3.
3           is   5.
5           is   4.
4 is magic.

क्या आप टेबल वापस करने के बजाय केवल व्यक्तिगत परिणाम नहीं छाप सकते हैं? इससे आउटपुट अच्छा लगेगा।
जॉय

1
मुझे नहीं लगता कि यह ठीक से शून्य को संभालता है। कैसे कुछ इस तरह के बारे में:CREATE FUNCTION d(@ int) RETURNS int AS BEGIN Declare @l char(9),@s char(50) Select @l='066555766',@s='03354435543668877987' if @=0 return 4 if @<20 return 0+substring(@s,@+1,1)return 0+substring(@l,@/10,1)+substring(@s,@%10+1,1)END
गाबे

9

जावा (बॉयलरप्लेट के साथ), 308 290 286 282 280 अक्षर

class A{public static void main(String[]a){int i=4,j=0;for(;;)System.out.printf("%d is %s.%n",i=i==4?new java.util.Scanner(System.in).nextInt():j,i!=4?j="43354435543668877988699;::9;;:699;::9;;:588:998::9588:998::9588:998::97::<;;:<<;699;::9;;:699;::9;;:".charAt(i)-48:"magic");}}

मुझे यकीन है कि ग्रूवी को इससे बहुत छुटकारा मिलेगा।

स्पष्टीकरण और प्रारूपण (सभी टिप्पणियाँ, नई सूचियाँ और गिनती में हटाए गए प्रमुख / अनुगामी व्हाट्सएप):

यथोचित सीधे आगे, लेकिन

//boilerplate
class A{
   public static void main(String[]a){
      //i is current/left number, j right/next number.  i=4 signals to start
      //by reading input
      int i=4,j=0;
      for(;;)
         //print in the form "<left> is <right>."
         System.out.printf(
            "%d is %s.%n",
            i=i==4?
               //<left>: if i is 4 <left> will be a new starting number
               new java.util.Scanner(System.in).nextInt():
               //otherwise it's the next val
               j,
            i!=4?
               //use string to map number to its length (:;< come after 9 in ASCII)
               //48 is value of '0'.  store in j for next iteration
               j="43354435543668877988699;::9;;:699;::9;;:588:998::9588:998::9588:998::97::<;;:<<;699;::9;;:699;::9;;:".charAt(i)-48:
               //i==4 is special case for right; print "magic"
               "magic");
   }
}

संपादित करें: अब हेक्स का उपयोग नहीं करते हैं, यह कम कीस्ट्रोक्स है


1
249 आयात के बिना, वर्ग दोष या मुख्य दोष।
मार्क पीटर्स

1
वह पैशाचिक है। मुझे बेस 16 पसंद है। (+1)
प्लैटिनम एज़्योर

आप String[]aइसके बजाय का उपयोग करके एक स्थान बचा सकते हैं String[] a
बालूसी

धन्यवाद @ बलस, हेक्स पार्सिंग का उपयोग करने के बजाय चरित्र पर सरल अंकगणित करके एक गुच्छा को भी समाप्त कर दिया।
मार्क पीटर्स

@ मर्क पीटर्स: नास्टियर। मुझे लगता है कि तुलना में वेनिला।
प्लैटिनम एज़्योर

9

विंडोज पॉवरशेल: 152 153 184 बाइट्स

पिछले समाधान के आधार पर, अन्य समाधानों से अधिक प्रभाव के साथ

$o="03354435543668877988"
for($input|sv b;($a=$b)-4){if(!($b=$o[$a])){$b=$o[$a%10]-48+"66555766"[($a-$a%10)/10-2]}$b-=48-4*!$a
"$a is $b."}'4 is magic.'

10 के गुणकों का समर्थन करने के लिए फिक्स्ड ("नब्बेटीरो" के बजाय "नब्बे")।
गाबे

हे @ गबे :), धन्यवाद; हाल ही में गोल्फ के लिए ज्यादा समय नहीं था। फिर भी, आस- $inputपास के उद्धरणों को तब तक बने रहना है क्योंकि आप एक एन्यूमरेटर को सीधे नहीं डाल सकते हैं int; यह stringपहली बार से गुजरने पर काम करता है :-)
जॉय

8

सी, 158 वर्ण

main(n,c){char*d="03354435543668877988";for(scanf("%d",&n);n-4;n=c)printf("%d is %d.\n",n,c=n?n<19?d[n]-48:d[n%10]-"_,**+++)**"[n/10]:4);puts("4 is magic.");}

(मूल रूप से व्लाद के पायथन कोड पर आधारित, टॉम सिरगेडस के C ++ समाधान से एक तरकीब उधार ली गई थी, कुछ और समाधान निकालने के लिए)

विस्तारित संस्करण:

main(n, c) {
    char *d = "03354435543668877988";
    for (scanf("%d",&n); n-4; n = c)
        printf("%d is %d.\n", n, c = n ? n<19 ? d[n]-48 : d[n%10] - "_,**+++)**"[n/10]  : 4);
    puts("4 is magic.");
}

मेरे लिए काम करने के लिए प्रतीत नहीं होता है: / 10/10 10 -27 है। विभाजन दोष
केसी

@ कैसी - स्कैनफ () कॉल थोड़ा स्केच था। यह एक चार्ट में एक इंट पढ़ रहा था। मैं इसके साथ OSX पर दूर जा रहा था और विंडोज पर यह काम किया लेकिन बाहर निकलने पर दुर्घटनाग्रस्त हो गया। तो, मैंने फिर से n & c ints बनाया। मुझे एहसास हुआ कि मैं कश्मीर कीवर्ड को K & R संकेतन का उपयोग करके पैरामीटर बना सकता हूं। परिणाम सुरक्षित है और एक चरित्र छोटा है।
फेरुचियो

आप " 466555766" [n / 10] + d [n% 10] -96 के साथ d [n% 10] - " , +++) " [n / 10]
Tom Sirgedas

6

अजगर, 129 133 137 148 घर का काम

वार्म-अप के रूप में, यहां मेरा पहला संस्करण है (पिछले सर्वश्रेष्ठ पायथन से अधिक कुछ वर्णों में सुधार)।

पुनश्च। कुछ कटौती के बाद अब यह लगभग बीस चार्ट छोटा है:

n=input()
while n-4:p=(922148248>>n/10*3&7)+(632179416>>n%10*3&7)+(737280>>n&1)+4*(n<1);print n,'is %d.'%p;n=p
print'4 is magic.'

6

C #: 210 वर्ण।

squished:

using C=System.Console;class B{static void Main(){int
x=0,y=int.Parse(C.ReadLine());while(x!=4)C.Write((x=y)+" is {0}.\n",x==4?"magic":""+(y=x==0?4:"03354435543668877988"[x<20?x:x%10]+"0066555766"[x/10]-96));}}

विस्तारित:

using C=System.Console;
class B
{
    static void Main()
    {
        int x=0,y=int.Parse(C.ReadLine());
        while(x!=4)
            C.Write((x=y)+" is {0}.\n",
                x==4?
                     "magic":
                     ""+(y= x==0?
                                4:
                                "03354435543668877988"[x<20?x:x%10]+
                                "0066555766"[x/10]-96)
                   );
    }
}

ट्रिक्स इस दृष्टिकोण का उपयोग करता है:

  • संख्या में दिखाई देने वाले अंकों के आधार पर संख्या नाम की लंबाई के लिए एक लुकअप तालिका बनाएं।
  • एक वर्ण पर वर्ण सरणी लुकअप का उपयोग करें, और एक संख्यात्मक सरणी के बजाय चार अंकगणित करें।
  • अल्प के लिए कक्षा नाम का उपयोग करें Console. हैC.
  • ?:इसके बजाय सशर्त (टर्नरी) ऑपरेटर ( ) का उपयोग करेंif/else
  • के \nसाथ प्रयोग करेंWriteके बजाय भागने कोडWriteLine
  • इस तथ्य का उपयोग करें कि C # के अंदर असाइनमेंट की अनुमति देने के लिए मूल्यांकन का एक परिभाषित क्रम है Write फ़ंक्शन कॉल के
  • अतिरिक्त वक्तव्यों को खत्म करने के लिए असाइनमेंट एक्सप्रेशन का उपयोग करें, और इस प्रकार अतिरिक्त ब्रेसिज़

int[] zक्योंकि यह जरूरत नहीं है छोटी होगीnew[]
जॉय

सरणी लुकअप के बजाय वर्ण अंकगणित का उपयोग करने के लिए संशोधित।
LBushkin

@ mdm20: आप सही कह रहे हैं। मुझे लुकअप टेबल में गलती थी। अभी तय किया है।
एलबस्किन

खैर, बारहवीं बार आकर्षण है: * डी
LBushkin

एक quicky 5 अक्षर को बचाने के लिए: कास्टिंग की तुलना में कम "magic"करने के लिए object, हो सकता है परोक्ष फोन ToString()पर yजोड़कर ""। लेकिन, क्योंकि +इसकी पूर्वता अधिक है ?:, इसलिए आपको इसे झूठे हिस्से के बजाय सच्चे हिस्से में रखना होगा :।x!=4?y+"":"magic"
पी डैडी

6

पर्ल: 148 अक्षर

(पर्ल: 233 181 212 206 200 199 198 185 179 149 148 अक्षर)

  • इकाई सरणी में हैश अपवाद को स्थानांतरित किया। यह मेरे लिए कई पात्रों को काटने में सक्षम होने के परिणामस्वरूप :-)
  • भीड़ ने एक बुरा बग बताया। त्वरित सुधार 31 वर्ण जोड़ता है, ouch!
  • शून्य विशेष मामले के लिए संदर्भित, हल्के गोल्फिंग के रूप में अच्छी तरह से किया।
  • सरणी के लिए भंडारण के बजाय एकल उपयोग के लिए प्रत्यक्ष सूची पहुंच? अरे हाँ!
  • सिर्फ एक खूनी चरित्र के लिए बहुत कुछ है। यह, सही मायने में, एक गोल्फ खिलाड़ी का जीवन है। :-(
  • उफ़, आसान व्हाट्सएप फिक्स। 198 अब।
  • कुछ निरर्थक कोड दर्शाया गया।
  • में अंतिम वापसी कीवर्ड r अनावश्यक है, कुछ और बंद किया गया है।
  • प्रति टिप्पणियों में बड़े पैमाने पर रिफैक्टिंग; दुर्भाग्य से मैं इसे केवल 149 पर ही प्राप्त कर सका क्योंकि मुझे एक बग को ठीक करना था जो मेरे पहले के कोड और टिप्पणीकारों के दोनों संस्करणों में मौजूद था।
  • "जादू" नंगेपन की कोशिश करना।

आइए इस गेंद को पर्ल में एक मामूली प्रयास के साथ घुमाएं।

@u=split'','4335443554366887798866555766';$_=<>;chop;print"$_ is ".($_=$_==4?0:$_<20?$u[$_]:($u[$_/10+18]+($_%10&&$u[$_%10]))or magic).".
"while$_

ट्रिक्स:

बहुत अधिक!


एसीके! मैंने कभी कैसे परीक्षण किया कि मुझे कभी पता नहीं चलेगा।
प्लैटिनम एज़्योर

क्या आपके पास वहाँ कुछ मृत कोड है? मैं यह नहीं देख रहा हूँ कि $ u [0] 4 के लिए शून्य का विशेष मामला कैसे आवश्यक है। मेरे पास आपके कोड @ 166 वर्णों का एक प्रतीत होता है-कार्यशील संस्करण है, और मुझे लगता है कि इससे थोड़ा छोटा होने के लिए जगह है।
हॉब्स

@ हब्स: अच्छी बात है, मैं फिर से देखूंगा। कहानी यह है कि मैं कुछ संशोधन के माध्यम से आधा हो गया और अचानक चीजें टूट गईं (उस बिंदु के बारे में जहां मैंने 4 - 0 के लिए चुना था)। मुझे लगता है कि आप इस बिंदु पर सही हैं, हालांकि :-)
प्लैटिनम एज़्योर

मैं अपने आप को एक महान पर्ल प्रोग्रामर नहीं मानता, लेकिन आप कुछ पात्रों को कम कर सकते हैं: @u=split$x,'43350435543668877988';आपके कॉमा एक अनावश्यक 19 वर्णों का undefउपयोग करते हैं, हर वर्ण पर एक विभाजन को विभाजित करते हैं, मैं $x`अपरिभाषित 'की जगह लेने के लिए अपरिभाषित चर के रूप में उपयोग करता हूं - कुल बचत: 11 अक्षर। इसके अलावा, हटाने mमें chompऔर आप किसी अन्य चरित्र अपने स्कोर को बंद मुंडा मिलता है।
Vol7ron

बेहतर कर रहे हैं, लेकिन आप अभी भी sub rपूरी तरह से हार कर अधिक बचत कर सकते हैं - आप केवल एक बार इसका उपयोग करते हैं और आप इसे एक भी नेस्टेड टर्नरी द्वारा बिना परेंस के भी बदल सकते हैं । मेरा संस्करण अभी 144 वर्ण है: gist.github.com/473289
hobbs

5

जावास्क्रिप्ट 1.8 (स्पाइडरमोनी) - 153 शुल्क

l='4335443554366887798866555766'.split('')
for(b=readline();(a=+b)-4;print(a,'is '+b+'.'))b=a<20?l[a]:+l[18+a/10|0]+(a%10&&+l[a%10])
print('4 is magic.')

उपयोग: echo 42 | js golf.js

आउटपुट:

42 is 8.
8 is 5.
5 is 4.
4 is magic.

बोनस के साथ - 364 चार्ट

l='zero one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty thirty fourty fifty sixty seventy eighty ninety'.split(' ')
z=function(a)a<20?l[a]:l[18+a/10|0]+(a%10?' '+l[a%10]:'')
for(b=+readline();(a=b)-4;print(z(a),'is '+z(b)+'.'))b=z(a).replace(' ','').length
print('four is magic.')

आउटपुट:

निन्यानवे दस है।
दस तीन है।
तीन पाँच है।
पाँच चार है।
चार जादू है।

4

हास्केल, 224 270 वर्ण

o="43354435543668877988"
x!i=read[x!!i]
n x|x<20=o!x|0<1="0066555766"!div x 10+o!mod x 10
f x=zipWith(\a b->a++" is "++b++".")l(tail l)where l=map show(takeWhile(/=4)$iterate n x)++["4","magic"]
main=readLn>>=mapM putStrLn.f

और थोड़ा अधिक पठनीय -

ones = [4,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8]
tens = [0,0,6,6,5,5,5,7,6,6]

n x = if x < 20 then ones !! x else (tens !! div x 10) + (ones !! mod x 10)

f x = zipWith (\a b -> a ++ " is " ++ b ++ ".") l (tail l)
    where l = map show (takeWhile (/=4) (iterate n x)) ++ ["4", "magic"]
    
main = readLn >>= mapM putStrLn . f

4

C ++ Stdio संस्करण, छोटा: 196 वर्ण

#include <cstdio>
#define P;printf(
char*o="43354435543668877988";main(int p){scanf("%d",&p)P"%d",p);while(p!=4){p=p<20?o[p]-48:"0366555966"[p/10]-96+o[p%10]P" is %d.\n%d",p,p);}P" is magic.\n");}

सी ++ आईस्ट्रीम संस्करण, कीमा बनाया हुआ: 195 वर्ण

#include <iostream>
#define O;std::cout<<
char*o="43354435543668877988";main(int p){std::cin>>p;O p;while(p!=4){p=p<20?o[p]-48:"0366555966"[p/10]-96+o[p%10]O" is "<<p<<".\n"<<p;}O" is magic.\n";}

मूल, अन-मिनिफ़ाइड: 344 अक्षर

#include <cstdio>

int ones[] = { 4, 3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8 };
int tens[] = { 0, 3, 6, 6, 5, 5, 5, 9, 6, 6 };

int n(int n) {
    return n<20 ? ones[n] : tens[n/10] + ones[n%10];
}

int main(int p) {
    scanf("%d", &p);
    while(p!=4) {
        int q = n(p);
        printf("%i is %i\n", p, q);
        p = q;
    }
    printf("%i is magic\n", p);
}

फिक्स्ड। इसने इसे थोड़ा छोटा भी कर दिया।
माइक डीमोन जूल

अच्छी तरह से किया। (मैं 20-चरित्र std conundrum पर बहुत हँसा!)
प्लैटिनम एज़्योर

हाँ, यह एक वास्तविक हेडबैंगर था, जब तक कि यह मुझ पर नहीं चढ़ता था, जो तब #defineभी छोटा होता था क्योंकि यह कई टोकन बदल सकता था।
माइक डीमोन

printf("is magic".\n)=> putsprintf("%d",p)=> puts(atoi(p))। न केवल कम बल्कि तेज भी।
बेन वोइगट

2
@ माइक डीसिमोन: मुझे लगता है कि while(p!=4)इसे छोटा किया जा सकता है while(p-4)। एक पूरा चरित्र, मुझे पता है, लेकिन फिर भी। :-)
प्लैटिनम एज़्योर

3

डेल्फी: 329 अक्षर

एकल पंक्ति संस्करण:

program P;{$APPTYPE CONSOLE}uses SysUtils;const S=65;A='EDDFEEDFFEDGGIIHHJII';B='DGGFFFJGG';function Z(X:Byte):Byte;begin if X<20 then Z:=Ord(A[X+1])-S else Z:=(Ord(B[X DIV 10])-S)+Z(X MOD 10)end;var X,Y:Byte;begin Write('> ');ReadLn(X);repeat Y:=Z(X);WriteLn(Format('%d is %d.',[X,Y]));X:=Y;until X=4;WriteLn('4 is magic.');end.

स्वरूपित:

program P;

{$APPTYPE CONSOLE}

uses
  SysUtils;

const
  S = 65;
  A = 'EDDFEEDFFEDGGIIHHJII';
  B = 'DGGFFFJGG';

function Z(X:Byte):Byte;
begin
  if X<20
  then Z := Ord(A[X+1])-S
  else Z := (Ord(B[X DIV 10])-S) + Z(X MOD 10);
end;

var
  X,Y: Byte;

begin
  Write('> ');
  ReadLn(X);

  repeat
    Y:=Z(X);
    WriteLn(Format('%d is %d.' , [X,Y]));
    X:=Y;
  until X=4;

  WriteLn('4 is magic.');
end.

शायद कुछ और निचोड़ के लिए कमरा ...: -पी


3

C # 314 286 283 274 289 273 252 chars।

squished:

252 

सामान्य:

using C = System.Console;
class P
{
    static void Main()
    {
        var x = "4335443554366877798866555766";
        int m, o, v = int.Parse(C.ReadLine());
        do {
            C.Write("{0} is {1}.\n", o = v, v == 4 ? (object)"magic" : v = v < 20 ? x[v] - 48 : x[17 + v / 10] - 96 + ((m = v % 10) > 0 ? x[m] : 48));
        } while (o != 4);
        C.ReadLine();
    }
}

Dykam को संपादित करें: काफी सावधानीपूर्वक प्रविष्टि और परिवर्तन किए गए:

  • एल को बदल दिया। String () के लिए एक डाली objectमें string "magic"
  • एक अस्थायी चर बनाया गया है o, इसलिए मैं breakबाहर के forलूप को स्थानांतरित कर सकता हूं , अर्थात्, ए do-while
  • oअसाइनमेंट को रेखांकित करें, असाइनमेंट को vपूरा करें, lफ़ंक्शन तर्कों की गणना पूरी तरह से सम्मिलित करने के लिए जारी रखें , जिसकी आवश्यकता को हटा दें l। के कार्य को भी रेखांकित किया m
  • में एक स्थान हटाया int[] x, int[]xकानूनी भी है।
  • सरणी को एक स्ट्रिंग परिवर्तन में बदलने की कोशिश की गई, लेकिन using System.Linqइसे सुधारने के लिए बहुत अधिक था।

संपादित करें 2 डाइकम ने इंट सरणी को चार सरणी / स्ट्रिंग में बदल दिया, इसे ठीक करने के लिए उचित अंकगणित जोड़ा।


हाँ, यह जावा संस्करण से छोटा है।
डायकम

3

लुआ, 176 वर्ण

o={[0]=4,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8}t={3,6,6,5,5,5,7,6,6}n=0+io.read()while n~=4 do a=o[n]or o[n%10]+t[(n-n%10)/10]print(n.." is "..a..".")n=a end print"4 is magic."

या

  o={[0]=4,3,3,5,4,4
  ,3,5,5,4,3,6,6,8,8
  ,7,7,9,8,8}t={3,6,
   6,5,5,5,7,6,6}n=
   0+io.read()while
   n ~= 4 do a= o[n
   ]or o[n%10]+t[(n
   -n%10)/10]print(
n.." is "..a.."." )n=a
end print"4 is magic."

3

सी - बिना संख्या के शब्द

180 175 * 172 167 वर्ण

सभी नई पठनीयता के लिए हैं और उन्हें हटाया जा सकता है:

i;V(x){return"\3#,#6$:WOXB79B"[x/2]/(x%2?1:10)%10;}main(c){for(scanf("%d",&c);
c-4;)i=c,printf("%d is %d.\n",i,c=c?c>19?V(c/10+19)+V(c%10):V(c):4);puts(
"4 is magic.");}

थोड़ा अनभिज्ञ:

i;
V(x){return"\3#,#6$:WOXB79B"[x/2]/(x%2?1:10)%10;}
main(c){
    for(scanf("%d",&c);c-4;)
        i=c,
        printf("%d is %d.\n",i,c=c?c>19?V(c/10+19)+V(c%10):V(c):4);
    puts("4 is magic.");
}

* पिछले संस्करण ने कल्पना के दो हिस्सों पर निशान छोड़ दिया: यह शून्य को संभाल नहीं पाया, और इसने गति के बजाय कमांड लाइन पर इनपुट लिया। शून्य जोड़े गए वर्णों को संभालना, लेकिन कमांड लाइन के बजाय स्टडिन का उपयोग करने से भी अधिक बचत हुई, जिसके परिणामस्वरूप शुद्ध बचत हुई।


2

पर्ल, 123 122 वर्ण

बस एहसास हुआ कि STDOUT में आउटपुट की कोई आवश्यकता नहीं है, इसलिए STDERR के बजाय आउटपुट और किसी अन्य वर्ण को बंद करें।

@u='0335443554366887798866555766'=~/./g;$_+=<>;warn"$_ is ",$_=$_-4?$_<20?$u[$_]||4:$u[chop]+$u[$_+18]:magic,".\n"until/g/

और, एक ऐसा वर्जन जो अंकों की वर्तनी देता है:

279 278 276 280 वर्ण

@p=(Thir,Four,Fif,Six,Seven,Eigh,Nine);@n=("",One,Two,Three,Four,Five,@p[3..6],Ten,Eleven,Twelve,map$_.teen,@p);s/u//for@m=map$_.ty,Twen,@p;$n[8].=t;sub n{$n=shift;$n?$n<20?$n[$n]:"$m[$n/10-2] $n[$n%10]":Zero}$p+=<>;warnt$m=n($p)," is ",$_=$p-4?n$p=()=$m=~/\w/g:magic,".\n"until/c/

जबकि यह कल्पना से मिलता है, यह 100% अच्छी तरह से स्वरूपित नहीं है। यह शून्य में समाप्त होने के बाद एक अतिरिक्त स्थान देता है। युक्ति कहती है:

"मुझे परवाह नहीं है कि आप टोकन शब्द को कैसे अलग करते हैं, हालांकि उन्हें अलग किया जाना चाहिए"

हालांकि यह एक तरह की वीसली है। पर एक और अधिक सही संस्करण

282 281 279 283 वर्ण

@p=(Thir,Four,Fif,Six,Seven,Eigh,Nine);@n=("\x8",One,Two,Three,Four,Five,@p[3..6],Ten,Eleven,Twelve,map$_.teen,@p);s/u//for@m=map$_.ty,Twen,@p;$n[8].=t;sub n{$n=shift;$n?$n<20?$n[$n]:"$m[$n/10-2]-$n[$n%10]":Zero}$p+=<>;warn$m=n($p)," is ",$_=$p-4?n$p=()=$m=~/\w/g:magic,".\n"until/c/

1

अजगर:

#!/usr/bin/env python

# Number of letters in each part, we don't count spaces
Decades = ( 0, 3, 6, 6, 6, 5, 5, 7, 6, 6, 0 )
Smalls  = ( 0, 3, 3, 5, 4, 4, 3, 5, 5, 4 )
Teens  =  ( 6, 6, 8, 8, 7, 7, 9, 8, 8 )

def Count(n):
    if n > 10 and n < 20: return Teens[n-11]
    return   Smalls[n % 10 ] + Decades [ n / 10 ]

N = input()

while N-4:
    Cnt = Count(N)
    print "%d is %d" % ( N, Cnt)
    N = Cnt

print "4 is magic"

4
मुझें यह पसंद है। आप शायद इसे थोड़ा कस सकते हैं।
जोश के

@ व्लाद: तर्कों के बजाय स्टड से इनपुट पढ़ा जाना चाहिए। इसका मतलब है कि आप बस N = input()(या raw_input()) का उपयोग कर सकते हैं और sysसामान को खत्म कर सकते हैं ।

इसके अलावा, आप छोटे लोगों को किशोर शामिल कर सकते हैं, तो अगर बयान केवल "अगर n <20: रिटर्न स्मॉल [एन]" होगा। स्मॉल अभी भी> = 20 केस के लिए काम करेंगे, क्योंकि मापांक 10. के अनुसार
जॉन स्मॉक

5
यह पहली बार मैं (पूरी तरह से वैकल्पिक) देख होना चाहिए she-bangएक कोड गोल्फ जवाब में ;-)
ChristopheD

एक अच्छी शुरुआत की तरह लगता है ... निश्चित रूप से इसे कस लें, यहां तक ​​कि अजगर को इस व्हाट्सएप की सभी की आवश्यकता नहीं है। :-) इसके अलावा, जैसा कि फेरुचियो बताते हैं, 0 काम नहीं करता है, विशेष रूप से यह एक अनंत लूप में जाने लगता है।
प्लैटिनम एज़्योर

1

C ++, 171 वर्ण (# निकाले गए)

void main(){char x,y,*a="03354435543668877988";scanf("%d",&x);for(;x-4;x=y)y=x?x<19?a[x]-48:"_466555766"[x/10]+a[x%10]-96:4,printf("%d is %d.\n",x,y);puts("4 is magic.");}

मुझे लगता है कि यदि आप इसे सी मानते हैं, तो आप इसकी आवश्यकता से बच सकते हैं #includeक्योंकि कार्यों को केवल intपैरामीटर लेने के लिए मान लिया जाएगा । तुम भी mainवापसी करके एक स्ट्रोक बचा सकते हैं int
गाबे

1

रूबी, 164 वर्ण

n=gets.to_i;s="03354435543668877987";if n==0;puts"0 is 4.";else;puts"#{n} is #{n=(n<20)?s[n]-48:"0066555766"[n/10]-48+s[n%10]-48}." until n==4;end;puts"4 is magic."

डीकोड:

n = gets.to_i
s = "03354435543668877987"
if n == 0
  puts "0 is 4."
else
  puts "#{n} is #{n = (n < 20) ? s[n] - 48 : "0066555766"[n / 10] - 48 + s[n % 10] - 48}." until n == 4
end

puts "4 is magic."

अच्छा रूबी समाधान, यह सरल रखते हुए। :-) (+1)
प्लेटिनम एज़्योर

इसे सरल रखना बहुत अधिक समय तक रखने का कोई बहाना नहीं है; हालांकि ;-)
जॉय

मुझे लगता है कि आप 'if n == 0' को 'if! N' से बदल सकते हैं
Vincent

2
रूबी में? मैंने हमेशा सोचा था कि झूठे और शून्य को छोड़कर सभी मूल्यों का सही मूल्यांकन किया गया है :-(
प्लैटिनम एज़्योर

1

लुआ 185 190 199

अतिरिक्त अवधि, जोड़ा गया io.read, निकाला गया () अंतिम प्रिंट पर

 n=io.read();while(n~=4)do m=('43354435543668877988699;::9;;:699;::9;;:588:998::9588:998::9588:998::97::<;;:<<;699;::9;;:699;::9;;:'):sub(n+1):byte()-48;print(n,' is ',m,'.')n=m;end print'4 is magic.'

लाइन टूटने के साथ

 n=io.read()
 while (n~=4) do
    m=('43354435543668877988699;::9;;:699;::9;;:588:998::9588:998::9588:998::97::<;;:<<;699;::9;;:699;::9;;:'):sub(n+1):byte()-48;
    print(n,' is ',m,'.')
    n=m;
 end 
 print'4 is magic.'

n=io.read()मानक इनपुट से संख्या पढ़ने के लिए नियम का पालन करने के लिए (+11 वर्ण) की आवश्यकता है । बदलने के print('4 is magic.')लिए print'4 is magic.'2 वर्णों को बचाएगा। ;बाद हटाने से )1 char बच जाएगा। printअल्पविरामों का उपयोग धोखा दे की तरह लगता है, लेकिन कल्पना स्पष्ट नहीं है। साथ ही इसे print(n,'is',m,'.')2 वर्णों को बचाने के लिए बदल सकते हैं ।
15:16 पर gwell

क्या लोआ अकेले खड़े होने के लिए अल्पविराम को नए रूप में प्रदान किया जाता है? Ive का उपयोग करने के बाद से यह एक समय हो गया है।
निक वान ब्रंट

कॉमा को टैब के रूप में प्रस्तुत किया जाता है।
ग्वेल जूल

0

पीएचपी कोड

function get_num_name($num){  
    switch($num){  
        case 1:return 'one';  
    case 2:return 'two';  
    case 3:return 'three';  
    case 4:return 'four';  
    case 5:return 'five';  
    case 6:return 'six';  
    case 7:return 'seven';  
    case 8:return 'eight';  
    case 9:return 'nine';  
    }  
}  

function num_to_words($number, $real_name, $decimal_digit, $decimal_name){  
    $res = '';  
    $real = 0;  
    $decimal = 0;  

    if($number == 0)  
        return 'Zero'.(($real_name == '')?'':' '.$real_name);  
    if($number >= 0){  
        $real = floor($number);  
        $decimal = number_format($number - $real, $decimal_digit, '.', ',');  
    }else{  
        $real = ceil($number) * (-1);  
        $number = abs($number);  
        $decimal = number_format($number - $real, $decimal_digit, '.', ',');  
    }  
    $decimal = substr($decimal, strpos($decimal, '.') +1);  

    $unit_name[1] = 'thousand';  
    $unit_name[2] = 'million';  
    $unit_name[3] = 'billion';  
    $unit_name[4] = 'trillion';  

    $packet = array();    

    $number = strrev($real);  
    $packet = str_split($number,3);  

    for($i=0;$i<count($packet);$i++){  
        $tmp = strrev($packet[$i]);  
        $unit = $unit_name[$i];  
        if((int)$tmp == 0)  
            continue;  
        $tmp_res = '';  
        if(strlen($tmp) >= 2){  
            $tmp_proc = substr($tmp,-2);  
            switch($tmp_proc){  
                case '10':  
                    $tmp_res = 'ten';  
                    break;  
                case '11':  
                    $tmp_res = 'eleven';  
                    break;  
                case '12':  
                    $tmp_res = 'twelve';  
                    break;  
                case '13':  
                    $tmp_res = 'thirteen';  
                    break;  
                case '15':  
                    $tmp_res = 'fifteen';  
                    break;  
                case '20':  
                    $tmp_res = 'twenty';  
                    break;  
                case '30':  
                    $tmp_res = 'thirty';  
                    break;  
                case '40':  
                    $tmp_res = 'forty';  
                    break;  
                case '50':  
                    $tmp_res = 'fifty';  
                    break;  
                case '70':  
                    $tmp_res = 'seventy';  
                    break;  
                case '80':  
                    $tmp_res = 'eighty';  
                    break;  
                default:  
                    $tmp_begin = substr($tmp_proc,0,1);  
                    $tmp_end = substr($tmp_proc,1,1);  

                    if($tmp_begin == '1')  
                        $tmp_res = get_num_name($tmp_end).'teen';  
                    elseif($tmp_begin == '0')  
                        $tmp_res = get_num_name($tmp_end);  
                    elseif($tmp_end == '0')  
                        $tmp_res = get_num_name($tmp_begin).'ty';  
                    else{  
                        if($tmp_begin == '2')  
                            $tmp_res = 'twenty';  
                        elseif($tmp_begin == '3')  
                            $tmp_res = 'thirty';  
                        elseif($tmp_begin == '4')  
                            $tmp_res = 'forty';  
                        elseif($tmp_begin == '5')  
                            $tmp_res = 'fifty';  
                        elseif($tmp_begin == '6')  
                            $tmp_res = 'sixty';  
                        elseif($tmp_begin == '7')  
                            $tmp_res = 'seventy';  
                        elseif($tmp_begin == '8')  
                            $tmp_res = 'eighty';  
                        elseif($tmp_begin == '9')  
                            $tmp_res = 'ninety';  

                        $tmp_res = $tmp_res.' '.get_num_name($tmp_end);  
                    }  
                    break;  
            }  

            if(strlen($tmp) == 3){  
                $tmp_begin = substr($tmp,0,1);  

                $space = '';  
                if(substr($tmp_res,0,1) != ' ' && $tmp_res != '')  
                    $space = ' ';  

                if($tmp_begin != 0){  
                    if($tmp_begin != '0'){  
                        if($tmp_res != '')  
                            $tmp_res = 'and'.$space.$tmp_res;  
                    }  
                    $tmp_res = get_num_name($tmp_begin).' hundred'.$space.$tmp_res;  
                }  
            }  
        }else  
            $tmp_res = get_num_name($tmp);  
        $space = '';  
        if(substr($res,0,1) != ' ' && $res != '')  
            $space = ' ';  
        $res = $tmp_res.' '.$unit.$space.$res;  
    }  

    $space = '';  
    if(substr($res,-1) != ' ' && $res != '')  
        $space = ' ';  

    if($res)  
        $res .= $space.$real_name.(($real > 1 && $real_name != '')?'s':'');  

    if($decimal > 0)  
        $res .= ' '.num_to_words($decimal, '', 0, '').' '.$decimal_name.(($decimal > 1 && $decimal_name != '')?'s':'');  
    return ucfirst($res);  
}  

//////////// परिक्षण ////////////////

 $str2num = 12;
    while($str2num!=4){
        $str = num_to_words($str2num, '', 0, '');  
        $str2num = strlen($str)-1;
        echo $str . '=' . $str2num .'<br/>';
        if ($str2num == 4)
            echo 'four is magic';
    }

////// परिणाम /////////

Twelve =6
Six =3
Three =5
Five =4
four is magic

4
@wallacoloo: क्रैमी भाषा के लिए एक क्रमी समाधान: D
थॉमस ईडिंग

5
या बहुत छोटा 178 वर्ण:$l='4335443554366887798866555766';for($b=(int)fgets(fopen('php://stdin','r'));($a=$b)-4;){$b=$a<20?$l[$a]:$l[18+$a/10]+($a%10?$l[$a%10]:0);echo"$a is $b.\n";}echo"4 is magic.\n";
जार्फ

अच्छा मजाक। : -D इतना अच्छी तरह से क्रमादेशित।
टॉम पैजोर्रेक

0

पर्ल - 130 वर्ण


5.12.1 (130 वर्ण) 121 123 132 136 140

#        1         2         3         4         5         6         7         8         9        100        11        12        13       14    
#23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123

@u='4335443554366887798866555766'=~/./g;$_=pop;say"$_ is ",$_=$_-4?$_<20?$u[$_]:$u[$_/10+18]+(($_%=10)&&$u[$_]):magic,"."until/\D/


5.10.1 (134 वर्ण) 125 127 136 140 144

#        1         2         3         4         5         6         7         8         9        100        11        12        13       14    
#23456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 1234

@u='4335443554366887798866555766'=~/./g;$_=pop;print"$_ is ",$_=$_-4?$_<20?$u[$_]:$u[$_/10+18]+(($_%=10)&&$u[$_]):magic,".\n"until/\D/


इतिहास बदलें:

20100714:2223- भीड़ के ध्यान में उलटा परिवर्तन , लेकिन ($_%10&&$u[$_%10])(($_%=10)&&$u[$_]), जो समान # वर्णों का है, लेकिन मैंने ऐसा किया है कि कोई इसे सुधारने का तरीका देख सकता है

20100714:0041- split//,'...''...'=~/./g
20100714:0025- ($_%10&&$u[$_%10])$u[$_%10]
20100713:2340- while$_→ → until/\D/अनावश्यक कोष्ठकों को हटाया
20100713:xxxx- $=<>;chop;$_=pop;- जुटाना


नोट: मैं टिप्पणियों में दूसरों के उत्तरों को सुधारने से थक गया था, इसलिए अब मैं लालची हो रहा हूं और बस यहां अपने बदलाव जोड़ सकता हूं :) यह प्लेटिनम अज़ूर के जवाब से अलग एक विभाजन है - हॉब्स , मोबाइल और प्लेटिनम नीला


आप से छुटकारा मिला जब $_%10&&...निर्माण, आप आदानों 20,30,40 के लिए कल्पना तोड़ दिया, ...
भीड़

+1 किया हुआ। आप हालांकि :-( आर्ग में stdin से बाहर चले गए हैं
प्लेटिनम Azure

सही, के साथ प्रतिस्थापित ARGV, जो STDIN:) या .. से आबाद है echo bar | xargs perl foo.pl, तकनीकी रूप से प्रतिध्वनि के लिए प्रतिध्वनियों में प्रतिध्वनि से :)
vol7ron

0

संख्याहीन शब्दों के साथ बेशर्म पर्ल (329 अक्षर)

पी डैडी के सी कोड से सीधे तौर पर अनुकूलित किया गया है, कुछ ट्विक्स के साथ p()इसे सी के बजाय पर्ल प्राइमिटिव का उपयोग करके एक ही काम करने के लिए, और एक ज्यादातर फिर से लिखे गए मुख्य लूप। उसकी व्याख्या के लिए देखें। Newlines सभी वैकल्पिक हैं।

@t=(qw(zero one two three four five six sM eight nine
tL elM twelve NP 4P fifP 6P 7P 8O 9P twLQ NQ forQ fifQ
6Q 7Q 8y 9Q en evL thir eL tO ty 4SmagicT)," is ",".\n");
sub p{local$_=$t[pop];1while s/[0-Z]/$t[-48+ord$&]/e;
print;length}$_=<>;chop;while($_-4){
$_=($_>19?(p($_/10+18),$_&&print("-"),$_%=10)[0]:0)+p$_;
p 35;p$_;p 36}p 34

साइड नोट: यह बहुत बुरा है कि पर्ल printसिर्फ सही / गलत रिटर्न देता है; अगर यह एक गिनती लौटा तो यह मुझे 7 स्ट्रोक बचा लेगा।


0

रूबी, 141 चरस:

n=gets.to_i;m="4335443554366887798866555766";loop{s=n;n=n>20?m[18+n/10]+m[n%10]-96: m[n]-48;puts"#{s} is #{n==s ? 'magic': n}.";n==s &&break}

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