Trifid Cipher (bez słowa kluczowego)

19

Wprowadzenie:

Mam mnóstwo różnych szyfrów przechowywanych w dokumencie, który kiedyś skompilowałem jako dziecko, wybrałem kilka z tych, które moim zdaniem najlepiej nadawały się na wyzwania (niezbyt trywialne i niezbyt trudne) i przekształciłem je w wyzwania. Większość z nich wciąż znajduje się w piaskownicy i nie jestem jeszcze pewien, czy opublikuję je wszystkie, czy tylko kilka. Oto drugi ( Szyfr komputerowy był pierwszym, który opublikowałem).


W przypadku szyfru Trifid (bez użycia słowa kluczowego) alfabet (i dodatkowa karta zastępcza) jest podzielona na trzy tabele 3 na 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  

Tekst, który chcemy zaszyfrować, jest pierwszym znakiem po znaku zakodowanym w numerach tabeli-wiersza-kolumny. Na przykład tekst this is a trifid cipherstaje się:

        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

Następnie umieszczamy wszystko po sobie wiersz po wierszu w powyższej tabeli w grupach po trzy:

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

A te są przekształcane z powrotem w postaci przy użyciu tych samych tabel:

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

Należy zauważyć, że długość wejściowa powinna być coprime do 3. Więc jeśli długość jest wielokrotnością 3, dodajemy jedną lub dwie końcowe spacje, aby długość wejściowa nie była wielokrotnością 3.

Wyzwanie:

Biorąc pod uwagę ciąg sentence_to_encipher, szyfruj go jak opisano powyżej.

Musisz tylko wyszyfrować dane sentence_to_encipher, więc nie ma potrzeby tworzenia programu / funkcji odszyfrowującej. Mogę jednak w przyszłości podjąć wyzwanie z części 2 dla odszyfrowania (chociaż mam wrażenie, że jest to trywialne / podobne do procesu szyfrowania).

Zasady konkursu:

  • Możesz założyć, że sentence_to_encipherbędą zawierać tylko litery i spacje.
  • Możesz użyć zarówno wielkich, jak i wielkich liter (podaj, którego użyłeś w odpowiedzi).
  • Możesz dodać jedną lub dwie spacje końcowe, gdy długość wejściowa wynosi 3, aby nie była już wielokrotnością 3.
  • I / O jest elastyczny. Zarówno dane wejściowe, jak i wyjściowe mogą być łańcuchem, listą / tablicą / strumieniem znaków itp.

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki gry w golfa zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania.
  • Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
  • Zalecane jest również dodanie wyjaśnienia do odpowiedzi.

Przypadki testowe:

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)
Kevin Cruijssen
źródło
3
Przeczytałem to jako „bez klawiatury ”. To będzie wspaniałe wyzwanie!
Cort Ammon - Przywróć Monikę
1
Dlaczego długość wejścia powinna być coprime na 3? Nie rozumiem, jak to się tutaj liczy.
Pozew Fund Moniki z
Wymóg coprime nie jest konieczny, aby szyfr działał, ale czyni go nieco bardziej bezpiecznym, zapewniając, że grupy trzech cyfr nie będą zgadzały się z podziałami wierszy na liście pierwszych cyfr.
Sparr
@NicHartley Rzeczywiście masz rację, że nawet jeśli dane wejściowe są podzielne przez 3, nadal możesz transponować tabelę. Początkowo nie miałem tej reguły w Piaskownicy, ale ktoś powiedział mi, że Wikipedia dla Trifid pokazuje, że należy dodać jedno lub dwa spacje, aby szyfrowanie było nieco bardziej bezpieczne. Dodałem go więc jako część wyzwania i aby zsynchronizować go ze stroną Wikipedii (oprócz słowa kluczowego, które usunąłem).
Kevin Cruijssen,
1
@KevinCruijssen I ... naprawdę nie rozumiem, jak to uczyniłoby to bezpieczniejszym (jeśli cokolwiek, wymuszenie, by dane wejściowe nie były określonej długości, uczyniłoby to mniej bezpiecznym, ponieważ można się domyślić, że ostatni znak koduje spacja), ale zgadzam się, że utrzymanie opisu szyfru zgodnego z Wikipedią to dobry pomysł. Dzięki za wyjaśnienie!
Pozew funduszu Moniki z

Odpowiedzi:

6

Galaretka , 29 26 25 bajtów

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

Wypróbuj online!

Jak to działa

⁶Ø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.
Dennis
źródło
Nigdy nie znam zasad dotyczących efektów ubocznych ... ale porozumienie ;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸ymoże znieść, µjeśli jest to dopuszczalne dla 24.
Jonathan Allan,
Mamy słaby konsensus ( + 6 / -1 ), że jest to dozwolone, więc dziękuję!
Dennis,
Dane wyjściowe wydają się nieprawidłowe. Nie sądzę, aby dołączona przestrzeń „przylgnęła”.
Dennis
6

Węgiel drzewny , 39 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

≔               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
Neil
źródło
6

Python 2 , 180 176 174 165 163 bajtów

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

Wypróbuj online!

Dane wejściowe mogą być wyższe lub niższe. Dane wyjściowe są pisane wielkimi literami

TFeld
źródło
6

Pyth, 34 33 bajty

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

Pełny program Dane wejściowe są oczekiwane jako małe litery, dane wyjściowe to tablica znaków. Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .

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

Alternatywne rozwiązanie 34-bajtowe: sm@+G;id3csCm.[03jx+G;d3+W!%lz3zd3- zamiast +27 i ogona, używa .[03padu z 0 do długości 3. Może wynosić 33, jeśli supuszczenie prowadzi.

Edycja: zapisano bajt, usuwając wiodące, sponieważ tablice znaków są prawidłowymi danymi wyjściowymi

Sok
źródło
5

Rubin , 153 145 138 131 bajtów

->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}}

Wypróbuj online!

Szybkie i naiwne podejście, działa z małym tekstem. Tablice wejściowe i wyjściowe znaków.

Kirill L.
źródło
4

Java (JDK) , 192 bajty

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;}

Wypróbuj online!

Bardzo naiwne podejście. Bierze małą literę char[]jako dane wejściowe, ale zwraca a String.

Objaśnienia

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
}

Kredyty

Olivier Grégoire
źródło
1
Dwa małe golfa: Integer.valueOfdo Byte.valueOfi R+=c<26?(char)(c+97):' ';doR+=(char)(c<26?c+97:32);
Kevin Cruijssen
1
202 bajty
Kevin Cruijssen,
4

R , 145 bajtów

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]])

Wypróbuj online!

I / O jako ciągi; dodaje jedną spację. Dziwne powtarzanie [,3:1]polega na tym, że naturalne indeksowanie tablic R jest nieco inne.

Giuseppe
źródło
Dang, pobiłeś mnie o ponad 200 bajtów. Zawsze jestem pod wrażeniem twojego kodowania, @Giuseppe. Czasami nie powinienem nawet zawracać sobie głowy próbą
Sumner18,
1
@ Sumner18 dobrze, dziękuję! Zwykle staram się przepuścić dzień lub dwa, zanim odpowiem na wyzwania, ponieważ wiem, że jest teraz wielu innych golfistów R, ale nie mogłem się oprzeć temu, odkąd zobaczyłem to w piaskownicy. Zawsze możesz wysyłać pomysły na grę w golfa w czacie R golfowym . :-)
Giuseppe,
3
@ Sumner18 też nie ma się czego wstydzić, próbując znaleźć się krótko, moje pierwsze zgłoszenie tutaj było okropne i tylko się poprawiłem! Kontynuuj pisanie, myślę, że zawsze dobrze jest uzyskać informację zwrotną, abyś mógł poprawić :-)
Giuseppe,
3

APL + WIN, 102 bajty

⎕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←⎕)↓' '])]]

Wyjaśnienie:

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  

Przykład zrzutu ekranu przypadku testowego:

⎕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  
Graham
źródło
Czy mógłbyś dodać zrzut ekranu (jednego lub wielu) przypadków testowych? Wiem, że wersja WIN APL nie jest dostępna w TIO, ale nadal chciałbym zobaczyć jakąś weryfikację, ponieważ ledwo wiem, jak interpretować kod APL, po prostu czytając go, a tym bardziej weryfikując go bez uruchamiania. :)
Kevin Cruijssen,
Nie jestem pewien, jak to zrobić, ale tak to by wyglądało. Dodam coś do powyższego wpisu
Graham
Zwykle mogę używać Dyalog Classic w TIO, ale w tym przypadku jego wektor atomowy jest w innej kolejności, więc indeksowanie nie będzie działać.
Graham
3

SAS, 305 bajtów

Serdeczne „oof” za potworność SAS. Istnieje wiele losowych formatowań ciągów, które, jak sądzę, mogę uniknąć. Jestem pewien, że są lepsze sposoby na zrobienie tego.

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;

Dane wejściowe są wprowadzane w znakach nowego wiersza po wyciągu z kart, podobnie jak:

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

Wysyła zestaw danych zawierający dane wyjściowe w zmiennej fwraz z grupą zmiennych pomocniczych / wartości tablicowych.

wprowadź opis zdjęcia tutaj

Nieskluczone / wyjaśnienie:

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
Josh Eller
źródło
3

JavaScript (Node.js) ,  146 141 139  136 bajtów

I / O jest pisane małymi literami.

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``

Wypróbuj online!

Skomentował

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
Arnauld
źródło
Myślę, że już raz to wyjaśniłeś, ale jak (o=...,++i)%3znów działa w JS? Czy (o,i)jest krotka czy coś, a obie wewnętrzne liczby całkowite są konwertowane na ich modulo-3? Jako programista Java nadal trochę mnie to myli (a,b)%c. Ładna odpowiedź! Podoba mi się, jak konwertujesz co trzecią cyfrę, a następnie usuwasz pierwsze dwa bajty zerowe. +1 ode mnie
Kevin Cruijssen,
2
@KevinCruijssen Cytując MDN : „Operator przecinka ocenia każdy ze swoich operandów (od lewej do prawej) i zwraca wartość ostatniego operandu. ” Zatem modulo ma zastosowanie tylko do ++i.
Arnauld,
3

05AB1E , 25 bajtów

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

Ponieważ nikt jeszcze nie opublikował odpowiedzi 05AB1E, pomyślałem, że opublikuję własne rozwiązanie. Widzę, że teraz jest bardzo podobna do odpowiedzi @ Dennis ♦ Jelly , mimo że wymyśliłem ją samodzielnie, zanim opublikowałem wyzwanie.

Dane wejściowe jako ciąg znaków, dane wyjściowe jako lista znaków. Dodaje jedną spację, jeśli długość dzieli się przez 3.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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"]
Kevin Cruijssen
źródło
3

Japt , 42 bajty

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

Wypróbuj online!

Rdzeń tej odpowiedzi pochodzi z usuniętej odpowiedzi Kudłaty, ale nigdy nie wrócił, aby poradzić sobie z danymi wejściowymi o długości podzielnej przez 3, więc jest to wersja stała .

Wyjaśnienie:

;                                 #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
Kamil Drakari
źródło
3

C # (interaktywny kompilator Visual C #) , 178 bajtów

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;}

Wypróbuj online!

Mniej gra w golfa ... To wciąż mylące :)

// 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;
}
dana
źródło