Trifid Cipher (ไม่มีคีย์เวิร์ด)


19

บทนำ:

ฉันมียันต์ต่าง ๆ มากมายที่เก็บไว้ในเอกสารที่ฉันเคยรวบรวมเมื่อตอนเป็นเด็กฉันเลือกบางอย่างที่ฉันคิดว่าเหมาะสมที่สุดสำหรับความท้าทาย ส่วนใหญ่ยังอยู่ในกล่องทรายและฉันยังไม่แน่ใจว่าฉันจะโพสต์พวกเขาทั้งหมดหรือเพียงไม่กี่ นี่คืออันที่สอง (รหัสคอมพิวเตอร์เป็นอันแรกที่ฉันโพสต์)


สำหรับTrifid Cipher (โดยไม่ต้องใช้คำสำคัญ) ตัวอักษร (และไวด์การ์ดเพิ่มเติม) จะถูกแบ่งออกเป็นสาม 3 โดย 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

สิ่งหนึ่งที่ควรทราบความยาวอินพุตควรเป็น coprime ถึง 3 ดังนั้นหากความยาวคือหลายเท่าของ 3 เราจะผนวกช่องว่างต่อท้ายหนึ่งหรือสองช่องเพื่อทำให้ความยาวอินพุตไม่เท่ากับ 3 อีกต่อไป

ท้าทาย:

รับสตริงsentence_to_encipherเข้ารหัสตามที่อธิบายไว้ข้างต้น

คุณต้องเข้ารหัสsentence_to_encipherเท่านั้นดังนั้นไม่จำเป็นต้องสร้างโปรแกรม / ฟังก์ชันถอดรหัสอีกด้วย ฉันอาจจะทำการท้าทายส่วนที่ 2 สำหรับการถอดรหัสในอนาคตอย่างไรก็ตาม (แม้ว่าฉันจะรู้สึกว่ามันไม่สำคัญ / คล้ายกับกระบวนการเข้ารหัส)

กฏท้าทาย:

  • คุณสามารถสันนิษฐานได้ว่าsentence_to_encipherจะมีเพียงตัวอักษรและช่องว่าง
  • คุณสามารถใช้ตัวพิมพ์เล็กเต็มหรือตัวพิมพ์ใหญ่เต็มรูปแบบ (โปรดระบุว่าคุณใช้ตัวใดในคำตอบของคุณ)
  • คุณสามารถเลือกที่จะผนวกช่องว่างต่อท้ายหนึ่งหรือสองต่อท้ายเมื่อความยาวอินพุตเท่ากับ 3 เพื่อทำให้ไม่เป็น 3 เท่าของอีกต่อไป
  • I / O ยืดหยุ่นได้ ทั้งอินพุตและเอาต์พุตสามารถเป็นสตริงรายการ / อาร์เรย์ / สตรีมของอักขระเป็นต้น

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาที่ใช้รหัสกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ codegolfing พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานใช้สำหรับคำตอบของคุณด้วยกฎ 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 - Reinstate Monica

1
ทำไมความยาวของอินพุตควรเป็น coprime ถึง 3 ฉันไม่เห็นว่าสิ่งที่สำคัญที่นี่
คดีของกองทุนโมนิกา

ข้อกำหนด coprime ไม่จำเป็นต้องทำให้รหัสทำงาน แต่มันทำให้มีความปลอดภัยมากขึ้นเล็กน้อยโดยการทำให้แน่ใจว่ากลุ่มตัวเลขสามหลักจะไม่สอดคล้องกับส่วนของแถวของรายการหลักเริ่มต้น
Sparr

@NicHartley คุณพูดถูกจริง ๆ ถึงแม้ว่าข้อมูลจะถูกหารด้วย 3 คุณก็ยังสามารถเปลี่ยนตารางได้ ตอนแรกฉันไม่ได้มีกฎนั้นใน Sandbox แต่มีคนบอกฉันว่า Wikipedia สำหรับ Trifid แสดงให้เห็นว่าควรเพิ่มช่องว่างหนึ่งหรือสองช่องเพื่อให้การเข้ารหัสปลอดภัยขึ้นเล็กน้อย ดังนั้นฉันจึงเพิ่มมันเป็นส่วนหนึ่งของความท้าทายและเพื่อให้สอดคล้องกับหน้า Wikipedia (นอกเหนือจากคำหลักที่ฉันลบ)
Kevin Cruijssen

1
@KevinCruijssen I ... จริงๆไม่เห็นว่ามันจะทำให้ปลอดภัยมากขึ้น (ถ้ามีอะไรที่บังคับให้อินพุตไม่ความยาวแน่นอนจะทำให้มันปลอดภัยน้อยลงเพราะคุณเดาได้ว่าตัวอักษรตัวสุดท้ายกำลังเข้ารหัส เว้นวรรค) แต่ฉันเห็นด้วยว่าการเก็บคำอธิบายตัวเลขไว้ที่นี่ตาม Wikipedia เป็นความคิดที่ดี ขอบคุณที่อธิบาย!
คดีฟ้องร้องกองทุนโมนิก้า

คำตอบ:


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.

ฉันไม่เคยรู้กฎเกี่ยวกับผลข้างเคียงที่เกิดขึ้น ... แต่การจัดเรียง;L3ḍƊ¡⁶µ⁶Øa;3ṗ¤,ðṚyZFs3⁸yสามารถทำได้ด้วยµหากเป็นที่ยอมรับใน 24.
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

Python 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 และส่วนท้ายใช้.[03ในการรองด้วยความยาว 0 ถึง 3 สามารถเป็น 33 หากนำหน้าsตก

แก้ไข: บันทึกไบต์ด้วยการดรอปนำหน้า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

Java (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[]เป็น input 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.valueOfไปByte.valueOfและR+=c<26?(char)(c+97):' ';กลับR+=(char)(c<26?c+97:32);
Kevin 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]นั้นเป็นเพราะการจัดทำดัชนีอาเรย์ตามธรรมชาตินั้นแตกต่างกันบ้าง


แดงคุณเอาชนะฉันไปมากกว่า 200 ไบต์ ฉันประทับใจในการเข้ารหัสของคุณ @Giuseppe เสมอ บางครั้งฉันก็ไม่ควรที่จะลองด้วย
ซ้ำ

1
@ Sumner18 ขอบคุณมาก! ฉันมักจะพยายามปล่อยให้หนึ่งหรือสองวันก่อนที่จะตอบคำถามท้าทายเนื่องจากฉันรู้ว่ามีนักกอล์ฟ R คนอื่น ๆ มากมายที่นี่ตอนนี้ แต่ฉันไม่สามารถต้านทานได้เนื่องจากฉันเห็นมันใน Sandbox คุณยินดีต้อนรับเสมอกับความคิดตีกลับสำหรับการเล่นกอล์ฟออกเราในเนต R เล่นกอล์ฟ :-)
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 โดยเพียงแค่อ่านมัน :)
Kevin Cruijssen

ไม่แน่ใจว่าจะทำอย่างไร แต่นี่คือสิ่งที่มันจะมีลักษณะ ฉันจะเพิ่มบางอย่างในรายการด้านบน
เกรแฮม

โดยปกติฉันสามารถใช้ Dyalog Classic ใน TIO แต่ในกรณีนี้เวกเตอร์อะตอมของมันอยู่ในลำดับที่แตกต่างกันดังนั้นการทำดัชนีจะไม่ทำงาน
เกรแฮม

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

ส่งออกชุดข้อมูลที่มีการส่งออกในตัวแปรfพร้อมกับพวงของตัวแปรตัวช่วย / ค่าอาร์เรย์

ป้อนคำอธิบายรูปภาพที่นี่

/ คำอธิบาย Ungolfed:

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 ไบต์

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)%3ทำงานใน JS อีกครั้งได้อย่างไร คือ(o,i)สิ่งอันดับหรืออะไรบางอย่างและจำนวนเต็มทั้งภายในจะถูกแปลงเป็นโมดูโล-3 ของพวกเขา? ในฐานะที่เป็นนักพัฒนา Java (a,b)%cก็ยังคงสร้างความสับสนให้ฉันบิตเพื่อดู คำตอบที่ดีแม้ว่า! ฉันชอบวิธีที่คุณแปลงทุก ๆ สามหลักแล้วลบสอง null-bytes แรก +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

Japt , 42 ไบต์

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

ลองออนไลน์!

หลักของคำตอบนี้มาจากคำตอบที่ถูกลบโดยปุย แต่เขาไม่เคยกลับมาในการจัดการปัจจัยการผลิตที่มีความยาวหารด้วย 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 # Interactive คอมไพเลอร์) , 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;}

ลองออนไลน์!

golfed น้อย ... มันยังสับสนอยู่ :)

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