Ihre Herausforderung besteht darin, ein Programm zu entwickeln, das einen Datenübertragungsstrom nachahmt. Ihr Programm sollte Eingaben von stdin lesen und direkt an stdout ausgeben. Um das Problem interessanter zu machen, ist der Ausgabestream "fehlerhaft" und muss mehrere Anforderungen erfüllen:
- Es sollte eine 10% ige Chance bestehen, dass jedes Zeichen um +1 ASCII-Code verschoben wird (ex 'a' wird zu 'b', '9' wird zu ':') usw.
- Die Eingabe und Ausgabe sollte nur druckbare ASCII-Werte abdecken ('!' Bis '~', Dezimal 33 bis einschließlich Dezimal 126). Wenn der Zufall +1 auf einem '~' (Dezimalzahl 126) auftritt, wird ein '!' (Dezimal 33) sollte stattdessen ausgegeben werden.
- Wenn drei Zeichen zufällig hintereinander verschoben werden, sollte das Programm "FEHLERCODE 4625: NICHT WIEDERHERSTELLBARER FEHLER, BITTE KONTAKTIEREN SIE IHREN SYSTEMADMINISTRATOR" (nachfolgende Zeilenumbruch optional) ausgeben und die Ausführung anhalten.
Um das Problem zu vereinfachen, sind hier einige andere Kriterien:
- Sie können davon ausgehen, dass die Eingabe immer gültig ist. Das heißt, es enthält nur die Werte '!' durch '~'.
- Das Programm sollte fortgesetzt werden, bis drei Zeichen zufällig hintereinander verschoben wurden. Es ist davon auszugehen, dass EOF niemals auftreten wird.
- Die Zufälligkeit muss sich zwischen den Läufen unterscheiden. Wenn Ihr Zufallszahlengenerator gesetzt werden muss, um bei jedem Lauf ein eindeutiges Ergebnis zu erzielen, muss Ihr Code es setzen.
- Sie müssen ein Programm schreiben, keine Funktion.
- Sie müssen Eingaben von stdin nehmen und Ausgaben in stdout schreiben.
- Sie dürfen keine externen Bibliotheken oder Ressourcen verwenden.
- Ihr Code muss einen frei verfügbaren und funktionierenden Intrepreter oder Compiler haben.
Es gelten die Standardregeln für Code-Golf. Gewinner ist derjenige, der in zwei Wochen (Donnerstag, 20. Februar 2014) das kürzeste Programm veröffentlicht hat.
Antworten:
Befunge-98,
166159156155148Dieser verbessert die andere ausgezeichnete Befunge-Antwort mit der richtigen Wahrscheinlichkeit (1/10) und ist etwas kompakter:
quelle
x
wird an zwei Stellen als "goto" verwendet. Kantenumhüllung wird (ab) ausgiebig verwendet, einschließlich der Steuerung, die durch den Zwischenraum zwischenASE
und fließtCONTACT
. Der Zähler "3 in einer Reihe" befindet sich am unteren Rand des Stapels. Backslash wird verwendet, um bei Bedarf darauf zu tauschen und darauf zuzugreifen.?
Anweisungen verwendet werden (von denen eine von zwei Pfaden getroffen wird, sodass die Wahrscheinlichkeit immer noch genau 1/10 beträgt). Außerdem wurden einige kleinere Änderungen vorgenommen, um 7 weitere Zeichen zu entfernen!C, 168 Zeichen
Das Seeding des PRNG durch diese Lösung nutzt die Tatsache, dass moderne Betriebssysteme bei jedem Lauf den Speicherort des Stacks im Speicher ändern, als grundlegende Maßnahme gegen Exploits, die den Stapel zerschlagen.
quelle
c
vollständig loswerden, indem Sie dengetchar()
Aufruf inputchar()
eine ausgefallene Mathematik verschieben und diese verwenden ...c
damit Sie dengetchar()
Wert gegen 126 testen und ihn an weitergeben könnenputchar()
.putchar((getchar()-33+(rand()%10?i=0:1))%94+33))
sollte funktionieren. Wenn ich Ihre Lösung als Basis verwende, habe ich 165 Zeichen.Ruby, 156
quelle
:3while
?:3
ist eigentlich das Ende dieser Anweisung: Hiermit wirde=r>0?e-r :3
der Wert von e (Anzahl der vor dem Abbruch verbleibenden sequenziellen Fehler) basierend auf r festgelegt (1, wenn das zuletzt verarbeitete Zeichen ein Fehler war, 0, wenn nicht). Es ist nur gegen die Weile gedrückt, um Platz zu sparen:>while
ohne Leerzeichen davor? Das ist so dunkel und unlesbar! ;)Charge - 359
Offen für Vorschläge, um die Herausforderungsregeln vollständig einzuhalten.
Ich werde daran arbeiten, es kleiner / besser zu machen - ich wollte es veröffentlichen, während es funktioniert, bevor ich es kaputt mache.
Es gibt definitiv einige Möglichkeiten, Golf zu spielen.
Nicht Golf -
quelle
Befunge-93 (206)
Es hat 142 Nicht-Leerzeichen. Technisch ist es nicht konform, da es eine Wahrscheinlichkeit von 1/9 und nicht 1/10 für einen Fehler hat.
Ausführen als
cat /dev/urandom | tr -dc '!-~' | ./befungee.py -c 100 ../rand
.Mit dieser Eingabe erhalten
!!!!aaaaaaa~~~~~~~~~~
wir die Ausgabe, die!"!!aabaaba~~~!~~~~!!
angibt, dass die Fehler korrekt behandelt werden.quelle
PHP 190
das ist der weitere Weg, den ich spielen könnte, aber ich finde es ziemlich gut, dass es weniger als 100 Zeichen von der Spitze entfernt ist
quelle
C # -
346330313309297288278274Ein bisschen lang, macht aber den Job.
quelle
c=n==0?c+1:0
ist kürzer alsc+=(n==0?1:-c)
...(n==1?1:0)
ist kürzer als(n==1?n--:(--n-n))
(und dann natürlich die später ändernn==0
zun==1
)(false)
? Wenn überhaupt, willst du nicht(true)
?shbash, auf OSX,211,208,203,200,196, 185Etwas besser als 10%, da zufällig Zahlen zwischen 0 und 32767 generiert werden, also sind es wirklich 3.277 bei 32.768 Gewinnchancen (10.0006%).
Danke, @ Gilles (aber nicht sicher, was du mit der Umstrukturierung meinst. Hatte auch einige andere Ideen in der Dusche.
quelle
[ $RANDOM -gt 3276 ]
auf((RANDOM>3276))
und[ $[t++] -eq 2 ]
bis verkürzen((t++==2))
. Ich denke, Sie können auch ein paar Zeichen speichern, indem Sie als umstrukturierenwhile read -n1 a;((RANDOM>3276))&&…
.while read...
Teil?while …;do :;done
oderuntil …;do :;done
, Sie sollten in der Lage sein, einige Zeichen zu rasieren.C
260257237225189174Mein erster Golf, Vorschläge geschätzt.
7 ist sehr zufällig.
Beim Kompilieren erhalten Sie Warnungen.
Vielen Dank für die Hilfe von Breadbox und Josh.
quelle
#include
; C akzeptiert (mit Warnungen) Aufrufe von nicht deklarierten Funktionen (innerhalb von Grenzen). Verwenden Sie globale Variablen, um eine automatische Nullinitialisierung zu erhalten. Finden Sie Möglichkeiten, den ternären Operator anstelle vonif
/else
-Anweisungen zu verwenden. Die Verwendungfor
anstelle vonwhile
bietet mehr Möglichkeiten, um die Anzahl der Anweisungen der obersten Ebene zu verringern und die Klammern um den Schleifenkörper wegzulassen. Viel mehr, das erwähnt werden könnte: Untersuchen Sie andere C-Lösungen auf dieser Site.n
undc
im globalen Bereich. Auf diese Weise können Sie dieint
Deklaration löschen und die Initialisierung auf Null automatisch durchführen.c
den nicht initialisierten Wert in zu verwendensrand
. Ich denke, ich könnte&c
oder&n
stattdessen verwenden, was Breadbox verwendet.