Mein Kollege und ich arbeiten an einer alten Software, die wir manchmal hassen. Wann immer Sie es ausführen, fliegen Debug-Asserts überall hin und es ist nie eine Garantie dafür, dass irgendetwas funktioniert. Die Motivation für diese Runde Code-Golf kam von meinem Kollegen, der Folgendes über unsere Software sagte .
"Es ist, als ob Sie jedes Mal, wenn Sie dieses Programm ausführen, einigen Nutzungsbedingungen zustimmen, die besagen, dass jedes 17. Bit auf Ihrer Festplatte in eine 1 umgewandelt wird."
Ziel: Schreiben Sie ein Programm, das eine exakte Kopie einer Datei erstellt und jedes 17. Bit einer Textdatei in eine 1 verwandelt
- Sie können nicht drehen EVERY Bit der Datei zu einem 1. dh Ihr Programm muss eine gewisse Intelligenz zeigen , dass es nur jedes 17. Bit Targeting
- Sie dürfen NICHT in irgendeiner Form in die Originaldatei schreiben
- Der Gewinner ist die kleinste Programmeinreichung am Monatsende
Viel Spaß damit! Gehen!
code-golf
, dh kürzester Code in Bytes gewinnt. Acode-challenge
benötigt ein genau festgelegtes Bewertungssystem. 2. Das Verwandeln jedes 18. Bits einer Festplatte in eine 1 ist nur durch direktes Schreiben auf die Festplatte möglich. Dies kann nicht durch Erstellen und / oder Ändern von Dateien erreicht werden. 3. Wenn Sie dies tun, wird das gesamte Laufwerk unbrauchbar, sodass eine kompatible Lösung destruktiv ist. Ich weiß nicht, wie gut die Community eine Anfrage zum Schreiben von Malware erhalten wird ...:/
Antworten:
CJam, 22 Bytes
Probieren Sie es online aus.
Berührt jedes 17. Bit und zählt vom letzten.
Ich habe STDIN und STDOUT verwendet, da CJam keine Datei-E / A hat. Wenn dies nicht zulässig ist, kann das Programm zum Preis von 24 zusätzlichen Bytes in ein Bash-Skript eingeschlossen werden:
Wie es funktioniert
quelle
Perl 59
Regex-Substitution für Bit-Strings:
Verwendungszweck:
quelle
b
undB
in denpack
VorlagenC 125
Nimmt Big-Endian- und 16-Bit-Ganzzahlen an .
Funktioniert, indem alle zwei Bytes ein bitweises ODER angewendet wird.
Eingabedatei ist
y
, Ausgabe istz
.Ungolfed
quelle
00000000 00000001 00000000 00000000 10000000 00000000
, alsoa
sollte Null an bestimmten Punkten sein. Die Maschine muss Big Endian verwenden (sonst hätten Sie00000000 10000000
stattdessen10000000 00000000
, was den falschen Wert ergeben würde).c = __builtin_bswap16(c);
korrigierte es.Python 2, 112 Bytes
Dies setzt jedes 17. Big-Endian-Bit, beginnend mit dem 17. von Anfang an. Es werden keine Bibliotheken verwendet. Es funktioniert durch Konvertieren der Eingabedatei in eine gigantische
n
-bit-Ganzzahl und bitweises ODER-Verknüpfen mit2**n/(2**17 - 1) == 0b10000000000000000100000000000000001…
.quelle
C - 139
Liest aus einer Datei mit dem Namen "i" und gibt in eine Datei mit dem Namen "o" aus.
Mit Zeilenumbrüchen:
Zählt Eingangsbits und verwendet dann eine schwebende Bitmaske, um jedes siebzehnte Bit zu setzen.
quelle
Java - 247
Verwendet eine
BitSet
und eine einfache Schleife, anstatt die Bytes manuell zu behandeln / zu maskieren. Da dies Java ist, ist das Boilerplate natürlich das halbe Programm, also nicht gerade kurz.Immer noch nicht zuletzt! : D.
No-Scroll-Version:
quelle
Python - 98 Bytes
Lesen Sie von i, schreiben Sie an o. Verwendet die Bitarray-Bibliothek https://pypi.python.org/pypi/bitarray
ungolfed
quelle
a[::17]=1
?from bitarray import*
und ein Byte speichern könnena=bitarray()
.Cobra - 308
Jedes Mal, wenn ich eine dieser Herausforderungen zum "Manipulieren der einzelnen Teile von etwas" durchführe, wünsche ich mir, dass entweder Cobra oder die .NET-Standardbibliothek einen
binary string => integer
Konverter haben.quelle
Javascript (+ HTML5), 282
Wahrscheinlich nicht die kürzeste, aber benutzerfreundlich: D.
Es ist browserübergreifend, aber es scheint, dass Chrome das einzige ist, das es zulässt, wenn die HTML-Datei eine lokale Datei ist (= Zugriff mit
file://...
). Für die anderen Browser müssen Sie es auf einem Webserver ablegen.Die Ausgabedatei sollte im Standard-Download-Verzeichnis gespeichert werden, möglicherweise mit einer Eingabeaufforderung (abhängig von Ihrer Konfiguration).
Ungolfed Version:
quelle
Python 3 - 187 Bytes
Liest ein
i
und schreibt ano
.Code:
Ungolfed:
quelle
Python 3 - 103 Zeichen
Wechseln Sie
f
in den Pfad der Datei, die Sie lesen möchten, undo
in den Pfad der Datei, in die Sie schreiben möchten.quelle