Ich bin ein Mentor bei RubyLearning und eine der Übungen, die wir unseren Schülern geben, ist die "Deaf Grandma" -Übung aus Chris Pines Buch " Learn to Program ". Hier ist die Beschreibung:
Schreiben Sie ein Programm für gehörlose Großmütter. Was auch immer Sie zu Oma sagen (was auch immer Sie eingeben), sie sollte antworten mit: "Huh ?! Sprechen Sie, Junge!", Es sei denn, Sie rufen es (geben Sie alle Großbuchstaben ein). Wenn Sie schreien, kann sie Sie hören (oder glaubt es zumindest) und schreit zurück: "Nein, nicht seit 1938!"
Lassen Sie die Oma jedes Mal ein anderes Jahr rufen, damit Ihr Programm wirklich glaubwürdig wird. Vielleicht jedes beliebige Jahr zwischen 1930 und 1950. (Dieser Teil ist optional und wäre viel einfacher, wenn Sie den Abschnitt über Rubys Zufallszahlengenerator am Ende des Kapitels über Methoden lesen.) Sie können nicht aufhören, mit Oma zu sprechen, bis Sie Ruf "Tschüss".
Nach mehreren Kursiterationen habe ich versucht zu sehen, wie klein ich das bekommen kann und habe es jetzt auf 112 Zeichen reduziert:
puts (s||='').upcase==s ? "NO, NOT SINCE #{1930+rand(21)}!":"HUH?! SPEAK UP, SONNY!" until(s=gets.chomp)=="BYE"
Ich bin gespannt, in wie wenigen Zeichen dies in der Sprache Ihrer Wahl erreicht werden kann, da Ruby hier meiner Meinung nach bereits sehr gut abschneidet.
Bearbeiten: Die unten veröffentlichte Perl-Lösung führte zu
ruby -nle 'puts($_=="BYE"?exit: $_.upcase!? "HUH?! SEPAK UP, SONNY!":"NO, NOT SINCE #{1930+rand(21)}!")'
Das sind 92 Zeichen für den Ausdruck + 2 weitere Zeichen für die Optionen n
und l
.
Antworten:
Perl,
85-91Ausführen mit
perl -nE '<code goes there>'
(n
gezählt in Programmgröße):Das nachstehende Ausrufezeichen ist sehr teuer ...Von IK vorgeschlagene Änderungen:
-l
globale Option sowie zwei Programmzeichen: -3.$=
als Ganzzahl festlegen: -4.(Und es summiert sich immer noch nicht und ich bin zu müde, um herauszufinden, warum. Na ja, die letzte Zählung stimmt zumindest)
quelle
$=
und Verwendung eines regulären Ausdrucks für "BYE" führt zu 84 + 1:perl -nE '$==1930+rand 21;say/^BYE$/?last:uc eq$_?"NO, NOT SINCE $=!":"HUH?! SPEAK UP, SONNY!"'
Python 120 Zeichen
Irgendwelche Tipps zur Verbesserung?
quelle
s=''
, Ihre Anweisungen in der while-Schleife neu anordnen und die gesamte while-Schleife in eine Zeile einfügen : gist.github.com/3787809 Wenn Sie wirklich entschlossen wären , könnten Sie dies Speichern Sie 2 Zeichen mit Python 3 (raw_input () -> input (), aber print -> print ())131 Zeichen in PowerShell:
Mit Leerzeichen:
18 Charaktere auf Joeys Vorschlag gedrückt.
Übrigens, 'Learn to Program' war das erste Programmierbuch, das ich jemals von vorne bis hinten gelesen habe.
quelle
if...
in die bedingte Prüfung vonfor()
ähnlichem so zerquetschen :for(;($j=read-host)-cne"BYE"){if($j-ceq$j.ToUpper()){...
Auch die Spezifikation sagt 1930-1950.C # - 234 Zeichen
Besser lesbar:
quelle
Befunge - 27x6 = 162 Zeichen
EDIT: Den "BYE" Teil komplett verpasst. Neue Version kommt bald.
EDIT 2: Eigentlich macht das es ein bisschen zu komplex für meine mageren Befunge-Fähigkeiten. Vielleicht versuche ich es später noch einmal, aber ich kann mir im Moment keine einfache Art der Implementierung vorstellen.
quelle
C # - 194 Zeichen
Mit Leerzeichen:
Mit etwas Inspiration von Nellius und fR0DDY.
Bitte lassen Sie mich wissen, ob es verbessert werden kann.
quelle
Main()
). Außerdem denke ich, dass Sie möchten, dass Parens im?:
Ausdruck das!
in beiden bekommen. Ich habe eine Antwort mit diesem und EOL hinzugefügt (aber immer noch undicht).Main();
Lösung ... kein vernünftiger Mensch würde dieses Programm lange genug verwenden, um ein Problem darzustellen.D: 246 Zeichen
Mehr leserlich:
quelle
Javascript, 142 Zeichen, davon 29 zufällige Jahr
quelle
Awk: 97 Zeichen
quelle
Windows PowerShell,
121117Aufgrund der Art der Aufgabe sieht dies ziemlich identisch mit der Lösung von Ty Auvil aus , obwohl es unabhängig geschrieben wurde:
Vielen Dank an SpellingD für den Vorschlag,
quelle
if
verwenden: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)
Das Seltsame ist, dass Haskell-Code in der Regel viel kürzer ist als vergleichbarer C-Code, wenn man ein „ernstes“ Programm schreibt.
quelle
Char
indem Sieany(`elem`['a'..'z'])s
zum Testen auf Kleinbuchstaben verwenden.APL (76)
quelle
C # - 345 Zeichen
Verdammt wortreiche Sprache ... :-)
quelle
P
. Und dies erkennt Großbuchstaben nicht richtig. Ich kann es anschreien und es kann mich immer noch nicht hören. Sie können die Hauptmethode auf kürzenwhile(t(Console.ReadLine()));
. Sie könnenusing C=System.Console;
zu Beginn verwenden, um den Zugriff aufReadLine()
undWriteLine()
zuC.ReadLine()
und zu verkürzenC.WriteLine()
.196 Zeichen (aber undicht)
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();}}}
Das ist @ Richards (undichte) Antwort mit zwei Parens (siehe unten) und einem \ n, das dort hinzugefügt wird, um die EOL in beiden Fällen zu erhalten. Ansonsten
" + "
ist das nur Platzverschwendung.Formatiert
UPDATE: Um meinen Kommentar zu den benötigten Parens zu verdeutlichen, bekomme ich Folgendes ohne die Parens (dh mit @ Richards ursprünglicher Lösung):
Und mit den Eltern:
Keiner von diesen nutzt meine zusätzliche
\n
obwohl.quelle
Bash:
136128 ZeichenBegrenzte Alternative:
132123 ZeichenSie können unbegrenzt mit einem Gehörlosen sprechen, aber die Konversation mit diesem späteren Code wird durch die Anrufliste begrenzt. (In meinem Test wird es nach 4989 Aufrufen beendet.)
quelle
Javascript -
133131130128127121 ZeichenGolf-Version von www0z0ks Lösung
Bearbeiten: Mit diesem tollen Tipp wurden weitere sechs Zeichen gespeichert
quelle
g=/[a-z]/.test(i)?'Huh?!...':'No...'
und Sie sparen 2 Zeichen.Math.ceil()
ist kürzer alsMath.floor()
. Ändern Sie einfach das Basisjahr das Intervall unverändert zu halten:Math.ceil(Math.random()*21+1929)
.Clojure -
160154 ZeichenIch arbeite ein bisschen mehr daran, Golf zu spielen. Vorschläge sind willkommen.
Führen Sie REPL durch
quelle
Q, 115
Verwendung
quelle