Optimizando deslizar a través de un teclado 1D

16

Este es un 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

norte

k=1nortemetrok2

metrokk

9 92+4 42+32+4 42+32=1314 42+22+22+22+22=32

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:

    S+L
    SL

    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
Arnauld
fuente
Sandbox (ahora eliminado).
Arnauld
Adivina quién más conoce la lucha ...
Erik the Outgolfer
Si va a incluir esta regla: "Su código debe ejecutarse en menos de 1 minuto para cada lista", podría ser bueno especificar dónde se ejecutará. El código que se ejecuta en una computadora en un minuto podría llevar horas en otra.
mypetlion
@mypetlion Lo que realmente importa aquí es que el código realmente genera algo (y no solo se ejecuta para siempre), así que he relajado esta regla.
Arnauld
" Un teclado se considera válido si cada palabra genera una secuencia de deslizamiento única " . ¿Qué significa único aquí? Por ejemplo, ¿el orden alfabético es una solución no válida para las palabras 'abda', 'acda'?
ngn

Respuestas:

5

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

from ortools.sat.python.cp_model import*
from itertools import*
C=combinations
R=range
L=len
T=lambda w:[*zip(w,w[1:],w[2:])]
W=[(*(g[0]for g in groupby(w)),)for w in input().split()]
K={*sum(W,())}
m=CpModel()
V=m.NewBoolVar
B={c:V(f"B{c}")for c in C(K,2)}
for a,b in[*B]:B[b,a]=B[a,b].Not()
for a,b,c in permutations(K,3):m.AddBoolOr([B[a,b],B[b,c],B[c,a]])
M={t:V(f"M{t}")for t in{*sum(map(T,W),[])}}
for a,b,c in M:m.AddBoolXOr([B[a,b],B[b,c],M[a,b,c].Not()])
N={(w,n):V(f"N{w,n}")for w in W for n in R(1,L(w))}
for w in W:
 for n in R(1,L(w)-1):s=sum(M[t]for t in T(w));m.Add(s>=n).OnlyEnforceIf(N[w,n]);m.Add(s<n).OnlyEnforceIf(N[w,n].Not())
for a,b in C(W,2):
 if(a[0],a[-1])==(b[0],b[-1]):m.AddForbiddenAssignments([M[t]for t in T(a)+T(b)],[[x in X for x in R(L(a)-2)]+[y in Y for y in R(L(b)-2)]for n in R(L(a))for X in C(R(L(a)-2),n)for Y in C(R(L(b)-2),n)if[a[x+1]for x in X]==[b[y+1]for y in Y]])
m.Minimize(sum((2*n+3)*N[w,n]for w,n in N))
s=CpSolver()
s.Solve(m)
o={k:0for k in K}
for c in C(K,2):o[c[s.Value(B[c])]]+=1
print(*sorted(K,key=lambda k:o[k]),sep="")

Resultado

  1. SEH, 13
  2. DOLC, 20
  3. TNSECA, 13
  4. RACIÓN, 80
  5. TYKCIDBRFHJUEVOXWNGZALQMPS, 32
  6. REWINTHUVOFABMPY, 66
  7. FYCWORTMHAGINDKVESULB, 125
  8. TSHRDABXLYOWUPMIENGCF, 213
  9. PVKEFDLBMUSWOIHACNYTRG, 212
  10. XHGTPMCKSUABYORDLJEIWNFV, 596
  11. PYLFNAVEKBOCHTRGDSIZUM, 601

Verificar puntaje

Anders Kaseorg
fuente