Costruisci un codificatore rot32


10

Costruire un codificatore rot13 golfato è troppo facile perché le lettere sono tutte dello stesso ordine nello spazio dei caratteri ASCII. Proviamo invece un motore rot32.

Il tuo compito è costruire una funzione che accetta una stringa Base64 come input e restituisce la stessa stringa ma con ogni lettera ruotata di 32 simboli dal suo originale (in sostanza, con il primo bit capovolto).

La stringa di codifica base64 da utilizzare per questo problema è 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/con un carattere di riempimento di =. Questo per evitare soluzioni che altrimenti utilizzerebbero o importerebbero una libreria Base64 integrata in cui normalmente iniziano le stringhe Aanziché 0.

Example inputs and outputs:

> rot32("THE+QUICK+BROWN+FOX+JUMPS+OVER+THE+LAZY+DOG=")
nb8ukoc6eu5liqhu9irudogjmuip8lunb8uf4tsu7ia=

> rot32("NB8UKOC6EU5LIQHU9IRUDOGJMUIP8LUNB8UF4TSU7IA=")
h5Eoei6C8oBfckboFclo7iadgocjEfoh5Eo9AnmoDc4=

> rot32("Daisy++daisy++give+me+your+answer+true/I+/+m+half+crazy++all+for+the+love+of+you")
7GOY2uuJGOY2uuMO/KuSKu2U+XuGTY0KXuZX+KvcuvuSuNGRLuIXG32uuGRRuLUXuZNKuRU/KuULu2U+

Vince il programma più breve per farlo in qualsiasi lingua.


4
Dalla domanda, vorrei capire che dobbiamo fare una decodifica base-64, alcuni bit-twiddling e una codifica base-64. Ma la tua risposta di esempio suggerisce che tutto il discorso su base-64 è un'aringa rossa, ed è proprio come rot-13 tranne per il fatto che l'insieme di personaggi che non vengono ignorati è più grande. Cos'è questo?
Peter Taylor,

1
È proprio come rot-13, ma pensavo che il bit-twiddling potesse essere una possibile strategia per ridurre il codice.
Joe Z.

Risposte:


4

CJam, 24 byte

q"+"":/{a[A"{,^}/_32m>er

Provalo online.

Come funziona

q         " Read from STDIN.                                                              ";
"+"       " Push that string.                                                             ";
":/{a[A"  " Push that string.                                                             ";
{         " For each character in the second string:                                      ";
  ,       "   Push the string of all charcters with a lower ASCII code.                   ";
  ^       "   Take the symmetric difference of the two topmost strings on the stack.      ";
}/        " Result: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/0123456789'.   ";
_32m>     " Rotate a copy 32 characters to the right.                                     ";
er        " Perform character transliteration.                                            ";

15

Shell Bash / Unix, 29

tr 0-9a-zA-Z+/ w-zA-Z+/0-9a-v

Ingresso da STDIN, uscita su STDOUT.


5

Perl, 41

Solo una semplice traslitterazione . Legge da STDIN, genera STDOUT:

$_=<>;y#0-9a-zA-Z+/#w-zA-Z+/0-9a-v#;print

Provalo qui.


2
Chi dice che il Perl non è un esolang (e / o un linguaggio orientato al golf)?
Ottimizzatore

È possibile radere alcuni caratteri utilizzando le opzioni della riga di comando -pe -eper eliminare il $_=<>;e il ;print.
Segna il

4

CJam, 45 41 38 29 27 26 byte

qA,'{,97>_eu"+/"+++_32m>er

Legge la stringa da crittografare da STDIN

Come funziona :

q                              "Read input";
 A,                            "Get 0 - 9 array";
   '{,                         "Get array/string of ASCII code 0 till ASCII code of z";
      97>                      "Remove first 96 characters to get a-z string";
         _eu                   "Copy a-z array and turn it to uppercase A-Z array";
            "+/"+++            "Push string +/ and concat all 4 arrays";
                   _32m>       "Copy the array and move first 32 characters to end";
                        er     "Transliterate input using the two arrays, leaving ="
                               "intact as it does not appear in the first array";

Provalo online qui


3

Python, 178

b = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"

def rot32(s):
    o = ""
    for c in s:
        if c not in b:
            o += c
        else:
            o += b[b.find(c) ^ 32] 
    return o

Questa è un'implementazione di riferimento dell'ultimo posto non modificata in Python che puoi usare per testare la tua implementazione.


Almeno, spero che rimanga all'ultimo posto.
Joe Z.

0

GolfScript ( 41 40 byte)

{'0:a{A['2/{{,>}*}%'+/'+[1$]+.32/(*@?=}%

Demo online

Ci sono due parti in questo: la traduzione è una variante dell'ultima tecnica menzionata nel mio suggerimento su trGolfScript , e l'altra parte è la costruzione di stringhe, che utilizza la stringa 0:a{A[come un array di valori char e una piega per trasformarli in gamme di caratteri. Nota l'uso di 32/(*per costruire la stringa tradotta inserendo i primi 32 caratteri tra i secondi 32 caratteri e il carattere che stiamo traducendo.


0

pitone, 69

f = lambda s,b: ''.join(b[b.index(c)^32] if c in b else c for c in s)

test

>>> b = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
>>> print f("THE+QUICK+BROWN+FOX+JUMPS+OVER+THE+LAZY+DOG=", b)
nb8ukoc6eu5liqhu9irudogjmuip8lunb8uf4tsu7ia=

>>> print f('nb8ukoc6eu5liqhu9irudogjmuip8lunb8uf4tsu7ia=', b)
THE+QUICK+BROWN+FOX+JUMPS+OVER+THE+LAZY+DOG=

0

LiveScript, 91

r=[\0 to\9].concat [\a to\z] [\A to\Z] [\+ \/];f=(.replace /[^\W_]/ ->r[32.^.r.indexOf it])

LiveScript, 50

Se la stringa è consentita come secondo argomento.

f=(a,b)->a.replace /[^\W_]/ ->r[32.^.b.indexOf it]

0

JavaScript 164

b="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
function rot32(s){for(i=0,o="";i<s.length;i++)c=s[i],j=b.indexOf(c),o+=j>-1?b[j^32]:c
return o}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.