시저 시프 팅


22

시저 이동은 아마도 우리 모두에게 친숙 할 것입니다.

(당신은 숙제로 할 수도 있습니다. 그렇다면 대답을 복사하지 마십시오. 선생님은 거의 여기에서 답변과 같은 것을 원하지 않습니다.)

그렇지 않은 경우, 시저 이동은 매우 간단한 형태의 암호입니다. 암호화 할 문자열과 정수가 필요합니다. 그런 다음 문자열의 모든 알파벳 문자에 대해 다음 변환을 수행하십시오.

  1. 알파벳의 문자 위치를 계산하십시오 (0 기반).
  2. 처음에받은 정수를 그 숫자에 더하십시오.
  3. 숫자가 25보다 크면 26을 빼십시오.
  4. 알파벳의 위치를 ​​정하십시오.

나머지 문자는 변경하지 마십시오.

대문자가없는 영어 란 무엇입니까? 대문자는 존중되어야합니다.

예 :

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 또는 가장 가까운 대체품에서 입력을받습니다.
  • 입력 한 형식을 선택할 수 있습니다. 답을 기재하십시오.
  • 필요가 이동되는 것을 문자는 아스키 코드 포인트입니다 0x41 - 0x5A0x61-0x7A대문자와 소문자 -

    • 대문자는 대문자로 유지해야합니다
    • 소문자는 낮게 유지해야합니다
    • 이 범위에 있지 않은 문자는 그대로 두어야합니다
  • 이 문제에 대한 참고 사항은 문자열을 암호화해야하며 문자열을 자동으로 해결할 수 -x는 없지만 ( 암호를 주는 것은 암호를 되돌릴 것입니다)


이것은 카탈로그이기 때문에이 도전 이후에 만들어진 언어는 경쟁 할 수 있습니다. 제출물을 테스트하려면 통역사가 있어야합니다. 이전에 구현되지 않은 언어에 대해이 통역사를 직접 작성할 수 있습니다. 그 외에도 의 모든 표준 규칙을 준수해야합니다. 대부분의 언어로 된 제출물은 적절한 기존 인코딩 (보통 UTF-8)으로 바이트 단위로 채점됩니다.

목록

이 게시물의 맨 아래에있는 스택 스 니펫은 답변 a) 언어 당 가장 짧은 솔루션 목록으로, b) 전체 리더 보드로 카탈로그를 생성합니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

## 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 바이트 kludge를
건네면 어떻게 될지 궁금해

답변:


9

Pyth, 13 바이트

uXGH.<HQrBG1z

테스트 스위트

기본적으로, 우리는 시저 이동을 원하는 두 개의 문자열, 소문자와 대문자로 시작합니다. 이 두 가지를 모두 포함하는 목록 rBG1은 대문자로 분기하여 생성됩니다 . 그런 다음 입력 문자열로 시작하여 첫 번째 소문자를 번역 한 다음 대문자를 적절한 이동으로 변환하여이 목록을 줄입니다.


아주 좋은, 나는 분기가 존재하는 것을 잊어
버린다


5

배쉬 + bsd- 게임 패키지, 21

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

내장 FTW! 거의 Mathematica와 같은 느낌입니다. Pyth 답변은 여전히 ​​짧습니다.

STDIN에서 입력 문자열을 읽고 명령 행에서 정수를 입력하십시오. 예 :

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

또는 내장 기능이 마음에 들지 않으면

배쉬 + 코어 유틸리티, 63

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

coreutils 버전이 -127 및 / 또는 127에서 작동하지 않는 것 같습니다.
Neil

@ 닐 예. 잘 잡았습니다. 결정된.
Digital Trauma

5

자바 스크립트 (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()))

@Neil 덕분에 4 바이트가 절약되었습니다 !

설명

첫 번째 프롬프트는 입력 문자열을받습니다. 두 번째는 각 문자를 바꾸는 숫자입니다.

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

고마워요.
user81655

합니까의 a=x&96,(x-a+n+129)%26+a+1도움?
Neil

3

CJam, 34 22 21 20 바이트

1 바이트를 절약 한 FryAmTheEggman에게 감사합니다.

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

여기에서 테스트하십시오.

입력은 첫 번째 줄에서 이동할 문자열이고 두 번째 줄에서 전환 할 문자열입니다.

설명

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

자바, 249 바이트

이것은 내가 얻을 수있는 한 짧습니다. stdin에서 읽으려면 많은 바이트가 필요합니다. 명령 행 인수를 사용하는 솔루션은 눈에 띄게 짧지 만이 태스크는 입력을 위해 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))}

언 골프

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

펄, 81 바이트

( -p플래그에 +1 )

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

파이썬 2, 163160 바이트

그래도 골프를 칠 수 있을지 모르겠습니다.

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

읽을 수 없기 때문에 다음은 ungolfed 버전입니다.

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

파이썬 2, 118116 바이트

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인스턴스 ( listgolf.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

수학, 117 바이트

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

문자열, 줄 바꾸기, 이동 요소를 차례로받습니다. 여전히 골프를 할 수 있습니다 ...


1

펄 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또는 for이고 ksh, for루프 인덱싱을 ((i=0;i<5;i++)). One-based arrays, 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.