Sezar Kayması


22

Sezar kayması muhtemelen hepimizin aşina olduğu bir şey.

(Bir ev ödevi olarak bile yapıyor olabilirsiniz. Öyleyse, lütfen bu cevapları kopyalamayın, öğretmeniniz kesinlikle buradaki cevaplar gibi bir şey istemez.)

Olmazsan, Sezar kayması çok basit bir şifreleme şeklidir. Şifrelenmiş bir dize ve bir tamsayı alır. Sonra dizedeki her alfabetik karakter için aşağıdaki dönüşümü yapın:

  1. Karakterin alfabedeki konumunu araştırın (0 tabanlı).
  2. Başlangıçta alınan tamsayı bu sayıya ekleyin.
  3. Sayı 25'den büyük olsa da, ondan 26'yı çıkarın.
  4. İçinde bulunduğu alfabenin konumunu hesapla.

Karakterlerin geri kalanını değiştirmeden bırakın.

Büyük harflere saygı duyulmalı çünkü büyük harfsiz İngilizce nedir?

Örnekler:

abcdefghijklmnopqrstuvwxyz 1 -> bcdefghijklmnopqrstuvwxyza
Spam spam spam sausage and spam! 13 -> Fcnz fcnz fcnz fnhfntr naq fcnz!
abcdefghijklmnopqrstuvwxyz 52 -> abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz -1 -> zabcdefghijklmnopqrstuvwxy
ABCxyz 3 -> DEFabc

Varsayımlar

  • Herhangi bir yazdırılabilir ASCII karakteri alabilirsiniz.
  • Giriş numarası negatif olabilir ve her zaman -128'den büyük ve 128'den küçük olacaktır ( -128<x<128)
  • Büyük harfleri ve büyük harfleri tersine çevirerek kodlayabilmelisiniz.
  • Yalnızca bir işlev veya snippet değil, tam bir program oluşturmanız gerekir
  • Girişinizi STDIN'den veya en yakın alternatiften alacaksınız
  • Girişiniz için formatı seçebilirsiniz, lütfen cevabınızı belirtiniz.
  • Kayması gereken karakterler ASCII kod noktaları 0x41 - 0x5Ave 0x61-0x7A- büyük ve küçük harflerdir.

    • Büyük harfler üstte kalmalı
    • Küçük harfler küçük kalmalıdır
    • Bu aralıkta olmayan karakterler olduğu gibi bırakılmalıdır
  • Bu zorluğa dikkat edin, yalnızca dizeleri şifrelemeniz gerekir, bunları otomatik olarak çözmeniz gerekmez (ancak verme -xşifreyi tersine çevirir)


Bu bir katalog olduğundan, bu mücadeleden sonra oluşturulan dillerin rekabet etmesine izin verilir. Göndermenin test edilebilmesi için bir tercüman olması gerektiğini unutmayın. Daha önce uygulanmamış bir dil için bu tercümanı kendiniz yazmanıza izin verilir (ve hatta teşvik edilir). Bunun dışında tüm standart kurallarına uyulmalıdır. Çoğu dilde yapılan gönderiler uygun bir önceden kodlanmış kodlamada (genellikle UTF-8) bayt olarak puanlanacaktır.

Katalog

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

## Ruby, <s>104</s> <s>101</s> 96 bytes

Başlığınıza birden fazla sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğiniz için), gerçek puanın başlıktaki son sayı olduğundan emin olun :

## Perl, 43 + 2 (-p flag) = 45 bytes

Dil adını, daha sonra pasajda görünecek bir bağlantı da yapabilirsiniz:

## [<><](https://esolangs.org/wiki/Fish), 121 bytes


8
“Bir ev ödevi olarak bile yapıyor olabilirsiniz. Öyleyse, lütfen bu cevapları kopyalamayın, öğretmeniniz kesinlikle buradaki cevaplar gibi bir şey istemiyor .” 90 baytlık dağınık karakter ve kısayollardan oluşan bir kludge verirseniz, ne olacağını merak ediyorum ...
ASCIIThenANSI

Yanıtlar:


9

Pyth, 13 bayt

uXGH.<HQrBG1z

Test odası

Temel olarak, sezar vardiyası yapmak istediğimiz iki dize, küçük harf ve büyük harf alfabe ile başlıyoruz. Her ikisini de içeren liste rBG1, büyük harfli bifurcate tarafından üretilir . Ardından, giriş dizesi ile başlayan ve ilk küçük harf, sonra büyük harfleri uygun vardiya ile çevirerek bu listeyi küçültüriz.


Çok güzel, çatallanmaların varlığını unutmaya devam ediyorum ...: P
FryAmTheEggman


5

Bash + BSD oyunları paketi, 21

caesar $[($1+130)%26]

Yerleşikler FTW! Neredeyse Mathematica gibi hissediyor. Pyth cevapları yine de daha kısa.

Giriş dizesi STDIN'den ve tamsayıdan komut satırından okunur. Örneğin:

$ ./caesar.sh 13 <<< "Spam spam spam sausage and spam!"
Fcnz fcnz fcnz fnhfntr naq fcnz!
$

Ya da yerleşik yapmayı sevmiyorsanız:

Bash + coreutils, 63

printf -va %s {a..z}
t=${a:$1%26}${a:0:$1%26}
tr A-Z$a ${t^^}$t

Bana öyle geliyor ki coreutils sürümü -127 ve / veya 127 ile çalışmıyor mu?
Neil

@Neil Evet. İyi yakalama. Sabit.
Dijital Travma

5

JavaScript (ES6), 122 118 114 111 bayt

alert((p=prompt)().replace(/[a-z]/gi,c=>String.fromCharCode((x=c.charCodeAt(),a=x&96,x-a+n+129)%26-~a),n=+p()))

@Neil sayesinde 4 bayt kaydedildi !

açıklama

İlk komut istemi giriş dizesini alır. İkincisi, her harfin kaydırılacağı sayıdır.

alert(
  (p=prompt)()              // get input string
    .replace(/[a-z]/gi,c=>  // for each letter
      String.fromCharCode((
        x=c.charCodeAt(),   // x = code of character
        a=x&96,             // a = index of letter a (-1) in same capitalisation
        x-a+n+129)%26-~a    // add N to the letter code and wrap at 26
      ),                    // (+129 is needed to make the % work with negative numbers)
      n=+p()                // get number to shift by
    )
)

1
Çok hoş! Ancak tüm girdilerde çalışmaz; dene "abcdefg", -26. Bu, formülü değiştirerek düzeltilebilir (x-a+n+130)%26.
ETHProductions

@ETHproductions Bunu yakaladığın için teşekkürler!
user81655

"Yalnızca bir işlev veya snippet değil, tam bir program oluşturmanız gerekir"
LegionMammal978

@ LegionMammal978 Teşekkürler, fark etmedim.
user81655

Yardımcı a=x&96,(x-a+n+129)%26+a+1olur mu?
Neil

3

CJam, 34 22 21 20 bayt

FryAmTheEggman'a 1 byte tasarruf ettiğin için teşekkürler.

l'[,_el^_26/l~fm<ser

Burada test et.

Giriş, ilk satırda kaydırılacak olan dize ve ikinci satırdaki vardiyadır.

açıklama

l    e# Read the first line of input.
'[,  e# Push a string with all ASCII characters up to and including Z.
_el  e# Duplicate and convert to lower case. This only affects the letters.
^    e# Symmetric set-difference: except for the letters, each character appears in both
     e# sets and will be omitted from the difference, but all the letters will be included.
     e# This gives us "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
_26/ e# Duplicate and split into chunks of 26 characters, separating lower and upper case.
l~   e# Read the second line of input and evaluate.
fm<  e# Shift each of the two substrings by that many characters to the left.
s    e# Convert to a single string, joining both substrings back together.
     e# On the stack are now the input, the letters in alphabetical order and the letters
     e# in shifted order.
er   e# Character transliteration: replace each occurrence of a letter with the character
     e# at the corresponding position in the shifted string.

@ FryAmTheEggman Dennis'ten '[,_el^bir bahşiş. fYine de ne demek istediğinizi anlamadım , normal kullanım gibi görünüyor?
Martin Ender

Sanırım yeterince CJam cevabını okumamıştım: P Harita gibi kullanmak ancak tartışma sırasını değiştirmek gerçekten güzel görünüyor.
FryAmTheEggman

@ FryAmTheEggman aslında, hiç ihtiyacım yok @. :)
Martin Ender

2

Java, 249 Bayt

Bu alabildiğim kadar kısa. Stdin'den okumak bir ton bayt yer. Komut satırı argümanları kullanan bir çözüm gözle görülür şekilde daha kısadır, ancak bu görev girdi için stdin belirtmiştir.

Giriş biçimi, önce yeni bir satırdaki vardiya numarasını izleyen Dize'dir.

interface C{static void main(String[]a){java.util.Scanner r=new java.util.Scanner(System.in);String s=r.nextLine();int i=(r.nextInt()+26)%26;s.chars().forEach(c->System.out.print((char)(c>64&c<91|c>96&c<123?c<91?65+(c+i-65)%26:97+(c+i-97)%26:c)));}}

Argümanlar komut satırının kullanılması Bu çözüm sadece 188 bayttır. Girdi, ilk argüman olarak Dize ve ikinci olarak kaymadır.

interface C{static void main(String[]a){int i=(Integer.parseInt(a[1])+26)%26;a[0].chars().forEach(c->System.out.print((char)(c>64&c<91|c>96&c<123?c<91?65+(c+i-65)%26:97+(c+i-97)%26:c)));}}

1

R, 111 bayt

kod

n=scan();s=scan(,"");for(l in as.numeric(sapply(s,charToRaw))){v=97;if(l<97)v=65;cat(intToUtf8((l+n-v)%%26+v))}

ungolfed

n <- scan()                           # input integer
s <- scan(,"")                        # input string letter by letter
z <- as.numeric(sapply(s,charToRaw))  # get ASCII index of character
for (l in z){                         # loop through chars
  v=97                                # base index of not capitalized chars
  if(l<97)v=65                        # base index of capitalized chars
  cat(intToUtf8((l+n-v)%%26+v))       # paste the char of the shifted index
}

Bu program kullanıcı girişi STDIN'den, önce tamsayı kaydırıcısından sonra da karakterden karakter dizisine alır.


1

Perl, 81 bayt

( -pBayrak için +1 )

s/[^ ]+ //;$n=$&%26;eval"y/a-zA-Z/".($x=chr(97+$n)."-za-".chr$n+96).uc$x."/"if$n

Hala golf oynamak için çalışıyorum ...

Ölçek:

llama@llama:...code/perl/ppcg67044caesar$ printf '1 abcdefghijklmnopqrstuvwxyz\n13 Spam spam spam sausage and spam!\n52 abcdefghijklmnopqrstuvwxyz\n-1 abcdefghijklmnopqrstuvwxyz\n3 ABCxyz' | perl -p caesar.pl; echo
bcdefghijklmnopqrstuvwxyza
Fcnz fcnz fcnz fnhfntr naq fcnz!
abcdefghijklmnopqrstuvwxyz
zabcdefghijklmnopqrstuvwxy
DEFabc


1

Piton 2, 163 160 bayt

Eminim hala golf oynayabilir miyim?

import sys;k=sys.argv
def f(x,n):r=chr((ord(x.lower())-97+n)%26+97);return(x,[r,r.upper()][x.isupper()])
print''.join(f(x,int(k[2]))[x.isalpha()] for x in k[1])

Oldukça okunaksız olduğundan, işte burası eskimiş bir sürüm:

import sys

def shift(x,n):
    # shift character x by n (all in lowercase)
    r = chr((ord(x.lower())-97+n)%26+97)
    if x.isalpha() and x.islower():
        return r
    elif x.isalpha() and x.isupper():
        return r.upper()
    else:
        return x

# 'map' the function shift to each character of the input   
output = ''.join(shift(x,int(sys.argv[2])) for x in sys.argv[1])
print(output)

Girdi ile ilgili: İki argüman beklenir, ilki bir dize olmalı, diğeri tamsayı (kaydırma miktarı). Örnekler (dosya adı verilir csr.py):

$ python csr.py gnu 9
pwd
$ python csr.py "Spam spam spam sausage and spam\!" 13
Fcnz fcnz fcnz fnhfntr naq fcnz!

Not: İkinci örnekte bir kaçış karakteri ve ""gerekli


1

Python 2, 118 116 bayt

s,n=input()
print''.join([[c,chr((ord(c)-97+n)%26+97)]['`'<c<'{'],chr((ord(c)-65+n)%26+65)]['@'<c<'[']for c in s)

if/elseÖrneklerin yerine listeleri kullanmak isteyebilirsiniz ( codegolf.stackexchange.com/a/62/36885 ). Örneğin, print''.join([[c,chr((ord(c)-97+n)%26+97)]['~'<c<'{'],chr((ord(c)-65+n)%26+65)]['@'<c<'[']for c in s)biraz daha kısa ve aynı şekilde çalışması gerekir. (Önceden yaptığınız gibi tilde değiştirmek yerine arka tuğlayı değiştirmek dışında - arka
tiklamayı

1

Mathematica, 117 bayt

Echo[InputString[]~StringReplace~Thread[Join[a=Alphabet[],b=ToUpperCase@a]->(c=RotateLeft)[a,d=Input[]]~Join~c[b,d]]]

Dizeyi alır, ardından yeni satır izler, ardından kayma faktörü gelir. Hala golf oynayabilirsin ...


1

Perl 6 , 73 + 1 = 74 bayt

$ perl6 -pe 's:g:i/<[a..z]>/{chr ((my$o=ord ~$/)-(my$a=$o+&96+1)+BEGIN get%26)%26+$a}/' # 73+1

İlk girdi satırı harfleri yukarı kaydırmak için kullanılan karakter sayısıdır.

Kullanımı:

$ perl6 -pe 's:g:i/<[a..z]>/{...}/' <<< \
'1
abcdefghijklmnopqrstuvwxyz'
bcdefghijklmnopqrstuvwxyza
$ perl6 -pe 's:g:i/<[a..z]>/{...}/' <<< \
'13
Spam spam spam sausage and spam!'
Fcnz fcnz fcnz fnhfntr naq fcnz!
$ perl6 -pe 's:g:i/<[a..z]>/{...}/' <<< \
'52
abcdefghijklmnopqrstuvwxyz'
abcdefghijklmnopqrstuvwxyz
$ perl6 -pe 's:g:i/<[a..z]>/{...}/' <<< \
'-1
abcdefghijklmnopqrstuvwxyz'
zabcdefghijklmnopqrstuvwxy
$ perl6 -pe 's:g:i/<[a..z]>/{...}/' <<< \
'3
ABCxyz'
DEFabc
$ perl6 -pe 's:g:i/<[a..z]>/{...}/' <<< \
'1000000000000000000000000000000000000000
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ'
mnopqrstuvwxyzabcdefghijkl
MNOPQRSTUVWXYZABCDEFGHIJKL

1

C ++, 163 154 152 bayt

#include<cstdio>
#include<cstdlib>
int main(int x,char**a){for(int c,b,s=atoi(a[1]);1+(c=getchar());putchar(c<b|c>b+26?c:(c+s-b+26)%26+b))b=c<97?65:97;}

Kullanımı:

$ ./caesar -1 <<< "123 a A z Z aBcDeFgHiKlMnOpQrStUvWxYz"
123 z Z y Y zAbCdEfGhJkLmNoPqRsTuVwXy

0

k4, 80 bayt

Program, vardiya numarasını komut satırı argümanı olarak kabul eder ve stdin'den metin okur.

Teknik bir kısıtlama nedeniyle, negatif kaymalar kısa çizgi yerine alt çizgi ile kodlanmalıdır. (Bu kodlamayı yorumlamak için ayrıştırıcı olmadan, çözüm 64 bayt olur.)

% wc -c c.k
80 c.k
% cat c.k
c:{x;,/x{y!(x_y),x#y}'.Q`a`A}
.z.pi:{1@x^c[.q.mod[.*{x^((!).$"_-")x}.z.x]26]x;}
% 

İşte yürütülen örnekler:

% echo abcdefghijklmnopqrstuvwxyz|q c.k 1
bcdefghijklmnopqrstuvwxyza
% echo 'Spam spam spam sausage and spam!'|q c.k 13
Fcnz fcnz fcnz fnhfntr naq fcnz!
% echo abcdefghijklmnopqrstuvwxyz|q c.k 52
abcdefghijklmnopqrstuvwxyz
% echo abcdefghijklmnopqrstuvwxyz|q c.k _1
zabcdefghijklmnopqrstuvwxy
% echo ABCxyz|q c.k 3
DEFabc
%

Ve işte hem şifreyi hem de kodu çözmeyi doğrulayan aptal küçük bir test cihazı. (Bu zsh; döngü indekslemesini değiştirir bashveya kshdeğiştirir . Tek tabanlı diziler, ugh ....)for((i=0;i<5;i++))

% a=(abcdefghijklmnopqrstuvwxyz 'Spam spam spam sausage and spam!' abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz ABCxyz)
% b=(1 13 52 _1 3)
% c=(bcdefghijklmnopqrstuvwxyza 'Fcnz fcnz fcnz fnhfntr naq fcnz!' abcdefghijklmnopqrstuvwxyz zabcdefghijklmnopqrstuvwxy DEFabc)
% for ((i=1;i<=5;i++))
for> do
for>     r=$(echo "${a[i]}"|q c.k "${b[i]}")
for>     s=$(echo "$r"|if [[ ${b[i]} == _* ]]; then q c.k "${b[i]/_}"; else q c.k "_${b[i]}"; fi)
for>     printf '%s\t%s\n' "$([[ ${c[i]} == $r ]] && echo good || echo bad)" "$([[ ${a[i]} == $s ]] && echo good || echo bad)"
for> done
good    good
good    good
good    good
good    good
good    good
% 
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.