Ottimizzazione dello scorrimento su una tastiera 1D


16

Questa è una al con un sistema di punteggio personalizzato, in cui vince il punteggio più basso.

introduzione

Molti smartphone consentono di inserire il testo facendo scorrere il dito sulla tastiera virtuale 2D. Questa tecnologia è solitamente combinata con un algoritmo di predizione che genera un elenco di parole indovinate, ordinate dalla più probabile alla meno probabile.

In questa sfida:

  • Scorreremo su una tastiera unidimensionale limitata a un sottoinsieme di 26 lettere.
  • Non ci sarà alcun algoritmo di predizione : vogliamo che ogni parola sia identificata in modo univoco dalla sua 'sequenza di scorrimento'.
  • Vogliamo che la tastiera sia ottimizzata in modo tale da ridurre al minimo il numero totale di mosse per un determinato elenco di parole.

Scorrimento in una dimensione

Di seguito è una tastiera 1D lessicograficamente ordinata con tutte le lettere:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

NB: questo può essere visualizzato su più righe se stai navigando dal cellulare. Si prega di pensarlo come una singola riga.

Per inserire la parola " GOLF " su tale tastiera, dovremo:

  • iniziare a G
  • scorrere verso destra per O
  • scorrere verso sinistra per F

Perché Lsi trova tra Oe F, continuiamo semplicemente a scorrere senza fermarci lì.

Quindi la sequenza di scorrimento di ' GOLF ' su questa tastiera è GOF.

Più generalmente:

  • La prima e l'ultima lettera sono sempre incluse.
  • Altre lettere sono incluse se e solo se è richiesto un cambio di direzione subito dopo di esse.
  • Le lettere ripetute devono essere trattate come singole lettere. Ad esempio, sulla tastiera sopra:

    • ' LOOP ' verrebbe codificato come LP(senza stop attivo O)
    • ' GOOFY ' verrebbe codificato come GOFY( Oè incluso perché c'è un cambio di direzione lì - non perché è raddoppiato)

Ottimizzazione della tastiera

Consideriamo il seguente elenco di parole: [" PROGRAMMAZIONE ", " PUZZLE ", " AND ", " CODICE ", " GOLF "].

Abbiamo bisogno di 16 lettere distinte per digitare queste parole, quindi abbiamo solo bisogno di una tastiera di 16 lettere. Quello seguente è - di nuovo - ordinato lessicograficamente:

ACDEFGILMNOPRSUZ

Con questa tastiera, le parole verranno codificate in questo modo:

  • PROGRAMMAZIONE : PRGRAMING(9 mosse)
  • PUZZLE : PZES(4 mosse)
  • E : AND(3 mosse)
  • CODICE : CODE(4 mosse)
  • GOLF : GOF(3 mosse)

Sono in totale 23 mosse per tutte le parole.

Ma possiamo fare molto meglio con questa tastiera:

CGODSELZNUIFRPAM

Che dà:

  • PROGRAMMAZIONE : PGMG(4 mosse)
  • PUZZLE :PS (2 mosse)
  • E :AD (2 mosse)
  • CODICE :CE (2 mosse)
  • GOLF :GF (2 mosse)

per un totale di soli 12 mosse .

Punteggio della tastiera

n

ΣK=1nmK2

mKK -esima parola.

92+42+32+42+32=13142+22+22+22+22=32

Più basso è, meglio è.

La sfida

  • Dato un elenco di parole, il codice deve generare una tastiera valida per questo elenco. Una tastiera è considerata valida se ogni parola genera una sequenza di scorrimento unica.
  • Ti verranno fornite 11 liste di parole indipendenti. Il tuo punteggio sarà uguale a:

    S+L
    SL

    Puoi usare questo script per controllare il tuo punteggio . La score()funzione prevede la lunghezza del codice come primo parametro e una matrice di 11 stringhe di tastiera come secondo parametro (il caso non ha importanza).

  • Vince l'invio con il punteggio più basso. In caso di pareggio, la proposta presentata per prima vince.

Regole aggiuntive

  • Il tuo codice deve essere deterministico (ovvero deve sempre restituire lo stesso output per un determinato input).
  • Devi A) fornire un link di prova (ad es. Su TIO) che non scada, oppure B) includere le tastiere generate nel corpo della tua risposta.
  • Puoi prendere le parole in maiuscolo o minuscolo. Sono vietati casi misti.
  • È garantito che l'input abbia almeno una soluzione.
  • Tutte le parole sono composte da almeno 2 lettere distinte.
  • Il codice deve funzionare per qualsiasi input valido. Verrà testato con un elenco di parole non divulgato per assicurarsi che non si basi su risultati codificati.
  • Mi riservo il diritto di aumentare le dimensioni della suite di test in qualsiasi momento per assicurarmi che gli invii non siano ottimizzati per i casi di test iniziali.

Elenchi di parole

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

Sandbox (ora eliminato).
Arnauld,

Indovina chi altro conosce la lotta ...
Erik the Outgolfer,

Se hai intenzione di includere questa regola: "Il tuo codice deve essere eseguito in meno di 1 minuto per ogni elenco", potrebbe essere utile specificare dove verrà eseguito. Il codice che viene eseguito su un computer in un minuto potrebbe richiedere ore su un altro.
mypetlion il

@mypetlion Ciò che conta davvero qui è che il codice effettivamente produce qualcosa (e non funziona solo per sempre), quindi ho rilassato questa regola.
Arnauld,

" Una tastiera è considerata valida se ogni parola genera una sequenza di scorrimento unica. " - cosa significa unico qui? per esempio, l'ordine alfabetico è una soluzione non valida per le parole "abda", "acda"?
ngn,

Risposte:


5

Python 3 + Google OR-Tools , 1076 + 1971 = 3047

Questo trova sempre soluzioni ottimali (ma spende molto codice per farlo). Esegue i test 1–9 in pochi secondi, il test 10 in sei minuti e il test 11 in un minuto.

Codice

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="")

Risultato

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

Controlla il punteggio

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.