Jestem mentorem w RubyLearning, a jednym z ćwiczeń, które wykonujemy dla naszych uczniów, jest ćwiczenie „Głucha babcia” z książki Chrisa Pine'a „ Naucz się programować ”. Oto opis:
Napisz program dla głuchoniemych babć. Cokolwiek powiesz babci (cokolwiek wpiszesz), powinna odpowiedzieć: „Hę ?! Mów, synku!”, Chyba że krzykniesz (wpisz wszystkie wielkie litery). Jeśli krzyczysz, słyszy cię (a przynajmniej tak jej się wydaje) i krzyczy: „Nie, nie od 1938 roku!”
Aby twój program był naprawdę wiarygodny, niech babcia za każdym razem krzyczy o innym roku; może w dowolnym roku losowo między 1930 a 1950. (Ta część jest opcjonalna i byłaby o wiele łatwiejsza, gdybyś przeczytał sekcję generatora liczb losowych Ruby na końcu rozdziału metod.) Nie możesz przestać rozmawiać z babcią, dopóki krzycz „BYE”.
Po kilku iteracjach kursu próbowałem zobaczyć, jak mały mogę to uzyskać, a teraz mam do 112 znaków:
puts (s||='').upcase==s ? "NO, NOT SINCE #{1930+rand(21)}!":"HUH?! SPEAK UP, SONNY!" until(s=gets.chomp)=="BYE"
Jestem ciekawy, jak mało znaków można to osiągnąć w wybranym przez ciebie języku, ponieważ myślę, że Ruby już tutaj ma się naprawdę dobrze.
Edycja: Rozwiązanie Perla opublikowane poniżej doprowadziło do
ruby -nle 'puts($_=="BYE"?exit: $_.upcase!? "HUH?! SEPAK UP, SONNY!":"NO, NOT SINCE #{1930+rand(21)}!")'
czyli 92 znaki dla wyrażenia + 2 więcej dla opcji n
i l
.
Odpowiedzi:
Perl, 85
91Uruchom z
perl -nE '<code goes there>'
(n
liczony jako rozmiar programu):Końcowy wykrzyknik jest bardzo drogi ...Edycje sugerowane przez IK:
-l
opcję globalną, a także dwa znaki programu: -3.$=
, ograniczonej do liczby całkowitej: -4.(i nadal się nie sumuje, a ja jestem zbyt śpiący, żeby dowiedzieć się, dlaczego. No cóż, przynajmniej ostateczna liczba jest słuszna)
źródło
$=
i użycie wyrażenia regularnego dla „BYE” sprowadza to do 84 + 1:perl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
Python 120 znaków
Wszelkie wskazówki do poprawy?
źródło
s=''
, zmienisz kolejność instrukcji w pętli while i umieścisz całą pętlę while w jednej linii: gist.github.com/3787809 Jeśli naprawdę byłeś zdeterminowany, możesz zapisz 2 znaki, używając Pythona 3 (raw_input () -> input (), ale print -> print ())131 znaków w PowerShell:
W / białe znaki:
Wyciągnęliśmy 18 znaków z sugestii Joeya.
BTW, „Learn to Program” to pierwsza książka programowa, jaką czytałem od deski do deski.
źródło
if...
w warunkową kontrolęfor()
podobnego: takfor(;($j=read-host)-cne"BYE"){if($j-ceq$j.ToUpper()){...
, specyfikacja mówi 1930-1950.C # - 234 znaków
Bardziej czytelny:
źródło
Befunge - 27x6 = 162 znaków
EDYCJA: Całkowicie przegapiłem część „BYE”. Nowa wersja już wkrótce.
EDYCJA 2: Właściwie to sprawia, że jest to trochę zbyt skomplikowane dla moich skromnych umiejętności Befunge. Mogę spróbować ponownie później, ale w tej chwili nie mogę wymyślić żadnego prostego sposobu na jego wdrożenie.
źródło
C # - 194 CHARS
Z białymi spacjami:
Z pewną inspiracją od Nelliusa i fR0DDY.
Daj mi znać, czy można to poprawić.
źródło
Main()
). Ponadto myślę, że chcesz, aby parens w?:
wyrażeniu uzyskały!
oba. Dodałem odpowiedź z tym i EOL (ale nadal przecieki).Main();
rozwiązanie ... żadna rozsądna osoba nie używałaby tego programu na tyle długo, aby stanowił problem.D: 246 znaków
Bardziej czytelnie:
źródło
javascript, 142 znaki, 29 z nich wykonuje losowy rok
źródło
Awk: 97 znaków
źródło
Windows PowerShell,
121117Ze względu na charakter zadania wygląda to prawie identycznie jak rozwiązanie Ty Auvila , chociaż zostało napisane niezależnie:
Dzięki SpellingD za sugestię,
źródło
if
zamiast tego:for(;($j=read-host)-cne'BYE'){if($j-cmatch'[a-z]'){'Huh?! Speak up, sonny!'}else{"No, not since 19$(30..50|random)"}}
Haskell (189)
Dziwne jest to, że kod Haskell jest zwykle dużo krótszy niż porównywalny kod C podczas pisania „poważnego” programu.
źródło
Char
, używającany(`elem`['a'..'z'])s
do testowania małych liter.APL (76)
źródło
C # - 345 znaków
Cholernie pełny język ... :-)
źródło
P
. I to nie wykrywa poprawnie wielkich liter. Mogę na to krzyczeć i wciąż mnie nie słyszy. Możesz skrócić główną metodę dowhile(t(Console.ReadLine()));
. Możesz użyćusing C=System.Console;
na początku, aby skrócić dostęp doReadLine()
orazWriteLine()
doC.ReadLine()
iC.WriteLine()
.C # - 196 znaków (ale nieszczelne)
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();}}}
To odpowiedź @ (nieszczelna) @ Richarda z dwoma parenami (patrz poniżej) i dodanym tam \ n, aby uzyskać EOL w obu przypadkach. W przeciwnym razie
" + "
jest to tylko zmarnowane miejsce.Sformatowany
AKTUALIZACJA: aby wyjaśnić mój komentarz na temat potrzebnych parenów, oto co otrzymuję bez parens (tj. Z oryginalnym rozwiązaniem @ Richarda):
I z parens:
Żadne z nich nie korzysta z moich dodatkowych
\n
.źródło
Bash:
136128 znakówOgraniczona alternatywa:
132123 znakówMożesz rozmawiać z głuchymi w nieskończoność, ale rozmowa z tym późniejszym kodem jest ograniczona stosem wywołań. (W moim teście kończy się po 4989 połączeniach).
źródło
JavaScript -
133131130128127121 znakówgolfowa wersja rozwiązania www0z0ks
Edycja: Zapisałem kolejne sześć znaków dzięki tej wielkiej wskazówce
źródło
g=/[a-z]/.test(i)?'Huh?!...':'No...'
a oszczędzasz 2 znaki.Math.ceil()
jest krótszy niżMath.floor()
. Wystarczy zmienić rok bazowy zachować odstęp niezmienioneMath.ceil(Math.random()*21+1929)
.Clojure -
160154 znakówTrochę więcej gry w golfa. Sugestie mile widziane.
Uruchom przez REPL
źródło
Q, 115
stosowanie
źródło