Trifid Cipher (키워드 제외)


19

소개:

나는 한때 어렸을 때 컴파일 된 문서에 다양한 암호가 저장되어 있으며, 도전에 가장 적합하다고 생각되는 몇 가지를 선택했습니다 (너무 사소하지 않고 어렵지 않음). 대부분은 여전히 ​​샌드 박스에 있으며, 모두 게시할지 또는 일부만 게시할지 확실하지 않습니다. 다음은 두 번째 것입니다 ( 컴퓨터 암호 는 내가 게시 한 첫 번째 것입니다).


를 들어 삼열 암호 알파벳 (키워드를 사용하지 않고) (및 추가 와일드 카드) 세 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  

우리가 암호화하고자하는 텍스트는 테이블 행 열 번호로 인코딩 된 첫 문자입니다. 예를 들어, 텍스트 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

그런 다음 위의 표에서 세 개씩 그룹으로 모든 항목을 하나씩 차례로 배치합니다.

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

그리고 같은 테이블을 사용하여 문자로 다시 변환됩니다.

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

한 가지 주목할 점은 입력 길이는 3의 공통점이되어야합니다. 따라서 길이가 3의 배수 인 경우 입력 길이가 3의 배수가 아닌 하나 또는 두 개의 후행 공백을 추가합니다.

도전:

문자열이 주어지면 sentence_to_encipher위에서 설명한 것처럼 암호화하십시오.

당신은 주어진 sentence_to_encipher암호를 해독해야하므로 해독 프로그램 / 기능을 만들 필요가 없습니다. 그러나 나는 미래에 해독에 대해 2 부 도전을 할 수 있습니다 (암호화 과정과 사소한 / 유사한 느낌이 들지만).

도전 규칙 :

  • 당신은 sentence_to_encipher문자와 공백만을 포함 한다고 가정 할 수 있습니다 .
  • 소문자 또는 대문자를 사용할 수 있습니다 (답변에 사용한 것을 적어주십시오).
  • 입력 길이가 3 일 때 하나 또는 두 개의 후행 공백을 추가하여 더 이상 3의 배수가되지 않도록 선택할 수 있습니다.
  • I / O는 유연합니다. 입력과 출력 모두 문자열, 목록 / 배열 / 문자 스트림 등이 될 수 있습니다.

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하지 마십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙기본 I / O 규칙으로 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트와 함께 링크를 추가하십시오 (예 : TIO ) .
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

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
" 키보드 없이"라고 읽습니다 . 그것은 즐거운 도전이 될 것입니다!
Cort Ammon-복원 모니카

1
입력 길이가 3의 코 프라임이어야하는 이유는 무엇입니까? 나는 그것이 어떻게 중요한지 알지 못한다.
Fund Monica의 소송

coprime 요구 사항은 암호 작업을 수행하는 데 필요하지 않지만 세 자리 그룹이 초기 자리 목록의 행 구분과 일치하지 않도록하여 좀 더 안전합니다.
Sparr

@NicHartley 실제로 입력 값을 3으로 나눌 수 있어도 테이블을 조옮김 할 수 있습니다. 처음에는 샌드 박스에서 그 규칙을 사용하지 않았지만 누군가 Trifid 용 Wikipedia에 암호화를 약간 더 안전하게하기 위해 한두 개의 공백을 추가해야한다고 나에게 말했습니다. 그래서 나는 그것을 도전의 일부로 추가하고 Wikipedia 페이지 (제거한 키워드 제외)와 더 동기화되도록했습니다.
Kevin Cruijssen

1
@KevinCruijssen 나는 ... 정말 할 것없는 일정한 길이로 입력을 강요, 그게 더 안전 (어떤 경우 만들 것이라고 표시되지 않습니다 마지막 문자가를 인코딩되는 것을 추측 수 있기 때문에, 보안 space) 그러나 Wikipedia와 함께 여기에 암호 설명을 유지하는 것이 좋습니다. 설명해 주셔서 감사합니다!
Fund Monica의 소송 22.58.

답변:


6

젤리 , 29 26 25 바이트

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

온라인으로 사용해보십시오!

작동 원리

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

부작용 출력에 대한 규칙을 결코 알지 못하지만 24 일 수용 가능한 경우에는 그 배치를 제거 ;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸y할 수 있습니다 µ.
Jonathan Allan

우리는 이것이 허용 되는 약한 합의 ( + 6 / -1 )를 가지고 있습니다. 감사합니다!
Dennis

출력이 올바르지 않은 것 같습니다. 추가 된 공간이 "스틱"이라고 생각하지 않습니다.
Dennis

6

, 39 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔               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

파이썬 (2) , 180 (176) 174 165 163 바이트

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

온라인으로 사용해보십시오!

입력은 위 또는 아래 일 수 있습니다. 출력은 대문자


6

Pyth, 34 33 바이트

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

전체 프로그램. 입력은 소문자로 예상되며 출력은 문자 배열입니다. 여기 에서 온라인으로 시도 하거나 모든 테스트 사례를 한 번에 확인 하십시오 .

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

대안 34 바이트 솔루션 : sm@+G;id3csCm.[03jx+G;d3+W!%lz3zd3-+ 27 및 꼬리 대신 .[030에서 길이 3 s까지 채 웁니다. 행간 을 삭제 하면 33이 될 수 있습니다 .

편집 : s문자 배열이 유효한 출력으로 선행 을 삭제하여 바이트를 저장했습니다.


5

루비 , 153 145 138 131 바이트

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

온라인으로 사용해보십시오!

빠르고 순진한 접근 방식은 소문자 텍스트와 함께 작동합니다. 문자 배열을 입력 및 출력합니다.


4

자바 (JDK) 192 바이트

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

온라인으로 사용해보십시오!

매우 순진한 접근 방식. 소문자를 사용합니다char[] 를 입력으로 사용하지만 a를 출력합니다 String.

설명

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
}

크레딧


1
두 개의 작은 골프를 친다 : Integer.valueOfByte.valueOfR+=c<26?(char)(c+97):' ';R+=(char)(c<26?c+97:32);
케빈 Cruijssen


4

R , 145 바이트

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

온라인으로 사용해보십시오!

문자열로서의 I / O; 하나의 공백을 추가합니다. 이상한 반복은 [,3:1]R의 자연 배열 인덱싱이 다소 다르기 때문입니다.


덩, 너는 200 바이트 이상 나를 때렸다. @Giuseppe의 코딩에 항상 감동합니다. 난 가끔 시도 귀찮게 안
Sumner18

1
@ Sumner18 잘 감사합니다! 나는 보통 여기에 다른 많은 R 골퍼가 있다는 것을 알고 있기 때문에 도전에 대답하기 전에 하루나 이틀을 보내려고 노력하지만 샌드 박스에서 그것을 본 후에는 이것을 막을 수 없었습니다. 당신은 항상 R golfing chatroom 에서 우리에게 골프를 치기위한 아이디어를 되 찾을 수 있습니다. :-)
Giuseppe

3
@ Sumner18도 노력하고 부끄러워하는 데 부끄러움이 없습니다. 첫 번째 제출은 끔찍했으며 더 좋아졌습니다! 계속해서 글을 올리십시오. 피드백을받는 것이 항상 좋은 것 같아서 개선 할 수 있습니다 :-)
Giuseppe

3

APL + WIN, 102 바이트

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

설명:

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  

테스트 케이스의 스크린 샷 예 :

⎕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  

테스트 사례의 스크린 샷을 추가 하시겠습니까? WIN APL 버전은 TIO에서 사용할 수 없다는 것을 알고 있지만 APL 코드를 해석하여 실행하지 않고 확인하는 것만으로 APL 코드를 해석하는 방법을 거의 알지 못하기 때문에 여전히 일종의 확인을 원합니다. :)
Kevin Cruijssen

어떻게 해야할지 확실하지 않지만 이것이 어떻게 보일 것입니다. 위 항목에 추가하겠습니다
Graham

일반적으로 TIO에서 Dyalog Classic을 사용할 수 있지만이 경우 원자 벡터의 순서가 다르므로 인덱싱이 작동하지 않습니다.
Graham

3

SAS, 305 바이트

이 SAS 괴물에 대한 진지한 '발언'. 내가이 문제를 피할 수 있다고 생각되는 임의의 문자열 형식이 많이 있습니다. 이 중 일부를 수행하는 더 좋은 방법이 있다고 확신합니다.

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;

다음과 같이 카드 명세서 다음에 줄 바꿈에 입력이 입력됩니다.

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

fhelper 변수 / 배열 값과 함께 variable 출력을 포함하는 데이터 세트를 출력 합니다.

여기에 이미지 설명을 입력하십시오

언 골프 / 설명 :

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

자바 스크립트 (Node.js를) ,  146 (141) 139  136 바이트

I / O는 소문자입니다.

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

온라인으로 사용해보십시오!

댓글

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

이전에 한 번 설명했지만 (o=...,++i)%3JS에서 다시 작동 하는 방법은 무엇입니까? 가 (o,i)튜플 또는 무언가는 모두 내부 정수는 자신의 모듈로-3로 변환? Java 개발자로서 여전히 혼란 스럽습니다 (a,b)%c. 그래도 좋은 답변입니다! 세 번째 숫자를 모두 변환 한 다음 처음 두 개의 null 바이트를 제거하는 방법이 마음에 듭니다. 나에게서 +1
Kevin Cruijssen

2
@KevinCruijssen Quoting MDN : "쉼표 연산자는 각 피연산자 (왼쪽에서 오른쪽으로)를 평가하고 마지막 피연산자 값을 반환합니다. "따라서 모듈로만 적용됩니다 ++i.
Arnauld

3

05AB1E , 25 바이트

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

아무도 05AB1E 답변을 아직 게시하지 않았기 때문에 내 솔루션을 게시한다고 생각했습니다. 이제는 @ Dennis ♦ 와 매우 유사합니다. '젤리 답변 도전을 게시하기 전에 독립적으로 생각해 냈지만 .

문자열로 입력하고 문자 목록으로 출력합니다. 길이를 3으로 나눌 수 있으면 하나의 공백을 추가합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

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

apt , 42 바이트

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

온라인으로 사용해보십시오!

이 답변의 핵심은 Shaggy의 삭제 된 답변에서 비롯되었지만 길이가 3으로 나눌 수있는 입력을 처리하기 위해 다시 돌아 오지 않았습니다. 고정 버전 입니다.

설명:

;                                 #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 # 대화식 컴파일러) , 178 바이트

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

온라인으로 사용해보십시오!

덜 골프 ... 여전히 혼란 스럽습니다 :)

// 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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.