Mật mã Trifid (không có từ khóa)


19

Giới thiệu:

Tôi có vô số mật mã khác nhau được lưu trữ trong một tài liệu tôi từng biên soạn khi còn bé, tôi đã chọn một vài trong số những mật mã mà tôi nghĩ là phù hợp nhất cho các thử thách (không quá tầm thường và không quá khó) và biến chúng thành thử thách. Hầu hết trong số họ vẫn còn trong hộp cát, và tôi không chắc liệu tôi sẽ đăng tất cả chúng hay chỉ một vài. Đây là cái thứ hai ( Mật mã máy tính là cái đầu tiên tôi đăng).


Đối với Mật mã Trifid (không sử dụng từ khóa), bảng chữ cái (và ký tự đại diện bổ sung) được chia thành ba 3 cho 3 bảng:

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  

Một văn bản chúng tôi muốn mã hóa là ký tự đầu tiên theo ký tự được mã hóa thành các số cột-hàng-cột. Ví dụ: văn bản this is a trifid ciphertrở thành:

        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

Sau đó, chúng tôi đặt mọi thứ sau một hàng khác trong bảng ở trên trong nhóm ba:

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

Và chúng được chuyển trở lại thành các ký tự bằng cách sử dụng cùng một bảng:

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

Một điều cần lưu ý, độ dài đầu vào phải là số nguyên tố bằng 3. Vì vậy, nếu độ dài là bội số của 3, chúng ta sẽ thêm một hoặc hai khoảng trắng ở cuối để làm cho độ dài đầu vào không phải là bội số 3 nữa.

Thử thách:

Cho một chuỗi sentence_to_encipher , mã hóa nó như mô tả ở trên.

Bạn chỉ phải mã hóa cho sentence_to_encipher , vì vậy không cần phải tạo chương trình / chức năng giải mã. Tuy nhiên, tôi có thể thực hiện thử thách phần 2 cho việc giải mã trong tương lai (mặc dù tôi có cảm giác nó không quan trọng / tương tự như quá trình mã hóa).

Quy tắc thử thách:

  • Bạn có thể giả sử sentence_to_encipher chúc chỉ chứa các chữ cái và dấu cách.
  • Bạn có thể sử dụng cả chữ thường hoặc chữ hoa đầy đủ (vui lòng cho biết cái nào bạn đã sử dụng trong câu trả lời của mình).
  • Bạn có thể chọn nối thêm một hoặc hai dấu cách khi độ dài đầu vào là 3 để làm cho nó không còn là bội số của 3 nữa.
  • I / O là linh hoạt. Cả đầu vào và đầu ra có thể là một chuỗi, danh sách / mảng / luồng ký tự, v.v.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ: TIO ).
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

Các trường hợp thử nghiệm:

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
Tôi đọc nó là "không có bàn phím ". Đó sẽ là một thử thách thú vị!
Cort Ammon - Phục hồi Monica

1
Tại sao độ dài của đầu vào phải là số nguyên tố đến 3? Tôi không thấy vấn đề ở đây như thế nào.
Vụ kiện của Quỹ Monica

Yêu cầu đồng thời không cần thiết để làm cho mật mã hoạt động, nhưng nó làm cho nó an toàn hơn một chút bằng cách đảm bảo các nhóm ba chữ số sẽ không khớp với các phân chia hàng của danh sách chữ số ban đầu.
Sparr

@NicHartley Bạn thực sự đúng rằng ngay cả khi đầu vào chia hết cho 3, bạn vẫn có thể hoán chuyển bảng. Ban đầu tôi không có quy tắc đó trong Sandbox, nhưng ai đó đã nói với tôi Wikipedia cho Trifid cho thấy nó nên thêm một hoặc hai khoảng trắng để mã hóa an toàn hơn một chút. Vì vậy, tôi đã thêm nó như một phần của thử thách và để làm cho nó đồng bộ hơn với trang Wikipedia (ngoài Từ khóa mà tôi đã xóa).
Kevin Cruijssen

1
@KevinCruijssen Tôi ... thực sự không thấy cách nào làm cho nó an toàn hơn (nếu có bất cứ điều gì, buộc đầu vào không có độ dài nhất định sẽ làm cho nó kém an toàn hơn , vì bạn có thể đoán rằng ký tự cuối cùng đang mã hóa một không gian) nhưng tôi đồng ý rằng việc giữ mô tả mật mã ở đây phù hợp với Wikipedia là một ý tưởng tốt. Cảm ơn vì đã giải thích!
Vụ kiện của Quỹ Monica

Câu trả lời:


6

Thạch , 29 26 25 byte

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Tôi không bao giờ biết các quy tắc về đầu ra hiệu ứng phụ ... nhưng sự sắp xếp ;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸ycó thể loại bỏ µnếu nó được chấp nhận cho 24.
Jonathan Allan

Chúng tôi có sự đồng thuận yếu ( + 6 / -1 ) rằng điều này được cho phép, vì vậy cảm ơn!
Dennis

Đầu ra dường như không chính xác. Tôi không nghĩ rằng "gậy" không gian được nối thêm.
Dennis

6

Than , 39 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Giải trình:

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

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

6

Python 2 , 180 176 174 165 163 byte

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

Hãy thử trực tuyến!

Đầu vào có thể là trên hoặc dưới. Đầu ra là chữ hoa


6

Pyth, 34 33 byte

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

Chương trình đầy đủ. Đầu vào được dự kiến ​​là chữ thường, đầu ra là một mảng ký tự. Dùng thử trực tuyến tại đây hoặc xác minh tất cả các trường hợp thử nghiệm cùng một lúc tại đây .

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

Giải pháp thay thế 34 byte: sm@+G;id3csCm.[03jx+G;d3+W!%lz3zd3- thay vì +27 và đuôi, sử dụng .[03để đệm với 0 đến chiều dài 3. Có thể là 33 nếu hàng đầu sbị bỏ.

Chỉnh sửa: đã lưu một byte bằng cách thả hàng đầu svì mảng ký tự là đầu ra hợp lệ


5

Ruby , 153 145 138 131 byte

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

Hãy thử trực tuyến!

Một cách tiếp cận nhanh chóng và ngây thơ, làm việc với văn bản chữ thường. Đầu vào và đầu ra mảng các ký tự.


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

Hãy thử trực tuyến!

Cách tiếp cận rất ngây thơ. Lấy chữ thường char[]làm đầu vào nhưng đầu ra a String.

Giải thích

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
}

Tín dụng


1
Hai Integer.valueOfByte.valueOfR+=c<26?(char)(c+97):' ';R+=(char)(c<26?c+97:32);
sân golf


4

R , 145 byte

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

Hãy thử trực tuyến!

I / O dưới dạng chuỗi; thêm một không gian. Sự lặp lại kỳ lạ [,3:1]là bởi vì lập chỉ mục mảng tự nhiên của R có phần khác nhau.


Dang, bạn đánh tôi hơn 200 byte. Tôi luôn bị ấn tượng bởi mã hóa của bạn, @Giuseppe. Thậm chí đôi khi tôi không muốn thử
Sumner18

1
@ Sumner18 cũng cảm ơn! Tôi thường cố gắng để một hoặc hai ngày trôi qua trước khi trả lời các thử thách vì tôi biết có rất nhiều người chơi gôn R khác ở đây, nhưng tôi không thể cưỡng lại điều này kể từ khi tôi nhìn thấy nó trong Sandbox. Bạn luôn được chào đón để tung lên ý tưởng cho chơi golf tắt chúng trong chatroom R chơi golf . :-)
Giuseppe

3
@ Sumner18 cũng không có gì xấu hổ khi cố gắng và sắp tới, lần gửi đầu tiên của tôi ở đây thật kinh khủng và tôi chỉ trở nên tốt hơn! Hãy tiếp tục đăng bài, tôi nghĩ việc nhận phản hồi luôn tốt để bạn có thể cải thiện :-)
Giuseppe

3

APL + THẮNG, 102 byte

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

Giải trình:

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  

Ví dụ về ảnh chụp màn hình của trường hợp thử nghiệm:

⎕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  

Bạn có phiền khi thêm một ảnh chụp màn hình của (một hoặc nhiều) trường hợp thử nghiệm không? Tôi biết phiên bản WIN APL không có sẵn trên TIO, nhưng tôi vẫn muốn xem một số loại xác minh, vì tôi hầu như không biết cách diễn giải mã APL bằng cách chỉ đọc nó, chứ đừng nói đến việc xác minh nó mà không cần chạy. :)
Kevin Cruijssen

Không hoàn toàn chắc chắn làm thế nào để làm điều đó nhưng đây là những gì nó sẽ trông như thế nào. Tôi sẽ thêm một cái gì đó để vào ở trên
Graham

Thông thường tôi có thể sử dụng Dyalog Classic trong TIO nhưng trong trường hợp này, vectơ nguyên tử của nó theo một thứ tự khác nên việc lập chỉ mục sẽ không hoạt động.
Graham

3

SAS, 305 byte

Một 'oof' nồng nhiệt cho sự quái dị của SAS này. Có rất nhiều định dạng chuỗi ngẫu nhiên mà tôi nghĩ rằng tôi có thể tránh đi sâu vào vấn đề này; Tôi chắc chắn có nhiều cách tốt hơn để làm một số điều này.

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;

Đầu vào được nhập vào dòng mới sau câu lệnh thẻ, như vậy:

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

Xuất ra một tập dữ liệu chứa đầu ra trong biến f, cùng với một loạt các biến / giá trị mảng của trình trợ giúp.

nhập mô tả hình ảnh ở đây

Ungolfed / giải thích:

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

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

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

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

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

f='';

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

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

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

3

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

I / O là chữ thường.

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

Hãy thử trực tuyến!

Đã bình luận

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

Tôi nghĩ rằng bạn đã giải thích nó một lần trước đây, nhưng làm thế nào để (o=...,++i)%3làm việc lại trong JS? Là (o,i)một tuple hoặc một cái gì đó, và cả hai số nguyên bên trong được chuyển đổi thành modulo-3 của chúng? Là một nhà phát triển Java, nó vẫn khiến tôi bối rối một chút để xem (a,b)%c. Câu trả lời tốt đẹp mặc dù! Tôi thích cách bạn chuyển đổi mỗi chữ số thứ ba, và sau đó loại bỏ hai byte đầu tiên. +1 từ tôi.
Kevin Cruijssen

2
@KevinCruijssen Trích dẫn MDN : "Toán tử dấu phẩy đánh giá từng toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng cuối cùng. " Vì vậy, modulo chỉ được áp dụng cho ++i.
Arnauld

3

05AB1E , 25 byte

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

Vì chưa có ai đăng câu trả lời 05AB1E, tôi nghĩ rằng tôi sẽ đăng giải pháp của riêng mình. Tôi thấy bây giờ nó rất giống với câu trả lời Jelly của @ Dennis ♦ , mặc dù tôi đã tự mình nghĩ ra nó trước khi tôi đăng thử thách.

Nhập dưới dạng chuỗi, xuất dưới dạng danh sách các ký tự. Thêm một khoảng trắng nếu chiều dài chia hết cho 3.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

3

Japt , 42 byte

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

Hãy thử trực tuyến!

Cốt lõi của câu trả lời này đến từ một câu trả lời đã bị xóa bởi Shaggy, nhưng anh ta không bao giờ quay lại để xử lý các đầu vào có độ dài chia hết cho 3 nên đây là phiên bản cố định .

Giải trình:

;                                 #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 # (Trình biên dịch tương tác Visual C #) , 178 byte

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

Hãy thử trực tuyến!

Ít chơi gôn hơn ... Nó vẫn khó hiểu :)

// 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.