क्रिस पाइन की "बहरे दादी"


22

मैं RubyLearning में एक संरक्षक हूं और हमारे छात्रों को दिए गए अभ्यासों में से एक क्रिस पाइन की पुस्तक " लर्न टू प्रोग्राम " से "बधिर दादी" अभ्यास है । यहाँ वर्णन है:

बहरा दादी कार्यक्रम लिखें। जब भी आप दादी से कहते हैं (आप जो भी टाइप करते हैं), तो उन्हें इस बात का जवाब देना चाहिए: "हुह? बोलो, बेटा!", जब तक कि आप इसे चिल्लाएंगे नहीं (सभी राजधानियों में टाइप करें)। यदि आप चिल्लाते हैं, तो वह आपको सुन सकती है (या कम से कम वह ऐसा सोचती है) और वापस चिल्लाती है: "नहीं, 1938 से नहीं!"

अपने कार्यक्रम को वास्तव में विश्वसनीय बनाने के लिए, हर बार दादी ने एक अलग साल चिल्लाया; 1930 और 1950 के बीच यादृच्छिक रूप से किसी भी वर्ष। (यह हिस्सा वैकल्पिक है, और अगर आप रूबी के यादृच्छिक संख्या जनरेटर पर अनुभाग अध्याय के अंत में अनुभाग पढ़ते हैं तो यह बहुत आसान होगा।) जब तक आप दादी से बात नहीं कर सकते। "BYE" चिल्लाएँ।

कई पाठ्यक्रम पुनरावृत्तियों के बाद मैंने यह देखने की कोशिश की कि मुझे यह कितना छोटा लग सकता है और अब यह 112 वर्णों तक नीचे है:

puts (s||='').upcase==s ? "NO, NOT SINCE #{1930+rand(21)}!":"HUH?! SPEAK UP, SONNY!" until(s=gets.chomp)=="BYE"

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

संपादित करें: नीचे दिए गए पर्ल समाधान का नेतृत्व किया गया

ruby -nle 'puts($_=="BYE"?exit: $_.upcase!? "HUH?! SEPAK UP, SONNY!":"NO, NOT SINCE #{1930+rand(21)}!")'

जो कि अभिव्यक्ति के लिए 92 अक्षर है + nऔर lविकल्पों के लिए 2 और ।


गोल्फ के संदर्भ में, इसके लिए अतिरिक्त विनिर्देश की आवश्यकता होती है। यदि बीईई से कोई अतिरिक्त उत्पादन हो तो क्या होना चाहिए?
जेबी

केवल "BYE" बिल्कुल कार्यक्रम को समाप्त करता है।
माइकल कोहल 20

जवाबों:


13

पर्ल, 85 91

साथ चलाएं perl -nE '<code goes there>'( nप्रोग्राम आकार में गिना गया):

$==1930+rand 21;say/^BYE$/?last:uc eq$_?"
NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"

यह अनुगामी विस्मयादिबोधक चिह्न बहुत महंगा है ...

IK द्वारा सुझाए गए संपादन:

  • एक स्ट्रिंग मैच के बजाय एक regexp का उपयोग करने के लिए -l वैश्विक विकल्प के साथ-साथ दो प्रोग्राम वर्ण: -3 भी हो जाते हैं।
  • किसी मान को सहेजने के लिए एक वास्तविक चर का उपयोग करना और बाद में प्रक्षेप के लिए इसका उपयोग करना (प्रतिभा! जो उस के लिए एक चर का उपयोग करने के बारे में सोचा होगा?): 0।
  • उस चर को बनाना $=, पूर्णांक बनने के लिए विवश: -4।

(और यह अभी भी जोड़ नहीं है और मुझे यह पता करने के लिए बहुत नींद आ रही है कि क्यों। ओह ठीक है, अंतिम गिनती कम से कम सही है)


कोस $=और "अलविदा" के लिए एक regexp का उपयोग कर 84 + 1 को यह नीचे हो जाता है:perl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
Ilmari कारोनेन

@ इल्मारिकारोन एकीकृत, धन्यवाद!
जेबी

6

अजगर 120 वर्ण

r=raw_input
s=r()
while'BYE'!=s:
 print["HUH?! SPEAK UP, SONNY!","NO, NOT SINCE %d!"%(1930+id(s)%21)][s.isupper()];s=r()

सुधार के लिए कोई संकेत?


आपको उस विवरण के चारों ओर कोष्ठक की आवश्यकता नहीं है, अगर मुझे भी यकीन है कि अजगर को एक पुनरावृत्ति छत है - लेकिन यह सिर्फ सोते हुए आपकी दादी को अनुकरण कर सकता है।
फिश

ओह! मैं कोष्ठक निकालना भूल गया। धन्यवाद :)
fR0DDY

यदि आप पहली पंक्ति को हटाते हैं, तो आप कुछ वर्णों को सहेज सकते हैं, दूसरे को प्रतिस्थापित कर सकते हैं s='', अपने स्टेटमेंट को अपने लूप में फिर से व्यवस्थित कर सकते हैं और पूरे को लूप में रख सकते हैं: gist.github.com/3787809 यदि आप वास्तव में निर्धारित थे, तो आप कर सकते हैं अजगर 3 (raw_input () -> इनपुट (), लेकिन प्रिंट -> प्रिंट ()) का उपयोग करके 2 पात्रों को बचाएं
मैट

4

पॉवरशेल में 131 वर्ण:

for(){$j=read-host;if($j-ceq"BYE"){break}if($j-ceq$j.ToUpper()){"No, not since 19$(10..90|random)!"}else{"Huh?! Speak up, sonny!"}}

डब्ल्यू / व्हाट्सएप:

for(){
  $j = read-host;
  if ( $j -ceq "BYE" ) { break }
  if ( $j -ceq $j.ToUpper() ) { "No, not since 19$(10..90|random)!" }
  else { "Huh?! Speak up, sonny!" }
}

जॉय के सुझाव से 18 पात्रों को निचोड़ा।

BTW, 'लर्न टू प्रोग्राम' पहली प्रोग्रामिंग बुक थी जिसे मैंने कभी कवर करने के लिए कवर पढ़ा था।


आप यहाँ एक नज़र रखना चाहते हैं: codegolf.stackexchange.com/questions/191/…
जॉय

आप इस तरह if...की सशर्त जांच में पहली बार स्क्वीज़ करके इसे 120 तक नीचे ला सकते हैं for(): for(;($j=read-host)-cne"BYE"){if($j-ceq$j.ToUpper()){...इसके अलावा, 1930-1950 में यह भी कहा गया है।
स्पेलिंग

3

सी # - 234 शुल्क

using System;class P{static void Main(){for(;;){var s=Console.ReadLine();if(s!=s.ToUpper()){Console.WriteLine("Huh?! Speak up, sonny!");continue;}if(s=="BYE")break;Console.WriteLine("No, not since 19{0}!",new Random().Next(30,51));}}}

अधिक पठनीय:

using System;
class P
{
    static void Main()
    {
        for(;;)
        {
            var s=Console.ReadLine();
            if(s!=s.ToUpper())
            {
                Console.WriteLine("Huh?! Speak up, sonny!");
                continue;
            }
            if(s=="BYE")
                break;
            Console.WriteLine("No, not since 19{0}!",new Random().Next(30,51));
        }
    }
}

आह कुछ सरल लोगों को याद किया, और कुछ मूर्खतापूर्ण गलतियाँ कीं। नाइस +1
काइल रोज़ेंडो

3

Befunge - 27x6 = 162 वर्ण

> ~:0`  #v _            vv<
         >:"a"`!#v  _:"z"`|
^                <       <
v"Huh?! Speak up, sonny!"0<
v"No, not since 1938!"0 <
>:# #, _@

संपादित करें: पूरी तरह से "BYE" भाग याद किया। नया संस्करण जल्द ही आ रहा है

EDIT 2: वास्तव में, यह मेरे अल्प Befunge कौशल के लिए थोड़ा जटिल है। मैं बाद में फिर से कोशिश कर सकता हूं, लेकिन मैं इसे लागू करने का कोई सरल तरीका नहीं सोच सकता।


3

C # - 194 CHARS

using System;class P{static void Main(){var s=Console.ReadLine();if(s!="BYE"){Console.Write((s==s.ToUpper()?"No, not since 19"+new Random().Next(30, 51):"Huh?! Speak up, sonny")+"!");Main();}}}

व्हाट्सएप के साथ:

using System;
class P
{
    static void Main()
    {
        var s = Console.ReadLine();
        if (s != "BYE")
        {
            Console.Write((s == s.ToUpper() ? "No, not since 19" + new Random().Next(30, 51) : "Huh?! Speak up, sonny") + "!");
            Main();
        }
    }
}

Nellius और fR0DDY से कुछ प्रेरणा लेकर।

कृपया मुझे बताएं कि क्या इसमें सुधार किया जा सकता है।


लघु, लेकिन एफडब्ल्यूआईडब्ल्यू, मुझे लगता है कि यह लीक (पुनरावर्ती कॉलिंग Main()) है। इसके अलावा, मुझे लगता है कि आप दोनों में ?:प्राप्त करने के लिए अभिव्यक्ति में parens चाहते हैं !। मैंने इस और ईओएल (लेकिन अभी भी लीक) के साथ एक उत्तर जोड़ा।
bw

मैं देख रहा हूँ कि आपने परिजनों को जोड़ा और आपकी टिप्पणी को हटा दिया। बहुत बढ़िया। अब मेरे और परेंस के बिना मेरे स्क्रीनशॉट को जोड़ने के लिए एडिट्स मूट है। (लेकिन, अभी भी लीक) :-)
bw

@ बिल हां, मैंने शुरू में अपने परीक्षण को गड़बड़ कर दिया। नॉन लीकी संस्करण 199 वर्ण, वाया बहुत लंबा :)
रिचर्ड

हा। मुझे Main();समाधान पसंद है ... कोई भी समझदार व्यक्ति इस कार्यक्रम का उपयोग नहीं करेगा इसके लिए एक समस्या है।
bw

जैसा कि Foshi0DDY के लिए टिप्पणी में Phoshi ने कहा। जब दादी सो जाती है तो प्रोग्राम क्रैश हो जाता है।
रिचर्ड

3

D: 246 वर्ण

import std.random,std.stdio,std.string;void main(){auto r=rndGen();for(;;){auto t=strip(readln());if(t=="BYE")break;if(t.toupper()==t)writefln("No, not since %s!",{r.popFront();return r.front%20+1930;}());else writeln("Huh?! Speak up, sonny!");}}

अधिक कानूनी रूप से:

import std.random, std.stdio, std.string;

void main()
{
    auto r = rndGen();

    for(;;)
    {
        auto t = strip(readln());

        if(t == "BYE")
            break;

        if(t.toupper() == t)
            writefln("No, not since %s!", {r.popFront(); return r.front % 20 + 1930;}());
        else
            writeln("Huh?! Speak up, sonny!");
    }
}

3

जावास्क्रिप्ट, 142 वर्ण, उनमें से 29 यादृच्छिक वर्ष का प्रदर्शन करते हैं

n='a'; while((/[a-z]/.test(n)?r="HUH?! SPEAK UP, SONNY!":n=="BYE"?r='':r="NO, NOT SINCE "+Math.floor(Math.random()*21+1930))!=''){n=prompt(r)}


3

विंडोज पॉवरशेल, 121 117

कार्य की प्रकृति के कारण यह Ty Auvil के समाधान के समान प्रतीत होता है , हालांकि इसे स्वतंत्र रूप से लिखा गया था:

for(;($j=read-host)-cne'BYE'){if($j-cmatch'[a-z]'){'Huh?! Speak up, sonny!'}else{"No, not since 19$(30..50|random)"}}

सुझाव के लिए वर्तनी के लिए धन्यवाद,


मुझे आपका रेगेक्स मैचिंग पसंद है, लेकिन स्विच स्टेटमेंट तरीका भारी है। सुझाव के साथ मैंने Ty दिया, आप ifइस तरह से इसके बजाय regex का उपयोग करके अपने चरित्र की संख्या को 117 तक कम कर सकते हैं :for(;($j=read-host)-cne'BYE'){if($j-cmatch'[a-z]'){'Huh?! Speak up, sonny!'}else{"No, not since 19$(30..50|random)"}}
SpellingD

2

हास्केल (189)

import Random
import Char
main=getLine>>=g
g"BYE"=return""
g s|s/=map toUpper s=putStrLn"HUH?! SPEAK UP SONNY!">>main|4>2=randomRIO(30,50::Int)>>=putStrLn.("NO, NOT SINCE 19"++).show>>main

अजीब बात है, 'गंभीर' प्रोग्राम लिखते समय हस्केल कोड आमतौर पर तुलनीय सी कोड से बहुत छोटा होता है।


आप निचले मामलों के पत्रों के परीक्षण के लिए आयात करने Charसे बच सकते हैं any(`elem`['a'..'z'])s
हमर


1

C # - 345 शुल्क

using System;class Program{static void Main(){for(;;){if(!t(Console.ReadLine()))break;}}static bool t(string s){bool b=false;if(s=="BYE")return b;int i=0;for(;i<s.Length;i++){b=(s[i]>65&&s[i]<90)?true:false;if(!b)break;}if(b) p("NO, NOT SINCE 1938!");else p("HUH?! SPEAK UP, SONNY!");return true;}static void p(string s){Console.WriteLine(s);}}

धिक्कार क्रिया भाषा ... :-)


1
आप क्लास को बस बुला सकते हैं P । और यह सही ढंग से अपरकेस का पता नहीं लगाता है। मैं इस पर चिल्ला सकता हूं और यह अभी भी मुझे नहीं सुन सकता है। आप मुख्य विधि को छोटा कर सकते हैं while(t(Console.ReadLine()));। आप उपयोग कर सकते हैं using C=System.Console;शुरू में करने के लिए उपयोग कम करने के लिए ReadLine()और WriteLine()करने के लिए C.ReadLine()और C.WriteLine()
जॉय

@ जोये - सुझावों के लिए धन्यवाद!
काइल रोज़ेंडो

1

C # - 196 वर्ण (लेकिन टपका हुआ)

using System;class P{static void Main(){var s=Console.ReadLine();if(s!="BYE"){Console.Write((s==s.ToUpper()?"No, not since 19"+new Random().Next(30, 51):"Huh?! Speak up, sonny")+"!\n");Main();}}}

कि दोनों मामलों में EOL पाने के लिए @ रिचर्ड (टपकी) का जवाब दो परेंस (नीचे देखें) और a \ n जोड़ा गया है। अन्यथा " + "केवल व्यर्थ जगह है।

प्रारूपित

using System;
class P
{
    static void Main() { 
        var s = Console.ReadLine(); 
        if (s != "BYE") { 
            Console.Write((
                s == s.ToUpper() ? 
                "No, not since 19" + new Random().Next(30, 51) : 
                "Huh?! Speak up, sonny"
                ) + "!\n");
            Main(); 
        } 
    }
}

अद्यतन: आवश्यक होने के बारे में मेरी टिप्पणी को स्पष्ट करने के लिए, यहाँ मुझे बिना परेंस के (यानी @ रिचर्ड के मूल समाधान के साथ) क्या मिलेगा:

बिना परों के

और परेंस के साथ:

Parens के साथ

\nहालांकि , इनमें से कोई भी मेरे अतिरिक्त का उपयोग नहीं करता है।


यह 195 यहाँ है, केवल। क्या आपने अंत में एक अनावश्यक लाइन ब्रेक की गिनती की?
जॉय

1

बैश: 136 128 अक्षर

while read s
do
[[ $s = BYE ]]&&break
[[ ${s^^} = $s ]]&&echo NO, NOT SINCE $[RANDOM%21+1930]!||echo HUH?! SPEAK UP, SONNY!
done

सीमित विकल्प: 132 123 वर्ण

f(){
read s
[[ $s = BYE ]]||{
[[ ${s^^} = $s ]]&&echo NO, NOT SINCE $[RANDOM%21+1930]!||echo HUH?! SPEAK UP, SONNY!
f
}
}
f

आप एक बहरे से असीम रूप से बात कर सकते हैं, लेकिन इस बाद के कोड के साथ बातचीत कॉल स्टैक द्वारा सीमित है। (मेरे परीक्षण में यह 4989 कॉल के बाद समाप्त हो जाता है।)


1

जावास्क्रिप्ट - 133 131 130 128 127 127 चर

www0z0ks समाधान के गोल्फ संस्करण

g='';while((i=prompt(g))!='BYE'){/[a-z]/.test(i)?g='Huh?! Speak up, sonny!':g='No, not since '+Math.floor(Math.random()*21+1930)+'!'}

g='';while((i=prompt(g))!='BYE'){g=/[a-z]/.test(i)?'Huh?! Speak up, sonny!':'No, not since '+Math.floor(Math.random()*21+1930)+'!'}

g='';while((i=prompt(g))!='BYE'){g=/[a-z]/.test(i)?'Huh?! Speak up, sonny!':'No, not since '+Math.ceil(Math.random()*21+1929)+'!'}

for(g='';(i=prompt(g))!='BYE';g=/[a-z]/.test(i)?'Huh?! Speak up, sonny!':'No, not since '+Math.ceil(Math.random()*21+1929)+'!');

for(g='';(i=prompt(g))!='BYE';g=/[a-z]/.test(i)?'Huh?! Speak up, sonny!':'No, not since '+parseInt(Math.random()*21+1930)+'!');

for(g='';(i=prompt(g))!='BYE';g=/[a-z]/.test(i)?'Huh?! Speak up, sonny!':'No, not since '+(Math.random()*21+1930|0)+'!');

संपादित करें: इस महान टिप के साथ एक और छह वर्ण सहेजे गए


के रूप में टर्नरी ऑपरेटर लिखें g=/[a-z]/.test(i)?'Huh?!...':'No...'और आप 2 वर्णों को छोड़ दें।
मैनटवर्क

संपादित, सूचक के लिए धन्यवाद।
कोडवन

1
1 और चरित्र मुझे मिला: Math.ceil()से छोटा है Math.floor()। अंतराल को अपरिवर्तित रखने के लिए बस आधार वर्ष बदलें Math.ceil(Math.random()*21+1929):।
मैनटवर्क

महान, +1! मैंने लूप के लिए थोड़ी देर बदलने के साथ एक और दो वर्णों को बचाया।
कोडपॉइंट

0

क्लोजर - 160 154 वर्ण

(#(if(= % "BYE")%(do(if(=(.toUpperCase %)%)(prn(str"No, not since "(+ 1930(rand-int 9))"!"))(prn"Huh?! Speak up, sonny!"))(recur(read-line))))(read-line))

इसे थोड़ा और गोल्फिंग पर काम करना। सुझाव का स्वागत करते हैं।

REPL के माध्यम से चलाएँ


0

क्यू, ११५

{while[1;v:read0 0;$[v~"BYE";'`;v~upper v;-1"No, not since ",/:(($)1?1930+(!)20),'"!";-1"Huh?! Speak up, sonny!"]]}

प्रयोग

q){while[1;v:read0 0;$[v~"BYE";'`;v~upper v;-1"No, not since ",/:(($)1?1930+(!)20),'"!";-1"Huh?! Speak up, sonny!"]]}`
Hi
Huh?! Speak up, sonny!
Hello
Huh?! Speak up, sonny!
HELLO!
No, not since 1938!
Goodbye Grandma
Huh?! Speak up, sonny!
BYE
'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.