Este es un desafío de código con un sistema de puntuación personalizado, donde gana el puntaje más bajo.
Introducción
Muchos teléfonos inteligentes permiten ingresar texto deslizando el dedo por el teclado virtual 2D. Esta tecnología generalmente se combina con un algoritmo de predicción que genera una lista de palabras adivinadas, ordenadas de la más probable a la menos probable.
En este desafío:
- Vamos a deslizarnos por un teclado unidimensional restringido a un subconjunto de las 26 letras.
- No habrá algoritmo de predicción : queremos que cada palabra se identifique de forma única por su 'secuencia de deslizamiento'.
- Queremos que el teclado se optimice de tal manera que se minimice el número total de movimientos para una lista de palabras dada.
Deslizar en una dimensión
A continuación se muestra un teclado 1D ordenado lexicográficamente con todas las letras:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
NB: Esto puede mostrarse en varias filas si está navegando desde el móvil. Piense en ello como una sola fila.
Para ingresar la palabra ' GOLF ' en dicho teclado, haremos lo siguiente:
- Empieza en G
- deslizar hacia la derecha para O
- deslizar hacia la izquierda para F
Debido a que Lse encuentra entre Oy F, seguimos deslizando sin parar allí.
Entonces, la secuencia de deslizamiento de ' GOLF ' en este teclado es GOF.
Más generalmente:
- La primera y la última letra siempre se incluyen.
- Se incluyen otras letras si y solo si se requiere un cambio de dirección justo después de ellas.
Las letras repetidas deben tratarse de la misma manera que las letras simples. Por ejemplo, en el teclado anterior:
- ' LOOP ' se codificaría como LP(sin parar O)
- ' GOOFY ' se codificaría como GOFY( Ose incluye porque hay un cambio de dirección allí, no porque se haya duplicado)
Optimización del teclado
Consideremos la siguiente lista de palabras: [' PROGRAMACIÓN ', ' PUZZLES ', ' Y ', ' CÓDIGO ', ' GOLF '].
Necesitamos 16 letras distintas para escribir estas palabras, por lo que solo necesitamos un teclado de 16 letras. El siguiente está, nuevamente, ordenado lexicográficamente:
ACDEFGILMNOPRSUZ
Con este teclado, las palabras se codificarán de esta manera:
- PROGRAMACIÓN : PRGRAMING(9 movimientos)
- PUZZLES : PZES(4 movimientos)
- Y : AND(3 movimientos)
- CÓDIGO : CODE(4 movimientos)
- GOLF : GOF(3 movimientos)
Eso es un total de 23 movimientos para todas las palabras.
Pero podemos hacerlo mucho mejor con este teclado:
CGODSELZNUIFRPAM
Lo que da:
- PROGRAMACIÓN : PGMG(4 movimientos)
- PUZZLES : PS(2 movimientos)
- Y : AD(2 movimientos)
- CÓDIGO : CE(2 movimientos)
- GOLF : GF(2 movimientos)
para un total de solo 12 movimientos .
Puntuación de teclado
Cuanto más bajo, mejor.
El reto
- Dada una lista de palabras, su código debe generar un teclado válido para esta lista. Un teclado se considera válido si cada palabra genera una secuencia de deslizamiento única.
Tendrás 11 listas independientes de palabras. Su puntaje será igual a:
Puede usar este script para verificar su puntaje . La
score()
función espera la longitud de su código como primer parámetro y una matriz de 11 cadenas de teclado como segundo parámetro (el caso no importa).La presentación con la puntuación más baja gana. En caso de empate, la presentación que se envió primero gana.
Reglas adicionales
- Su código debe ser determinista (es decir, siempre debe devolver la misma salida para una entrada determinada).
- Debe A) proporcionar un enlace de prueba (por ejemplo, en TIO) que no agote el tiempo, o B) incluir los teclados generados dentro del cuerpo de su respuesta.
- Puede tomar las palabras en mayúsculas o minúsculas. Los casos mixtos están prohibidos.
- Se garantiza que la entrada tenga al menos una solución.
- Todas las palabras están formadas por al menos 2 letras distintas.
- Su código debe funcionar para cualquier entrada válida. Se probará con una lista no revelada de palabras para asegurarse de que no se basa en resultados codificados.
- Me reservo el derecho de aumentar el tamaño del conjunto de pruebas en cualquier momento para asegurarme de que las presentaciones no estén optimizadas para los casos de prueba iniciales.
Listas de palabras
1) Sanity check #1 (only 4 valid solutions: HES, SEH, ESH or HSE)
SEE, SHE
2) Sanity check #2 (16 valid solutions, of which 4 are optimal: COLD, DOLC, DLOC or CLOD)
COLD, CLOD
3) Sanity check #3
ACCENTS, ACCESS
4) Warm-up
RATIO, NATION, NITRO, RIOT, IOTA, AIR, ART, RAT, TRIO, TRAIN
5) Pangram
THE, QUICK, BROWN, FOX, JUMPS, OVER, LAZY, DOG
6) Common prepositions
TO, OF, IN, FOR, ON, WITH, AT, BY, FROM, UP, ABOUT, INTO, OVER, AFTER
7) Common verbs
BE, HAVE, DO, SAY, GET, MAKE, GO, KNOW, TAKE, SEE, COME, THINK, LOOK, WANT, GIVE, USE, FIND, TELL, ASK, WORK, SEEM, FEEL, TRY, LEAVE, CALL
8) Common adjectives
GOOD, NEW, FIRST, LAST, LONG, GREAT, LITTLE, OWN, OTHER, OLD, RIGHT, BIG, HIGH, DIFFERENT, SMALL, LARGE, NEXT, EARLY, YOUNG, IMPORTANT, FEW, PUBLIC, BAD, SAME, ABLE
9) Common nouns
TIME, PERSON, YEAR, WAY, DAY, THING, MAN, WORLD, LIFE, HAND, PART, CHILD, EYE, WOMAN, PLACE, WORK, WEEK, CASE, POINT, GOVERNMENT, COMPANY, NUMBER, GROUP, PROBLEM, FACT
10) POTUS
ADAMS, ARTHUR, BUCHANAN, BUREN, BUSH, CARTER, CLEVELAND, CLINTON, COOLIDGE, EISENHOWER, FILLMORE, FORD, GARFIELD, GRANT, HARDING, HARRISON, HAYES, HOOVER, JACKSON, JEFFERSON, JOHNSON, KENNEDY, LINCOLN, MADISON, MCKINLEY, MONROE, NIXON, OBAMA, PIERCE, POLK, REAGAN, ROOSEVELT, TAFT, TAYLOR, TRUMAN, TRUMP, TYLER, WASHINGTON, WILSON
11) Transition metals
SCANDIUM, TITANIUM, VANADIUM, CHROMIUM, MANGANESE, IRON, COBALT, NICKEL, COPPER, ZINC, YTTRIUM, ZIRCONIUM, PLATINUM, GOLD, MERCURY, RUTHERFORDIUM, DUBNIUM, SEABORGIUM, BOHRIUM, HASSIUM, MEITNERIUM, UNUNBIUM, NIOBIUM, IRIDIUM, MOLYBDENUM, TECHNETIUM, RUTHENIUM, RHODIUM, PALLADIUM, SILVER, CADMIUM, HAFNIUM, TANTALUM, TUNGSTEN, RHENIUM, OSMIUM
fuente
Respuestas:
Python 3 + Google OR-Tools , 1076 + 1971 = 3047
Esto siempre encuentra soluciones óptimas (pero gasta mucho código para hacerlo). Ejecuta las pruebas 1–9 en unos segundos, prueba 10 en seis minutos y prueba 11 en un minuto.
Código
Resultado
Verificar puntaje
fuente