Mi amigo y yo tenemos este juego que jugamos con palabras. Es un pasatiempo divertido e implica "cancelar" letras en una palabra hasta que no quede nada. Estoy realmente cansado de que sea mucho más rápido que yo, así que es tu trabajo implementarlo y dejarme finalmente vencerlo. Obviamente, dado que tengo que hacer que el programa sea lo más fácil de ocultar posible, tiene que ser lo más pequeño posible.
¿Cómo funciona este juego?
El juego es un algoritmo bastante simple. Reduce una cadena alfabética hasta que no se puede reducir más, lo que la convierte en una especie de hash. El juego real que hacemos los humanos es muy difícil de implementar, pero se puede simplificar en el siguiente algoritmo:
Empiezas doblando el alfabeto por la mitad y alineando las dos piezas de la siguiente manera:
a b c d e f g h i j k l m
z y x w v u t s r p q o n
Luego, comenzando desde el medio, asigna los enteros positivos a la mitad superior y los negativos a la parte inferior:
a b c d e f g h i j k l m
13 12 11 10 9 8 7 6 5 4 3 2 1
z y x w v u t s r p q o n
-13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
Luego toma su cadena (la usaremos hello world
) e ignora los caracteres no alfabéticos, traduzca:
h e l l o w o r l d
6 9 2 2 -2 -10 -2 -5 2 10
Luego sumas los valores de las letras. Los que se alinearon en el diagrama anterior (por ejemplo, d
y w
, l
y o
) se cancelan, mientras que los otros van a sumar.
sum(6 9 2 2 -2 -10 -2 -5 2 10 )=12
12 es el número para b
, entonces el hash de hello world
esb
Para una palabra que anula por completo (por ejemplo love
), que la salida "0 carácter": -
. Tenga en cuenta que en la entrada, -
todavía se tendrá en cuenta. Solo importa en la salida.
Si la magnitud del número es mayor que 13, entonces comienzas a duplicar los a
's y los z
' s. Básicamente, tomas tantos a
's z
' o 'caben en el número y tomas lo que queda en la última letra de la siguiente manera:
code golf: 43.
Se adapta a 3 a
y le quedan 4:
aaa 4: j
result: aaaj
Sugerencia: Esta parte es básicamente divmod
excepto que se redondea hacia cero, no -infinity
(por ejemplo, -43 se convertiría en 3 z
's y' a ' -4
que es p
así zzzp
).
Nota: el guión no viene si el a
's o el z
' s encajan perfectamente, solo si es exactamente 0
.
Aclaraciones:
- El hash es caso en sensible
- Las lagunas estándar no están permitidas
- I / O puede estar en cualquier formato que no sea demasiado extravagante, stdin, stdout, arg de línea de comandos, función, etc.
- Este es el código de golf, por lo que gana el tamaño más corto en bytes .
Ejemplos:
hello world --> b
love --> -
this is an example --> aak
hello *&*(&(*&%& world --> b
good bye --> ae
root users --> zzs
love
está vacío ...Respuestas:
CJam, 46 bytes
Pruébelo en línea o pruebe el conjunto de pruebas en línea .
Explicación
El algoritmo funciona de la forma esperada: lea la entrada, convierta a minúsculas, asigne cada carácter a un valor, sume los valores e imprima caracteres y ajuste la suma en consecuencia hasta que la suma sea cero. Probablemente la optimización más interesante (aunque solo ahorra dos bytes) es que en su lugar se utilizan asignaciones de caracteres negadas, ya que esto evita intercambiar argumentos de sustracción para corregir el signo al calcular el valor asignado y evita el intercambio nuevamente al asignar a una letra debido a la resta de un valor negado que es reemplazable por adición.
fuente
Pyth,
797877656158fuente
@Jz
lugar def}YJz
Hay probablemente más, pero debo dormir ahora. Buena suerte;)@
!Clip 10 , 87
fuente
R, 258 bytes
Este tiene que ser el código R más grosero de la historia. Pensé que R podría ser una opción decente ya que tiene un vector de todas las letras "a" a "z" como una variable global incorporada. Pero resulta que el resto es un desastre.
Ungolfed + explicación:
Esto crea un objeto de función sin nombre que acepta una cadena como entrada y devuelve el valor hash asociado. Para llamarlo, asígnele un nombre, por ejemplo
f=function(s){...}
.Ejemplos:
Pruébalo en línea!
Preguntas? Con mucho gusto le daré más explicaciones. Sugerencias? ¡Las sugerencias son más que bienvenidas!
fuente
Haskell, 171 bytes
Prueba de funcionamiento:
Cómo funciona:
l
es una tabla de búsqueda de letras al valor correspondiente. Busque todos los caracteres de la cadena de entrada y descarte los que no se encuentran. Suma la lista resultante. Dependiendo de la sumap
impresa-
o tal vez primero algunosa
s yz
s y finalmente (inversa) busca la letral
.fuente
R - 200
fuente