Смена Цезаря - это, наверное, то, с чем мы все знакомы.
(Вы можете даже делать это как домашнее задание. Если это так, пожалуйста, не копируйте эти ответы, ваш учитель почти наверняка не хочет ничего подобного здесь.)
На всякий случай, если вы не являетесь, сдвиг Цезаря - это очень простая форма шифра. Требуется строка для шифрования и целое число. Затем для каждого алфавитного символа в строке выполните следующее преобразование:
- Определите положение персонажа в алфавите (на основе 0).
- Добавьте к этому числу целое число, полученное в начале.
- Хотя число больше 25, вычтите из него 26.
- Определите положение алфавита, в котором оно находится.
Оставьте остальных персонажей без изменений.
Прописные буквы должны соблюдаться, потому что что такое английский без заглавных букв?
Примеры:
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
<style>body { text-align: left !important} #answer-list { padding: 10px; width: 290px; float: left; } #language-list { padding: 10px; width: 290px; float: left; } table thead { font-weight: bold; } table td { padding: 5px; }</style><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="language-list"> <h2>Shortest Solution by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr> </thead> <tbody id="languages"> </tbody> </table> </div> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr> </thead> <tbody id="answers"> </tbody> </table> </div> <table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr> </tbody> </table><script>var QUESTION_ID = 67044; var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe"; var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk"; var OVERRIDE_USER = 32686; var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page; function answersUrl(index) { return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER; } function commentUrl(index, answers) { return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER; } function getAnswers() { jQuery.ajax({ url: answersUrl(answer_page++), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { answers.push.apply(answers, data.items); answers_hash = []; answer_ids = []; data.items.forEach(function(a) { a.comments = []; var id = +a.share_link.match(/\d+/); answer_ids.push(id); answers_hash[id] = a; }); if (!data.has_more) more_answers = false; comment_page = 1; getComments(); } }); } function getComments() { jQuery.ajax({ url: commentUrl(comment_page++, answer_ids), method: "get", dataType: "jsonp", crossDomain: true, success: function (data) { data.items.forEach(function(c) { if (c.owner.user_id === OVERRIDE_USER) answers_hash[c.post_id].comments.push(c); }); if (data.has_more) getComments(); else if (more_answers) getAnswers(); else process(); } }); } getAnswers(); var SCORE_REG = /<h\d>\s*([^\n,<]*(?:<(?:[^\n>]*>[^\n<]*<\/[^\n>]*>)[^\n,<]*)*),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/; var OVERRIDE_REG = /^Override\s*header:\s*/i; function getAuthorName(a) { return a.owner.display_name; } function process() { var valid = []; answers.forEach(function(a) { var body = a.body; a.comments.forEach(function(c) { if(OVERRIDE_REG.test(c.body)) body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>'; }); var match = body.match(SCORE_REG); if (match) valid.push({ user: getAuthorName(a), size: +match[2], language: match[1], link: a.share_link, }); else console.log(body); }); valid.sort(function (a, b) { var aB = a.size, bB = b.size; return aB - bB }); var languages = {}; var place = 1; var lastSize = null; var lastPlace = 1; valid.forEach(function (a) { if (a.size != lastSize) lastPlace = place; lastSize = a.size; ++place; var answer = jQuery("#answer-template").html(); answer = answer.replace("{{PLACE}}", lastPlace + ".") .replace("{{NAME}}", a.user) .replace("{{LANGUAGE}}", a.language) .replace("{{SIZE}}", a.size) .replace("{{LINK}}", a.link); answer = jQuery(answer); jQuery("#answers").append(answer); var lang = a.language; lang = jQuery('<a>'+lang+'</a>').text(); languages[lang] = languages[lang] || {lang: a.language, lang_raw: lang, user: a.user, size: a.size, link: a.link}; }); var langs = []; for (var lang in languages) if (languages.hasOwnProperty(lang)) langs.push(languages[lang]); langs.sort(function (a, b) { if (a.lang_raw > b.lang_raw) return 1; if (a.lang_raw < b.lang_raw) return -1; return 0; }); for (var i = 0; i < langs.length; ++i) { var language = jQuery("#language-template").html(); var lang = langs[i]; language = language.replace("{{LANGUAGE}}", lang.lang) .replace("{{NAME}}", lang.user) .replace("{{SIZE}}", lang.size) .replace("{{LINK}}", lang.link); language = jQuery(language); jQuery("#languages").append(language); } }</script>
Ответы:
Pyth, 13 байт
Тестирование
По сути, мы начинаем с двух строк, которые мы хотим сдвинуть кесарево, алфавитов в нижнем и верхнем регистре. Список, содержащий оба из них, генерируется
rBG1
, раздвоенным верхним регистром. Затем мы сокращаем этот список, начиная с входной строки и переводя сначала строчные, а затем заглавные буквы на соответствующий сдвиг.источник
Pyth, 16
Попробуйте онлайн или запустите Test Suite
источник
Пакет bash + bsd-games, 21
Встроенные FTW! Почти похоже на Mathematica. Pyth ответы все еще короче, хотя.
Входная строка читается из STDIN и целое число из командной строки. например:
Или, если вам не нравится встроенный:
Баш + кореутилс, 63
источник
JavaScript (ES6),
122118114111 байтСохранено 4 байта благодаря @Neil !
объяснение
Первая подсказка принимает входную строку. Второй номер, на который нужно сдвинуть каждую букву.
источник
"abcdefg", -26
. Это можно исправить, изменив формулу на(x-a+n+130)%26
.a=x&96,(x-a+n+129)%26+a+1
?CJam,
34222120 байтСпасибо FryAmTheEggman за сохранение 1 байта.
Проверьте это здесь.
Ввод - это строка, которую нужно сдвинуть в первой строке, а сдвиг - во второй.
объяснение
источник
'[,_el^
совет от Денниса. Я не знаю, что вы имеете в виду,f
хотя, это похоже на довольно нормальное использование?@
. :)Java, 249 байт
Это так коротко, как я мог получить. Чтение со стандартного ввода съедает тонну байтов. Решение, использующее аргументы командной строки, заметно короче, но эта задача задала стандартный ввод для ввода.
Формат ввода - сначала строка, а затем номер смещения в новой строке.
При использовании аргументов командной строки это решение занимает всего 188 байт. Ввод - это строка в качестве первого аргумента и сдвиг в качестве второго.
источник
R 111 байтов
код
ungolfed
Эта программа принимает пользовательский ввод из STDIN, сначала целочисленный сдвиг, а затем строку, символ за символом.
источник
Perl, 81 байт
(+1 за
-p
флаг)Все еще работаю над игрой в гольф ...
Тест:
источник
Japt,
4543 байтаПопробуйте онлайн!
источник
Python 2,
163160 байтНе уверен, смогу ли я все еще играть в гольф ..
Так как это довольно нечитаемо, вот версия без заглядывания:
Что касается входных данных: он ожидает два аргумента: первый должен быть строкой, а второй - целым числом (величина сдвига). Примеры (файл называется
csr.py
):Примечание: во втором примере символ экранирования и
""
необходимыисточник
Python 2,
118116 байтисточник
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)
немного короче, и должно работать так же. (За исключением того, что измените тильду наMathematica, 117 байт
Принимает строку, за которой следует новая строка с последующим коэффициентом смещения. Может еще быть в гольф ...
источник
Perl 6 , 73 + 1 = 74 байта
Первая строка ввода - это количество символов, на которое нужно сдвинуть буквы.
Использование:
источник
C ++,
163154152 байтаИспользование:
источник
k4, 80 байтов
Программа принимает номер сдвига в качестве аргумента командной строки и читает текст из стандартного ввода.
Из-за технических ограничений отрицательные сдвиги должны кодироваться с подчеркиванием вместо дефиса-минуса. (Без синтаксического анализатора для интерпретации этой кодировки, решение будет 64 байта.)
Вот выполненные примеры:
А вот маленький глупый тестовый комплект, который проверяет как кодирование, так и декодирование. (Это
zsh
; дляbash
илиksh
, изменитеfor
индексирование цикла на((i=0;i<5;i++))
. Одноосновные массивы, тьфу ....)источник