Um turno de César é provavelmente algo com o qual todos estamos familiarizados.
(Você pode até fazer isso como uma tarefa de casa. Se sim, por favor, não copie essas respostas, seu professor quase certamente não quer nada parecido com as respostas aqui.)
Caso não esteja, um turno de César é uma forma muito simples de cifra. É preciso uma string para ser cifrada e um número inteiro. Em seguida, para cada caractere alfabético na sequência, execute a seguinte transformação:
- Calcule a posição do personagem no alfabeto (com base em 0).
- Adicione a esse número o número inteiro recebido no início.
- Enquanto o número for maior que 25, subtraia 26 dele.
- Calcule a posição do alfabeto em que está.
Deixe o restante dos caracteres sem deslocamento.
As letras maiúsculas devem ser respeitadas porque o que é inglês sem letras maiúsculas?
Exemplos:
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
Suposições
- Você pode receber qualquer caractere ASCII imprimível
- O número de entrada pode ser negativo e sempre será maior que -128 e menor que 128 (
-128<x<128
)
- Você deve poder codificar letras maiúsculas e não maiúsculas de forma reversível.
- Você deve criar um programa completo, não apenas uma função ou trecho
- Você receberá sua entrada do STDIN ou do alternativo mais próximo
- Você pode escolher o formato para sua entrada, por favor, indique-o na sua resposta
Os caracteres que precisam ser deslocados são pontos de código ASCII 0x41 - 0x5A
e 0x61-0x7A
- letras maiúsculas e minúsculas
- Letras maiúsculas devem ficar em maiúsculas
- Letras minúsculas devem ficar em minúsculas
- Os caracteres fora desse intervalo devem ser deixados como estão.
Nota para este desafio: você só precisa codificar cadeias de caracteres, não precisa resolvê-las automaticamente (mas a doação -x
reverterá a codificação)
Por se tratar de um catálogo, os idiomas criados após esse desafio podem competir. Observe que deve haver um intérprete para que o envio possa ser testado. É permitido (e até encorajado) escrever esse intérprete para um idioma anteriormente não implementado. Fora isso, todas as regras padrão do código-golfe devem ser obedecidas. Os envios na maioria dos idiomas serão pontuados em bytes em uma codificação preexistente apropriada (geralmente UTF-8).
Catálogo
O snippet de pilha na parte inferior desta postagem gera o catálogo a partir das respostas a) como uma lista da solução mais curta por idioma eb) como uma tabela geral de líderes.
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
## Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:
## Perl, 43 + 2 (-p flag) = 45 bytes
Você também pode transformar o nome do idioma em um link que será exibido no snippet:
## [<><](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>
Respostas:
Pitão, 13 bytes
Suíte de teste
Basicamente, começamos com as duas strings que queremos alterar em césar, os alfabetos em minúsculas e maiúsculas. A lista que contém ambos é gerada por
rBG1
, bifurca em maiúsculas. Em seguida, reduzimos essa lista, iniciando com a sequência de entrada e traduzindo primeiro letras minúsculas e depois letras maiúsculas no turno apropriado.fonte
Pyth, 16
Experimente online ou execute um Test Suite
fonte
Pacote Bash + bsd-games, 21
Builtins FTW! Quase parece o Mathematica. Respostas Pyth ainda são mais curtas.
String de entrada lida em STDIN e número inteiro na linha de comando. por exemplo:
Ou se você não gosta do incorporado:
Bash + coreutils, 63
fonte
JavaScript (ES6),
122118114111 bytesGuardado 4 bytes graças a @Neil !
Explicação
O primeiro prompt pega a sequência de entrada. O segundo é o número pelo qual cada letra é deslocada.
fonte
"abcdefg", -26
. Isso pode ser corrigido alterando a fórmula para(x-a+n+130)%26
.a=x&96,(x-a+n+129)%26+a+1
ajuda?CJam,
34222120 bytesAgradecemos a FryAmTheEggman por economizar 1 byte.
Teste aqui.
Entrada é a sequência a ser trocada na primeira linha e a troca na segunda.
Explicação
fonte
'[,_el^
é uma dica de Dennis. Eu não sei o que você quer dizer comf
isso, parece um uso bastante normal?@
nada. :)Java, 249 bytes
Isso é o mais curto que eu pude entender. A leitura de stdin consome uma tonelada de bytes. Uma solução usando args da linha de comando é visivelmente mais curta, mas esta tarefa especificou stdin para entrada.
O formato de entrada é a String primeiro, seguida pelo número do turno em uma nova linha.
Usando argumentos da linha de comando, esta solução tem apenas 188 bytes. Input é a String como o primeiro argumento e a mudança como o segundo.
fonte
R, 111 bytes
código
destroçado
Este programa pega a entrada do usuário de STDIN, primeiro o deslocador inteiro e depois a sequência, caractere por caractere.
fonte
Perl, 81 bytes
(+1 para a
-p
bandeira)Ainda trabalhando no golfe ...
Teste:
fonte
Japonês,
4543 bytesExperimente online!
fonte
Python 2,
163160 bytesNão tenho certeza se ainda posso jogar golfe ..
Já que é bastante ilegível, aqui está uma versão não destruída:
Com relação à entrada: espera dois argumentos, o primeiro deve ser uma sequência e o segundo um número inteiro (a quantidade de turno). Exemplos (o arquivo é chamado
csr.py
):Nota: No segundo exemplo, um caractere de escape e
""
são necessáriosfonte
Python 2,
118116 bytesfonte
if/else
instâncias ( codegolf.stackexchange.com/a/62/36885 ). Por exemplo,print''.join([[c,chr((ord(c)-97+n)%26+97)]['~'<c<'{'],chr((ord(c)-65+n)%26+65)]['@'<c<'[']for c in s)
é um pouco mais curto e deve funcionar da mesma maneira. (Exceto a mudança o til a um backtick como você tinha antes - eu não poderia começar a crase para display direito.)Mathematica, 117 bytes
Pega a sequência, seguida por uma nova linha, seguida pelo fator de mudança. Ainda pode ser jogável ...
fonte
Perl 6 , 73 + 1 = 74 bytes
A primeira linha de entrada é o número de caracteres para aumentar as letras.
Uso:
fonte
C ++,
163154152 bytesUso:
fonte
k4, 80 bytes
O programa aceita o número do turno como argumento da linha de comando e lê o texto de stdin.
Devido a uma restrição técnica, as mudanças negativas devem ser codificadas com um sublinhado em vez de um hífen-menos. (Sem o analisador para interpretar essa codificação, a solução seria 64 bytes.)
Aqui estão os exemplos executados:
E aqui está um pequeno equipamento de teste bobo que verifica tanto a codificação quanto a decodificação. (Isto é
zsh
; parabash
ouksh
, altere afor
indexação do loop para((i=0;i<5;i++))
. Matrizes baseadas em um, ugh ....)fonte