Chiffre trifide (sans mot-clé)

19

Introduction:

J'ai des tas de chiffrements différents stockés dans un document que j'ai compilé quand j'étais enfant, j'ai choisi quelques-uns de ceux que je pensais être les mieux adaptés aux défis (pas trop triviaux et pas trop difficiles) et les ai transformés en défis. La plupart d'entre eux sont toujours dans le bac à sable, et je ne sais pas encore si je vais tous les poster, ou seulement quelques-uns. Voici le deuxième (le chiffre informatique a été le premier que j'ai publié).


Pour le chiffre Trifid (sans utiliser de mot clé), l'alphabet (et un caractère générique supplémentaire) est divisé en trois tableaux 3 par 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 texte que nous voulons chiffrer est le premier caractère par caractère codé en nombres table-ligne-colonne. Par exemple, le texte this is a trifid cipherdevient:

        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

Nous avons ensuite tout rangé par rang dans le tableau ci-dessus par groupes de trois:

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

Et ceux-ci sont transformés en caractères en utilisant les mêmes tables:

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

Une chose à noter, la longueur d'entrée doit être coprime à 3. Donc, si la longueur est un multiple de 3, nous ajoutons un ou deux espaces de fin pour que la longueur d'entrée ne soit plus un multiple de 3.

Défi:

Étant donné une chaîne sentence_to_encipher, chiffrez-la comme décrit ci-dessus.

Vous n'avez qu'à chiffrer étant donné le sentence_to_encipher, donc pas besoin de créer de programme / fonction de déchiffrement également. Cependant, je pourrais faire un défi de partie 2 pour le déchiffrement à l'avenir (même si j'ai le sentiment que c'est trop trivial / similaire au processus de chiffrement).

Règles du défi:

  • Vous pouvez supposer que le sentence_to_enciphertestament ne contiendra que des lettres et des espaces.
  • Vous pouvez utiliser des minuscules ou des majuscules (veuillez indiquer celui que vous avez utilisé dans votre réponse).
  • Vous pouvez choisir d'ajouter un ou deux espaces de fin lorsque la longueur d'entrée est 3 pour ne plus en faire un multiple de 3.
  • Les E / S sont flexibles. L'entrée et la sortie peuvent être une chaîne, une liste / un tableau / un flux de caractères, etc.

Règles générales:

  • C'est le , donc la réponse la plus courte en octets l'emporte.
    Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues autres que le golf de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation.
  • Des règles standard s'appliquent à votre réponse avec des règles d'E / S par défaut , vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
  • Les failles par défaut sont interdites.
  • Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
  • De plus, l'ajout d'une explication à votre réponse est fortement recommandé.

Cas de 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)
Kevin Cruijssen
la source
3
J'ai lu cela comme "sans clavier ". Cela allait être un délicieux défi!
Cort Ammon - Rétablir Monica
1
Pourquoi la longueur de l'entrée devrait-elle être coprime à 3? Je ne vois pas en quoi cela compte ici.
Fund Monica's Lawsuit
L'exigence de coprime n'est pas nécessaire pour faire fonctionner le chiffrement, mais elle le rend très légèrement plus sûr en s'assurant que les groupes de trois chiffres ne seront pas alignés avec les divisions de ligne de la liste de chiffres initiale.
Sparr
@NicHartley Vous avez en effet raison de dire que même si l'entrée est divisible par 3, vous pouvez toujours transposer le tableau. Au départ, je n'avais pas cette règle dans le bac à sable, mais quelqu'un m'a dit que Wikipedia pour Trifid montre qu'il devrait ajouter un ou deux espaces pour rendre le chiffrement légèrement plus sécurisé. Je l'ai donc ajouté dans le cadre du défi, et pour le rendre plus synchronisé avec la page Wikipedia (à l'exception du mot-clé que j'ai supprimé).
Kevin Cruijssen
1
@KevinCruijssen Je ... ne vois vraiment pas comment cela le rendrait plus sécurisé (si quoi que ce soit, forcer l'entrée à ne pas être d'une certaine longueur la rendrait moins sûre, car vous pourriez deviner que le dernier caractère est en train d'encoder un espace) mais je suis d'accord que garder la description du chiffre ici en ligne avec Wikipedia est une bonne idée. Merci d'avoir expliqué!
Fund Monica's Lawsuit

Réponses:

6

Gelée , 29 26 25 octets

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

Essayez-le en ligne!

Comment ça fonctionne

⁶Ø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
la source
Je ne connais jamais les règles concernant les sorties d'effets secondaires ... mais l'arrangement ;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸ypeut supprimer le µsi c'est acceptable pour 24.
Jonathan Allan
Nous avons un faible consensus ( + 6 / -1 ) sur ce qui est autorisé, alors merci!
Dennis
La sortie semble incorrecte. Je ne pense pas que l'espace ajouté "colle".
Dennis
6

Fusain , 39 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

≔               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
la source
6

Python 2 , 180 176 174 174 165 163 octets

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

Essayez-le en ligne!

L'entrée peut être supérieure ou inférieure. La sortie est en majuscule

TFeld
la source
6

Pyth, 34 33 octets

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

Programme complet. L'entrée est attendue en minuscules, la sortie est un tableau de caractères. Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .

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

Solution alternative à 34 octets: sm@+G;id3csCm.[03jx+G;d3+W!%lz3zd3- plutôt que +27 et queue, utilise un .[03pad avec 0 à la longueur 3. Peut être 33 si l'interligne sest supprimé.

Modifier: enregistré un octet en supprimant l'interlignage scar les tableaux de caractères sont une sortie valide

Sok
la source
5

Rubis , 153 145 138 131 131 octets

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

Essayez-le en ligne!

Une approche rapide et naïve, fonctionne avec du texte en minuscules. Entrées et sorties tableaux de caractères.

Kirill L.
la source
4

Java (JDK) , 192 octets

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

Essayez-le en ligne!

Approche très naïve. Prend une minuscule char[]en entrée mais sort a String.

Explications

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
}

Crédits

Olivier Grégoire
la source
1
Deux petits golfs: Integer.valueOfvers Byte.valueOfet R+=c<26?(char)(c+97):' ';versR+=(char)(c<26?c+97:32);
Kevin Cruijssen
1
202 octets
Kevin Cruijssen
4

R , 145 octets

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

Essayez-le en ligne!

E / S sous forme de chaînes; ajoute un espace. La répétition étrange de [,3:1]est parce que l'indexation de tableau naturel de R est quelque peu différente.

Giuseppe
la source
Dang, tu m'as battu de plus de 200 octets. Je suis toujours impressionné par votre codage, @Giuseppe. Je ne devrais même pas prendre la peine d'essayer parfois
Sumner18
1
@ Sumner18 bien merci! J'essaie généralement de laisser passer un jour ou deux avant de relever des défis car je sais qu'il y a beaucoup d'autres golfeurs R ici maintenant, mais je n'ai pas pu résister à celui-ci depuis que je l'ai vu dans le bac à sable. Vous êtes toujours les bienvenus pour échanger des idées pour nous de jouer au golf dans la R chatroom de golf . :-)
Giuseppe
3
@ Sumner18 aussi il n'y a pas de honte à essayer et à faire court, ma première soumission ici était horrible et je ne fais que m'améliorer! Veuillez continuer à poster, je pense qu'il est toujours bon d'obtenir des commentaires afin que vous puissiez vous améliorer :-)
Giuseppe
3

APL + WIN, 102 octets

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

Explication:

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  

Exemple de capture d'écran du scénario de test:

⎕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
la source
Pourriez-vous ajouter une capture d'écran (d'un ou de plusieurs) des cas de test? Je sais que la version WIN APL n'est pas disponible sur TIO, mais j'aimerais toujours voir une sorte de vérification, car je sais à peine comment interpréter le code APL en le lisant, sans parler de le vérifier sans l'exécuter. :)
Kevin Cruijssen
Je ne sais pas trop comment faire cela, mais voici à quoi cela ressemblerait. J'ajouterai quelque chose à l'entrée ci
Graham
Normalement, je peux utiliser Dyalog Classic dans TIO mais dans ce cas, son vecteur atomique est dans un ordre différent, donc l'indexation ne fonctionnera pas.
Graham
3

SAS, 305 octets

Un «oof» copieux pour cette monstruosité SAS. Il y a beaucoup de formatages de chaînes aléatoires que je pensais pouvoir éviter d'entrer dans ceci; Je suis sûr qu'il existe de meilleures façons de le faire.

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;

La saisie est entrée sur les nouvelles lignes après le relevé des cartes, comme ceci:

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

Génère un ensemble de données contenant la sortie dans la variable f, ainsi qu'un ensemble de variables d'aide / valeurs de tableau.

entrez la description de l'image ici

Non golfé / explication:

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
la source
3

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

Les E / S sont en minuscules.

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

Essayez-le en ligne!

Commenté

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
la source
Je pense que vous l'avez déjà expliqué, mais comment (o=...,++i)%3fonctionne à nouveau JS? Est-ce (o,i)un tuple ou quelque chose, et les deux entiers internes sont convertis en leur modulo-3? En tant que développeur Java, cela me rend encore un peu confus (a,b)%c. Belle réponse cependant! J'aime la façon dont vous convertissez tous les trois chiffres, puis supprimez les deux premiers octets nuls. +1 de moi.
Kevin Cruijssen
2
@KevinCruijssen Citant MDN : "L'opérateur virgule évalue chacun de ses opérandes (de gauche à droite) et renvoie la valeur du dernier opérande. " Ainsi, le modulo n'est appliqué qu'à ++i.
Arnauld
3

05AB1E , 25 octets

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

Comme personne n'a encore posté de réponse 05AB1E, j'ai pensé publier ma propre solution. Je vois maintenant que c'est très similaire à la réponse Jelly de @ Dennis ♦ , même si je l'ai trouvée indépendamment avant de poster le défi.

Entrée sous forme de chaîne, sortie sous forme de liste de caractères. Ajoute un espace si la longueur est divisible par 3.

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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
la source
3

Japt , 42 octets

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

Essayez-le en ligne!

Le cœur de cette réponse provient d'une réponse supprimée par Shaggy, mais il n'est jamais revenu pour gérer des entrées de longueur divisible par 3, il s'agit donc d'une version fixe .

Explication:

;                                 #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
la source
3

C # (compilateur interactif Visual C #) , 178 octets

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

Essayez-le en ligne!

Moins de golf ... C'est toujours déroutant :)

// 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
la source