Esta tarea es bastante simple y utiliza tres caracteres distintos de "operador". Su tarea es, dada una simple secuencia de letras, realice la siguiente tarea para codificarla utilizando <
, >
, *
. Puede elegir usar letras mayúsculas o minúsculas, no tiene que manejar ambas.
Explicación de cifrado
El cifrado es simple, está utilizando operaciones de incremento y decremento para recorrer de la letra 1 a la letra final, *
siendo su función de "envío". El operador para "incremento" será >
y "decremento" será <
.
Un ejemplo usando la palabra adbc
:
- Comience con la primera letra de la palabra, envíe esa letra.
a
- Luego, use
>
y<
(como brainfuck) para "navegar" la letra actual a la siguiente.a>
daría como resultado 'elevar'a
por 1 al pie de la letrab
.a<
resultaríaz
porque está bajando la letra (se ajusta, siempre debe elegir la dirección que resulte en la MENOS cantidad de operaciones). - Después de generar la combinación minimalista correcta de
<
y>
generar a*
para indicar que hemos llegado a la siguiente letra.
Los pasos para codificar adbc
serían:
a # a
a>>>* # ad
a>>>*<<* # adb
a>>>*<<*>* # adbc
Ejemplos
Los pasos para codificar aza
serían:
a # a
a<* # az
a<*>* # aza
Más ejemplos:
"abcdef" = "a>*>*>*>*>*"
"zyaf" = "z<*>>*>>>>>*"
"zzzzzz" = "z*****"
"z" = "z"
"zm" = "z<<<<<<<<<<<<<*" or "z>>>>>>>>>>>>>*" (equidistant)
"zl" = "z>>>>>>>>>>>>*"
"alphabet" = "a>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*"
"banana" = "b<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*" OR "b<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*"
"abcdefghijklmnopqrstuvwxyz" = "a>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*>*"
"abcdefz" = "a>*>*>*>*>*<<<<<<*"
Reglas
- Estamos codificando, no decodificando, así que no lo estropees.
- Puede suponer que el mensaje contendrá letras
[A-Z]
o[a-z]
, a su elección. - Puede usar cualquier carácter que no sea letra / numérico / reservado para denotar
*
(EG$
). - Debe tener el final
*
, no está implícito en las repeticiones. - Puede suponer que no hay cadenas vacías, pero es posible un solo carácter.
- Si es equidistante en ambos sentidos a la siguiente letra, puede elegir una dirección.
- Este es el código de golf , el menor recuento de bytes gana.
Por favor explique su respuesta, ayuda a otros a aprender de esta manera.
abcdefghijklmnopqrstuvwxyz
y no es su propia entrada?zl
debería usar>
.alphabet
está en mi opinióna>>>>>>>>>>>*>>>>*<<<<<<<<*<<<<<<<*>*>>>*<<<<<<<<<<<*
yzl
debería serz>>>>>>>>>>>>*
y parabanana
si existe una segunda soluciónb<*<<<<<<<<<<<<<*>>>>>>>>>>>>>*<<<<<<<<<<<<<*>>>>>>>>>>>>>*
zm
. @jorg buenas capturas, las arregló todas, fue un esfuerzo manual.Respuestas:
Jalea , 17 bytes
Utiliza un carácter de espacio en lugar de
*
(un espacio⁶
, o una nueva línea⁷
, guarda un byte”*
).Funciona con cualquiera mayúsculas sólo o entrada en minúsculas solamente.
Pruébalo en línea! o vea un conjunto de pruebas (donde esos espacios se reemplazan posteriormente
*
para facilitar la lectura).¿Cómo?
fuente
Código de máquina 8086,
70 6867 bytesCómo funciona:
fuente
Python 3 , 87 bytes
Pruébalo en línea!
Funciona con minúsculas o mayúsculas.
El programa construye la cadena de salida a
r
medida que itera sobre los caracteres en la cadena de entrada. Almacena el carácter anterior comop
, y calcula la operación de incremento para llegarp
al nuevo carácterc
.El intervalo entre los caracteres es
ord(c)-ord(p)
, y lo(ord(c)-ord(p)-13)%26-13
lleva el módulo 26 al intervalo[-13..12]
. Un resultado negativo significa que es más corto dar un paso atrás, y un resultado positivo significa dar un paso adelante. Esto debe convertirse en una cadena de>
o en<
función del signo. En lugar de usarabs
o un condicional, aprovechamos la multiplicación de cadenas de Python ques*n
da la cadena vacía cuandon
es negativa. En la expresión'<'*-d+'>'*d
, la parte mal firmada no contribuye.El estado inicial se maneja dividiendo la entrada en su primer carácter y el resto con el desempaquetado de Python 3
r,*s=input()
. El carácter inicial se usa para comenzar a construir la cadena, así como el carácter "anterior" inicial.Gracias a Ovs por sugerir cambiar a Python 3 para hacer este desempaquetado.
fuente
Python 3 ,
11093 bytesPruébalo en línea!
fuente
JavaScript (ES6),
118109107 bytesLa cadena de entrada no distingue entre mayúsculas y minúsculas.
Cómo funciona
A diferencia de Python, el operador de módulo JS devuelve un número que tiene el mismo signo que el dividendo en lugar del divisor. Además, el
repeat()
método JS arroja un error cuando se le da un número negativo, en lugar de devolver una cadena vacía (y de*
todos modos es significativamente más larga que una simple ).Estos son comportamientos bastante desfavorables para este desafío. Por lo tanto, sería mejor identificar en qué caso exacto estamos en lugar de depender de trucos matemáticos. (Lo que no significa que tales trucos no existan, sino que no pude encontrarlos).
A continuación hay una tabla que describe los 4 casos posibles, donde
d
está la distancia firmada entre el personaje actual y el anterior:Casos de prueba
Mostrar fragmento de código
fuente
PHP, 127 bytes
Casos de prueba
PHP, 137 bytes
Casos de prueba
fuente
JavaScript (ES6),
111103 bytesOriginalmente, la versión que tomó 111 bytes antes de adaptar el truco de configuración de @ Arnauld
n
mientras computabap
, creo que probablemente haya otro truco usando ens
lugar de,n
pero se está haciendo tarde, así que no me molestaré .:fuente
Haskell (lambdabot),
161153 bytesPruébalo en línea!
Explicación:
fuente
EXCEL VBA 130 bytes
Ejecútelo desde la ventana de Excel VBA Inmediato.
Explicación:
Simple for loop que con la función String para repetir el ">" o "<" n número de veces donde n es la diferencia entre la cadena de caracteres i e i + 1.
fuente
Java 7-, 232 bytes
Más o menos la solución trivial. Ungolfed y comentó:
fuente
C, 170 bytes
Detallado en vivo
fuente
#define x q<14?q:q+26 e(c){putchar(c);}i,q;m(a,b){q=b-a;i=q?(a>b?x:-x):0;while(i>0)e('>'),i--;while(i<0)e('<'),i++;}f(char*l){e(*l);while(*(l+1))m(*l,*(l+1)),e('*'),l++;}
JavaScript (ES6),
140128129111113 bytesSeguí una ruta diferente a las otras soluciones JS, pero no funcionó demasiado bien: esto es lo que tengo hasta ahora:
Original, 131 bytes
Mostrar fragmento de código
fuente
([x,...s])=>x+s.map(...)
ahorra 12 bytes. Tenga en cuenta que también debe agregar un carácter de impresión al final. Sugiero usar un número, que solo costará 2 bytes en`1`+1
lugar de`*`
.join
haber resultado en una salida no válida para entradas de una sola letra. Sin embargo, mover el carácter de impresión dentro delmap
método solo cuesta 1 byte.([x,...s])=>x+s.map(y=>'<><>'[r=(d=y[c='charCodeAt']()-x[c](x=y))/13+2|0].repeat([d+26,-d,d,26-d][r])+0).join``
para 111 bytesreduce
solución, pero resultó ser 115 bytes.C ++,
210190 bytesMi primer intento en el golf!
k almacena cuál de <,> o * para imprimir. En primer lugar, simplemente imprime el primer elemento de la matriz y luego ejecuta un bucle desde el primero hasta el último elemento de la matriz. j almacena el elemento anterior y luego al comparar si j más cerca de * a mediante <o> establezca k en <,> respectivamente y luego imprima k y luego ejecute este ciclo hasta que j sea igual a p. Luego, después de cada final de la segunda impresión de bucle *.
fuente
*p!=0
puede ser reemplazado con*p
. Estoy bastante seguro de que el espaciochar *a
también es innecesario. También necesitarás#include <iostream>
yusing namespace std;
(aunque creo que podría ser más barato simplemente agregarstd::
) para que esta sea una respuesta completa.std::
ousing namespace std;
probablemente también necesitará#include <iostream>
en su recuento de bytes.05AB1E , 17 bytes
Pruébalo en línea!
Explicación
Usos
>
,<
y<space>
para denotar incremento , decremento , enviarfuente
Haskell ,
167168126 bytesAhora usando la solución aritmética de xnor. Llame con
e str
dondestr :: String
está la cadena a codificar.fuente
Haskell , 109 bytes
Pruébalo en línea! Utiliza el enfoque de xnor . Llamada con
f "somestring"
.fuente