Trifid Cipher (senza parola chiave)


19

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. Ecco il secondo (il Computer Cipher è stato il primo che ho pubblicato).


Per il Trifid Cipher (senza usare una parola chiave) l'alfabeto (e un carattere jolly aggiuntivo) è diviso in tre tabelle 3 per 3:

table 1:     table 2:     table 3:
 |1 2 3       |1 2 3       |1 2 3
-+-----      -+-----      -+-----
1|a b c      1|j k l      1|s t u
2|d e f      2|m n o      2|v w x
3|g h i      3|p q r      3|y z  

Un testo che vogliamo codificare è il primo carattere per carattere codificato in numeri di tabella-riga-colonna. Ad esempio, il testo this is a trifid cipherdiventa:

        t h i s   i s   a   t r i f i d   c i p h e r
table:  3 1 1 3 3 1 3 3 1 3 3 2 1 1 1 1 3 1 1 2 1 1 2
row:    1 3 3 1 3 3 1 3 1 3 1 3 3 2 3 2 3 1 3 3 3 2 3
column: 2 2 3 1 3 3 1 3 1 3 2 3 3 3 3 1 3 3 3 1 2 2 3

Mettiamo quindi tutto uno dopo l'altro riga per riga nella tabella sopra in gruppi di tre:

311 331 331 332 111 131 121 121 331 331 313 133 232 313 332 322 313 313 132 333 313 331 223

E quelli vengono trasformati in caratteri usando le stesse tabelle:

s   y   y   z   a   g   d   d   y   y   u   i   q   u   z   w   u   u   h       u   y   o

Una cosa da notare, la lunghezza di input dovrebbe essere coprime a 3. Quindi, se la lunghezza è un multiplo di 3, aggiungeremo uno o due spazi finali per rendere la lunghezza di input non più un multiplo 3.

Sfida:

Data una stringa sentence_to_encipher, codificala come descritto sopra.

Devi solo codificare dato sentence_to_encipher, quindi non è necessario creare anche un programma / funzione di decifrazione. In futuro, tuttavia, potrei presentare una sfida della seconda parte per la decifrazione (anche se ho la sensazione che sia banale / simile al processo di codifica).

Regole della sfida:

  • Puoi presumere sentence_to_encipherche conterrà solo lettere e spazi.
  • È possibile utilizzare lettere maiuscole o minuscole (indicare quale è stato utilizzato nella risposta).
  • Puoi scegliere di aggiungere uno o due spazi finali quando la lunghezza di input è 3 per renderlo non più un multiplo di 3.
  • L'I / O è flessibile. Sia l'input che l'output possono essere una stringa, un elenco / un array / un flusso di caratteri, ecc.

Regole generali:

  • Questo è , 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.
  • Per la tua risposta valgono regole standard con regole I / O predefinite , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
  • Sono vietate le scappatoie predefinite .
  • 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:            "this is a trifid cipher"
Output:           "syyzagddyyuiquzwuuh uyo"

Input:            "test"
Output:           "utbk"

Input:            "output"
Possible outputs: "rrvgivx" (one space) or "rrzcc lr" (two spaces)

Input:            "trifidcipher"
Possible output:  "vabbuxlzz utr" (one space) or "vabbyzv rx ie " (two spaces)

3
L'ho letto come "senza tastiera ". Sarebbe stata una sfida deliziosa!
Cort Ammon - Ripristina Monica l'

1
Perché la lunghezza dell'input dovrebbe essere coprime a 3? Non vedo come sia importante qui.
Fondi Monica's Lawsuit

Il requisito coprime non è necessario per far funzionare il codice, ma lo rende leggermente più sicuro assicurando che i gruppi di tre cifre non si allineino con le divisioni di riga dell'elenco di cifre iniziale.
Sparr,

@NicHartley Hai proprio ragione nel dire che anche se l'input è divisibile per 3, puoi comunque trasporre la tabella. Inizialmente non avevo questa regola nel Sandbox, ma qualcuno mi ha detto che Wikipedia per Trifid mostra che dovrebbe aggiungere uno o due spazi per rendere la crittografia leggermente più sicura. Quindi l'ho aggiunto come parte della sfida e per renderlo più sincronizzato con la pagina di Wikipedia (a parte la parola chiave che ho rimosso).
Kevin Cruijssen,

1
@KevinCruijssen I ... davvero non vedo come ciò lo renderebbe più sicuro (semmai, forzando l'input a non avere una certa lunghezza lo renderebbe meno sicuro, come puoi immaginare che l'ultimo carattere stia codificando un spazio) ma concordo sul fatto che mantenere la descrizione del codice qui in linea con Wikipedia sia una buona idea. Grazie per aver spiegato!
Fondo Monica's Lawsuit,

Risposte:


6

Gelatina , 29 26 25 byte

⁶Øa;3ṗ¤,©Ṛy;⁶$L3ḍƊ¡ZFs3®y

Provalo online!

Come funziona

⁶Øa;3ṗ¤,©Ṛy;⁶$L3ḍƊ¡ZFs3®y  Main link. Argument: s (string)

⁶                          Set the return value to space.
 Øa;                       Append it to "a...z".
    3ṗ¤                    Yield the third Cartesian power of [1, 2, 3].
       ,©                  Pair the results and store the pair in the register.
                           The register now holds
                           [[[1, 1, 1], ..., [3, 3, 3]], ['a', ... ,'z', ' '].
         Ṛ                 Reverse the outer array.
           ;⁶$             Append a space to s...
              L3ḍƊ¡        if the length is divisible by 3.
          y                Transliterate according to the mapping to the left.
                   ZFs3    Zip/transpose, flatten, split into chunks of length 3.
                       ®y  Transliterate according to the mapping in the register.

Non conosco mai le regole sulle uscite degli effetti collaterali ... ma l'accordo ;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸ypuò farla finita µse è accettabile per 24.
Jonathan Allan,

Abbiamo un debole consenso ( + 6 / -1 ) sul fatto che ciò sia consentito, quindi grazie!
Dennis,

L'output sembra essere errato. Non credo che lo spazio allegato "si attacchi".
Dennis

6

Carbone , 39 byte

≔E⁺θ× ¬﹪Lθ³⌕βιθ⭆⪪E⁺÷θ⁹⁺÷θ³θ﹪鳦³§⁺β ↨³ι

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

≔               Assign
   θ            Input string
  ⁺             Concatenated with
                Literal space
    ×           Repeated
         θ      Input string
        L       Length
       ﹪        Modulo
          ³     Literal 3
      ¬         Logical not
 E              Mapped over characters
             ι  Current character
           ⌕    Position found in
            β   Lowercase alphabet
              θ To variable

     θ                      List of positions
    ÷                       Vectorised integer divide by
      ⁹                     Literal 9
   ⁺                        Concatenated with
         θ                  List of positions
        ÷                   Vectorised integer divide by
          ³                 Literal 3
       ⁺                    Concatenated with
           θ                List of positions
  E                         Map over values
             ι              Current value
            ﹪               Modulo
              ³             Literal 3
 ⪪                          Split into
                ³           Groups of 3
⭆                           Map over groups and join
                   β        Lowercase alphabet
                  ⁺         Concatenated with
                            Literal space
                 §          Cyclically indexed by
                       ι    Current group
                     ↨      Converted from
                      ³     Base 3
                            Implicitly print

6

Python 2 , 180 176 174 165 163 byte

lambda s:''.join(chr(32+(33+a*9+3*b+c)%59)for a,b,c in zip(*[iter(sum(zip(*[(c/9,c/3%3,c%3)for c in map(o,s+' '[len(s)%3:])]),()))]*3))
o=lambda c:(ord(c)%32-1)%27

Provalo online!

L'ingresso può essere superiore o inferiore. L'output è maiuscolo


6

Pyth, 34 33 byte

m@+G;id3csCmtj+27x+G;d3+W!%lz3zd3

Programma completo. L'input è previsto in minuscolo, l'output è un array di caratteri. Provalo online qui o verifica tutti i casi di test contemporaneamente qui .

m@+G;id3csCmtj+27x+G;d3+W!%lz3zd3   Implicit: z=input(), d=" ", G=lowercase alphabet
                           lz       Length of z
                          %  3      The above, mod 3
                        W!          If the above != 3...
                       +      zd    ... append a space to z
           m                        Map the elements of the above, as d, using:
                  +G;                 Append a space to the lowercase alphabet
                 x   d                Find the 0-based index of d in the above
              +27                     Add 27 to the above
             j        3               Convert to base 3
            t                         Discard first element (undoes the +27, ensures result is 3 digits long)
          C                         Transpose the result of the map
         s                          Flatten
        c                       3   Split into chunks of length 3
m                                   Map the elements of the above, as d, using:
     id3                              Convert to decimal from base 3
 @+G;                                 Index the above number into the alphabet + space
                                    Implicit print

Soluzione alternativa a 34 byte: sm@+G;id3csCm.[03jx+G;d3+W!%lz3zd3- anziché +27 e coda, utilizza il .[03pad con 0 alla lunghezza 3. Può essere 33 se il primos viene lasciato cadere.

Modifica: salvato un byte rilasciando il comando iniziale spoiché le matrici di caratteri sono output valide


5

Rubino , 153 145 138 131 byte

->a{a<<" "if a.size%3<1;a.map{|c|[(b=(c.ord%32-1)%27)/9,b%9/3,b%3]}.transpose.join.scan(/.{3}/).map{|x|((x.to_i(3)+65)%91+32).chr}}

Provalo online!

Un approccio rapido e ingenuo, funziona con testo minuscolo. Input e output array di caratteri.


4

Java (JDK) , 192 byte

s->{String T="",R=T,C=T,r=T;for(int c:s){c-=c<33?6:97;T+=c/9;R+=c%9/3;C+=c%3;}for(var S:(s.length%3<1?T+2+R+2+C+2:T+R+C).split("(?<=\\G...)"))r+=(char)((Byte.valueOf(S,3)+65)%91+32);return r;}

Provalo online!

Approccio molto ingenuo. Accetta le lettere minuscole char[]come input ma genera a String.

spiegazioni

s->{                                       // char[]-accepting lambda
 String T="",                              //  declare variables Table as an empty string,
        R=T,                               //                    Row as an empty string,
        C=T,                               //                    Column as an empty string,
        r=T;                               //                    result as an empty string.
 for(int c:s){                             //  for each character
  c-=c<33?6:97;                            //   map each letter to a number from 0 to 25, space to 26.
  T+=c/9;                                  //   append the table-value to Table
  R+=c%9/3;                                //   append the row-value to Row
  C+=c%3;                                  //   append the column-value to Column
 }                                         //
 for(var S:                                //  For each token of...
     (s.length%3<1?T+2+R+2+C+2:T+R+C)      //    a single string out of table, row and column and take the space into account if the length is not coprime to 3...
      .split("(?<=\\G...)"))               //    split every 3 characters
  r+=(char)((Byte.valueOf(S,3)+65)%91+32); //   Parses each 3-characters token into a number, using base 3,
                                           //  and make it a letter or a space
 return r;                                 //  return the result
}

Titoli di coda


1
Due piccoli golf: Integer.valueOfda Byte.valueOfe R+=c<26?(char)(c+97):' ';perR+=(char)(c<26?c+97:32);
Kevin Cruijssen, l'


4

R , 145 byte

function(s,K=array(c(97:122,32),rep(3,3)))intToUtf8(K[matrix(arrayInd(match(c(utf8ToInt(s),32[!nchar(s)%%3]),K),dim(K))[,3:1],,3,byrow=T)[,3:1]])

Provalo online!

I / O come stringhe; aggiunge uno spazio. La strana ripetizione di [,3:1]è perché l'indicizzazione dell'array naturale di R è leggermente diversa.


Dang, mi hai battuto di oltre 200 byte. Sono sempre impressionato dalla tua codifica, @Giuseppe. A volte non dovrei nemmeno preoccuparmi di provare
Sumner18 l'

1
@ Sumner18 bene grazie! Di solito provo a lasciar passare un giorno o due prima di rispondere alle sfide poiché so che ci sono molti altri giocatori di golf R qui ora, ma non ho potuto resistere a questo da quando l'ho visto nella Sandbox. Sei sempre il benvenuto a farci rimbalzare le idee per giocare a golf nella chat room R golf . :-)
Giuseppe,

3
@ Sumner18 anche non c'è da vergognarsi nel provare e venire breve, la mia prima presentazione qui è stata orribile e sono solo migliorato! Per favore continua a pubblicare, penso che sia sempre bello ricevere feedback in modo da poter migliorare :-)
Giuseppe,

3

APL + WIN, 102 byte

⎕av[n[c⍳(⊂[2]((⍴t),3)⍴,⍉⊃(c←⊂[2]c,(,⍉9 3⍴c←9/⍳3),[1.1]27⍴⍳3)[(⎕av[n←(97+⍳26),33])⍳t←t,(3|⍴t←⎕)↓' '])]]

Spiegazione:

t←t,(3|⍴t←⎕)↓' ' Prompts for input and applies coprime condition

(⎕av[n←(97+⍳26),33]⍳ Indices of characters in APL atomic vector 

c←⊂[2]c,(,⍉9 3⍴c←9/⍳3),[1.1]27⍴⍳3) Create a matrix of table, row column for 27 characters

⊂[2]((⍴t),3)⍴,⍉⊃ Extract columns of c corresponding to input and re-order

c⍳ Identify Column indices of re-ordered columns

⎕av[.....] Use indices back in atomic vector to give enciphered text  

Esempio di schermata del test case:

⎕av[n[c⍳(⊂[2]((⍴t),3)⍴,⍉⊃(c←⊂[2]c,(,⍉9 3⍴c←9/⍳3),[1.1]27⍴⍳3)[(⎕av[n←(97+⍳26),33])⍳t←t,(3|⍴t←⎕)↓' '])]]
⎕:
'output'
rrvgivx  

Ti dispiacerebbe aggiungere uno screenshot di (uno o più dei) casi di test? So che la versione APL di WIN non è disponibile su TIO, ma mi piacerebbe comunque vedere una sorta di verifica, dal momento che a malapena so come interpretare il codice APL semplicemente leggendolo, figuriamoci verificarlo senza eseguirlo. :)
Kevin Cruijssen l'

Non sono sicuro di come farlo, ma questo è come sarebbe. Aggiungerò qualcosa alla voce sopra
Graham

Normalmente posso usare Dyalog Classic in TIO ma in questo caso il suo vettore atomico è in un ordine diverso, quindi l'indicizzazione non funzionerà.
Graham,

3

SAS, 305 byte

Un 'oof' abbondante per questa mostruosità SAS. Ci sono molte formattazioni casuali di stringhe che ho pensato di poter evitare di affrontare questo; Sono sicuro che ci sono modi migliori per farlo.

data;input n:&$99.;n=tranwrd(trim(n)," ","{");if mod(length(n),3)=0then n=cats(n,'{');f=n;l=length(n);array a(999);do i=1to l;v=rank(substr(n,i,1))-97;a{i}=int(v/9);a{i+l}=mod(int(v/3),3);a{i+l*2}=mod(v,3);end;f='';do i=1to l*3by 3;f=cats(f,byte(a{i}*9+a{i+1}*3+a{i+2}+97));end;f=tranwrd(f,"{"," ");cards;

L'inserimento viene inserito nelle nuove righe dopo la dichiarazione delle carte, in questo modo:

data;input n:&$99.;n=tranwrd(trim(n)," ","{");if mod(length(n),3)=0then n=cats(n,'{');f=n;l=length(n);array a(999);do i=1to l;v=rank(substr(n,i,1))-97;a{i}=int(v/9);a{i+l}=mod(int(v/3),3);a{i+l*2}=mod(v,3);end;f='';do i=1to l*3by 3;f=cats(f,byte(a{i}*9+a{i+1}*3+a{i+2}+97));end;f=tranwrd(f,"{"," ");cards;
this is a trifid cipher
test
output
trifidcipher

Emette un set di dati contenente l'output nella variabile f, insieme a un gruppo di variabili helper / valori di array.

inserisci qui la descrizione dell'immagine

Ungolfed / spiegazione:

data;
input n : & $99.; /* Read a line of input, maximum 99 characters */

n=tranwrd(trim(n)," ","{"); /* Replace spaces with '{' (this is the ASCII character following 'z', so it makes it easy to do byte conversions, and lets us not have to deal with spaces, which SAS does not like) */
if mod(length(n),3)=0then n=cats(n,'{'); /* If length of n is not coprime with 3, add an extra "space" to the end */

f=n; /* Set output = input, so that the string will have the same length */
l=length(n);    /* Get the length of the input */
array a(999);   /* Array of values to store intermediate results */

do i = 1 to l; /* For each character in the input... */
    v = rank(substr(n,i,1))-97; /* Get the value of the current character, from 0-26 */

    a{i}=int(v/9);          /* Get the table of the current character and store at appropriate index, from 0-2  */
    a{i+l}=mod(int(v/3),3); /* Get the row of the current character, from 0-2 */
    a{i+l*2}=mod(v,3);      /* Get the column of the current character, from 0-2  */
end;

f='';

do i = 1 to l*3 by 3; /* For each character in the output... */
    f=cats(f,byte(a{i}*9+a{i+1}*3+a{i+2}+97)); /* Convert values back from base 3 to base 10, and convert back into ASCII value */
end;

f = tranwrd(f,"{"," "); /* Replaces our "spaces" with actual spaces for final output */

/* Test cases */
cards;
this is a trifid cipher
test
output
trifidcipher

3

JavaScript (Node.js) ,  146 141 139  136 byte

L'I / O è in minuscolo.

s=>'931'.replace(/./g,d=>Buffer(s.length%3?s:s+0).map(c=>(o=(c>48?c-16:26)/d%3+o*3%27|0,++i)%3?0:(o+97)%123||32),i=o=0).split`\0`.join``

Provalo online!

Commentate

s =>                       // s = input string
  '931'.replace(/./g, d => // for each digit d = 9, 3 and 1:
    Buffer(                //   create a buffer from:
      s.length % 3 ?       //     if the length of s is coprime with 3:
        s                  //       the original input string
      :                    //     else:
        s + 0              //       the input string + an extra '0'
    )                      //
    .map(c =>              //   for each ASCII code c from this Buffer:
      ( o =                //     update o:
        ( c > 48 ?         //       if c is neither a space nor the extra '0':
            c - 16         //         yield c - 16 (which gives 81 .. 106)
          :                //       else:
            26             //         this is the 26th character (space)
        ) / d % 3 +        //       divide by d and apply modulo 3
        o * 3 % 27 | 0,    //       add o * 3, apply modulo 27, coerce to integer
        ++i                //       increment i
      ) % 3 ?              //     if i mod 3 is not equal to 0:
        0                  //       yield 0 (NUL character)
      :                    //     else:
        (o + 97) % 123     //       convert o to the ASCII code of the output letter
        || 32              //       or force 32 (space) for the 26th character
    ),                     //   end of map()
    i = o = 0              //   start with i = o = 0
  ).split`\0`.join``       // end of replace(); remove the NUL characters

Penso che tu l'abbia spiegato una volta prima, ma come (o=...,++i)%3funziona di nuovo in JS? È (o,i)una tupla o qualcosa del genere, e entrambi interi interni sono convertiti al loro modulo-3? Come sviluppatore Java, mi confonde ancora un po 'da vedere (a,b)%c. Bella risposta però! Mi piace come converti ogni terza cifra e quindi rimuovi i primi due byte null. +1 da me.
Kevin Cruijssen,

2
@KevinCruijssen Citando MDN : "L'operatore virgola valuta ciascuno dei suoi operandi (da sinistra a destra) e restituisce il valore dell'ultimo operando. " Quindi, il modulo viene applicato solo a ++i.
Arnauld,

3

05AB1E , 25 byte

g3Öð׫SAð«3L3㩇ø˜3ô®Að«‡

Dato che nessuno ha ancora pubblicato una risposta 05AB1E, ho pensato di pubblicare la mia soluzione. Vedo che ora è molto simile a @ Dennis ♦ 'Jelly risponde , anche se l'ho inventato indipendentemente prima di pubblicare la sfida.

Input come stringa, output come un elenco di caratteri. Aggiunge uno spazio se la lunghezza è divisibile per 3.

Provalo online o verifica tutti i casi di test .

Spiegazione:

g3Ö         # Check if the length of the (implicit) input is divisible by 3
            # (results in 1 for truthy or 0 for falsey)
            #  i.e. "out" → 1
            #  i.e. "test" → 0
   ð×       # Repeat a space that many times
            #  i.e. 1 → " "
            #  i.e. 0 → ""
     «      # And append it to the (implicit) input
            #  i.e. "out" and " " → "out "
            #  i.e. "test" and "" → "test"
      S     # Then make the string a list of characters
            #  i.e. "out " → ["o","u","t"," "]
            #  i.e. "test" → ["t","e","s","t"]
A           # Push the lowercase alphabet
 ð«         # Appended with a space ("abcdefghijklmnopqrstuvwxyz ")
   3L       # Push list [1,2,3]
     3ã     # Cartesian repeated 3 times: [[1,1,1],[1,1,2],...,[3,3,2],[3,3,3]]
       ©    # Save that list of triplets in the registry (without popping)
           # Transliterate, mapping the letters or space to the triplet at the same index
            #  i.e. ["o","u","t"," "] → [[2,2,3],[3,1,3],[3,1,2],[3,3,3]]
            #  i.e. ["t","e","s","t"] → [[3,1,2],[1,2,2],[3,1,1],[3,1,2]]
ø           # Zip, swapping all rows/columns
            #  i.e. [[2,2,3],[3,1,3],[3,1,2],[3,3,3]] → [[2,3,3,3],[2,1,1,3],[3,3,2,3]]
            #  i.e. [[3,1,2],[1,2,2],[3,1,1],[3,1,2]] → [[3,1,3,3],[1,2,1,1],[2,2,1,2]]
 ˜          # Flatten the list
            #  i.e. [[2,3,3,3],[2,1,1,3],[3,3,2,3]] → [2,3,3,3,2,1,1,3,3,3,2,3]
            #  i.e. [[3,1,3,3],[1,2,1,1],[2,2,1,2]] → [3,1,3,3,1,2,1,1,2,2,1,2]
  3ô        # Split it into parts of size 3
            #  i.e. [2,3,3,3,2,1,1,3,3,3,2,3] → [[2,3,3],[3,2,1],[1,3,3],[3,2,3]]
            #  i.e. [3,1,3,3,1,2,1,1,2,2,1,2] → [[3,1,3],[3,1,2],[1,1,2],[2,1,2]]
®           # Push the triplets from the registry again
 Að«        # Push the lowercase alphabet appended with a space again
           # Transliterate again, mapping the triplets back to letters (or a space)
            # (and output the result implicitly)
            #  i.e. [[2,3,3],[3,2,1],[1,3,3],[3,2,3]] → ["r","v","i","x"]
            #  i.e. [[3,1,3],[3,1,2],[1,1,2],[2,1,2]] → ["u","t","b","k"]

3

Japt , 42 byte

;Êv3 ?UpS:U
m!bS=iC)®+27 ì3 ÅÃÕc ò3 £SgXì3

Provalo online!

Il nucleo di questa risposta deriva da una risposta cancellata da Shaggy, ma non è mai tornato per gestire input di lunghezza divisibili per 3, quindi questo è un versione fissa .

Spiegazione:

;                                 #Set C to the string "abcdefghijklmnopqrstuvwxyz"

 Ê                                #Get the length of the input
  v3 ?                            #If it is divisible by 3:
      UpS                         # Add a space
         :U                       #Otherwise don't add a space
                                  #Store the result in U

   S=iC)                          #Set S to C plus a space
m                                 #For each character in U:
 !bS                              # Get the position of that character in S
        ®        Ã                #For each resulting index:
             ì3                   # Convert to base 3
         +27    Å                 # Including leading 0s up to 3 places
                  Õ               #Transpose rows and columns
                   c              #Flatten
                     ò3           #Cut into segments of length 3
                        £         #For each segment:
                           Xì3    # Read it as a base 3 number
                         Sg       # Get the letter from S with that index

3

C # (compilatore interattivo Visual C #) , 178 byte

s=>{int[]a={9,3,1},b=(s.Length%3>0?s:s+0).Select(c=>c<97?26:c-97).ToArray();s="";for(int i=0,k,l=b.Length;i<l*3;s+=(char)(k>25?32:97+k))k=a.Sum(p=>b[i%l]/a[i++/l]%3*p);return s;}

Provalo online!

Meno golf ... È ancora confuso :)

// s is an input string
s=>{
  // powers of 3
  int[]a={9,3,1},
  // ensure the length of s is coprime to 3
  // and convert to numbers from 0-26
  b=(s.Length%3>0?s:s+0).Select(c=>c<97?26:c-97).ToArray();
  // reset s to collect result
  s="";
  // main loop
  for(
    // i is the main index variable
    // k is the value of the encoded character
    // l is the length
    int i=0,k,l=b.Length;
    // i continues until it is 3x the length of the string
    i<l*3;
    // convert k to a character and append
    s+=(char)(k>25?32:97+k)
  )
    // compute the trifid
    // (this is the confusing part :)
    k=a.Sum(p=>b[i%l]/a[i++/l]%3*p);
  // return the result
  return s;
}
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.