ซีซาร์-Cypher-Mania


22

ซีซาร์ศูนย์เป็นศูนย์เปลี่ยนตัวง่ายมากที่ตัวอักษรแต่ละตัวจะเลื่อนโดยคงชดเชย (บ่วงรอบ Z ถึง A) ในทำนองเดียวกันเรายังสามารถ Caesar Cypher สำหรับชุดอักขระ ASCII ที่พิมพ์ได้ นี่คืออักขระ 95 ตัวจากรหัสจุด 0x20 ถึง 0x7E สำหรับการชดเชยที่กำหนดdเราจะจับคู่รหัสCกับ

(C - 32 + d) % 95 + 32

ซึ่งเปลี่ยนอักขระทั้งหมดโดย a dและวนรอบจาก~พื้นที่ อักขระที่อยู่นอกช่วงนี้ (อักขระควบคุมเช่นบรรทัดใหม่แท็บและอักขระที่อยู่นอกช่วง ASCII) จะไม่ได้รับผลกระทบ

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นสองอย่าง (อาจแตกต่างกันในภาษาต่าง ๆ ) ซึ่งเป็นการชดเชยdและสตริง โปรแกรมแรกควรกลับหรือพิมพ์ Cypher ของ Caesar ของอินพุต โปรแกรมที่สองควรส่งคืนหรือพิมพ์ผกผันซีซาร์เลขศูนย์ (เช่นใช้ชดเชย-d) คุณสามารถรับอินพุตผ่าน STDIN อาร์กิวเมนต์บรรทัดคำสั่งหรือฟังก์ชันอาร์กิวเมนต์

เพื่อให้สิ่งต่าง ๆ น่าสนใจยิ่งขึ้นโปรแกรมที่สองจะต้องเป็นซีซาร์ของโปรแกรมแรก นั่นคือถ้าคุณส่งซอร์สโค้ดของโปรแกรมแรกไปยังตัวเองสำหรับอ็อฟเซ็ตที่ไม่เป็นศูนย์บางdตัวเอาต์พุตจะต้องเป็นโปรแกรมที่สอง

ทั้งสองโปรแกรมรวมถึงสตริงอินพุตต้องมีอักขระ ASCII ที่พิมพ์ได้บรรทัดใหม่และแท็บเท่านั้น โปรแกรมไม่สามารถมีความคิดเห็นใด ๆ หรืออ่านซอร์สโค้ดของตัวเองชื่อไฟล์หรือ ID กระบวนการโดยตรงหรือโดยอ้อม

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ เนื่องจากทั้งสองโปรแกรมต้องมีขนาดเท่ากันคุณจึงต้องนับเพียงครั้งเดียว

คำตอบ:


12

Cjam, 40 38 37 ไบต์

ไปข้างหน้า Cypher:

 q~'~),32>_@m<er "o|%|'*10<]>k<cpZ"_-

Cypher ผกผัน:

"s!)!+.54@aBo>gt"$q~'~),32>_@m>er\$a/

และโปรแกรมที่สองคืออักษรตัวแรกของโปรแกรมที่มีความแตกต่าง 2


มันทำงานอย่างไร

ฉันมาพร้อมกับคำตอบนี้เกี่ยวกับโชคที่บริสุทธิ์ขณะทดสอบสิ่งต่างๆ

ครั้งแรกชิ้นส่วน Cypher:

q~'~),32>_@m<er
q~                 "Take the input and evaluate it";
  `~)              "Get the next character after the printable ASCII range";
     ,32>          "Get all printable ASCII characters":
         _@        "Copy the printable ASCII string and bring the cypher difference"
                   "on top of stack";
           m<      "Forward rotate the copy of printable ASCII string by difference";
                   "In case of inverse Cypher, this is m> to reverse rotate the string";
             er    "Transliterate to complete the forward/inverse Cypher";

ตอนนี้คำอธิบายของส่วนที่ยุ่งยากมา

การเปลี่ยนแปลงที่สำคัญคือ

<space> -> "     // Empty space to string conversion
Z -> \           // Character Z in an useless string to swap operation
_ -> a           // Copy operation to wrapping in an array
- -> /           // Set subtraction to string splitting

ดังนั้นโปรแกรมแรกคือ

 q~'~),32>_@m<er "o|%|'*10<]>k<cpZ"_-
 q~'~),32>_@m<er                          "no-op space, Forward cypher, no-op space";
                 "o|%|'*10<]>k<cpZ"       "Useless String (Actually not)";
                                   _      "Copy it and ..."
                                    -     "remove all alphabets of copy from original";

และโปรแกรมที่สองคือ

"s!)!+.54@aBo>gt"$q~'~),32>_@m>er\$a/
"s!)!+.54@aBo>gt"                       "Cypher of first part of first program"
                                        "with difference of 2";
                 $q~'~),32>_@m>er\$a/   "Cypher of the useless string of first program";
                                        "with difference 2";
                 $                      "Sort the first program's main part's cypher";
                  q~'~),32>_@m>er       "Program to reverse cypher";
                                 \$     "Swap the cypher to the top of stack and sort it";
                                   a    "Wrap it in array";
                                    /   "Split the output string on an array, which";
                                        "always returns the output in an array as there";
                                        "are no occurrences of an array in a string";

อินพุตเหมือน "<escaped string to be cyphered>" <difference>

ตัวอย่างเช่น:

"abcd" 4

และผลลัพธ์ของโปรแกรมแรกคือ

efgh

และโปรแกรมที่สองคือ

]^_`

ลองออนไลน์ได้ที่นี่


ไม่ใช่ 40 ไบต์ใช่ไหม มันยังทำให้เกิดข้อผิดพลาดในล่ามออนไลน์ (บางอย่างเกี่ยวกับ Arraylists ที่ไม่ได้ใช้งาน)
Def

@Deformyer แก้ไขการนับจำนวนไบต์ คุณให้อะไรใส่เป็น?
เครื่องมือเพิ่มประสิทธิภาพ

ใช่ฉันไม่ดีฉันใช้ข้อโต้แย้งในลำดับที่ไม่ถูกต้อง
Def

'' q ~ '~), 32> _ @ m <er "9} o |% |' * 10 <]> k <cp}]" _- "2 'ไม่ทำงาน (java.lang.RuntimeException: ไม่คาดคิด})
กำหนด

1
@Deformyer คุณต้องหลีกเลี่ยงอัญประกาศในสตริงนั้น
เครื่องมือเพิ่มประสิทธิภาพ

7

Python 2, 147

เห็นได้ชัดว่าฉันไม่ได้คิดหนักเกินไปเกี่ยวกับเรื่องนี้เพราะมันจะไร้ประโยชน์ใน Python มีเพียงสองโปรแกรมแยกกันโดยที่โปรแกรมที่ไม่ได้ใช้จะถูกใส่ในสตริง

ออฟเซ็ตระหว่างสองโปรแกรมคือ 39

ข้างหน้า

นิยามฟังก์ชัน Z ที่ยอมรับสตริง Unicode และอ็อฟเซ็ต

Z=lambda s,d:s.translate({i+32:(i+d)%95+32for i in range(95)})or u''and Z
"uE:F;=:XLd=rLfMK:GLE:M>`TBckjr`Be=a]qmckj?HKXBXBGXK:G@>`qmaVaHKXN__:G=X"

ผกผัน

กำหนดฟังก์ชั่นที่ฉันยอมรับสตริง Unicode และอ็อฟเซ็ต

"d4)5*,)G;S,a;U<:)6;4)<-OC1RZYaO1R,PL`\RZY.7:G1G16G:)6/-O`\PEP7:G=NN)6,G"
I=lambda s,d:s.translate({i+32:(i-d)%95+32for i in range(95)})or u''and I

5

Python 3 - 248 ไบต์

เป้าหมายของฉันคือทำสิ่งนี้ในฐานะ Python หนึ่งซับใน ความสำเร็จของเป้าหมาย แต่ตอนนี้ฉันไม่สามารถตีกอล์ฟได้

การเข้ารหัสลับ:

r=q="".__doc__[2];eval("p"+q+"int(''.join([c,ch"+q+"((o"+q+"d(c)-32+d)%95+32)][31<o"+q+"d(c)<127]fo"+q+" d in[int(input())]fo"+q+" c in input()))")or'\^UZ`smmyV[UZsGOwOT^ss[^PsOtx~}xPtp%!v~}tIG~|([^PsOt(|}$IR[^kPkUZGUZ`sUZ\a`sttIR[^kOkUZkUZ\a`sttt'

ถอดรหัส:

'Q&Q66Bssx$wssoFqOy+u!<6%6?&?6}#)<;;B~$}#<ow@w|6?&?6<<$6?&?6x<w=AGF?x=9MI?GF=qoGEP$6?&?6x<w=PEFKqz$6?&?64x4}#o}#)<}#%*)<==qz$6?&?64w4}#4}#%*)<===6=$';print("".join([c,chr((ord(c)-32-d)%95+32)][31<ord(c)<127]for d in[int(input())]for c in input()));

แก้ไข: แก้ไขไม่ให้มีผลกระทบกับตัวอักษรนอกช่วง ASCII ที่พิมพ์ได้

ออฟเซ็ตจากการเข้ารหัสเพื่อถอดรหัสคือ 20 ใช้โดยการป้อนออฟเซ็ตก่อนจากนั้นสตริงเช่น

5
hello

คำอธิบาย

การแปลงต่อไปนี้เป็นกุญแจสำคัญ:

r -> '
' -> ;

อันแรกอนุญาตให้ใช้orในขณะที่สองไม่สนใจสตริงด้วยเครื่องหมายอัฒภาค

โปรดทราบว่า"".__doc__[2]ส่งกลับสตริงr(นำมาจากstr) นี่เป็นสิ่งจำเป็นเพื่อป้องกันไม่ให้สตริงที่ยกมาเดี่ยวในโปรแกรมถอดรหัสจากการมีคำพูดหลงทางอยู่ตรงกลาง


5

Ruby, 131 125 ไบต์

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

ส่งต่อ Cypher:

Y=->d,s{s.chars{|c|x=c.ord;$><<(x<32?x:(x-32+d)%95+32).chr}};Y
"tdu<cKSKe;@9JKST;TPt;eGJ<r[uss_PsjivPq_Pdjid<`\plbji`e;@JUUr"

ผกผัน Cypher:

"eUf-T<D<V,1*;<DE,EAe,V8;-cLfddPAd[ZgAbPAU[ZS-QMa]S[ZQV,1;FFc"
J=->d,s{s.chars{|c|x=c.ord;$><<(x<32?x:(x-32-d)%95+32).chr}};J

ตัวอย่างทั้งสองกำหนดฟังก์ชั่น (เรียกว่าYในคนแรกและJในคนที่สอง) ซึ่งใช้จำนวนเต็มและสตริงและพิมพ์สตริงที่แปลงเป็น STDOUT 40ชดเชยระหว่างสองชิ้นของรหัสคือ


4

oOo CODE , 750 744 bytes, รหัสทั้งหมดที่ใช้ในโปรแกรมทั้งสอง

นานเกินไป แต่อาจเป็นเครื่องมือที่เหมาะสมในการทำเช่นนั้น ...

การเข้ารหัสลับ:

CcCcccccccccCcYcccCCCccCcCcCccccccCcCcccccCcCcccCcCccCccCcCCccccCcCccccCCcCccccCCccCccCcCCcccCCCcCccccCcCCcCCcCCcCcCcCccccCCccCccCccCccCccCccCccCccccccCCCcCccCccCCcCcCcccCCcCcccCcCCcCCcCcCCccCCcCCcCCcCCcCCcCCcCCcCCcCCcCCcCcccccccCccccCccccCCccccCCcCccCCcccCccccccccccCcCccCccCccCccCcCCccCCcccCcCcCccCCcccCCCcCcccccccccccccCCccCccCcCcCcccCCccccccccccCcCccccccCcCccccCCcCccCccCCcCccccccccccCCccCcCcCcccccCcCccCcCCCcCccCccCCcCccCccCccCcCcccccCcCcccCCCcCcCccccCcCccCCcCCcCCcCcCCcccCcCCcCCcCCcCCcCCcCCcCCcCCcCCcCcCcccCccCCcccccCcCcccCcccccCcccCcccCccCccCCcCcccccccccccccCCCcccCcCcCcccCcccCCCcCccCccCccCcCCccCccCcCCCcCccccCcCccccccccCcCccCccCcCCccccccCccccccccCcccCCccCccCccCCcCCcCCcCCcCcCcCcccccCcCCcCCcCCcCCcCCcCCcCCcCccCcCCcccCCccCcCcccCCcccCCCcCC

ถอดรหัส:

SsSsssssssssSsisssSSSssSsSsSssssssSsSsssssSsSsssSsSssSssSsSSssssSsSssssSSsSssssSSssSssSsSSsssSSSsSssssSsSSsSSsSSsSsSsSssssSSssSssSssSssSssSssSssSssssssSSSsSssSssSSsSsSsssSSsSsssSsSSsSSsSsSSssSSsSSsSSsSSsSSsSSsSSsSSsSSsSSsSsssssssSssssSssssSSssssSSsSssSSsssSssssssssssSsSssSssSssSssSsSSssSSsssSsSsSssSSsssSSSsSsssssssssssssSSssSssSsSsSsssSSssssssssssSsSssssssSsSssssSSsSssSssSSsSssssssssssSSssSsSsSsssssSsSssSsSSSsSssSssSSsSssSssSssSsSsssssSsSsssSSSsSsSssssSsSssSSsSSsSSsSsSSsssSsSSsSSsSSsSSsSSsSSsSSsSSsSSsSsSsssSssSSsssssSsSsssSsssssSsssSsssSssSssSSsSsssssssssssssSSSsssSsSsSsssSsssSSSsSssSssSssSsSSssSssSsSSSsSssssSsSssssssssSsSssSssSsSSssssssSssssssssSsssSSssSssSssSSsSSsSSsSSsSsSsSsssssSsSSsSSsSSsSSsSSsSSsSSsSssSsSSsssSSssSsSsssSSsssSSSsSS

การแปล Brainfuck:

+>>>+>,<[->[->+>+<<]>[-<+>]<<]>,[>++++[-<-------->]+<<+[<+>+++]<++++++++++>>[>-<-<+<-[>>>+<<<<]<-[+<-]+>>>>]<<[-]>>>[->[-<+<<+>>>]<[->+<]+<<+<<<[>[-]+[>+<+++]>++++++++++[<<->+>->-[<<<+>>>>]-[+>-]+<<<]<<]+>[->>+<<]>>->>-]<<<++++[->++++++++<]>.[-]>,]
+>>>->,<[->[->+>+<<]>[-<+>]<<]>,[>++++[-<-------->]+<<+[<+>+++]<++++++++++>>[>-<-<+<-[>>>+<<<<]<-[+<-]+>>>>]<<[-]>>>[->[-<+<<+>>>]<[->+<]+<<+<<<[>[-]+[>+<+++]>++++++++++[<<->+>->-[<<<+>>>>]-[+>-]+<<<]<<]+>[->>+<<]>>->>-]<<<++++[->++++++++<]>.[-]>,]

oOo CODE เป็นตัวแปรของ Brainfuck ที่มีเฉพาะกรณีของตัวอักษรเท่านั้น

ใช้ไบต์แรกและใช้รหัสอักขระเป็นd(ดังนั้นการขึ้นบรรทัดใหม่หมายถึง d = 10) ส่วนที่เหลือของการป้อนข้อมูลเป็นสตริง EOF คือ 0


4

GolfScript 95ไบต์ 64 รหัสทั้งหมดที่ใช้ในโปรแกรมทั้งสอง

การเข้ารหัสลับ:

0 0z{ 1)'[}??)9t:z21,--/; [84;%zt*84*84$|)21*|$Z!!\~'---|}`{)}%~

ถอดรหัส:

1!1{|!2*(\~@@*:u;{32-..0<!\95<&{u+95+95%}*32+}%[""] (...}~a|*~& 

รูปแบบอินพุต:

1 "0 0z{ 1)'[}??)9t:z21,--/; [84;%zt*84*84$|)21*|$Z!!\~'---|}`{)}%~"

คำอธิบาย

ถอดรหัส:

1!1                            # Push 0 1.
{                              # Define a block and evaluate it.
    |                          # Or.
    !2*(                       # Get 1 for encryption, or -1 for decryption.
    \~                         # Evaluate the input string.
    @@*:u;                     # u = d for encryption, or -d for decryption.
    {                          # For each character:
        32-                    # Subtract 32.
        ..0<!\95<&             # Test if it is in the printable range.
        {u+95+95%}*            # If so, add u (mod 95).
        32+                    # Add 32 back.
    }%
    [""] (...                  # Push an empty array and 4 empty strings.
}~
a                              # No-op.
|*~                            # Evaluate ""*(""|"") which does nothing.
&                              # Calculate []&"" which is empty.

การเข้ารหัสลับ:

0 0                            # Push 0 0.
z                              # No-op.
{                              # Define a block and get its string representation.
    ...                        # See decryption code.
    |                          # This will be decoded into a }. The string will be truncated here when evaluated.
}`                             # Only the closing } will be truncated, but it is still used as the end of the block.
{)}%                           # Increment each character. Note that the braces before and after the block will also be incremented.
~                              # Evaluate the string.

3

Javascript (ฉบับร่าง ES7) - 167 165 ไบต์

การยืมจากการใช้สตริงของ @feersum และการใช้เครื่องหมายอัฒภาคของ @MartinButtner;)

การเข้ารหัสลับ:

J=(s,d)=>s.replace(/[ -~]/g,x=>String.fromCharCode((x.charCodeAt()-32+d)%95+32));J
"eP<T-Qef<V;.95*,.PW$HUG&W0TAef{=;270V/;86k1*;k8-.PPAV,1*;k8-.i=PQS^[U-QMa]S[ZQQc"

ถอดรหัส:

"t_Kc<`tuKeJ=HD9;=_f3WdV5f?cPtu+LJAF?e>JGEz@9JzG<=__Pe;@9JzG<=xL_`djib<`\plbji``r"
Y=(s,d)=>s.replace(/[ -~]/g,x=>String.fromCharCode((x.charCodeAt()+63-d)%95+32));Y

ออฟเซ็ตที่จะใช้: 55


1
ล้มเหลวสำหรับสตริงว่าง นั่นเป็นเหตุผลที่ผมต้องใส่มากกว่าเท่านั้นor <empty string> and <function> or <function>
feersum

@feersum ตอนนี้ได้รับการแก้ไขแล้ว ... และ 2 ไบต์สั้นลง :)
nderscore

หืมนี่ดูคุ้น ๆ ;)
Martin Ender

@ MartinBüttnerฉันไม่รู้ว่าคุณหมายถึง ... ;)
ขีดล่าง

2

> <> (ปลา) 467 ไบต์

การเข้ารหัสลับ:

ffii{{~~__:0a('0'*!.0a('0'*22(!'(~$~_:}-}$-a*}+{{if~~:i:0({}?;__:{}84{}*__({}?\__:{} _{}70{}g_{})_{}?\4__{}8*-_{}+{}80{}g_%4_{}8*{}+\\sl||||||||||||||||||||||||||||9||||||||||||||9||||||||||||||||||||||||||||||||||||||||||||||||||||9
                                                                              >                      >                              >!;7f7-_{}!%_{}!<872-d_{}!&_{}!<[755(7(%~~_{}!<[55(7(_{}!*!*23a(_{}!'_{}!"55(7((~~_{}~~~o__'4'0.{{{o,

ถอดรหัส:

iill~~""bb=3d+*3*-$13d+*3*-55+$*+"'"b=!0!'0d-!.~~li""=l=3+~!B>bb=~!;7~!-bb+~!B_bb=~!#b~!:3~!jb~!,b~!B_7bb~!;-0b~!.~!;3~!jb(7b~!;-~!.__vo                            <              <                                                    <
##############################################################################A######################A##############################A$>:i:0b~!$(b~!$?;:50gb~!$)b~!$?^:88+:+(""b~!$?^88+:+b~!$-$-56d+b~!$*b~!$%88+:++""b~!"""rbb*7*31~~~r/

โปรแกรมสองโปรแกรมนั้นถูกชดเชยด้วย 3 และพวกเขารับอินพุตของแบบฟอร์ม:

<2-digit offset> <text>

ชดเชยต้องเป็นตัวเลข 2 หลักเพื่อชดเชย 5 05ความต้องการที่จะเข้ามาเป็น

นี่คือการส่งนาน แต่เกือบทั้งหมดตัวอักษรที่ไม่ใช่ฟิลเลอร์จะถูกใช้โดยทั้งสองโปรแกรม มีพื้นที่ว่างมากมายที่สามารถเล่นกอล์ฟได้อย่างแน่นอน แต่ฉันคิดว่าโปรแกรมนี้น่าสนใจมากขึ้นด้วยวิธีนี้

ภาพนี้เน้นตัวอักษรที่ใช้โดยโปรแกรมทั้งสอง

คำอธิบาย

โครงสร้างหลักที่ทำให้สิ่งนี้เป็นไปได้คือ_{} -> b~!ซึ่งยอมให้มีการข้ามตัวอักษรในโปรแกรมถอดรหัส อย่างไร?

Encrypt:
  _ : Mirror, but is a no-op if the program flow is horizontal
  { : Shift stack left
  } : Shift stack right

Decrypt:
  b : Push 11 to stack
  ~ : Pop top of stack
  ! : Skip the next instruction

สรุปแล้วโปรแกรมเข้ารหัสไม่ทำอะไรเลย แต่โปรแกรมถอดรหัสจะข้ามคำสั่งถัดไป จากนั้นสามารถขยายไปถึง_{}! -> b~!$ซึ่งอนุญาตให้ข้ามตัวอักษรในโปรแกรมเข้ารหัสแทนโดยพลการ

นอกเหนือจากนี้ส่วนที่เหลือของโปรแกรมส่วนใหญ่คือการกดตัวเลขดำเนินการกับตัวเลขเหล่านั้นแล้วหาวิธีที่จะป๊อปอัพพวกเขา ตัวอย่างเช่นหนึ่งโครงสร้างที่มีประโยชน์คือ~~ -> ""ซึ่งจะปรากฏสองค่าสำหรับโปรแกรมเข้ารหัส แต่ไม่มีอะไรในโปรแกรมถอดรหัส


> <>, 149 ไบต์

นี่คือเวอร์ชันที่น่าสนใจน้อยกว่าซึ่งใช้ความจริงที่ว่าคำแนะนำที่ไม่ผ่านเป็นความคิดเห็นที่มีประสิทธิภาพในภาษา 2D

การเข้ารหัสลับ:

i68*:@-a*i@@-+i~v
4:v?)g31:;?(0:i:/8
(?v48*-+03g%48*+\*
_~\of0.   .1+1fo/
j*+:zq<6B99A6=qz6g
53Ji?C58/8;?r0?C5:
C?EiJ4r?<EFJ3;EtEg
:tAC5EK8l5tKK86t*i

ถอดรหัส:

^+-~/5"V~^55" ^sk
)/k4}\(&/04|%/^/$-
|4k)-~" %(\y)-~ Q~
TsQd[%#ttt#& &[d$
_~ /of1+7..6+2fo+\
*(?^48*-$-04g%48*/
84:^?)g41:;?(0:i:\
/i68*:@-a*i@@-+i~^

โปรแกรมสองโปรแกรมนั้นถูกชดเชยด้วย 84 และใช้วิธีป้อนข้อมูลแบบเดียวกับด้านบน คำสั่งแรกตัดสินใจเลือกครึ่งหนึ่งของโปรแกรมที่จะดำเนินการโดยi(อินพุต) บำรุงรักษาโปรแกรมไหลในโปรแกรมเข้ารหัสและ^เปลี่ยนเส้นทางโปรแกรมขึ้น (วนรอบและกลับจากด้านล่าง) ในโปรแกรมถอดรหัส

คำอธิบาย

สำหรับครึ่งหนึ่งที่เกี่ยวข้องของโปรแกรมเข้ารหัส (โปรแกรมถอดรหัสคล้ายกัน):

i                       read first input digit as char
68*:@-a*                subtract 48 (ASCII "0") and multiply by 10, keeping another 48 on the stack
i                       read second input digit as char
@@-+                    subtract 48 and add to 10*(first digit), giving the offset
i~                      read in space and discard it

--- LOOP ---
:                       copy the offset
i:                      read input char
:0)?;                   check if less than 0 (i.e. EOF) and terminate if so
:13g)?v                 check if greater than ~ in cell (1,3) and drop down if so
48*(?v                  check if less than 32 and drop down if so
48*-+03g%48*+           calculate Caesar shift of the char, fetching 95 from (0,3)

of1+1.                  repeat loop
of0.                    repeat loop

เครื่องมือการเข้ารหัส

สิ่งนี้ไม่เกี่ยวข้องกับส่วนที่เหลือของโพสต์ด้านบน แต่ฉันคิดว่าฉันจะโพสต์สิ่งนี้เพราะฉันต้องใช้: P

for(var i=0;i<95;++i){var option=document.createElement("option");option.text=i;document.getElementById("offset").add(option)};function update(m){if(m==1)var code=document.getElementById("in").value;else var code=document.getElementById("out").value;var offset=parseInt(document.getElementById("offset").value);var output="";for(var i=0;i<code.length;i++){var n=code[i].charCodeAt(0);if(n<32||n>127)output+=code[i];else{var c=(n-32+offset*m)%95;output+=String.fromCharCode(c<0?c+95+32:c+32)}}if(m==1)document.getElementById("out").value=output;else document.getElementById("in").value=output};
<html><body><textarea id="in" onkeyup="update(1)" rows=5 style="width:100%"></textarea><textarea id="out" rows=5 style="width:100%" onkeyup="update(-1)"></textarea><select id="offset" onchange="update(1)"></select></body></html>


1

Perl - 131

มันรับอินพุตจาก args ของบรรทัดคำสั่ง

We;{for(split//,$ARGV[1]){print chr(((ord$_)-32+$ARGV[0])%95+32)}};q!LUXmYVROZttqi'8-<AvCnaVXOTZeINXmmmUXJiEnrxwri'8-<AuCnj~zpxwnc!

การเลื่อนโดย 26 ให้อีกอันหนึ่ง:

q U6!*-B.+'$/IIF>[lapuKwC6+-$)/:}#-BBB*-~>yCGMLE>[lapuJwC?SOEMLC88U,;for(split//,$ARGV[1]){print chr(((ord$_)-32-$ARGV[0])%95+32)};

@ มาร์ตินBüttner Woah, upvote! มันจริงไม่ทำงานหรือไม่
KSFT

มันเท่าที่ฉันสามารถบอกได้;)
Martin Ender
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.