Un cambio de César es probablemente algo con lo que todos estamos familiarizados.
(Puede que incluso lo esté haciendo como tarea de tarea. Si es así, por favor no copie estas respuestas, su maestro seguramente no quiere nada como las respuestas aquí).
En caso de que no lo estés, un cambio César es una forma muy simple de cifrado. Se necesita una cadena para ser cifrada y un número entero. Luego, para cada carácter alfabético en la cadena, realice la siguiente transformación:
- Calcula la posición del personaje en el alfabeto (basado en 0).
- Agregue a ese número el entero recibido al principio.
- Si bien el número es mayor que 25, resta 26 de él.
- Calcule la posición del alfabeto en el que se encuentra.
Deje el resto de los personajes sin cambiar.
Las letras mayúsculas deben respetarse porque ¿qué es el inglés sin mayúsculas?
Ejemplos:
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
Supuestos
- Puede recibir cualquier carácter ASCII imprimible
- El número de entrada puede ser negativo y siempre será mayor que -128 y menor que 128 (
-128<x<128
)
- Debe poder codificar letras mayúsculas y no mayúsculas de forma reversible.
- Debe crear un programa completo, no solo una función o fragmento
- Obtendrá su opinión de STDIN o la alternativa más cercana
- Puede elegir el formato para su entrada, indíquelo en su respuesta
Los caracteres que deben desplazarse son puntos de código ASCII 0x41 - 0x5A
y 0x61-0x7A
- letras mayúsculas y minúsculas
- Las letras mayúsculas deben permanecer mayúsculas
- Las letras minúsculas deben permanecer más bajas
- Los caracteres que no están en este rango deben dejarse como están
Tenga en cuenta que para este desafío, solo tiene que cifrar las cadenas, no tiene que ser capaz de resolverlas automáticamente (pero dar -x
invertirá el cifrado)
Como se trata de un catálogo, los idiomas creados después de este desafío pueden competir. Tenga en cuenta que debe haber un intérprete para que se pueda probar el envío. Está permitido (e incluso alentado) escribir este intérprete usted mismo para un lenguaje previamente no implementado. Aparte de eso, se deben obedecer todas las reglas estándar del golf de código . Las presentaciones en la mayoría de los idiomas se puntuarán en bytes en una codificación preexistente apropiada (generalmente UTF-8).
Catalogar
El Fragmento de pila al final de esta publicación genera el catálogo a partir de las respuestas a) como una lista de la solución más corta por idioma yb) como una tabla de clasificación general.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
## Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
## Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
## Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento:
## [<><](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>
Respuestas:
Pyth, 13 bytes
Banco de pruebas
Básicamente, comenzamos con las dos cadenas que queremos desplazar por césar, los alfabetos en minúsculas y mayúsculas. La lista que contiene ambos es generada por
rBG1
bifurcado en mayúsculas. Luego, reducimos esta lista, comenzando con la cadena de entrada y traduciendo primero las letras minúsculas y luego las mayúsculas por el cambio apropiado.fuente
Pyth, 16
Pruébelo en línea o ejecute un Test Suite
fuente
Paquete Bash + bsd-games, 21
Construido FTW! Casi se siente como Mathematica. Sin embargo, las respuestas de Pyth son aún más cortas.
Cadena de entrada leída desde STDIN y entero desde la línea de comandos. p.ej:
O si no te gusta el incorporado:
Bash + coreutils, 63
fuente
JavaScript (ES6),
122118114111 bytes¡Guardado 4 bytes gracias a @Neil !
Explicación
El primer mensaje toma la cadena de entrada. El segundo es el número para cambiar cada letra.
fuente
"abcdefg", -26
. Esto se puede solucionar cambiando la fórmula a(x-a+n+130)%26
.a=x&96,(x-a+n+129)%26+a+1
ayuda?CJam,
34222120 bytesGracias a FryAmTheEggman por guardar 1 byte.
Pruébalo aquí.
La entrada es la cadena que se desplazará en la primera línea y el desplazamiento en la segunda.
Explicación
fuente
'[,_el^
es un consejo de Dennis. Sinf
embargo, no sé a qué te refieres , ¿parece un uso bastante normal?@
nada. :)Java, 249 bytes
Esto es lo más corto que pude obtener. La lectura de stdin consume una tonelada de bytes. Una solución que usa args de línea de comando es notablemente más corta pero, esta tarea especificó stdin para entrada.
El formato de entrada es la Cadena seguida primero por el número de turno en una nueva línea.
Usando argumentos de línea de comando, esta solución tiene solo 188 bytes. La entrada es la Cadena como primer argumento y el cambio como el segundo.
fuente
R, 111 bytes
código
sin golf
Este programa toma la entrada del usuario de STDIN, primero el desplazador de números enteros y luego la cadena, carácter por carácter.
fuente
Perl, 81 bytes
(+1 para la
-p
bandera)Todavía estoy trabajando en jugar golf ...
Prueba:
fuente
Japt,
4543 bytesPruébalo en línea!
fuente
Pitón 2,
163160 bytesNo estoy seguro si todavía puedo jugar golf ...
Dado que es bastante ilegible, aquí hay una versión sin golf:
En cuanto a la entrada: espera dos argumentos, el primero debe ser una cadena y el segundo un número entero (la cantidad de desplazamiento). Ejemplos (se llama archivo
csr.py
):Nota: en el segundo ejemplo,
""
se necesita un carácter de escapefuente
Python 2,
118116bytesfuente
if/else
instancias ( codegolf.stackexchange.com/a/62/36885 ). Por ejemplo,print''.join([[c,chr((ord(c)-97+n)%26+97)]['~'<c<'{'],chr((ord(c)-65+n)%26+65)]['@'<c<'[']for c in s)
es un poco más corto y debería funcionar igual. (Excepto el cambio de la tilde a un acento grave como que tenía antes - no pude conseguir el acento grave a pantalla derecha.)Mathematica, 117 bytes
Toma la secuencia, seguida de una nueva línea, seguida del factor de desplazamiento. Todavía podría ser golfable ...
fuente
Perl 6 , 73 + 1 = 74 bytes
La primera línea de entrada es el número de caracteres por los que se desplazan las letras hacia arriba.
Uso:
fuente
C ++,
163154152 bytesUso:
fuente
k4, 80 bytes
El programa acepta el número de turno como un argumento de línea de comandos y lee el texto de stdin.
Debido a una restricción técnica, los desplazamientos negativos deben codificarse con un guión bajo en lugar de un guión menos. (Sin el analizador para interpretar esta codificación, la solución sería de 64 bytes).
Aquí están los ejemplos ejecutados:
Y aquí hay un pequeño arnés de prueba que verifica tanto la codificación como la decodificación. (Esto es
zsh
; parabash
oksh
, cambie lafor
indexación del bucle a((i=0;i<5;i++))
. Matrices basadas en uno, ugh ...)fuente