ক্রিস পাইনের “বধির ঠাকুমা”


22

আমি রুবিলিয়ারিংয়ের একজন পরামর্শদাতা এবং আমরা আমাদের শিক্ষার্থীদের যে অনুশীলনগুলি দিয়েছি তা হ'ল ক্রিস পাইনের বই " শিখুন থেকে প্রোগ্রাম " বইয়ের "বধির গ্র্যান্ডমা" অনুশীলন । বর্ণনাটি এখানে:

একটি বধির গ্র্যান্ডমা প্রোগ্রাম লিখুন। আপনি ঠাকুরমার কাছে যা কিছু বলুন (যা আপনি টাইপ করুন) তার সাথে প্রতিক্রিয়া জানানো উচিত: "হু?! কথা বলুন, সোনি!", যদি না আপনি চিৎকার করেন (সমস্ত রাজধানীতে টাইপ করুন)। যদি আপনি চিৎকার করেন, তিনি আপনাকে শুনতে (বা কমপক্ষে সে তা মনে করে) শুনতে পাবে এবং চিৎকার করে বলে: "না, 1938 সাল থেকে নয়!"

আপনার প্রোগ্রামটি সত্যই বিশ্বাসযোগ্য করে তোলার জন্য, প্রতিবার ঠাকুরমা অন্যরকম চিৎকার করুন; 1930 থেকে 1950 এর মধ্যে এলোমেলোভাবে যে কোনও বছর। "বাই" বলে চিৎকার করুন।

বেশ কয়েকটি কোর্সের পুনরাবৃত্তির পরে আমি এটি দেখার চেষ্টা করলাম যে আমি এটি কতটা ছোট পেতে পারি এবং এখন এটি 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)}!")'

যা অপশন nএবং lবিকল্পগুলির জন্য আরও 2 টি অভিব্যক্তির জন্য 92 টি অক্ষর ।


গল্ফিং প্রসঙ্গে, এর জন্য অতিরিক্ত স্পেসিফিকেশন প্রয়োজন। বাই-এর আগে কোনও অতিরিক্ত আউটপুট থাকলে কী হবে?
জেবি

কেবল "বাইওয়াই" প্রোগ্রামটি হুবহু শেষ করে।
মাইকেল কোহল

উত্তর:


13

পার্ল, 85 91

চালান perl -nE '<code goes there>'( nপ্রোগ্রাম আকারে গণনা):

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

এই পিছনে বিস্মৃত চিহ্নটি খুব ব্যয়বহুল ...

আই কে প্রস্তাবিত সম্পাদনাগুলি:

  • স্ট্রিং ম্যাচের পরিবর্তে একটি রেজিপ্যাক্স ব্যবহার করা -lগ্লোবাল বিকল্পের পাশাপাশি দুটি প্রোগ্রামের অক্ষরকে ছাড়িয়ে যায়: -3।
  • একটি মান সংরক্ষণ করতে প্রকৃত ভেরিয়েবল ব্যবহার এবং এটি পরবর্তীতে জন্য ব্যবহার করুন (জিনিয়াস! এর জন্য কে ভেরিয়েবল ব্যবহার করার কথা ভেবেছিলেন?): 0।
  • সেই পরিবর্তনশীলটি তৈরি করা $=, একটি পূর্ণসংখ্যা হিসাবে সীমাবদ্ধ: -4।

(এবং এটি এখনও যোগ করে না এবং কেন আমি তা জানতে খুব ঘুমে আছি। ওহ ভাল, চূড়ান্ত গণনা কমপক্ষে ঠিক আছে)


$="BYE" এর জন্য একটি রেইগএক্সকে আপত্তিজনকভাবে ব্যবহার এবং ব্যবহার করে এটি 84 + 1 এ নেমে আসে:perl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
ইলমারি করোনেন

ইলমারি কারোনেন ইন্টিগ্রেটেড, ধন্যবাদ!
জেবি

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()

উন্নতির জন্য কোনও ইঙ্গিত?


আপনার চারপাশের বন্ধনীগুলির দরকার নেই যদি বিবৃতি দেওয়া হয় তবে আমিও নিশ্চিত যে পাইথনের একটি পুনরাবৃত্তি সিলিং রয়েছে - তবে এটি কেবল আপনার নানীকে ঘুমিয়ে পড়া অনুকরণ করতে পারে।
ফোশি 14

উহু! আমি বন্ধনীগুলি সরিয়ে দিতে ভুলে গেছি। ধন্যবাদ :)
fR0DDY

আপনি কিছু অক্ষর সংরক্ষণ করতে পারেন যদি আপনি প্রথম লাইনটি সরিয়ে ফেলেন, দ্বিতীয়টি প্রতিস্থাপন করুন s='', আপনার বিবৃতিগুলি আপনার লুপটিতে পুনর্বিন্যাস করুন এবং পুরো লুপটি একটি লাইনে রেখে দিন: gist.github.com/3787809 আপনি যদি সত্যিই দৃ determined় সংকল্পবদ্ধ হন তবে আপনি করতে পারেন পাইথন 3 (কাঁচা_পিন্ড () -> ইনপুট () ব্যবহার করে দুটি অক্ষর সংরক্ষণ করুন - তবে মুদ্রণ -> মুদ্রণ ())
ম্যাট

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 টি অক্ষর মুছে ফেলেছে।

বিটিডব্লিউ, 'শিখুন প্রোগ্রাম' আমি প্রথম প্রচ্ছদ বইটি প্রচ্ছদটি কভার পড়তাম।


আপনি এখানে একবার নজর দিতে চাইবেন
জোয়

আপনি প্রথমটির 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

বেফুঞ্জ - 27x6 = 162 টি অক্ষর

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

সম্পাদনা: "বাই" অংশটি পুরোপুরি মিস হয়েছে। শীঘ্রই নতুন সংস্করণ আসছে।

সম্পাদনা 2: প্রকৃতপক্ষে, এটি আমার অপেক্ষাকৃত বেফুঞ্জ দক্ষতার জন্য কিছুটা জটিল। আমি পরে আবার চেষ্টা করতে পারি, তবে এই মুহূর্তে এটি বাস্তবায়নের কোনও সহজ উপায়ের কথা ভাবতে পারি না।


3

সি # - 194 চারস

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();
        }
    }
}

নেলিয়াস এবং fR0DDY থেকে কিছু অনুপ্রেরণা সহ।

যদি এটি উন্নত করা যায় তবে আমাকে জানান let


সংক্ষিপ্ত, তবে এফডাব্লুআইডাব্লু, আমি মনে করি এই ফাঁস (পুনরাবৃত্তভাবে কল করা Main())। এছাড়াও, আমি মনে করি আপনি ?:অভিব্যক্তিটির পেরেনগুলি !উভয়টিই পেতে চান । আমি এই এবং EOL (তবে এখনও ফাঁস) দিয়ে একটি উত্তর যুক্ত করেছি।
BW

আমি আপনাকে প্যারেন্স যুক্ত করেছি এবং আপনার মন্তব্য সরিয়েছি see ভাল করেছ. প্যারেন্সের সাথে এবং ছাড়া আমার উত্তরটিতে স্ক্রিনশট যুক্ত করার জন্য এখন আমার সম্পাদনাটি মোট। (কিন্তু, এখনও ছিদ্রময়) :-)
BW

@ বিলটি হ্যাঁ, আমি আমার পরীক্ষার শুরুতে গোলযোগ করেছি। অ-ফাঁস সংস্করণটি 199 টি চর হবে, ওয়াও খুব দীর্ঘ :)
রিচার্ড

হেক্টর। আমি Main();সমাধানটি পছন্দ করি ... কোনও বুদ্ধিমান ব্যক্তি এই সমস্যাটি হওয়ার জন্য এই প্রোগ্রামটি এত দিন ব্যবহার করবেন না।
BW

যেমন ফোশি মন্তব্যতে fR0DDY বলেছেন। দাদী ঘুমিয়ে পড়লে প্রোগ্রামটি ক্রাশ হয়।
রিচার্ড

3

ডি: 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

কার্যটির প্রকৃতির কারণে এটি টাই আউভিলের সমাধানের সাথে অনেকটা মিল দেখায় , যদিও এটি স্বাধীনভাবে লেখা হয়েছিল:

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

পরামর্শের জন্য স্পেলিংডিকে ধন্যবাদ,


আমি আপনার রেজেক্সের মিলটি পছন্দ করি তবে সুইচ স্টেটমেন্টটি বেশ বড়। পরামর্শ আমি Ty মর্যাদা দান করেছেন, আপনি একটি সঙ্গে Regex ব্যবহার করে 117 করার জন্য আপনার অক্ষর সংখ্যা কমিয়ে দিতে পারে ifপরিবর্তে এই মত: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

সি # - 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

সি # - ১৯6 টি চর (তবে ফাঁসী)

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();}}}

এটিই হ'ল রিচার্ডের (ফুটো) উত্তর দুটি প্যারেনের সাথে (নীচে দেখুন) এবং সেখানে একটি added 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(); 
        } 
    }
}

আপডেট: পেরেনগুলির প্রয়োজনীয়তা সম্পর্কে আমার মন্তব্যটি স্পষ্ট করার জন্য, আমি পেরেনগুলি ছাড়াই যা পেয়েছি তা এখানে (অর্থাত্ @ রিচার্ডের মূল সমাধান সহ):

প্যারেন ছাড়া

এবং প্যারেনস সহ:

পেরেন সহ

এগুলির কোনওটিই \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 121 অক্ষর

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 টি অক্ষর বাদ দেন।
manatwork

সম্পাদিত, পয়েন্টারের জন্য ধন্যবাদ।
কোডেপর্ন

1
আরও 1 টি চরিত্র আমি পেয়েছি: এর Math.ceil()চেয়ে খাটো Math.floor()। শুধু ভিত্তি বছরের ব্যবধান অপরিবর্তিত রাখার পরিবর্তন করুন: Math.ceil(Math.random()*21+1929)
manatwork

দুর্দান্ত, +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))

এটি আরও কিছুটা গল্ফ করে কাজ করা। পরামর্শ স্বাগত জানাই।

আরপিএল মাধ্যমে চালান


0

প্রশ্ন, 115

{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
'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.