Üç Boğumlu Şifre (anahtar kelime olmadan)


19

Giriş:

Bir zamanlar çocukken derlediğim bir belgede saklanan birçok farklı şifrem var, zorluklar için en uygun olduğunu düşündüğüm birkaç tanesini (çok önemsiz ve çok zor değil) seçtim ve onları zorluklara dönüştürdüm. Birçoğu hala sanal alanda ve hepsini mi göndereceğimi henüz bilmiyorum, ya da sadece birkaçı. İşte ikincisi ( Bilgisayar Şifresi ilk gönderdiğim oydu).


İçin Trifid şifre alfabe (anahtar kullanmadan) (ve, ek Joker) üç 3 3 tarafından tablolardan ayrılır:

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  

Şifrelemek istediğimiz bir metin, tablo-satır-sütun sayılarına kodlanan ilk karakter karakterdir. Örneğin, metin 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

Daha sonra her şeyi arka arkaya yukarıdaki tabloda üç kişilik gruplar halinde koyduk:

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

Ve bunlar aynı tabloları kullanarak karakterlere geri dönüştürülür:

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

Dikkat edilmesi gereken bir şey, giriş uzunluğu 3 ile eş zamanlı olmalıdır. Dolayısıyla, uzunluk 3'ün katlarıysa, giriş uzunluğunu artık 3 değil, bir veya iki arka boşluk ekleriz.

Meydan okuma:

Bir dize verildi sentence_to_encipher , yukarıda açıklandığı gibi şifreleyin.

Sadece sentence_to_encipher gerekir, bu yüzden deşifre programı / fonksiyonu oluşturmak gerek. Gelecekte deşifre için bir bölüm 2 meydan okuma yapabilirim (ancak şifreleme sürecine önemsiz / benzer olduğunu hissediyorum).

Zorluk kuralları:

  • Varsayabilirsin sentence_to_encipher yalnızca harf ve boşluk içerdiğini .
  • Tam küçük harf veya tam büyük harf kullanabilirsiniz (lütfen yanıtınızda hangisini kullandığınızı belirtin).
  • Giriş uzunluğu 3 olduğunda artık bir veya iki arka boşluk eklemeyi seçebilirsiniz.
  • G / Ç esnektir. Hem giriş hem de çıkış bir dize, liste / dizi / karakter akışı vb. Olabilir.

Genel kurallar:

  • Bu , bayt en kısa cevap kazanır.
    Kod golf dillerinin, kod yazmayan dillerle yanıt göndermenizi engellemesine izin vermeyin. 'Herhangi bir' programlama dili için olabildiğince kısa bir cevap bulmaya çalışın.
  • Varsayılan I / O kuralları ile cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem, uygun parametreler ve dönüş tipi, tam programlar ile kullanılabilir. Çağrınız.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için bir test içeren bir bağlantı ekleyin (örn. TIO) ).
  • Ayrıca, cevabınız için bir açıklama eklemeniz şiddetle tavsiye edilir.

Test senaryoları:

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
Bunu " klavyesiz " olarak okudum . Bu keyifli bir meydan okuma olacaktı!
Cort Ammon - Monica'yı eski

1
Girişin uzunluğu neden 3'e eşit olmalı? Bunun nasıl bir şey olduğunu anlamıyorum.
Monica'nın Davası

Şifrenin çalışması için coprime gereksinimi gerekli değildir, ancak üç basamaklı grupların ilk basamak listesinin satır bölümleriyle hizalanmamasını sağlayarak çok daha güvenli hale getirir.
Sparr

@NicHartley Giriş 3'e bölünebilse bile yine de tabloyu devredebileceğinizden haklısınız. Başlangıçta Sandbox'ta bu kurala sahip değildim, ancak birisi bana Trifid için Wikipedia'nın şifrelemeyi biraz daha güvenli hale getirmek için bir veya iki boşluk eklemesi gerektiğini söyledi. Bu yüzden bunu meydan okumanın bir parçası olarak ekledim ve Wikipedia sayfasıyla (kaldırdığım Anahtar Kelime dışında) daha senkronize hale getirmek için ekledim.
Kevin Cruijssen

1
@KevinCruijssen Ben ... bunun nasıl daha güvenli hale getireceğini gerçekten görmüyorum (eğer herhangi bir şey, girdiyi belirli bir uzunlukta olmaya zorlamak, daha az güvenli hale getirecektir , çünkü son karakterin bir ancak şifre açıklamasını Wikipedia ile uyumlu tutmanın iyi bir fikir olduğunu kabul ediyorum. Açıkladığınız için teşekkürler!
Monica'nın Davası

Yanıtlar:


6

Jöle , 29 26 25 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

⁶Ø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.

Yan etki çıktıları ile ilgili kuralları asla bilmiyorum ... ama düzenleme 24 için kabul edilebilirse ;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸yortadan kaldırabilirµ
Jonathan Allan

Buna izin verilen zayıf bir fikir birliği var ( + 6 / -1 ), bu yüzden teşekkürler!
Dennis

Çıktı yanlış görünüyor. Ben eklenen alan "sopa" sanmıyorum.
Dennis

6

Kömür , 39 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

≔               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

Piton 2 , 180 176 174 165 163 bayt

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

Çevrimiçi deneyin!

Giriş üst veya alt olabilir. Çıktı büyük harf


6

Pyth, 34 33 bayt

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

Tam program. Girdi küçük harf, çıktı bir karakter dizisidir. Buradan çevrimiçi olarak deneyin veya tüm test senaryolarını burada bir kerede doğrulayın .

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

Alternatif 34 bayt çözeltisi: sm@+G;id3csCm.[03jx+G;d3+W!%lz3zd3- +27 ve kuyruk yerine, .[030 ila uzunluk 3 arasında ped kullanır s. Önde gelen düşürülürse 33 olabilir .

Düzenleme: sKarakter dizileri geçerli çıktı olduğundan satır başını bırakarak bir bayt kaydetti


5

Yakut , 153 145 138 131 bayt

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

Çevrimiçi deneyin!

Hızlı ve naif bir yaklaşım, küçük harflerle çalışır. Girdiler ve çıktılar karakter dizileri.


4

Java (JDK) , 192 bayt

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

Çevrimiçi deneyin!

Çok saf bir yaklaşım. char[]Giriş olarak küçük harf alır , ancak çıkış a String.

açıklamalar

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
}

Kredi


1
İki küçük çoraplar: Integer.valueOfetmek Byte.valueOfve R+=c<26?(char)(c+97):' ';karşıR+=(char)(c<26?c+97:32);
Kevin Cruijssen


4

R , 145 bayt

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

Çevrimiçi deneyin!

Dizeler olarak G / Ç; bir boşluk ekler. Tuhaf tekrarı, [,3:1]R'nin doğal dizi indekslemesinin biraz farklı olmasıdır.


Dang, beni 200 byte aştın. Kodlamadan hep etkilendim, @Giuseppe. Bazen
denemekten

1
@ Sumner18 teşekkürler! Genellikle burada bir sürü R golfçüsü olduğunu bildiğim için zorlukları cevaplamadan önce bir veya iki gün geçmeye çalışıyorum, ancak Sandbox'ta gördüğümden beri buna dayanamadım. R golfing sohbet odasında bizi golf oynamak için fikirleri her zaman zıplayabilirsiniz . :-)
Giuseppe

3
@ Sumner18 de denemek ve kısa gelmek için utanç yok, buradaki ilk sunum korkunçtu ve sadece daha iyi oldum! Lütfen göndermeye devam edin, bence geri bildirim almanın her zaman iyi olduğunu düşünüyorum böylece :-)
Giuseppe

3

APL + WIN, 102 bayt

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

Açıklama:

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  

Test senaryosunun ekran görüntüsü örneği:

⎕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  

Test senaryolarının (bir veya daha fazla) ekran görüntüsünü eklemeyi düşünür müsünüz? WIN APL sürümünün TIO'da mevcut olmadığını biliyorum, ancak hala bir tür doğrulama görmek istiyorum, çünkü APL kodunu sadece okuyarak nasıl yorumlayacağımı bilmiyorum, sadece çalıştırmadan doğrulama yapalım. :)
Kevin Cruijssen

Bunu nasıl yapacağınızdan tam olarak emin değilim ama bu böyle görünecektir. Yukarıdaki girişe bir şey ekleyeceğim
Graham

Normalde TIO'da Dyalog Classic'i kullanabilirim, ancak bu durumda atom vektörü farklı bir sıradadır, bu nedenle indeksleme çalışmaz.
Graham

3

SAS, 305 bayt

Bu SAS canavarlığı için doyurucu bir 'oof'. Buna girmekten kaçınabileceğimi düşündüğüm bir sürü rastgele dize biçimlendirme var; Eminim bunlardan bazılarını yapmanın daha iyi yolları vardır.

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;

Giriş, kartlar ifadesinden sonra yeni satırlara şu şekilde girilir, şöyle:

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

fBir grup yardımcı değişken / dizi değeriyle birlikte , değişken içindeki çıktıyı içeren bir veri kümesi çıktılar .

resim açıklamasını buraya girin

Ungolfed / açıklama:

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 bayt

G / Ç küçük harflidir.

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

Çevrimiçi deneyin!

Yorumlananlar

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

Sanırım daha önce bir kez açıklamıştınız, ama (o=...,++i)%3JS'de tekrar nasıl çalışıyor? (o,i)Bir tuple falan mıdır ve her iki iç tamsayı da modulo-3'e dönüştürülür mü? Bir Java geliştiricisi olarak, hala görmek beni biraz karıştırıyor (a,b)%c. Güzel cevap olsa! Her üçüncü basamağı nasıl dönüştürdüğünüzü ve ardından ilk iki boş baytın nasıl kaldırıldığını seviyorum. Benden +1.
Kevin Cruijssen

2
@KevinCruijssen Alıntı MDN : "Virgül operatörü her bir işlenenini değerlendirir (soldan sağa) ve son işlenenin değerini döndürür. " Yani, modulo sadece uygulanır ++i.
Arnauld

3

05AB1E , 25 bayt

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

Henüz kimse 05AB1E cevabı göndermediğinden, kendi çözümümü yayınlayacağımı düşündüm. Şimdi görüyorum ki @ Dennis ♦ 'Jelly cevabı , meydan okumadan önce bağımsız olarak gelmeme rağmen.

Karakter dizisi olarak, karakter listesi olarak çıktı olarak girin. Uzunluk 3 ile bölünebilirse bir boşluk ekler.

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Bu cevabın özü, Shaggy tarafından silinen bir cevaptan geliyor, ancak 3'e bölünemeyen uzunluk girişlerini işlemek için geri dönmedi, bu yüzden bu bir sabit bir versiyon .

Açıklama:

;                                 #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 # (Visual C # Etkileşimli Derleyici) , 178 bayt

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

Çevrimiçi deneyin!

Daha az golf ... Hala kafa karıştırıcı :)

// 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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.