Im Jahr 1984 schrieb Michael Crichton ein Sicherheitsprogramm in BASIC, das in der Zeitschrift Creative Computing veröffentlicht wurde. Das Programm fordert den Benutzer auf, eine Phrase seiner Wahl einzugeben, die Intervalle zwischen den Tastenanschlägen aufzuzeichnen und ihn dann aufzufordern, die Phrase erneut einzugeben. Wenn sich die Timings zu stark unterscheiden würden, würde das Programm den Benutzer als Betrüger identifizieren.
Ihre Aufgabe: Erstellen Sie eine Version von Crichtons Programm in der Sprache Ihrer Wahl.
Regeln:
Sätze für die Kommunikation mit dem Benutzer ("Bitte geben Sie den Schlüsselbegriff ein", "Bitte geben Sie den Schlüsselbegriff erneut ein" usw.) zählen unabhängig von der tatsächlichen Länge jeweils als ein Byte. Dies ist nur für die Benutzerkommunikation gedacht. Versuchen Sie nicht, Programmcode in den Zeichenfolgen zu verbergen.
Der Pass / Fail-Test sollte auf dem durchschnittlichen absoluten Wert der prozentualen Abweichungen von den ursprünglichen Intervallen basieren. Wenn die Zeichenfolgen nicht übereinstimmen, können Sie nach eigenem Ermessen entweder fehlschlagen oder den Benutzer erneut versuchen lassen.
Die Schlüsselphrase sollte keine Nullzeichenfolge zulassen. Falls die Schlüsselphrase für Ihren String-Datentyp zu lang ist, können Sie sie nach eigenem Ermessen abschneiden oder nicht zulassen und neu beginnen.
Die Empfindlichkeit des Tests (der Schwellenwert für den Pass / Fail-Test) sollte im Quellcode einstellbar sein.
Ich habe ursprünglich einen Bonus von 20% der Gesamtbytezahl bereitgestellt, wenn Ihr Quellcode so formatiert werden kann, dass er erkennbar einem Dinosaurier ähnelt. Es wurde darauf hingewiesen, dass dies sehr subjektiv und möglicherweise besser für einen Beliebtheitswettbewerb geeignet ist, daher habe ich diesen Bonus entfernt. Ich empfehle jedoch weiterhin von Herzen, Dinosaurier zu formatieren. Wenn Sie Ihren Code so formatieren, dass er wie ein Dinosaurier aussieht, können Sie rein kosmetische Kommentare, Zeilenumbrüche oder Leerzeichen von Ihrer Bytesumme abziehen.
Die kürzeste Byteanzahl gewinnt, abhängig von der Anpassung der Zeichenfolgenlänge und der Dinosaurierformatierung.
Beachten Sie, dass meine obige Spezifikation nicht genau mit der Funktionsweise des Crichton-Codes übereinstimmt, von dem Kopien online verfügbar sind. Befolgen Sie die Spezifikation, versuchen Sie nicht, das Original zu klonen.
"Please type the key phrase"
als 1 Byte oder zählt nur die Phrase und die zitierte Phrase als 3 Bytes ("
, Phrase,"
)? Ist es beabsichtigt, dass ein viel längeres und ein viel kürzeres Intervall "aufheben" und wieder gleichmäßig werden? Muss das Programm überprüfen, ob die beiden Schlüsselphrasen übereinstimmen?Antworten:
Rubin,
171 167157 BytesAusgabe,
true
wenn die durchschnittliche Varianz über 20% liegt, andernfalls Ausgabefalse
.Dinosaurier ASCII Kunstversuch:
Ungolfed:
require 'io/console'
könnte entfernt werden, wenn es in einigen Ruby REPLs ausgeführt wird, da die Bibliothek bereits geladen ist.quelle
Java 768 Bytes
Was? Java? für Code Golf?
Dies ist wahrscheinlich das Schlimmste, aber ich habe es trotzdem versucht.
Es werden alle Nachrichten im Konsolenfenster angezeigt, aber die eigentliche Eingabe erfolgt im JTextField. Nicht gerade gut aussehend. Oh, und um 5 Bytes zu sparen, müssen Sie die Größe des JFrame selbst ändern. Außerdem wird beim zweiten Mal nicht überprüft, ob die Zeichenfolge korrekt ist. Ich bin mir nicht sicher, ob das gegen die Spezifikationen verstößt.
Benutzen:
Geben Sie Ihren Schlüssel in das Textfeld ein.
Drücken Sie nicht die Eingabetaste, gehen Sie zur Konsole und geben Sie etwas ein. Es wird eine weitere Meldung angezeigt
Geben Sie dasselbe in das Textfeld ein (das jetzt gelöscht werden sollte).
Gehen Sie zur Konsole und drücken Sie erneut etwas. Es wird angezeigt, ob Sie ein Eindringling sind oder nicht.
ungolfed:
Golf:
quelle
JFrame
, also würde man es nicht brauchenf
.HTML, JavaScript (ES6), 328
Die Gesamtanzahl der Bytes des Codes beträgt 402 Bytes und die Nachrichten, die mit dem Benutzer interagieren sollen:
sind insgesamt 78 Bytes, also Gesamtpunktzahl => 402 - 78 + 4 = 328
Führen Sie das folgende Snippet in einem aktuellen Firefox aus und geben Sie den Schlüssel in das Eingabefeld ein, gefolgt von der Eingabetaste.
Der Code überprüft, ob sowohl der eingegebene als auch der erneut eingegebene Schlüssel identisch sind (fordert zur erneuten Eingabe auf, wenn dies nicht der Fall ist), berechnet den durchschnittlichen Prozentsatz der absoluten Differenz und prüft, ob er unter dem Wert der Variablen liegt
V
quelle
C, 154 (86 + 68 für Flaggen)
Kompilieren Sie mit
-DY=(y=clock())-x
,-DZ=a[d]
,-DE=getch()
,-DW=);while
,-DU=i++[d]=Y
und-DP=puts(
. Zeilenumbrüche wurden zu Präsentationszwecken hinzugefügt und können entfernt werden (die angegebene Byteanzahl ist ohne).Ungolfed + Kommentare:
Dies überprüft weder, ob die neu eingegebene Phrase identisch ist, noch gibt sie etwas aus, wenn der Benutzer nicht als Betrüger identifiziert wird.
Dies berücksichtigt auch nicht die Zeit, die nach der Eingabeaufforderung vor dem ersten Tastendruck benötigt wird.
quelle
getch
wettengetc
odergetchar
? Ich habe einen undefinierten Verweis auf "getch", der, wenn ich mich richtig erinnere, veraltet ist.char
vor globalen Deklarationen hinzugefügt , und jetzt gibt dies zur Laufzeit einen Segmentierungsfehler. Können Sie Details dazu geben, wie man es baut? Welchen Compiler verwenden Sie? Vielen Dank.int
und auf initialisieren0
. Ich habe dies mit gcc unter Windows getestet (mit Windowsgetch
).getch
wird anstelle vongetc
oder verwendet,getchar
weilgetch
vor dem Verarbeiten von Zeichen nicht die Eingabetaste gedrückt werden muss (getch
ist unter Windows zwar veraltet, obwohl hier nichts falsch daran ist, veraltete Funktionen zu verwenden).Scala REPL 233
Wenn alle Abstände entfernt sind, haben Sie:
Ich bin mir sicher, dass jemand, der talentierter ist als ich, einen Dinosaurier machen könnte!
Kurze Erklärung:
Die
l
Methode liest Zeichen und zeichnetnanoTime
auf, wann jedes Zeichen eingegeben wurde.Die
m
Methode druckt"Enter"
, unterbricht diel
Methode beim Drücken der Eingabetaste (Zeichen 13), ordnet sie dann nur dem zunanoTimes
und ruft dann die Zeitintervalle zwischen den einzelnen Zeichen ab.Die nächsten 2 Zeilen lesen 2 Zeichenfolgen ein, komprimieren sie, ermitteln dann den durchschnittlichen absoluten Wert der prozentualen Differenz zwischen dem zweiten und dem ersten Intervall und drucken schließlich, ob dieser Durchschnitt kleiner als war oder nicht
0.2
.quelle
Common Lisp: 660
Ungolfed
Zusätzliche Bemerkungen
Dinosaurier Bonus
Ich sollte einen Bonus haben, weil jeder weiß, dass " Common Lisp ein sterbender Dinosaurier ist ".
quelle