Suponiendo que A = 1, B = 2 ... Z = 26, y el valor de una palabra es la suma de estos valores de letras, es posible dividir algunas palabras en dos partes para que tengan valores iguales.
Por ejemplo, "divisor de palabras" se puede dividir en dos partes así: ordsl wpit, porque o + r + d + s + l = w + p + i + t.
Este fue un desafío que nos dio mi maestro de computación, aparentemente es un viejo desafío de Lionhead Studios. Lo he resuelto en Python, y publicaré mi respuesta en breve.
Desafío: el programa más corto que puede enumerar todas las divisiones posibles que tienen puntajes iguales. Tenga en cuenta que solo tiene que enumerar una para cada grupo de letras: ordsl wpit es lo mismo que rdosl wtip, por ejemplo. Es más fácil enumerarlos en el orden en que aparecen en la palabra.
Prima:
- Si resalta pares donde ambas palabras son palabras válidas en inglés (o alguna permutación de las letras es), use una lista de palabras de algún tipo. (Esto podría hacerse colocando un asterisco al lado de cada uno u otro método, pero que quede claro).
- Agregar la opción para eliminar duplicados (esto no debería ser el predeterminado).
- Admite más de dos divisiones, por ejemplo, divisiones de tres, cuatro o incluso n-way.
Respuestas:
Perl, 115
118123Corre con
perl -nE '<code goes here>'
. Esa 'n' se cuenta en el tamaño del código.Respaced:
Con comentarios y nombres de variables:
Algunos de los trucos utilizados:
1..1<<@_
cubre el mismo rango de bits0..(1<<@_)-1
, pero es más corto. (tenga en cuenta que considerar el problema desde más lejos, incluyendo los límites del rango varias veces, no daría como resultado una salida incorrecta de todos modos)64-ord$_[$_]
lugar de sumarord$_[$_]-64
gana un carácter invisible: dado que termina con un delimitador, hace que el espacio antes seafor
innecesario.cond ? var1 : var2 = new_value
.&&
y||
se usan en lugar de condicionales apropiados.$l-$r
es más corto que$l!=$r
fuente
J (109)
Salida para
wordsplit
:Explicación:
1!:1[1
: leer una línea de stdin([{~(i.@!A.i.)@#)
: obtener todas las permutaciones"1
: para cada permutación:(96-~a.&i.)
: obtener puntajes de letras}.@(split~&.>i.@#@>)@<
: divide cada permutación de las puntuaciones en cada espacio posible, excepto antes del primero y después del último número>(>@(=/@:(+/"1&>)&.>)#[)
: vea qué permutaciones tienen mitades coincidentes y seleccione estas{&a.@(96&+)&.>
: convierte las puntuaciones de nuevo en letras~.(/:{[)
: eliminar variaciones triviales (p. ej.ordsl wpit
yordsl wpti
)fuente
{a,bc}
ya se encuentra, eliminar{a,cb}
pero no eliminar{bc,a}
. (Y, por supuesto, no me ofende, si realmente / hubiera / duplicado la respuesta de alguien, preferiría que alguien lo señalara)c99 - 379 caracteres necesarios
El enfoque es bastante obvio. Hay una función que suma las palabras según una máscara y una que también la imprime según una máscara. Entrada desde la entrada estándar. Una rareza es que la rutina de impresión inserta espacios para letras que no están en la máscara. Se utiliza una pestaña para separar los grupos.
No hago ninguno de los artículos de bonificación, ni se convierte fácilmente para apoyarlos.
Legible y comentado:
Validación
fuente
Rubí: 125 caracteres
Ejecución de muestra:
fuente
Mathematica
123111Encuentra todos los subconjuntos de palabras que tienen la media "ascii total" de la palabra,
d
. Luego encuentra los complementos de esos subconjuntos.d = "WORDSPLIT"
fuente
J, 66 caracteres
Usando dígitos de números base2 para seleccionar cada subconjunto posible.
fuente
Mi solución está abajo. Es casi un anti-golf en su tamaño, pero funciona muy bien. Admite divisiones n-way (aunque el tiempo de cálculo se vuelve muy largo para más de aproximadamente 3 divisiones) y admite la eliminación de duplicados.
Salida de muestra:
fuente
Lua - 195
la entrada debe estar en mayúsculas:
fuente
Python - 127
y aquí una versión n-split con 182 bytes sin duplicados:
La entrada es, por ejemplo:
fuente