Ca ca


22

Một ca làm việc của Caesar có lẽ là điều mà tất cả chúng ta đều quen thuộc.

(Bạn thậm chí có thể thực hiện nó như một nhiệm vụ bài tập về nhà. Nếu vậy, xin vui lòng không sao chép những câu trả lời này, giáo viên của bạn gần như chắc chắn không muốn bất cứ điều gì như câu trả lời ở đây.)

Chỉ trong trường hợp bạn không có, ca Caesar là một dạng mật mã rất đơn giản. Nó nhận một chuỗi được mã hóa và một số nguyên. Sau đó, với mỗi ký tự chữ cái trong chuỗi, thực hiện chuyển đổi sau:

  1. Tìm ra vị trí của nhân vật trong bảng chữ cái (dựa trên 0).
  2. Thêm vào số đó số nguyên nhận được ở đầu.
  3. Trong khi con số lớn hơn 25, trừ 26 từ nó.
  4. Làm việc ở vị trí của bảng chữ cái.

Để lại phần còn lại của các nhân vật không di chuyển.

Chữ in hoa phải được tôn trọng vì tiếng Anh không có chữ in hoa là gì?

Ví dụ:

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

Giả định

  • Bạn có thể nhận được bất kỳ ký tự ASCII có thể in
  • Số đầu vào có thể âm và sẽ luôn lớn hơn -128 và nhỏ hơn 128 ( -128<x<128)
  • Bạn phải có khả năng mã hóa chữ in hoa và chữ không viết hoa đảo ngược.
  • Bạn phải tạo một chương trình đầy đủ, không chỉ là một chức năng hoặc đoạn trích
  • Bạn sẽ nhận được đầu vào của bạn từ STDIN hoặc thay thế gần nhất
  • Bạn có thể chọn định dạng cho đầu vào của bạn, vui lòng nêu điều này trong câu trả lời của bạn
  • Các ký tự cần được dịch chuyển là các mật mã ASCII 0x41 - 0x5A0x61-0x7A- chữ in hoa và in thường

    • Chữ in hoa nên giữ nguyên
    • Chữ thường nên ở mức thấp hơn
    • Các nhân vật không nằm trong phạm vi này nên được để nguyên
  • Lưu ý cho thử thách này, bạn chỉ phải mã hóa chuỗi, bạn không phải giải quyết chúng tự động (nhưng việc đưa ra -xsẽ đảo ngược mật mã)


Vì đây là một danh mục, các ngôn ngữ được tạo sau thử thách này được phép cạnh tranh. Lưu ý rằng phải có một thông dịch viên để trình có thể được kiểm tra. Được phép (và thậm chí được khuyến khích) tự viết trình thông dịch này cho một ngôn ngữ chưa được thực hiện trước đó. Ngoài ra, tất cả các quy tắc tiêu chuẩn của phải được tuân theo. Đệ trình trong hầu hết các ngôn ngữ sẽ được ghi bằng byte trong một mã hóa có sẵn từ trước (thường là UTF-8).

Mục lục

Đoạn trích Stack ở cuối bài đăng này tạo ra danh mục từ các câu trả lời a) dưới dạng danh sách các giải pháp ngắn nhất cho mỗi ngôn ngữ và b) dưới dạng bảng xếp hạng tổng thể.

Để đảm bảo rằng câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề, sử dụng mẫu Markdown sau:

## Language Name, N bytes

nơi Nlà kích thước của trình của bạn. Nếu bạn cải thiện điểm số của mình, bạn có thể giữ điểm số cũ trong tiêu đề, bằng cách đánh bại chúng thông qua. Ví dụ:

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

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vì điểm của bạn là tổng của hai tệp hoặc bạn muốn liệt kê riêng các hình phạt cờ của thông dịch viên), hãy đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề:

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

Bạn cũng có thể đặt tên ngôn ngữ thành liên kết sau đó sẽ hiển thị trong đoạn trích:

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


8
"Bạn thậm chí có thể làm nó như một nhiệm vụ bài tập về nhà. Nếu vậy, xin vui lòng không sao chép những câu trả lời này, giáo viên của bạn gần như chắc chắn không muốn bất cứ điều gì như câu trả lời ở đây ." Tôi tự hỏi điều gì sẽ xảy ra nếu bạn trao cho giáo viên một ký tự và các phím tắt lộn xộn 90 byte ...
ASCIIThenANSI

Câu trả lời:


9

Bình thường, 13 byte

uXGH.<HQrBG1z

Bộ kiểm tra

Về cơ bản, chúng tôi bắt đầu với hai chuỗi chúng tôi muốn thay đổi caesar, bảng chữ cái chữ thường và chữ hoa. Danh sách chứa cả hai thứ này được tạo bởi rBG1, bifurcate trên chữ hoa. Sau đó, chúng tôi giảm qua danh sách này, bắt đầu bằng chuỗi đầu vào và dịch chữ thường đầu tiên, sau đó viết chữ hoa theo ca thích hợp.


Rất hay, tôi cứ quên mất sự phân chia tồn tại ...: P
FryAmTheEggman


5

Gói trò chơi Bash + bsd, 21

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

Nội dung FTW! Hầu như cảm thấy như Mathicala. Câu trả lời Pyth vẫn còn ngắn hơn mặc dù.

Chuỗi đầu vào đọc từ STDIN và số nguyên từ dòng lệnh. ví dụ:

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

Hoặc nếu bạn không thích nội dung:

Bash + coreutils, 63

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

Dường như với tôi rằng phiên bản coreutils không hoạt động với -127 và / hoặc 127?
Neil

@Neil Vâng. Nắm bắt tốt. Đã sửa.
Chấn thương kỹ thuật số

5

JavaScript (ES6), 122 118 114 111 byte

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

Đã lưu 4 byte nhờ @Neil !

Giải trình

Dấu nhắc đầu tiên lấy chuỗi đầu vào. Thứ hai là số để thay đổi từng chữ cái.

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
Rất đẹp! Nhưng nó không hoạt động trên tất cả các đầu vào; thử "abcdefg", -26. Điều này có thể được sửa bằng cách thay đổi công thức thành (x-a+n+130)%26.
Sản xuất ETH

@ETHproductions Cảm ơn bạn đã nắm bắt được điều đó!
dùng81655

"Bạn phải tạo một chương trình đầy đủ, không chỉ là một chức năng hoặc đoạn trích"
LegionMammal978

@ LegionMammal978 Cảm ơn, tôi đã không nhận thấy điều đó.
dùng81655

a=x&96,(x-a+n+129)%26+a+1giúp được không?
Neil

3

CJam, 34 22 21 20 byte

Cảm ơn FryAmTheEggman vì đã tiết kiệm 1 byte.

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

Kiểm tra nó ở đây.

Đầu vào là chuỗi được dịch chuyển trên dòng đầu tiên và dịch chuyển trên dòng thứ hai.

Giải trình

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 Đây '[,_el^là một mẹo từ Dennis. Tôi không biết ý của bạn là gì f, có vẻ như việc sử dụng khá bình thường?
Martin Ender

Tôi đoán là tôi chưa đọc đủ câu trả lời của CJam: P Có vẻ như thực sự gọn gàng khi sử dụng nó như bản đồ nhưng thay đổi thứ tự đối số.
FryAmTheEggman

@FryAmTheEggman thực sự, tôi không cần @gì cả. :)
Martin Ender

2

Java, 249 byte

Điều này là ngắn như tôi có thể nhận được nó. Đọc từ stdin ăn rất nhiều byte. Một giải pháp sử dụng dòng lệnh args ngắn hơn đáng kể, nhưng tác vụ này chỉ định stdin cho đầu vào.

Định dạng đầu vào là Chuỗi đầu tiên theo sau là số ca trên một dòng mới.

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

Sử dụng dòng lệnh Đối số giải pháp này chỉ là 188 byte. Đầu vào là Chuỗi làm đối số đầu tiên và dịch chuyển là đối số thứ hai.

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 byte

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

vô dụng

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
}

Chương trình này lấy đầu vào của người dùng từ STDIN, đầu tiên là shifter số nguyên và sau đó là chuỗi, ký tự theo ký tự.


1

Perl, 81 byte

(+1 cho -pcờ)

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

Vẫn đang chơi golf ...

Kiểm tra:

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

Con trăn 2 163 160 byte

Không chắc chắn nếu tôi vẫn có thể đánh nó xuống ..

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

Vì nó khá khó đọc, nên đây là một phiên bản không được chỉnh sửa:

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)

Liên quan đến đầu vào: Nó mong đợi hai đối số, đầu tiên phải là một chuỗi và thứ hai là một số nguyên (số lượng thay đổi). Ví dụ (tệp được gọi làcsr.py ):

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

Lưu ý: Trong ví dụ thứ hai, một ký tự thoát và ""cần thiết


1

Python 2, 118 116 byte

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)

Bạn có thể muốn sử dụng danh sách thay vì các if/elsetrường hợp ( codegolf.stackexchange.com/a/62/36885 ). Ví dụ, print''.join([[c,chr((ord(c)-97+n)%26+97)]['~'<c<'{'],chr((ord(c)-65+n)%26+65)]['@'<c<'[']for c in s)ngắn hơn một chút, và nên hoạt động như nhau. (Ngoại trừ thay đổi dấu ngã thành backtick như bạn đã có trước đây - Tôi không thể hiển thị backtick đúng.)
mathmandan

1

Toán học, 117 byte

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

Lấy chuỗi, theo sau là một dòng mới, theo sau là hệ số dịch chuyển. Vẫn có thể chơi được ...


1

Perl 6 , 73 + 1 = 74 byte

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

Dòng đầu tiên là số lượng ký tự để dịch các chữ cái lên.

Sử dụng:

$ 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 byte

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

Sử dụng:

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

0

k4, 80 byte

Chương trình chấp nhận số ca làm đối số dòng lệnh và đọc văn bản từ stdin.

Do một hạn chế kỹ thuật, các dịch chuyển âm phải được mã hóa bằng dấu gạch dưới thay vì dấu gạch nối. (Không có trình phân tích cú pháp để diễn giải mã hóa này, giải pháp sẽ là 64 byte.)

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

Dưới đây là các ví dụ được thực hiện:

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

Và đây là một khai thác thử nghiệm nhỏ ngớ ngẩn xác minh cả mã hóa và giải mã. (Đây là zsh; cho bashhoặc ksh, thay đổi forlập chỉ mục vòng lặp thành ((i=0;i<5;i++)). Mảng dựa trên một, 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
% 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.