Trifid Cipher (ohne Schlüsselwort)

19

Einführung:

In einem Dokument, das ich als Kind zusammengestellt habe, sind viele verschiedene Chiffren gespeichert. Ich habe einige ausgewählt, die meiner Meinung nach am besten für Herausforderungen geeignet sind (nicht zu trivial und nicht zu schwierig), und sie in Herausforderungen umgewandelt. Die meisten von ihnen sind noch im Sandkasten und ich bin mir noch nicht sicher, ob ich sie alle oder nur einige veröffentlichen werde. Hier ist die zweite (die Computer-Chiffre war die erste, die ich veröffentlicht habe).


Bei der Trifid-Chiffre (ohne Verwendung eines Schlüsselworts) ist das Alphabet (und ein zusätzlicher Platzhalter) in drei 3 x 3-Tabellen unterteilt:

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  

Ein Text, den wir verschlüsseln möchten, besteht aus Zeichen für Zeichen, die in Tabellenzeilenspaltennummern verschlüsselt sind. Zum Beispiel wird der Text this is a trifid cipher:

        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

Dann setzen wir in der obigen Tabelle zeilenweise alles nacheinander in Dreiergruppen:

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

Und diese werden mithilfe derselben Tabellen wieder in Zeichen umgewandelt:

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

Zu beachten ist, dass die Eingabelänge gleich 3 sein sollte. Wenn die Länge also ein Vielfaches von 3 ist, fügen wir ein oder zwei nachgestellte Leerzeichen hinzu, um die Eingabelänge nicht mehr zu einem Vielfachen von 3 zu machen.

Herausforderung:

sentence_to_encipherVerschlüsseln Sie einen String wie oben beschrieben.

Sie müssen nur die angegebenen Daten verschlüsseln sentence_to_encipher, sodass Sie auch kein Entschlüsselungsprogramm / keine Entschlüsselungsfunktion erstellen müssen. Ich könnte jedoch in Zukunft eine Herausforderung für Teil 2 für die Entschlüsselung darstellen (obwohl ich das Gefühl habe, dass es zu trivial / ähnlich zum Verschlüsselungsprozess ist).

Herausforderungsregeln:

  • Sie können davon ausgehen, dass das sentence_to_enciphernur Buchstaben und Leerzeichen enthält.
  • Sie können entweder Kleinbuchstaben oder Großbuchstaben verwenden (bitte geben Sie an, welche Sie in Ihrer Antwort verwendet haben).
  • Sie können entweder ein oder zwei nachgestellte Leerzeichen anhängen, wenn die Eingabelänge 3 ist, damit es kein Vielfaches von 3 mehr ist.
  • I / O ist flexibel. Sowohl Eingabe als auch Ausgabe können eine Zeichenfolge, eine Liste / ein Array / ein Stream von Zeichen usw. sein.

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
  • Außerdem wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Testfälle:

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
quelle
3
Ich habe das als "ohne Tastatur " gelesen . Das würde eine wunderbare Herausforderung werden!
Cort Ammon - Reinstate Monica
1
Warum sollte die Länge der Eingabe gleich 3 sein? Ich verstehe nicht, wie wichtig das hier ist.
Fund Monica's Lawsuit
Die Coprime-Anforderung ist nicht erforderlich, um die Verschlüsselung zum Laufen zu bringen, macht sie jedoch etwas sicherer, indem sichergestellt wird, dass die Dreistellengruppen nicht mit den Zeilenteilen der anfänglichen Ziffernliste übereinstimmen.
Sparr
@NicHartley Sie haben in der Tat Recht, dass Sie die Tabelle auch dann transponieren können, wenn die Eingabe durch 3 teilbar ist. Ich hatte diese Regel anfangs nicht in der Sandbox, aber jemand sagte mir, dass die Wikipedia für Trifid zeigt, dass ein oder zwei Leerzeichen hinzugefügt werden sollten, um die Verschlüsselung etwas sicherer zu machen. Also habe ich es als Teil der Herausforderung hinzugefügt und es besser mit der Wikipedia-Seite synchronisiert (abgesehen von dem Keyword, das ich entfernt habe).
Kevin Cruijssen
1
@KevinCruijssen ich ... wirklich nicht sehen , wie dass es sicher mehr machen würde (wenn überhaupt etwas, zwang die Eingabe nicht von einer bestimmten Länge zu sein , würde es weniger sicher, da Sie das letzte Zeichen eine Encodieren erraten konnten Ich stimme jedoch zu, dass es eine gute Idee ist, die Chiffrenbeschreibung hier mit Wikipedia in Einklang zu bringen. Danke fürs Erklären!
Fund Monica Klage

Antworten:

6

Jelly , 29 26 25 Bytes

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

Probieren Sie es online!

Wie es funktioniert

⁶Ø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
quelle
Ich kenne die Regeln für Nebenwirkungen nie ... aber das Arrangement ;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸ykann das µ
Jonathan Allan
Wir haben einen schwachen Konsens ( + 6 / -1 ), dass dies erlaubt ist, also danke!
Dennis
Die Ausgabe scheint falsch zu sein. Ich denke nicht, dass das angehängte Leerzeichen "klebt".
Dennis
6

Kohle , 39 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

≔               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
quelle
6

Python 2 , 180 176 174 165 163 Bytes

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

Probieren Sie es online!

Die Eingabe kann oben oder unten erfolgen. Die Ausgabe erfolgt in Großbuchstaben

TFeld
quelle
6

Pyth, 34 33 Bytes

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

Volles Programm. Die Eingabe wird als Kleinbuchstabe erwartet, die Ausgabe ist ein Zeichenarray. Versuchen Sie es online hier , oder prüfen Sie alle Testfälle auf einmal hier .

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

Alternative 34-Byte-Lösung: sm@+G;id3csCm.[03jx+G;d3+W!%lz3zd3- anstelle von +27 und Tail wird .[03zum Auffüllen mit 0 bis Länge 3 verwendet. Kann 33 sein, wenn das Leading sweggelassen wird.

Bearbeiten: Ein Byte wurde durch Fallenlassen von führenden sZeichen gespeichert, da Zeichenarrays eine gültige Ausgabe sind

Sok
quelle
5

Ruby , 153 145 138 131 Bytes

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

Probieren Sie es online!

Ein schneller und naiver Ansatz, der mit Kleinbuchstaben arbeitet. Ein- und Ausgabe von Zeichenfeldern.

Kirill L.
quelle
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;}

Probieren Sie es online!

Sehr naiver Ansatz. Nimmt einen Kleinbuchstaben char[]als Eingabe, gibt aber a aus String.

Erklärungen

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
}

Credits

Olivier Grégoire
quelle
1
Zwei kleine Golfplätze: Integer.valueOfnach Byte.valueOfund R+=c<26?(char)(c+97):' ';nachR+=(char)(c<26?c+97:32);
Kevin Cruijssen
1
202 Bytes
Kevin Cruijssen
4

R , 145 Bytes

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

Probieren Sie es online!

I / O als Strings; fügt ein Leerzeichen hinzu. Die seltsame Wiederholung von [,3:1]liegt daran, dass die natürliche Array-Indizierung von R etwas anders ist.

Giuseppe
quelle
Verdammt, du hast mich um über 200 Bytes geschlagen. Ich bin immer beeindruckt von deiner Kodierung, @ Giuseppe. Manchmal sollte ich es gar nicht erst versuchen
Sumner18
1
@ Sumner18 na danke! Normalerweise versuche ich, ein oder zwei Tage zu verstreichen, bevor ich Herausforderungen beantworte, da ich weiß, dass es hier viele andere R-Golfer gibt, aber ich konnte diesem nicht widerstehen, da ich ihn in der Sandbox gesehen habe. Gerne können Sie im R-Golf-Chatroom Anregungen für das Golfen von uns geben . :-)
Giuseppe
3
@ Sumner18 auch es ist keine schande zu versuchen und zu kurz zu kommen, meine erste einreichung hier war schrecklich und ich bin nur besser geworden! Bitte weiterhin posten, ich denke, es ist immer gut, Feedback zu bekommen, damit Sie sich verbessern können :-)
Giuseppe
3

APL + WIN, 102 Bytes

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

Erläuterung:

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  

Beispiel eines Screenshots eines Testfalls:

⎕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
quelle
Würde es Ihnen etwas ausmachen, einen Screenshot (von einem oder mehreren) der Testfälle hinzuzufügen? Ich weiß, dass die WIN APL-Version auf TIO nicht verfügbar ist, aber ich würde trotzdem gerne eine Art Verifikation sehen, da ich kaum weiß, wie man APL-Code interpretiert, indem man ihn nur liest, geschweige denn verifiziert, ohne ihn auszuführen. :)
Kevin Cruijssen
Ich bin mir nicht ganz sicher, wie ich das machen soll, aber so würde es aussehen. Ich werde etwas zum obigen Eintrag hinzufügen
Graham
Normalerweise kann ich Dyalog Classic in TIO verwenden, aber in diesem Fall hat der Atomvektor eine andere Reihenfolge, sodass die Indizierung nicht funktioniert.
Graham
3

SAS, 305 Bytes

Ein herzliches "Oof" für diese SAS-Monstrosität. Es gibt eine Menge zufälliger String-Formatierungen, von denen ich dachte, dass ich sie vermeiden könnte. Ich bin mir sicher, dass es dafür bessere Möglichkeiten gibt.

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;

Die Eingabe erfolgt in Zeilenumbrüchen nach dem Kartenauszug wie folgt:

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

Gibt ein Dataset aus, das die Ausgabe in der Variablen fzusammen mit einer Reihe von Hilfsvariablen / Array-Werten enthält.

Bildbeschreibung hier eingeben

Ungolfed / Erklärung:

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
quelle
3

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

I / O ist in Kleinbuchstaben.

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

Probieren Sie es online!

Kommentiert

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
quelle
Ich denke, Sie haben es schon einmal erklärt, aber wie funktioniert es wieder (o=...,++i)%3in JS? Ist (o,i)ein Tupel oder so etwas und werden beide inneren Ganzzahlen in ihr Modulo-3 umgewandelt? Als Java-Entwickler verwirrt mich das immer noch ein bisschen (a,b)%c. Gute Antwort! Mir gefällt, wie Sie jede dritte Ziffer konvertieren und dann die ersten beiden Null-Bytes entfernen. +1 von mir.
Kevin Cruijssen
2
@KevinCruijssen MDN zitieren : "Der Kommaoperator wertet jeden seiner Operanden aus (von links nach rechts) und gibt den Wert des letzten Operanden zurück. " Das Modulo wird also nur auf angewendet ++i.
Arnauld
3

05AB1E , 25 Bytes

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

Da noch niemand eine 05AB1E-Antwort gepostet hat, dachte ich, ich würde meine eigene Lösung posten. Ich sehe jetzt, dass es @ Dennis ♦ 'Jelly-Antwort sehr ähnlich ist , obwohl ich es mir selbst ausgedacht habe, bevor ich die Herausforderung gepostet habe.

Eingabe als String, Ausgabe als Liste von Zeichen. Fügt ein Leerzeichen hinzu, wenn die Länge durch 3 teilbar ist.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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
quelle
3

Japt , 42 Bytes

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

Probieren Sie es online!

Der Kern dieser Antwort stammt aus einer gelöschten Antwort von Shaggy, aber er kam nie zurück, um Eingaben mit einer durch 3 teilbaren Länge zu verarbeiten, sodass dies eine feste Version ist .

Erläuterung:

;                                 #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
quelle
3

C # (Visual C # Interactive Compiler) , 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;}

Probieren Sie es online!

Weniger Golf ... Es ist immer noch verwirrend :)

// 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
quelle