El objetivo de este desafío es escribir la función / programa más corto para tomar el texto de entrada, cifrarlo usando el método a continuación y devolver el resultado.
Como ejemplo, usaré la cadena hello world
.
Primero , obtenga el texto de entrada.
hello world
Segundo , convierta la cadena en ternario (base 3). Usa esta clave:
a = 000
b = 001
c = 002
d = 010
e = 011
f = 012
g = 020
...
w = 211
x = 212
y = 220
z = 221
[space] = 222
Con esta tecla, se hello world
convierte 021011102102112222211112122102010
, como se ve a continuación.
h e l l o w o r l d
021 011 102 102 112 222 211 112 122 102 010
Tercero , mueva el primer dígito al final.
021011102102112222211112122102010
becomes
210111021021122222111121221020100
Cuarto , convierta el número nuevamente en una cadena usando la misma clave.
210 111 021 021 122 222 111 121 221 020 100
v n h h r n q z g j
Por último , devuelva el texto cifrado.
vnhhr nqzgj
Aquí hay algunos ejemplos de texto y su salida:
the turtle ==> dvo fh ego
python ==> uudwqn
code golf ==> hpjoytqgp
Como se trata de código golf, gana la entrada más corta en bytes . Se permiten errores si algunos de los caracteres no son letras minúsculas o espacio. Este es mi primer desafío, por lo que cualquier sugerencia sería más que útil.
¡Buena suerte!
Tabla de clasificación:
var QUESTION_ID=54643;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var o=0;o<s.length;++o){var l=jQuery("#language-template").html(),t=s[o];l=l.replace("{{LANGUAGE}}",t.lang).replace("{{NAME}}",t.user).replace("{{SIZE}}",t.size).replace("{{LINK}}",t.link),l=jQuery(l),jQuery("#languages").append(l)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/,NUMBER_REG=/\d+/,LANGUAGE_REG=/^#*\s*([^,]+)/;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<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="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><div id="language-list"> <h2>Winners 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><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>
fuente
uint64
) usando poderes crecientes de27
. El desplazamiento por un dígito sería equivalente a multiplicar este entero grande por3
, y la introducción del primer dígito en el otro extremo sería simplemente una suma. Sin embargo, hay complicaciones, como descartando la última "acarreo" (tal vez a través de unamod
operación), y no pude conseguir que funcione con pocos bytesRespuestas:
Pyth,
2322 bytesPruébelo en línea: Regular Input / Test Suite
Gracias a @isaacg por un byte.
Explicación:
fuente
G
lugar de usarN
, por ejemplo=+Gd
.Pyth, 26 bytes
Pruébelo en línea en Pyth Compiler / Executor: demo | Casos de prueba
Idea
Suponga que todos los caracteres de entrada ya se han asignado a los enteros que especifica el paso 2.
Por cada número ternario de 3 dígitos, tenemos que xyz 3 = 9x + 3y + z , por lo que la división modular por 9 produce el cociente x residuo 3y + z .
Si la entrada es abc 3 def 3 ghi 3 , la aplicación de la división modular a cada uno produce a, 3b + c, d, 3e + f, g, 3h + i .
Después de rotar la lista desde arriba una unidad hacia la izquierda, podemos agrupar los enteros en pares. Esto produce la lista (3b + c, d), (3e + f, g), (3h + i, a) .
Ahora, si convertimos (3y + z, w) de base 3 a entero, obtenemos 3 (3y + z) + w = 9y + 3z + w = zyw 3 .
Por lo tanto, aplicar la conversión de base a la lista de pares nos da bcd 3 efg 3 hia 3 , que es precisamente el resultado de rotar los dígitos ternarios concatenados una unidad hacia la izquierda.
Todo lo que queda por hacer es asignar los enteros resultantes a los caracteres.
Código
fuente
Pitón 2, 96
Convierte un carácter
c
a un valorx
quex=(ord(c)-97)%91
, con el módulo que afectan solamente el espacio para convertirlo a 26. La conversión inversa esi
achr((i-26)%91+32)
, con el módulo solo afectandoi=26
para que se convierta en espacios.Recorremos los caracteres, notando el valor actual
x
y el valor anteriory
. Utilizamos los dos últimos dígitos ternarios dey
, encontrado comoy%9
, y el primer dígito ternario dex
, encontrado comox/9
. El valor de la concatenación esy%9*3+x/9
. Probablemente hay algunas optimizaciones que combinan esta aritmética con el desplazamiento por97
y la fijación del espacio.Hacemos este ciclo, volvemos al primer carácter de la cadena al final. También hacemos un ciclo de preparación para escribir en un valor anterior
y
, suprimiendo el carácter para el primer ciclo cuandoy
aún no se ha inicializado.fuente
CJam,
3929 bytesLo bueno de este es que ni siquiera usa la conversión de base.
Pruébalo en línea .
Me acabo de dar cuenta de que tenía exactamente la misma idea que la respuesta Pyth de Jakube. De hecho, porté este código CJam a Pyth antes de ver su publicación, terminando con 25 bytes. Dado que fue mi primer golf en Pyth, supongo que no está tan mal.
Explicación
fuente
CJam,
302927 bytesPruébelo en línea en el intérprete de CJam .
El enfoque es el mismo que en mi otra respuesta , que es un puerto de este código para Pyth.
Cómo funciona
fuente
Pyth,
3029 bytesGuardado 1 byte gracias a @Jakube.
Demostración en vivo y casos de prueba.
fuente
Javascript (ES6), 175 bytes
Una línea!
"Uso excesivo de
v
premio variable , alguien?"actualización: ¡ahora solo usa variables llamadas
v
, para confusión total!¡Gracias @vihan por guardar 6 bytes!
¡Gracias @Neil por guardar 27 bytes!
Define una función anónima. Para usar, agregue
v=
antes del código para darle un nombre a la función y llámelo comoalert(v("hello world"))
fuente
.slice(-3)
para guardar 6 bytes, momento en el que puede usar"00"+v
para guardar otro byte. (Puede concatenar con una plantilla pero la longitud resultante es la misma)..map(v=>(v<"V"?26:v.charCodeAt()-97).toString(3)).map(v=>("000"+v).slice(v.length))
entonces se convierte.map(v=>(v<"V"?53:v.charCodeAt()-70).toString(3).slice(1))
.Julia,
149137 bytesMi primer golf!
(parcialmente) sin golf:
fuente
=
lugar dein
para bucles y puede usarb[1]
en lugar deb[1:1]
. Tampoco necesita un espacio entre cerrar parens yfor
.=
, perob[1]
devuelve un carácter, que no se puede agregar a una cadena con*
.for
truco es ingenioso. También puede tenerlo directamente después de una cotización cercana. No me di cuenta de que el analizador era tan flexible.end
.Javascript (ES6),
178,172, 170Reemplazado Math.floor con un bit a bit o. Creó una función anónima. Si estoy entendiendo correctamente, esto debería solucionar un poco mi novato (¡gracias Dennis!) Y obtener otros 2 bytes menos.
fuente
Julia,
169166 bytesUngolfed + explicación:
fuente
Haskell, 160 bytes
Ugh, esto se siente demasiado largo, pero al menos estoy ... superando a Python de alguna manera. Y a Ruby.
fuente
Javascript (ES6),
141124120 bytesLo creas o no .... :-)
Al igual que con mi otra respuesta, esta es una función anónima y debe asignarse a una variable antes de que pueda usarse. Pruébalo aquí:
Mostrar fragmento de código
Pensé que podría recortar un par de bytes de mi respuesta anterior usando una técnica diferente, así que comencé con una similar a la de Tekgno y desde allí me aparté de la cabeza. Inicialicé algunas variables en la sección de argumentos de la función, y nuevamente metí todo en una
.map
función. Entonces me di cuenta deString.fromCharCode
que sería mucho más eficiente fuera del.map
. Después de todo lo dicho y hecho, ¡me había afeitado más de3045 bytes!Edición 1: ahorró 17 bytes al deshacerse de los
.replace
s, utilizando una técnica similar a la solución Python de xnor.OK, tal vez es hora de pasar a otro desafío ...
fuente
Python 2,
182180 bytesEsta solución no es ideal, debido a que el reemplazo es muy costoso. Intentar descubrir cómo evitarlo.
La entrada es como
"hello world"
.fuente
Mathematica, 162 bytes
(Re) Usar a
Rule
para convertir las listas de dígitos a caracteres y viceversa.fuente
Javascript (ES6), 179 bytes
Atrezzo a vihan para la
.match
expresión regular.fuente
Rubí, 177
Necesita al menos Ruby 1.9 para el
each_char
métodofuente
Java,
458449 bytesMe entristeció un poco determinar que podía reducir 10 bytes al no utilizar las secuencias de Java 8 y el
map()
método.Aquí está la versión de golf:
Aquí hay una versión mucho menos golfizada. Está destinado a ser legible, pero no garantizo nada.
Este programa toma la cadena para convertir como argumento de línea de comando. Si desea tener espacios en su entrada, debe rodearlo con comillas dobles.
Quería proporcionar un ejemplo de uso de esto desde la línea de comandos, pero no pude hacer que este código funcionara fuera de Eclipse. Nunca aprendí a usar Java desde la línea de comandos ^ _ ^; Probablemente pueda hacer que esto se ejecute dentro del IDE de su elección sin demasiados problemas.
fuente
Javascript (ES6),
181180 bytesEsta es una función anónima, por lo que debe recibir un nombre antes de poder usarse. (Por ejemplo
encrypt=t=>...
) Pruébalo aquí:Mostrar fragmento de código
Empecé usando múltiples variables y
for
bucles en lugar de.map
. Luego lo jugué de todas las maneras posibles sin cambiar el algoritmo, lo que me situó en algún lugar alrededor de 217 bytes. Después de echar un vistazo a la respuesta de UndefinedFunction, logré reducirla a 195, y una inspección de la respuesta de Dendrobium resultó en otros 14 de golf.Hasta donde sé, no puedo ir más lejos o mi resultado sería prácticamente idéntico al de Dendrobium (¡excepto por ser un personaje más corto!). ¿Alguien puede encontrar el lugar donde guardé un personaje? :-)
Como de costumbre, las sugerencias son bienvenidas.
fuente
Matlab, 113 bytes
La entrada es a través de stdin.
Ejemplo:
fuente
Julia -
92876154 bytesSin golf:
El truco puede confundirte. Restando 6 mueve 'a' a cero después del mod. Agregar 9 * 65 es equivalente a agregar 65 a v1 + v2, que es parte del proceso de restaurar los valores a sus valores ascii. Puede reemplazar
i=t%91+579
coni=t%91-6
, y luego reemplazarN=(v1+v2)%91+32
conN=(v1+v2+65)%91+32
para obtener el mismo resultado, pero requiere un carácter adicional.fuente