Introduzione:
Ho un sacco di cifre diverse memorizzate in un documento che una volta ho compilato da bambino, ne ho scelte alcune che pensavo fossero le più adatte alle sfide (non troppo banali e non troppo difficili) e le trasformavo in sfide. Molti di loro sono ancora nella sandbox, e non sono ancora sicuro se li posterò tutti o solo alcuni. Ma qui è il primo di cui iniziare.
Un cifrario informatico codificherà il testo dato in gruppi di caratteri "casuali" di un dato length
. Se un tale gruppo contiene una cifra, utilizzerà quella cifra per indicizzarsi nel proprio gruppo per il carattere codificato. Se nessuna cifra è presente nel gruppo, significa che viene utilizzato il primo carattere.
Ad esempio, supponiamo di voler crittografare il testo this is a computer cipher
con una determinata lunghezza di 5
. Questo è un potenziale output (nota: i numeri sono 1 indicizzati nell'esempio seguente):
t h i s i s a c o m p u t e r c i p h e r (without spaces of course, but added as clarification)
qu5dt hprit k3iqb osyw2 jii2o m5uzs akiwb hwpc4 eoo3j muxer z4lpc 4lsuw 2tsmp eirkr r3rsi b5nvc vid2o dmh5p hrptj oeh2l 4ngrv (without spaces of course, but added as clarification)
Prendiamo alcuni gruppi come esempi per spiegare come decifrare il gruppo:
qu5dt
: Questo gruppo contiene una cifra5
, quindi la (1-indicizzato) 5th carattere di questo gruppo è il carattere utilizzato per il testo decifrato:t
.hprit
: Questo gruppo non contiene cifre, in modo che il primo carattere di questo gruppo viene utilizzato in modo implicito per il testo decifrato:h
.osyw2
: Questo gruppo contiene una cifra2
, in modo che il (1-indicizzato) 2 ° carattere di questo gruppo è il carattere utilizzato per il testo decifrato:s
.
Sfida:
Dato un numero intero length
e una stringa word_to_encipher
, genera una stringa codificata casuale come descritto sopra.
Devi solo crittografare dato il length
e word_to_encipher
, quindi non è necessario creare anche un programma / funzione di decifrazione. Potrei comunque fare una sfida nella seconda parte per la decifrazione in futuro.
Regole della sfida:
- Puoi presumere che
length
sarà nell'intervallo[3,9]
. - Puoi presumere
word_to_encipher
che conterrà solo lettere. - È possibile utilizzare lettere maiuscole o minuscole (indicare quale è stato utilizzato nella risposta).
- Le uscite, ogni gruppo e le posizioni delle cifre in un gruppo (se presente) devono essere uniformemente casuali . Quindi tutte le lettere casuali dell'alfabeto hanno le stesse possibilità di verificarsi; la posizione della lettera codificata in ciascun gruppo ha le stesse possibilità di verificarsi; e la posizione della cifra ha le stesse possibilità di verificarsi (tranne quando è il primo carattere e nessuna cifra è presente; e ovviamente non può trovarsi nella stessa posizione del carattere codificato).
- È inoltre consentito utilizzare cifre indicizzate 0 anziché 1 indicizzate. Indica quale dei due hai utilizzato nella tua risposta.
- La cifra
1
(o0
quando 0-indicizzata) non sarà mai presente nell'output. Quindib1ndh
non è un gruppo valido per codificare il carattere 'b'. Tuttavia,b4tbw
è valido, dove i4
codificherà ib
alla 4a posizione (1-indicizzato), e gli altri caratterib
,t
,w
sono casuali (che contiene anche una coincidenzab
). Altri possibili gruppi validi dilength
5 per cifrare il carattere 'b' sono:abcd2
,ab2de
,babbk
,hue5b
, etc.
Regole generali:
- Questo è code-golf , quindi vince la risposta più breve in byte.
Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione. - Le regole standard si applicano alla tua risposta con le regole I / O predefinite , quindi puoi utilizzare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
- Le scappatoie predefinite sono vietate.
- Se possibile, aggiungi un link con un test per il tuo codice (ad es. TIO ).
- Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.
Casi test:
Input:
Length: 5
Word to encipher: thisisacomputercipher
Possible output:
qu5dthpritk3iqbosyw2jii2om5uzsakiwbhwpc4eoo3jmuxerz4lpc4lsuw2tsmpeirkrr3rsib5nvcvid2odmh5phrptjoeh2l4ngrv
Input:
Length: 8
Word to encipher: test
Possible output:
ewetng4o6smptebyo6ontsrbtxten3qk
Input:
Length: 3
Word to encipher: three
Possible output:
tomv3h2rvege3le
abcd2
, ab2de
, babbk
tutti uguali? È anche b1akk
valido?
b1akk
direi di no. Lo modificherà nella descrizione della sfida per chiarire. Se il primo carattere è quello crittografato, non dovrebbe essere presente alcuna cifra.
"a??"
ha 676 possibili risultati, ma "1a?"
, "?a1"
, "2?a"
, "?2a"
, ha only104 risultati. Quindi, se sto provando a scegliere un risultato tra tutti questi 780 risultati, la distribuzione di "posizione della lettera codificata" è 13: 1: 1, non 1: 1: 1. E lo considero come un lavoro "uniformemente casuale".