Цезарь Шифтинг


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 или ближайшего заместителя
  • Вы можете выбрать формат для ввода, пожалуйста, укажите это в своем ответе
  • Символы, которые должны быть сдвинуты, являются кодовыми точками ASCII 0x41 - 0x5Aи 0x61-0x7A- заглавными и строчными буквами

    • Прописные буквы должны оставаться верхними
    • Строчные буквы должны оставаться ниже
    • Символы, не входящие в этот диапазон, должны быть оставлены как есть
  • Заметьте, что для этой задачи вам нужно только зашифровать строки, вам не нужно будет автоматически их решать (но сдача -xперевернет шифр)


Поскольку это каталог, языки, созданные после этого конкурса, могут конкурировать. Обратите внимание, что должен быть переводчик, чтобы представление можно было проверить. Разрешается (и даже поощряется) самостоятельно писать этот переводчик для ранее не реализованного языка. Кроме этого, все стандартные правила должны соблюдаться. Материалы на большинстве языков будут оцениваться в байтах в соответствующей существующей кодировке (обычно UTF-8).

Каталог

Фрагмент стека в нижней части этого поста создает каталог из ответов а) в виде списка кратчайшего решения для каждого языка и б) в качестве общей таблицы лидеров.

Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:

## 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
«Возможно, вы даже делаете это как домашнее задание. Если это так, пожалуйста, не копируйте эти ответы, ваш учитель почти наверняка не хочет ничего подобного здесь ». Интересно, что произойдет, если вы
передадите

Ответы:


9

Pyth, 13 байт

uXGH.<HQrBG1z

Тестирование

По сути, мы начинаем с двух строк, которые мы хотим сдвинуть кесарево, алфавитов в нижнем и верхнем регистре. Список, содержащий оба из них, генерируется rBG1, раздвоенным верхним регистром. Затем мы сокращаем этот список, начиная с входной строки и переводя сначала строчные, а затем заглавные буквы на соответствующий сдвиг.


Очень хорошо, я постоянно забываю, что бифуркация существует ...: P
FryAmTheEggman


5

Пакет bash + bsd-games, 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?
Нил

@ Нейл Да. Хороший улов. Исправлена.
Цифровая травма

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 19.12.15

Помогает a=x&96,(x-a+n+129)%26+a+1?
Нил

3

CJam, 34 22 21 20 байт

Спасибо FryAmTheEggman за сохранение 1 байта.

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 Это '[,_el^совет от Денниса. Я не знаю, что вы имеете в виду, fхотя, это похоже на довольно нормальное использование?
Мартин Эндер

Я думаю, я просто не прочитал достаточно ответов CJam: P Просто кажется очень удобным использовать его как карту, но изменить порядок аргументов.
FryAmTheEggman

@FryAmTheEggman на самом деле, мне вообще не нужно @. :)
Мартин Эндер

2

Java, 249 байт

Это так коротко, как я мог получить. Чтение со стандартного ввода съедает тонну байтов. Решение, использующее аргументы командной строки, заметно короче, но эта задача задала стандартный ввод для ввода.

Формат ввода - сначала строка, а затем номер смещения в новой строке.

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 байт

Не уверен, смогу ли я все еще играть в гольф ..

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 байтов

Программа принимает номер сдвига в качестве аргумента командной строки и читает текст из стандартного ввода.

Из-за технических ограничений отрицательные сдвиги должны кодироваться с подчеркиванием вместо дефиса-минуса. (Без синтаксического анализатора для интерпретации этой кодировки, решение будет 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++)). Одноосновные массивы, тьфу ....)

% 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
% 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.