Sezar-Cypher-Mania


22

Sezar Cypher'ın her harf (A Z etrafında döngü) sabit bir kayma ile kaydırılır çok basit bir ikame şifre olup. Benzer şekilde, yazdırılabilir ASCII karakter kümesi için bir Sezar şifresi yapabiliriz. Bunlar, 0x20 - 0x7E kod noktalarındaki 95 karakterdir. Bir ofsetini için d, biz kod noktasını harita Ciçin

(C - 32 + d) % 95 + 32

tüm karakterleri a dile kaydırır ve etrafından ~uzaya doğru dolaşır . Bu aralığın dışındaki karakterler (yeni satırlar, sekmeler ve ASCII aralığının dışındaki karakterler gibi kontrol karakterleri) etkilenmez.

Bir ofset dve bir dize alan iki program veya fonksiyon (potansiyel olarak farklı dillerde) yazmanız gerekir . İlk program girişin Sezar şifresini döndürmeli veya yazdırmalıdır. İkinci program ters Caesar şifresini döndürmeli veya yazdırmalıdır (örneğin ofset kullanarak -d). STDIN, komut satırı argümanı ya da işlev argümanı yoluyla girdi alabilirsiniz.

İşleri daha ilginç hale getirmek için, ikinci programın ilk programın Sezar şifresi olması gerekir. Diğer bir deyişle, ilk programın kaynak kodunu kendinize aktarırsanız, sıfır olmayan bir değer için d, çıktının ikinci program olması gerekir.

Her iki program ve giriş dizeleri yalnızca yazdırılabilir ASCII karakterleri, yeni satırlar ve sekmeler içermelidir. Her iki program da herhangi bir yorum içeremez veya kendi kaynak kodunu, dosya adını veya işlem kimliğini doğrudan veya dolaylı olarak okuyamaz.

Bu kod golf, yani en kısa cevap (bayt cinsinden) kazanır. Her iki programın da aynı boyuta sahip olması gerektiğinden, yalnızca bir kez saymanız gerekir.

Yanıtlar:


12

Cjam, 40 38 37 bayt

İleri Cypher:

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

Ters Cypher:

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

ve ikinci program farkı olan ilk programın şifresidir. 2


Nasıl çalışır

Her şeyi test ederken saf şans üzerine bu cevabı buldum.

İlk olarak, Cypher bölümleri:

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

Şimdi zor kısmının açıklaması geliyor.

Anahtar dönüşümler

<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

Yani ilk program

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

Ve ikinci program

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

Giriş gibidir "<escaped string to be cyphered>" <difference>

Örneğin:

"abcd" 4

ve ilk programın çıktısı

efgh

ve ikinci programın

]^_`

Burada çevrimiçi deneyin


bu 40 byte değil mi? ayrıca çevrimiçi tercümanda bir hata veriyor (Arylistler üzerinde uygulanmayan bir şey)
Def

@Deformyer bayt sayısını düzeltti. Giriş olarak ne veriyorsunuz?
Doktor,

evet benim kötü, argümanlar yanlış sırayla kullandım.
Def

'"q ~' ~), 32> _ @ m <er" 9} o |% | '* 10 <]> k <cp}] "_-" 2' çalışmıyor (java.lang.RuntimeException: Beklenmeyen})
Def

1
@Deformyer Bu dizgede alıntı yapmak zorundasınız
Optimizer

7

Python 2, 147

Açıkçası Python'da boşuna olacağı için bunun hakkında fazla düşünmedim. Kullanılmayan programın bir dizgede yer aldığı basit iki ayrı program vardır.

İki program arasındaki denge 39.

ileri

Bir Unicode dizesini ve bir ofseti kabul eden Z işlevini tanımlar.

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"

Ters

Unicode string ve offset kabul ettiğim fonksiyonu tanımlar.

"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 bayt

Amacım bunu bir Python tek gömlek olarak yapmaktı. Hedef başarı, ama şimdi golf oynamaktan rahatsız olamam.

şifrele:

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'

azalmak:

'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()));

Düzenleme: Yazdırılabilir ASCII aralığının dışındaki karakterleri etkilememesi düzeltildi

Şifrelemeden şifresini çözmek için ofset değeri 20'dir. Önce ofseti, sonra dizeyi girerek kullanın.

5
hello

açıklama

Aşağıdaki dönüşümler anahtardır:

r -> '
' -> ;

İlk kullanımına izin verir or verirken, ikincisi noktalı virgüllerle bir dize yoksayar.

(Alınan ) "".__doc__[2]dize döndürür unutmayın . Bu, şifre çözme programındaki tek bir alıntı dizenin ortasında başıboş tırnaklara sahip olmasını önlemek için gereklidir.rstr


5

Ruby, 131 125 bayt

İşte kendi sunumum (daha önce kavramın bir kanıtı olarak yazmıştım, fakat bir şekilde kendi kurallarımızı ihlal etmeyi başardım). İki gönderi arasındaki herhangi bir kodu tekrar kullanmıyorum (sonuçta bunu yenmenizi istiyorum), ama bunun yerine, biri saçma sapan bir dizgeye dönüşen iki satırdan oluşur.

İleri şifre:

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"

Ters şifre:

"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

Her iki parçacıkları bir fonksiyon tanımlama (denilen Ybirinci birinde ve Jikincisinde) bir tam sayı ve bir dizi alır ve çıkışı için dönüştürülmüş dize basar. İki kod parçası arasındaki uzaklıktır 40.


4

o KOD , 750 744 bayt, her iki programda kullanılan tüm kodlar

Çok uzun ama muhtemelen bunu yapan doğru araç ...

şifrele:

CcCcccccccccCcYcccCCCccCcCcCccccccCcCcccccCcCcccCcCccCccCcCCccccCcCccccCCcCccccCCccCccCcCCcccCCCcCccccCcCCcCCcCCcCcCcCccccCCccCccCccCccCccCccCccCccccccCCCcCccCccCCcCcCcccCCcCcccCcCCcCCcCcCCccCCcCCcCCcCCcCCcCCcCCcCCcCCcCCcCcccccccCccccCccccCCccccCCcCccCCcccCccccccccccCcCccCccCccCccCcCCccCCcccCcCcCccCCcccCCCcCcccccccccccccCCccCccCcCcCcccCCccccccccccCcCccccccCcCccccCCcCccCccCCcCccccccccccCCccCcCcCcccccCcCccCcCCCcCccCccCCcCccCccCccCcCcccccCcCcccCCCcCcCccccCcCccCCcCCcCCcCcCCcccCcCCcCCcCCcCCcCCcCCcCCcCCcCCcCcCcccCccCCcccccCcCcccCcccccCcccCcccCccCccCCcCcccccccccccccCCCcccCcCcCcccCcccCCCcCccCccCccCcCCccCccCcCCCcCccccCcCccccccccCcCccCccCcCCccccccCccccccccCcccCCccCccCccCCcCCcCCcCCcCcCcCcccccCcCCcCCcCCcCCcCCcCCcCCcCccCcCCcccCCccCcCcccCCcccCCCcCC

azalmak:

SsSsssssssssSsisssSSSssSsSsSssssssSsSsssssSsSsssSsSssSssSsSSssssSsSssssSSsSssssSSssSssSsSSsssSSSsSssssSsSSsSSsSSsSsSsSssssSSssSssSssSssSssSssSssSssssssSSSsSssSssSSsSsSsssSSsSsssSsSSsSSsSsSSssSSsSSsSSsSSsSSsSSsSSsSSsSSsSSsSsssssssSssssSssssSSssssSSsSssSSsssSssssssssssSsSssSssSssSssSsSSssSSsssSsSsSssSSsssSSSsSsssssssssssssSSssSssSsSsSsssSSssssssssssSsSssssssSsSssssSSsSssSssSSsSssssssssssSSssSsSsSsssssSsSssSsSSSsSssSssSSsSssSssSssSsSsssssSsSsssSSSsSsSssssSsSssSSsSSsSSsSsSSsssSsSSsSSsSSsSSsSSsSSsSSsSSsSSsSsSsssSssSSsssssSsSsssSsssssSsssSsssSssSssSSsSsssssssssssssSSSsssSsSsSsssSsssSSSsSssSssSssSsSSssSssSsSSSsSssssSsSssssssssSsSssSssSsSSssssssSssssssssSsssSSssSssSssSSsSSsSSsSSsSsSsSsssssSsSSsSSsSSsSSsSSsSSsSSsSssSsSSsssSSssSsSsssSSsssSSSsSS

Brainfuck çevirileri:

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

o KOD, yalnızca harflerin geçerli olduğu durumlarda bir Brainfuck çeşididir.

İlk baytı alır ve karakter kodunu kullanır d(yani yeni satır d = 10 demektir). Girişin geri kalanı dizedir. EOF 0'dır.


4

GolfScript, 95 64 bayt, her iki programda kullanılan tüm kodlar

şifrele:

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

azalmak:

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

Giriş formatı:

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

açıklama

azalmak:

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.

şifrele:

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 Taslağı) - 167 165 bayt

@Feersum 'un dizeleri ve @MartinButtner' in noktalı virgül kullanması;

şifrele:

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"

azalmak:

"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

Kullanılacak ofset: 55


1
Boş dizeler için başarısız. Bu yüzden or <empty string> and <function>sadece değil koymak zorunda kaldım or <function>.
feersum

@feersum şimdi düzeltildi ... ve 2 byte daha kısa :)
nderscore

Hmm, bu tanıdık geliyor. ;)
Martin Ender

@ MartinBüttner Ne demek istediğini bilmiyorum ...;)
nderscore

2

> <> (Balık) , 467 bayt

şifrele:

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,

azalmak:

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/

İki program 3 ile dengelenir ve formun girdisini alırlar:

<2-digit offset> <text>

Ofset 2 hane olmalıdır , bu nedenle 5 ofset değeri girilmelidir.05 .

Bu uzun bir sunum, ancak hemen hemen tüm dolgu dışı karakterleri her iki program tarafından kullanılıyor . Kesinlikle golf oynayabilecek çok fazla boşluk var, ancak programın bu şekilde daha ilginç olacağını düşündüm.

Bu görüntü her iki program tarafından kullanılan karakterleri vurgulamaktadır.

açıklama

Bunu mümkün kılan ana yapı _{} -> b~! , şifre çözme programında karakterlerin rasgele atlanmasına izin veren . Nasıl?

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

Sonuçta, şifreleme programı hiçbir şey yapmaz, ancak şifre çözme programı bir sonraki talimatı atlar. Bu daha sonra uzatılabilir_{}! -> b~!$ şifreleme programında karakterlerin keyfi bir şekilde atlanmasına izin verecek .

Bunun yanı sıra, programın geri kalanının çoğu rakamları bastırıyor, bu sayılar üzerinde işlem yapıyor ve ardından onları patlatmanın yollarını buluyor. Örneğin ~~ -> "", şifreleme programı için iki değer belirleyen, ancak şifre çözme programında hiçbir şey itmeyen kullanışlı bir yapıdır .


> <>, 149 bayt

İşte, henüz iletilmeyen talimatların 2B dillerde etkili bir şekilde yorumlanması gerçeğini kullanan daha az ilginç sürüm.

şifrele:

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

azalmak:

^+-~/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~^

İki program 84 ile dengelenir ve yukarıdakiyle aynı şekilde girdi alır. İlk komut i, şifreleme programında program akışını (giriş) sağa doğru koruyarak ^ve şifre çözme programında program akışını yukarı doğru yönlendirerek (alttan dolanıp aşağıdan geri gelecek şekilde ) programın hangi yarısının çalıştırılacağına karar verir .

açıklama

Şifreleme programının ilgili yarısı için (şifre çözme programı benzerdir):

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

Kodlama aracı

Bu, yukarıdaki yazının geri kalanıyla ilgili değil, kullanmam gerekeceği için bunu göndereceğimi düşündüm: 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

Komut satırı argümanlarından girdi alır.

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

26'ya kaydırmak diğerine:

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

@Martin Büttner Woah, bir artı! Aslında yapar işi?
KSFT

söyleyebildiğim kadarıyla;;)
Martin Ender
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.