Questo si basa su xkcd # 153 .
Crea un programma o una funzione con nome che accetta 2 parametri, ognuno dei quali è una stringa o un elenco o una matrice di byte o caratteri. Il secondo parametro conterrà solo caratteri estratti da lrfu
(o byte ASCII equivalenti). Dovrebbe essere interpretato come una serie di istruzioni da eseguire su una sequenza di bit rappresentata dal primo parametro.
Il trattamento eseguito deve essere equivalente al seguente:
- Converti il primo parametro in una singola stringa di bit formata concatenando i bit di ciascun carattere (interpretato come uno di ASCII a 7 bit, un ASCII esteso a 8 bit o una codifica Unicode standard). Ad esempio, se il primo parametro è
"AB"
allora questo sarebbe uno di10000011000010
(7 bit),0100000101000010
(8 bit o UTF-8)00000000010000010000000001000010
, o01000001000000000100001000000000
(UTF-16 nei due endiannesses), ecc. - Per ogni carattere nel secondo parametro, in ordine, eseguire le istruzioni corrispondenti:
l
ruota la stringa di bit a sinistra. Ad esempio10000011000010
diventa00000110000101
.r
ruota la stringa di bit a destra. Ad esempio10000011000010
diventa01000001100001
.f
inverte (o inverte) ogni bit nella stringa di bit. Ad esempio10000011000010
diventa01111100111101
.u
inverte la stringa di bit. Ad esempio10000011000010
diventa01000011000001
.
- Converti la stringa di bit in una stringa ASCII che utilizza un carattere per bit. Ad esempio
10000011000010
diventa"10000011000010"
. Questo perché non tutti i set di 7/8 bit hanno un carattere assegnato a loro.
Esempio (in Python):
>>> f("b", "rfu")
01110011
Si trasforma "b"
nella sua rappresentazione binaria ASCII a 8 bit 01100010
, la ruota a destra ( 00110001
), capovolge ogni bit ( 11001110
) e lo inverte ( 01110011
).
Flessibilità
Altri caratteri possono essere utilizzati al posto dei caratteri l
, r
, f
, e u
, ma devono essere chiaramente documentati.
tabellone segnapunti
Grazie a @Optimizer per aver creato il seguente frammento di codice. Per utilizzare, fai clic su "Mostra frammento di codice", scorri verso il basso e fai clic su "► Esegui frammento di codice".
"rrfrburb"
? Inoltre, quando uno sposta o inverte i bit, lo fa per ogni singola lettera o per la stringa nel suo insieme? Altri casi di test lo renderebbero più chiaro.