Dies basiert auf xkcd # 153 .
Erstellen Sie ein Programm oder eine benannte Funktion, die zwei Parameter akzeptiert, von denen jeder eine Zeichenfolge oder eine Liste oder ein Array von Bytes oder Zeichen ist. Der zweite Parameter enthält nur Zeichen lrfu
(oder die entsprechenden ASCII-Bytes). Es sollte als eine Reihe von Anweisungen interpretiert werden, die an einer durch den ersten Parameter dargestellten Bitfolge ausgeführt werden sollen.
Die durchgeführte Verarbeitung muss der folgenden entsprechen:
- Konvertieren Sie den ersten Parameter in einen einzelnen Bitstring, der durch Verketten der Bits jedes Zeichens gebildet wird (interpretiert als einer von 7-Bit-ASCII, einem 8-Bit-erweiterten ASCII oder einer Standard-Unicode-Codierung). Wenn beispielsweise der erste Parameter lautet,
"AB"
ist dies einer von10000011000010
(7-Bit),0100000101000010
(8-Bit oder UTF-8)00000000010000010000000001000010
oder01000001000000000100001000000000
(UTF-16 in den beiden Endiannessen) usw. - Führen Sie für jedes Zeichen im zweiten Parameter der Reihe nach die entsprechende Anweisung aus:
l
dreht den Bitstring nach links. ZB10000011000010
wird00000110000101
.r
dreht den Bitstring nach rechts. ZB10000011000010
wird01000001100001
.f
kippt (oder invertiert) jedes Bit in der Bitfolge. ZB10000011000010
wird01111100111101
.u
kehrt die Bitfolge um. ZB10000011000010
wird01000011000001
.
- Konvertieren Sie den Bitstring in einen ASCII-String, der ein Zeichen pro Bit verwendet. ZB
10000011000010
wird"10000011000010"
. Dies liegt daran, dass nicht allen Sätzen von 7/8 Bits ein Zeichen zugewiesen ist.
Beispiel (in Python):
>>> f("b", "rfu")
01110011
Es verwandelt sich "b"
in seine 8-Bit-ASCII-Binärdarstellung 01100010
, dreht es nach rechts ( 00110001
), dreht jedes Bit ( 11001110
) um und kehrt es um ( 01110011
).
Flexibilität
Andere Zeichen anstelle der Zeichen verwendet werden können l
, r
, f
, und u
, aber sie müssen eindeutig dokumentiert werden.
Anzeigetafel
Vielen Dank an @Optimizer für die Erstellung des folgenden Code-Snippets. Klicken Sie zur Verwendung auf "Code-Snippet anzeigen", scrollen Sie nach unten und klicken Sie auf "► Code-Snippet ausführen".
"rrfrburb"
? Wenn man Bits verschiebt oder umkehrt, macht man das auch für jeden einzelnen Buchstaben oder die Zeichenfolge als Ganzes? Weitere Testfälle würden es klarer machen.