Parece haber esta locura constante por las personas que aprenden tediosamente nuevos diseños de teclado como Dvorak o Neo porque supuestamente los hace más productivos. Sostengo que cambiar la distribución del teclado es una mala idea, ya que puede llevarle meses ponerse al día, y cuando finalmente es un 5% más rápido que el resto, está jodido si necesita escribir en una computadora que no Es tuyo.
Además, todas estas personas olvidan dónde está el verdadero cuello de botella en la comunicación moderna: el teclado del teléfono.
Así es como se ve su teclado telefónico promedio:
La letra 'r' es la tercera letra del botón 7; así que si tuviera que escribir la letra 'r' en un teléfono móvil, presionaría el botón 7 tres veces, para 's' la presionaría 4 veces y para 'a' presionaría el botón 2 una vez.
Teniendo esto en cuenta, poner 'e' después de 'd' probablemente fue una mala decisión: 'e' es la letra más comúnmente utilizada en el alfabeto inglés, por lo tanto, si tuviera que etiquetar el botón 3 "EDF" en lugar de "DEF", usted ahorraría muchas pulsaciones de teclas.
Además, probablemente haya experimentado que escribir 2 letras que comparten el mismo botón es una molestia: si desea escribir "TU", no puede simplemente presionar 8 tres veces, porque eso daría como resultado 'V'. Por lo general, escribiría 'T', luego presionaría el espacio, luego la tecla de retroceso y luego escribiría 'U', que equivale a 5 pulsaciones de botón en lugar de 3.
TL; DR
Dadas estas dos reglas:
- Una letra se escribe presionando un botón n veces, donde n es la posición donde se encuentra la letra en la etiqueta del botón
- Escribir dos letras que se escriben con el mismo botón requiere presionar 2 botones adicionales
¿Cuál es la distribución del teclado del teléfono que requiere la menor cantidad de pulsaciones de botón, dado un texto específico? Solo debe usar los botones 2-9, 1 y 0 están reservados para símbolos especiales.
Entrada
El texto para el que debe encontrar el diseño óptimo se proporciona a través de stdin. No necesita manejar nada más que el alfabeto en minúsculas y puede suponer que la entrada consiste solo en eso. También puede suponer que el texto de entrada es razonablemente grande y que cada letra está allí al menos una vez, si eso ayuda.
Salida
No quiero poner demasiadas restricciones en la salida, ya que eso a veces da ventajas a algunos idiomas sobre otros; así que, sin embargo, su idioma muestra que las matrices están bien, alternativamente, puede separar cada etiqueta con una nueva línea.
Puede haber múltiples diseños óptimos posibles, puede imprimir cualquiera de ellos. Aquí hay un ejemplo simple:
>> echo "jackdawslovemybigsphinxofquartz" | foo.sh
ojpt
avhz
cen
skm
dyf
wbq
ixu
lgr
Puntos extra
-35 si su algoritmo no es de fuerza bruta todos los diseños posibles (estoy viendo las 'permutaciones' de Haskell aquí)
-3 si su código cabe dentro de un mensaje de texto (140 caracteres) y publica una foto de usted enviando su código a un amigo.
Este es mi primer desafío en StackExchange. Me encantaría saber si te gusta o si tienes algún otro comentario al respecto.
26! / (2! * 6!) = 280,063,514,671,253,913,600,000 > 2^77
permutaciones únicas, contando reorganizaciones simples de las teclas solo una vez.Respuestas:
Perl, 333
Aquí hay un intento de optimizar para la regla # 2. Después de mi comentario, más arriba, y en lugar de las respuestas que toman en cuenta esa regla (cf. calificación alta de preguntas), pensé que debo algo de esfuerzo aquí ...
Las soluciones que no se optimizan para la regla # 2 pueden producir resultados muy lejos de ser óptimos. Verifiqué el texto largo en inglés natural ("Alicia en el país de las maravillas", en realidad), preprocesado (solo letras minúsculas) y, por ejemplo, el script Perl de la respuesta de OJW, el resultado es
er
solo lo arruina, además de que otros pares nunca deberían haber terminado en la misma tecla ...Por cierto,
zxqjvkbpfmygwculdrshnioate
son letras ordenadas, frecuencia ascendente, de ese texto.Si tratamos de resolverlo de una manera fácil (esperando un bono de -35, tal vez) y colocar letras una por una, eligiendo la clave disponible por un recuento mínimo por pares, podemos terminar con, por ejemplo:
No publico código para esta solución (incorrecta) aquí. Por ejemplo, nota,
c
es más frecuentew
y se coloca primero.tc
(ct
) los pares son obviamente menos frecuentes queac
(ca
) - 43 + 235 contra 202 + 355. Pero luegow
termina cona
- 598 + 88. Terminamos con paresaw
ytc
(964 en total), aunque sería mejorac
ytw
(635 en total). Etc ..Entonces, el siguiente algoritmo intenta verificar cada una de las 8 letras restantes (o 2, si es la última) más frecuentes contra las letras que ya están en el teclado, y ubicarlas para que el recuento por pares sea mínimo.
El resultado es:
No me gusta la
ac
pareja (el gato es uno de los personajes, después de todo), pero, aun así, esa es la ubicación óptima de las letras en inglés, si mi código no es incorrecto. No es exactamente un esfuerzo de "golf", solo una solución de trabajo, fea o no.fuente
Python3, ¡es hora de Montecarlo!
Para resolver este problema, primero cuento cuántos "clics" necesita con el teclado predeterminado (inicialmente:)
abc,def,ghi,jkl,mno,pqrs,tuv,wxyz
. Luego modifico este teclado y veo si es más barato (el texto se escribe con menos clics). Si este teclado es más barato, se convierte en el predeterminado. Repito este proceso1M
veces.Para cambiar el teclado, primero decido cuántos cambios hacer (el número máximo de cambios es el número total de letras en el teclado). Luego, para cada cambio, elijo dos botones y dos posiciones y transfiero un personaje de la primera posición a la segunda.
El número máximo de interruptores por hora es el número de letras en el teclado porque es el número mínimo de cambios que necesita para cambiar desde dos teclados diferentes. (Quiero que siempre sea posible cambiar de un teclado a otro)
La salida de
echo "jackdawslovemybigsphinxofquartz" | python .\myscript.py
es:¿Dónde
61
está el número de botón presionado para componer un mensaje dado?Caracteres (sin espacios ni comentarios): 577
Sé que es largo pero soy realmente nuevo en esto.
Me pareció tan divertido que decidí probar este algoritmo con LO HOBBIT (¡también tengo una copia original en casa!). Tiene
383964
letras y estos son los dos clics vs teclado que estoy encontrando:Así que afirmo que este último es uno de los teclados más prácticos (en términos de clics).
fuente
Bueno, si solo quieres que los personajes más populares se asignen a los contenedores 2-9, Perl puede hacerlo en 127 caracteres ...
dando algo como:
O imprímalo todo en una línea, eliminando 12 caracteres:
fuente
$x{$_}++for split/\s*/,<>;map$o{$n++%8}.=$_,sort{$x{$b}<=>$x{$a}}keys%x;print map"$_:".$o{$_-2},2..9
Haskell, 160-35 = 125
Ejemplo:
Se podría argumentar que esto no se optimiza para la regla 2, pero sí pone las letras más frecuentes en diferentes teclas.
fuente
JavaScript, 192-35 = 157
Acabo de notar la regla de los personajes que se repiten; Esto no tiene eso en cuenta. Pero como @mniip señaló en su respuesta:
Esto probablemente hubiera estado en Ruby, pero no estoy en casa y me veo obligado a usar Internet Explorer (eww). Pero bueno, ¡a veces es divertido usar idiomas terribles para jugar al golf! ;)
Salida de muestra (para su entrada):
Como JS no tiene STDIN, el programa supone que la entrada se almacena en variable
s
.fuente
'abcdefghia'
no es exactamente óptima.'azbcdefghizjklmnopqzrstuvwxyz'
b=['','','','','','','','']
tob=[x='',x,x,x,x,x,x,x]
,s.split('')
tos.split(x)
yo[x]=o[x]?o[x]+1:1
too[x]=-~o[x]
.Python (119-35 = 84):
Asumiendo que la cadena es una variable a, y solo contiene letras minúsculas:
sin golf:
PYG (76-35 = 41):
Aaah, podemos soltar la enorme importación. Nuevamente, esto supone que la cadena despojada está en a.
fuente