Das Szenario
In letzter Zeit haben Sie ein merkwürdiges Verhalten mit Ihrem bevorzugten Texteditor festgestellt. Zuerst schien es, dass es zufällige Zeichen in Ihrem Code ignorierte, wenn auf die Festplatte geschrieben wurde. Nach einer Weile bemerkten Sie ein Muster; Zeichen mit ungeraden ASCII-Werten wurden ignoriert. Bei weiterer Überprüfung haben Sie festgestellt, dass Sie nur dann richtig in Dateien schreiben können, wenn jedes achte Bit Null ist. Jetzt müssen Sie wissen, ob Ihre wertvollen Dateien von diesem seltsamen Fehler betroffen sind.
Die Aufgabe
Sie müssen ein vollständiges Programm schreiben, das feststellt, ob eine Datei ungerade Bytes enthält (um zu demonstrieren, dass sie nicht beschädigt ist). Aufgrund Ihres Texteditors können Sie jedoch keine ungeraden Bytes in Ihren Quellcode schreiben. Sie können eine bereits vorhandene Codierung für die Eingabe annehmen, müssen jedoch jedes einzelne Byte und nicht nur Zeichen überprüfen.
Eingang
Ihr Programm übernimmt den Inhalt oder den Pfad zu einer Datei entweder über die Standard- oder die Befehlszeile.
Ausgabe
Ihr Programm gibt entweder einen Wahrheitswert aus, wenn die angegebene Datei ein ungerades Byte enthält, oder einen Fehler, wenn jedes achte Bit Null ist.
Kriterien
Dies ist Codegolf, das kürzeste Programm, das die Aufgabe abschließt, gewinnt. Um eine gültige Übermittlung zu sein, muss jedes achte Bit im Quellcode der Datei eine Null sein. Ich würde empfehlen, Ihrer Einreichung eine Kopie der Binärdateien Ihres Quellcodes beizufügen.
Es gelten Standardlücken .
Testfälle
(In ASCII-Codierung) Eingabe:
"$&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
Output:
falsy
Input:
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
Output:
truthy
Input:
LOREMIPSVMDOLORSITAMETCONSECTETVRADIPISCINGELITSEDDOEIVSMODTEMPORINCIDIDVNTVTLABOREETDOLOREMAGNAALIQVA
VTENIMADMINIMVENIAMQVISNOSTRVDEXERCITATIONVLLAMCOLABORISNISIVTALIQVIPEXEACOMMODOCONSEQVAT
DVISAVTEIRVREDOLORINREPREHENDERITINVOLVPTATEVELITESSECILLVMDOLOREEVFVGIATNVLLAPARIATVR
EXCEPTEVRSINTOCCAECATCVPIDATATNONPROIDENTSVNTINCVLPAQVIOFFICIADESERVNTMOLLITANIMIDESTLABORVM
Output:
truthy
Tipps
Wähle die Sprache mit Bedacht Diese Herausforderung ist möglicherweise nicht in jeder Sprache möglich
Der Unix-Befehl
xxd -b <file name>
druckt die Binärdateien einer Datei auf die Konsole (zusammen mit einigen zusätzlichen Formatierungselementen).Sie können andere Kodierungen als ASCII wie UTF-8 verwenden, solange alle anderen Regeln eingehalten werden
quelle
!#%')+-/13579;=?ACEGIKMOQSUWY[]_acegikmoqsuwy{}
sind die gesperrten druckbaren ASCII-Zeichen für alle, die sich interessieren. Die zulässigen druckbaren ASCII-Zeichen sind" $&(*,.02468:<>@BDFHJLNPRTVXZ\^`bdfhjlnprtvxz|~
[CR]
das ungerade Bit vorhanden ist. Ich hatte gehofft, dass WhiteSpace in Sicherheit ist, aber leider[TAB]
. Wenn Sie auf die alte Schule gehen möchten, gibt Ihnen EBCDIC drei Vokale.Antworten:
GS2 , 4 Bytes
Probieren Sie es online!
Hexdump
Wie es funktioniert
quelle
Befunge, 36 Bytes
Ich weiß, dass dies eine alte Frage ist, aber ich wollte es versuchen, weil ich dachte, dass es eine interessante Herausforderung in Befunge sein würde.
Probieren Sie es online!
Es wird ausgegeben,
1
wenn die Eingabe beschädigt ist (dh ein ungerades Byte enthält) und0
wenn es in Ordnung ist.Erläuterung
Das Problem ist, wie man ungerade Bytes ermittelt, ohne Zugriff auf die Befehle
/
(dividieren) oder%
(modulo) zu haben. Die Lösung bestand darin, den Wert mit 128 (der Sequenz28*8**
) zu multiplizieren und das Ergebnis in das Spielfeld zu schreiben. Bei einem strengen Standardinterpreter sind die Spielfeldzellen mit 8-Bit-Werten vorzeichenbehaftet, sodass eine ungerade Zahl multipliziert mit 128 auf -1 abgeschnitten wird, während eine gerade Zahl zu 0 wird.Der andere Trick bestand darin, die -1 oder 0 vom Spielfeld zurückzulesen, ohne Zugriff auf den
g
Befehl (get) zu haben. Die Problemumgehung hierfür bestand darin, den Wert in die Mitte einer vorhandenen Zeichenfolgensequenz (" "
) zu schreiben und dann diese Sequenz auszuführen, um den eingeschlossenen Wert auf den Stapel zu verschieben. Zu diesem Zeitpunkt ist die Bestimmung der Unregelmäßigkeit des Bytes ein einfacher Test, der kleiner als Null ist.Ein letzter Aspekt, den es zu diskutieren gilt, ist die Ausgabe. Im falschen Fall erreichen wir die
>$.
Sequenz mit nur einem Wert auf dem Stapel,$
löschen also den Stapel und.
geben eine Null aus. Im wahren Fall folgen wir dem Pfad20`:>$.
. Da zwei größer als Null sind, legt der Vergleich eine Eins auf den Stapel und erstellt:
eine doppelte Kopie, damit$
sie nicht gelöscht wird, bevor sie ausgegeben wird.quelle
CJam (11 Bytes)
Online-Demo
Das Entfernen der Tricks, um ungerade Bytes zu vermeiden, reduziert sich auf
Dieser liest die Eingabe, bildet ein bitweises UND mit ab
1
und führt dann eine Basisumwandlung durch, wobei Null erhalten wird, wenn alle UNDs Null waren.quelle
:(
Druckbare .COM-Datei, 100 Bytes
Hexdump:
Verwenden einer sehr losen Definition der Quelle als etwas, das von einem Menschen angemessen getippt werden kann und von der EICAR-Standard-Antivirus-Testdatei inspiriert ist (weitere Informationen unter "Viel Spaß mit der EICAR-Testdatei" bei Bugtraq).
Verwendet nur druckbare, nicht ungerade ASCII-Bytes (Randnotiz: Opcodes, die Wörter betreffen, sind in der Regel ungerade, das W-Bit ist das lsb einiger Opcodes), erstellt es ein Codefragment in SP (das wir praktischerweise direkt nach unserem generierenden Code setzen). und die Ausführung endet damit, dass sie zum generierten Code durchfällt.
Es wird die Tatsache ausgenutzt, dass der Stapel anfänglich einen Near-Zeiger auf den Start des PSP enthält und dass der Start des PSP die
INT 20h
Anweisung enthält (weitere Informationen hierzu unter https://stackoverflow.com/questions/12591673/ ).Echte Quelle:
quelle
MATL , 7 Bytes
Der Quellcode verwendet UTF-8-Codierung. Die Quellbytes sind also (in Dezimalzahl)
Die Eingabe ist ein Dateiname, der als Zeichenfolge in einfachen Anführungszeichen angegeben wird. Die Ausgabe ist die Anzahl der ungeraden Bytes in der Datei, die wahrheitsgemäß ungleich Null ist.
Erläuterung
quelle
CJam,
181715 BytesNimmt an, dass das Gebietsschema auf Latin-1 festgelegt ist. Probieren Sie es online!
Wie es funktioniert
Die einfache Lösung lautet wie folgt.
Leider können die Zeichen
q
undi
nicht im Quellcode erscheinen. Um dieses Problem zu umgehen, werden wir einen Teil des obigen Quellcodes dynamisch erstellen und dann die Zeichenfolge auswerten.quelle
Pyth,
2013 BytesOder binär:
Probieren Sie es online aus
Wie es funktioniert
Die resultierende Ganzzahl ist wahr (ungleich Null), wenn eines der Bytes ungerade war.
quelle
Gelee , 13 Bytes
Erwartet die Eingabe in Anführungszeichen als Befehlszeilenargument. Probieren Sie es online!
Hexdump
quelle
O%2¬Ạ¬
.Netzhaut , 106 Bytes
Entfernt alle zulässigen Zeichen und stimmt mit den verbleibenden Zeichen überein. Wahrheitswerte sind die Anzahl der gefundenen Zeichen. Falsche Werte werden sein
0
.Probieren Sie es online aus
Da
.
die Zeilenumbrüche standardmäßig nicht übereinstimmen, muss ich sie nicht entfernen.quelle
Perl 5+
-p0
, 136 BytesÄhnlich wie bei anderen Antworten werden alle geraden Bytes entfernt und alle ungeraden Bytes (was wahr ist) zurückgelassen.
Probieren Sie es online!
quelle
-0
tut nichts mit newlines. Es bestimmt nur , wie man sich trennen den Eingang, ist es keine Zeichen zu entfernen.-0
, ich wollte den ganzen Block als Klumpen machen, aber das sollte keine Rolle spielen, aber ich kann das nicht umgehen ... Schade! Ich werde diese Kommentare bereinigen. Vielen Dank für die Köpfe nach oben!Japt , 10 Bytes
Probieren Sie es online!
Die Codepage von Japt ist ISO-8859-1. Der Code gibt an,
false
wenn er selbst als Zeichenfolge eingegeben wird, daher eine gültige Übermittlung.Ausgepackt und wie es funktioniert
Nicht zu haben
String.c
(Zeichencode oder Karte über Zeichencodes zu bekommen) war ein Schmerz, aber zum Glück gibt esNumber.d
(Zahl in Zeichen umwandeln).Es stellt sich heraus, dass Japt CJam, Pyth und Jelly gewinnt :)
Ohne Einschränkung gibt es mehrere Möglichkeiten, dies in 6 Bytes zu tun (wieder mit CJam und Jelly gleichzusetzen):
"000..000"
wird in die Zahl 0 (falsch) umgewandelt, unabhängig davon, wie lange es dauert. Auf der anderen Seite wird alles, was 1 enthält, in einen Wert ungleich Null konvertiertdouble
oderInfinity
wenn es zu groß ist (beides ist wahr).Einfacherer Ansatz, der direkt
true
oder ergibtfalse
.Oder 5-Byte- Lösung ist sogar mit Hilfe von
-d
flag möglich:quelle