Я наставник в RubyLearning, и одним из упражнений, которое мы даем нашим студентам, является упражнение «Глухая бабушка» из книги Криса Пайна « Учись программировать ». Вот описание:
Написать программу «Глухая бабушка». Что бы вы ни сказали бабушке (что бы вы ни печатали), она должна ответить: «Да ?! Говори, сынок!», Если только ты не кричишь (набери все заглавные буквы). Если вы кричите, она слышит вас (или, по крайней мере, она так думает) и кричит в ответ: «Нет, не с 1938 года!»
Чтобы ваша программа была правдоподобной, каждый раз, когда бабушка кричит по-разному; может быть, любой случайный год между 1930 и 1950 годами. (Эта часть не обязательна, и будет намного проще, если вы прочитаете раздел о генераторе случайных чисел Руби в конце главы, посвященной методам.) Вы не можете перестать разговаривать с бабушкой, пока не кричать "пока".
После нескольких итераций курса я попытался увидеть, насколько маленьким я могу это получить, и теперь я сократил его до 112 символов:
puts (s||='').upcase==s ? "NO, NOT SINCE #{1930+rand(21)}!":"HUH?! SPEAK UP, SONNY!" until(s=gets.chomp)=="BYE"
Мне любопытно увидеть, как мало символов можно достичь на выбранном вами языке, потому что я думаю, что у Руби уже все хорошо.
Редактировать: решение Perl, опубликованное ниже, привело к
ruby -nle 'puts($_=="BYE"?exit: $_.upcase!? "HUH?! SEPAK UP, SONNY!":"NO, NOT SINCE #{1930+rand(21)}!")'
что составляет 92 символа для выражения + еще 2 для параметров n
и l
.
Ответы:
Perl, 85
91Запустить с
perl -nE '<code goes there>'
(n
считается в размере программы):Этот восклицательный знак очень дорогой ...Изменения, предложенные IK:
-l
глобальный параметр, а также два символа программы: -3.$=
, ограниченную целым числом: -4.(и это все еще не складывается, и я слишком сонный, чтобы выяснить, почему. Ну хорошо, окончательный счет, по крайней мере, правильный)
источник
$=
и использование регулярного выражения для "BYE" приводит к снижению до 84 + 1:perl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
Python 120 символов
Любые советы по улучшению?
источник
s=''
, переупорядочите свои выражения в цикле while и поместите весь цикл while в одну строку: gist.github.com/3787809 Если вы действительно настроены, вы можете сохранить 2 символа с помощью Python 3 (raw_input () -> input (), но print -> print ())131 символ в PowerShell:
С пробелами:
Выжал 18 символов из предложения Джои.
Кстати, «Учись программировать» была первой книгой по программированию, которую я когда-либо читал на обложке.
источник
if...
в условную проверку,for()
например, так:for(;($j=read-host)-cne"BYE"){if($j-ceq$j.ToUpper()){...
в спецификации написано 1930-1950.C # - 234 символа
Более читабельно:
источник
Befunge - 27x6 = 162 персонажа
РЕДАКТИРОВАТЬ: Полностью пропустил "BYE" часть. Скоро выйдет новая версия.
РЕДАКТИРОВАТЬ 2: На самом деле, это делает его слишком сложным для моих скудных навыков Befunge. Я мог бы попробовать позже, но я не могу придумать какой-либо простой способ реализовать это в данный момент.
источник
C # - 194 CHARS
С пробелами:
С вдохновением от Неллиуса и fR0DDY.
Пожалуйста, дайте мне знать, если это можно улучшить.
источник
Main()
). Кроме того, я думаю, что вы хотите, чтобы в?:
выражении присутствовали символы «паренс»!
. Я добавил ответ с этим и EOL (но все еще утечки).Main();
решение ... ни один здравомыслящий человек не использовал бы эту программу достаточно долго, чтобы она стала проблемой.D: 246 символов
Более разборчиво:
источник
javascript, 142 символа, 29 из них выполняют произвольный год
источник
Awk: 97 символов
источник
Windows PowerShell,
121117Из-за характера задачи это выглядит в значительной степени идентично решению Ty Auvil , хотя оно было написано независимо:
Спасибо SpellingD за предложение,
источник
if
вместо этого:for(;($j=read-host)-cne'BYE'){if($j-cmatch'[a-z]'){'Huh?! Speak up, sonny!'}else{"No, not since 19$(30..50|random)"}}
Хаскелл (189)
Странно то, что при написании «серьезной» программы код на Haskell обычно намного короче, чем сопоставимый код на C.
источник
Char
, используяany(`elem`['a'..'z'])s
для проверки строчных букв.APL (76)
источник
C # - 345 символов
Чертовски многословный язык ... :-)
источник
P
. И это не правильно определяет прописные буквы. Я могу кричать на это, и он все еще не слышит меня. Вы можете сократить основной метод доwhile(t(Console.ReadLine()));
. Вы можете использоватьusing C=System.Console;
в начале , чтобы сократить доступ кReadLine()
иWriteLine()
кC.ReadLine()
иC.WriteLine()
.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();}}}
Это ответ Ричарда (прохудившийся) с двумя паренами (см. Ниже) и добавлением \ n, чтобы получить EOL в обоих случаях. В противном случае
" + "
это просто пустое пространство.отформатирован
ОБНОВЛЕНИЕ: чтобы уточнить мой комментарий о необходимых паренонах, вот что я получаю без паренов (то есть с оригинальным решением @ Richard):
И с парнями:
Ни один из них не использует мой дополнительный
\n
хотя.источник
Баш:
136128 символовОграниченная альтернатива:
132123 символаВы можете общаться с глухими бесконечно, но разговор с этим более поздним кодом ограничен стеком вызовов. (В моем тесте он завершается после 4989 звонков.)
источник
Javascript -
133131130128127121 символовверсия решения www0z0ks для гольфа
Редактировать: Сохранено еще шесть символов с этим большим советом
источник
g=/[a-z]/.test(i)?'Huh?!...':'No...'
и вы сэкономите 2 символа.Math.ceil()
корочеMath.floor()
. Просто измените базовый год, чтобы сохранить интервал без измененийMath.ceil(Math.random()*21+1929)
.Clojure -
160154 персонажаРаботать над гольфом это немного больше. Предложения приветствуются.
Запустить через REPL
источник
Q, 115
использование
источник