Caesar เลื่อนลอย


22

การเปลี่ยนซีซาร์อาจเป็นสิ่งที่เราทุกคนคุ้นเคย

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

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

  1. กำหนดตำแหน่งของตัวละครในตัวอักษร (ตาม 0)
  2. เพิ่มไปยังหมายเลขนั้นจำนวนเต็มที่ได้รับเมื่อเริ่มต้น
  3. ในขณะที่จำนวนมากกว่า 25 ให้ลบ 26 ออก
  4. หาตำแหน่งของตัวอักษรที่มันมีอยู่

ปล่อยให้ส่วนที่เหลือของตัวละคร unshifted

ต้องเคารพตัวอักษรพิมพ์ใหญ่เพราะภาษาอังกฤษที่ไม่มีตัวอักษรพิมพ์ใหญ่คืออะไร

ตัวอย่าง:

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

สมมติฐาน

  • คุณอาจได้รับอักขระ ASCII ที่พิมพ์ได้
  • หมายเลขอินพุตสามารถเป็นค่าลบและจะใหญ่กว่า -128 และน้อยกว่า 128 ( -128<x<128) เสมอ
  • คุณจะต้องสามารถเข้ารหัสตัวพิมพ์ใหญ่และตัวพิมพ์ใหญ่ที่ไม่สามารถย้อนกลับได้
  • คุณต้องสร้างโปรแกรมเต็มรูปแบบไม่ใช่เพียงแค่ฟังก์ชั่นหรือตัวอย่างเท่านั้น
  • คุณจะได้รับข้อมูลของคุณจาก STDIN หรือทางเลือกอื่นที่ใกล้เคียงที่สุด
  • คุณสามารถเลือกรูปแบบการป้อนข้อมูลของคุณโปรดระบุสิ่งนี้ในคำตอบของคุณ
  • อักขระที่ต้องเปลี่ยนคือ codepoints ASCII 0x41 - 0x5Aและ0x61-0x7A- ตัวอักษรตัวใหญ่และตัวเล็ก

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


เนื่องจากนี่คือแคตตาล็อกภาษาที่สร้างขึ้นหลังจากความท้าทายนี้ได้รับอนุญาตให้แข่งขัน โปรดทราบว่าจะต้องมีล่ามเพื่อให้สามารถส่งการทดสอบได้ ได้รับอนุญาต (และสนับสนุนให้) เขียนล่ามนี้ด้วยตัวคุณเองสำหรับภาษาที่ยังไม่ได้ใช้งานมาก่อน นอกเหนือจากนั้นต้องปฏิบัติตามกฎมาตรฐานทั้งหมดของการการส่งในภาษาส่วนใหญ่จะได้คะแนนเป็นไบต์ในการเข้ารหัสที่มีมาก่อน (ปกติคือ UTF-8)

แค็ตตาล็อก

สแต็คส่วนย่อยที่ด้านล่างของโพสต์นี้สร้างแคตตาล็อกจากคำตอบ a) เป็นรายการคำตอบสั้นที่สุดต่อภาษาและ b) เป็นลีดเดอร์บอร์ดโดยรวม

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยหัวข้อโดยใช้เทมเพลต Markdown ต่อไปนี้:

## Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

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

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (เช่นเนื่องจากคะแนนของคุณคือผลรวมของไฟล์สองไฟล์หรือคุณต้องการแสดงรายการบทลงโทษการตั้งค่าสถานะของล่ามแยกต่างหาก) ตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นตัวเลขสุดท้ายในส่วนหัว:

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

คุณสามารถทำให้ชื่อภาษาเป็นลิงค์ซึ่งจะปรากฏในตัวอย่างข้อมูล:

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


8
"คุณอาจจะทำสิ่งนี้ด้วยการทำการบ้านถ้าเป็นเช่นนั้นโปรดอย่าคัดลอกคำตอบเหล่านี้อาจารย์ของคุณแทบไม่ต้องการคำตอบที่นี่เลย" ฉันสงสัยว่าจะเกิดอะไรขึ้นถ้าคุณส่งครูที่มีอักขระ 90 ตัวไปทางลัดและทางลัด ...
ASCIIThenANSI

คำตอบ:


9

Pyth, 13 ไบต์

uXGH.<HQrBG1z

ชุดทดสอบ

โดยพื้นฐานแล้วเราเริ่มต้นด้วยสองสายที่เราต้องการเปลี่ยนซีซาร์ตัวอักษรตัวเล็กและตัวพิมพ์ใหญ่ รายการที่มีทั้งสองนี้ถูกสร้างขึ้นโดยrBG1bifurcate บนตัวพิมพ์ใหญ่ จากนั้นเราลดรายการนี้เริ่มต้นด้วยสตริงอินพุตและแปลตัวพิมพ์เล็กก่อนจากนั้นจึงพิมพ์ตัวอักษรตัวใหญ่ตามการเลื่อนที่เหมาะสม


ดีมากฉันลืมการแยกไปสองทางมีอยู่ ... : P
FryAmTheEggman


5

แพ็คเกจ Bash + bsd-game อายุ 21

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

Builtins FTW! เกือบจะรู้สึกเหมือน Mathematica คำตอบของ Pyth ยังสั้นกว่านี้

อินพุตสตริงอ่านจาก STDIN และเลขจำนวนเต็มจากบรรทัดคำสั่ง เช่น:

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

หรือถ้าคุณไม่ชอบ builtin:

Bash + coreutils, 63

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

สำหรับฉันแล้วดูเหมือนว่ารุ่น coreutils ไม่ทำงานกับ -127 และ / หรือ 127?
Neil

@ Neil ใช่ จับดี. คงที่
Digital Trauma

5

JavaScript (ES6), 122 118 114 111 ไบต์

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

บันทึกแล้ว 4 ไบต์ขอบคุณ@Neil !

คำอธิบาย

ขั้นแรกให้รับสายป้อนข้อมูล ที่สองคือตัวเลขที่จะเลื่อนตัวอักษรแต่ละตัวโดย

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
ดีมาก! แต่มันไม่สามารถใช้งานได้กับอินพุตทั้งหมด "abcdefg", -26ความพยายาม (x-a+n+130)%26นี้สามารถแก้ไขได้โดยการเปลี่ยนสูตรการ
ETHproductions

@ ETHproductions ขอขอบคุณที่ติดตาม!
user81655

"คุณต้องสร้างโปรแกรมเต็มรูปแบบไม่ใช่เพียงแค่ฟังก์ชั่นหรือตัวอย่างเท่านั้น"
LegionMammal978

@ LegionMammal978 ขอบคุณฉันไม่ได้สังเกตว่า
user81655

ไม่a=x&96,(x-a+n+129)%26+a+1ช่วยเหลือ?
Neil

3

CJam, 34 22 21 20 bytes

ขอบคุณ FryAmTheEggman ที่ช่วยประหยัด 1 ไบต์

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

ทดสอบที่นี่

อินพุตคือสตริงที่จะเป็น shifte ในบรรทัดแรกและการเลื่อนบนวินาที

คำอธิบาย

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 The '[,_el^เป็นเคล็ดลับจาก Dennis ฉันไม่รู้ว่าคุณหมายถึงอะไรfดูเหมือนว่าการใช้งานปกติค่อนข้างใช่ไหม
Martin Ender

ฉันเดาว่าฉันยังไม่ได้อ่านคำตอบของ CJam ที่เพียงพอ: P มันดูเหมือนเรียบร้อยจริงๆที่จะใช้มันเหมือนแผนที่ แต่เปลี่ยนลำดับการโต้แย้ง
FryAmTheEggman

@FryAmTheEggman จริง ๆ แล้วฉันไม่ต้องการ@เลย :)
Martin Ender

2

Java, 249 ไบต์

นี่มันสั้นที่สุดที่ฉันจะได้รับ การอ่านจาก stdin กินหนึ่งไบต์ โซลูชันที่ใช้บรรทัดคำสั่ง args สั้นลงอย่างเห็นได้ชัด แต่งานนี้ระบุ stdin สำหรับอินพุต

รูปแบบการป้อนข้อมูลคือสตริงก่อนตามด้วยหมายเลขกะบนบรรทัดใหม่

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

การใช้บรรทัดคำสั่งอาร์กิวเมนต์ของโซลูชันนี้มีขนาดเพียง 188 ไบต์ อินพุตคือสตริงเป็นอาร์กิวเมนต์แรกและเลื่อนเป็นวินาที

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

รหัส

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
}

โปรแกรมนี้รับอินพุตผู้ใช้จาก STDIN อันดับแรกคือตัวเปลี่ยนจำนวนเต็มจากนั้นสตริงอักขระทีละตัวอักษร


1

Perl, 81 ไบต์

(+1 สำหรับ-pธง)

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

ยังคงทำงานเกี่ยวกับการเล่นกอล์ฟลง ...

ทดสอบ:

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

Python 2 163 160 bytes

ไม่แน่ใจว่าฉันยังสามารถลงสนามได้หรือไม่

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

เนื่องจากเป็นไฟล์ที่อ่านไม่ได้นี่เป็นเวอร์ชั่นที่ไม่ดีนัก:

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)

เกี่ยวกับอินพุต: มันต้องการอาร์กิวเมนต์สองตัวโดยตัวแรกจะต้องเป็นสตริงและตัวที่สองจะเป็นจำนวนเต็ม (จำนวนกะ) ตัวอย่าง (ไฟล์ที่เรียกว่าcsr.py):

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

หมายเหตุ: ในตัวอย่างที่สองต้องใช้อักขระยกเว้นและ""จำเป็น


1

Python 2, 118 116 ไบต์

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อินสแตนซ์ ( codegolf.stackexchange.com/a/62/36885 ) ตัวอย่างเช่นprint''.join([[c,chr((ord(c)-97+n)%26+97)]['~'<c<'{'],chr((ord(c)-65+n)%26+65)]['@'<c<'[']for c in s)สั้นกว่าเล็กน้อยและควรใช้งานได้เหมือนกัน (ยกเว้นเปลี่ยนเครื่องหมายตัวหนอนเป็นแบ็คทิคอย่างที่คุณเคยทำมาก่อน - ฉันไม่สามารถแสดง
แบ็

1

Mathematica, 117 ไบต์

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

รับสตริงตามด้วยการขึ้นบรรทัดใหม่ตามด้วยปัจจัยการเลื่อน อาจยังสามารถเล่นกอล์ฟได้ ...


1

Perl 6 , 73 + 1 = 74 ไบต์

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

บรรทัดแรกของการป้อนข้อมูลคือจำนวนตัวอักษรเพื่อเลื่อนตัวอักษรขึ้น

การใช้งาน:

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

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

การใช้งาน:

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

0

k4, 80 ไบต์

โปรแกรมรับหมายเลขกะเป็นอาร์กิวเมนต์บรรทัดคำสั่งและอ่านข้อความจาก stdin

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

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

นี่คือตัวอย่างของการดำเนินการ:

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

และนี่คือสายรัดทดสอบที่งี่เง่าที่ตรวจสอบทั้งการเข้ารหัสและการถอดรหัส (นี่คือzsh; สำหรับbashหรือkshเปลี่ยนการforทำดัชนีลูปเป็นอาเรย์ที่((i=0;i<5;i++))อ้างอิงแบบหนึ่ง ugh .... )

% 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
% 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.