Optimieren des Wischens über eine 1D-Tastatur


16

Dies ist eine mit einem benutzerdefinierten Bewertungssystem, bei dem die niedrigste Punktzahl gewinnt.

Einführung

Auf vielen Smartphones können Sie Text eingeben, indem Sie mit dem Finger über die virtuelle 2D-Tastatur fahren. Diese Technologie wird normalerweise mit einem Vorhersagealgorithmus kombiniert, der eine Liste von erratenen Wörtern ausgibt, die von höchstwahrscheinlich nach niedrigstwahrscheinlich sortiert sind.

In dieser Herausforderung:

  • Wir streichen über eine eindimensionale Tastatur, die auf eine Teilmenge der 26 Buchstaben beschränkt ist.
  • Es wird keinen Vorhersagealgorithmus geben : Wir möchten, dass jedes Wort durch seine "Wischsequenz" eindeutig identifiziert wird.
  • Wir möchten, dass die Tastatur so optimiert wird , dass die Gesamtanzahl der Bewegungen für eine bestimmte Liste von Wörtern minimiert wird.

Wischen in einer Dimension

Nachfolgend finden Sie eine lexikographisch sortierte 1D-Tastatur mit allen Buchstaben:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

NB: Dies kann in mehreren Zeilen angezeigt werden, wenn Sie vom Handy aus surfen. Stellen Sie es sich bitte als eine einzelne Zeile vor.

Um das Wort " GOLF " auf einer solchen Tastatur einzugeben, werden wir:

  • beginne bei G
  • wische nach rechts zu O
  • wische nach links zu F

Weil Lsich zwischen Ound befindet F, wischen wir einfach weiter, ohne dort anzuhalten.

Die Wischsequenz von ' GOLF ' auf dieser Tastatur ist also GOF.

Allgemeiner:

  • Der erste und der letzte Buchstabe sind immer enthalten.
  • Andere Buchstaben sind nur dann enthalten, wenn eine Richtungsänderung unmittelbar danach erforderlich ist.
  • Wiederholte Buchstaben müssen wie einzelne Buchstaben behandelt werden. Zum Beispiel auf der obigen Tastatur:

    • ' LOOP ' würde codiert werden als LP(ohne Stopp O)
    • ' GOOFY ' würde codiert als GOFY(das Oist enthalten, weil es dort eine Richtungsänderung gibt - nicht, weil es verdoppelt ist)

Tastaturoptimierung

Betrachten wir die folgende Liste von Wörtern: [' PROGRAMMIERUNG ', ' PUZZLES ', ' UND ', ' CODE ', ' GOLF '].

Wir brauchen 16 verschiedene Buchstaben, um diese Wörter zu tippen, also brauchen wir nur eine Tastatur mit 16 Buchstaben. Das folgende ist - wieder - lexikographisch sortiert:

ACDEFGILMNOPRSUZ

Mit dieser Tastatur werden die Wörter folgendermaßen codiert:

  • PROGRAMMIERUNG : PRGRAMING(9 Züge)
  • PUZZLES : PZES(4 Züge)
  • UND : AND(3 Züge)
  • CODE : CODE(4 Züge)
  • GOLF : GOF(3 Züge)

Das sind insgesamt 23 Züge für alle Wörter.

Aber wir können mit dieser Tastatur viel besser machen:

CGODSELZNUIFRPAM

Welches gibt:

  • PROGRAMMIERUNG : PGMG(4 Züge)
  • PUZZLES : PS(2 Züge)
  • UND : AD(2 Züge)
  • CODE : CE(2 Züge)
  • GOLF : GF(2 Züge)

für insgesamt nur 12 Züge .

Tastaturbewertung

n

k=1nmk2

mkk

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

Je niedriger, desto besser.

Die Herausforderung

  • Bei einer gegebenen Wortliste muss Ihr Code eine gültige Tastatur für diese Liste ausgeben . Eine Tastatur gilt als gültig, wenn jedes Wort eine eindeutige Wischsequenz erzeugt.
  • Sie erhalten 11 unabhängige Wortlisten. Ihre Punktzahl wird gleich sein mit:

    S+L
    SL

    Mit diesem Skript können Sie Ihre Punktzahl überprüfen . Die score()Funktion erwartet Ihre Codelänge als ersten Parameter und ein Array von 11 Tastaturzeichenfolgen als zweiten Parameter (der Fall spielt keine Rolle).

  • Die Einsendung mit der niedrigsten Punktzahl gewinnt. Bei einem Unentschieden gewinnt die Einsendung, die zuerst eingereicht wurde.

Zusätzliche Regeln

  • Ihr Code muss deterministisch sein (dh er muss für eine bestimmte Eingabe immer dieselbe Ausgabe zurückgeben).
  • Sie müssen entweder A) einen Testlink (z. B. auf TIO) bereitstellen, der keine Zeitüberschreitung aufweist, oder B) die generierten Tastaturen in den Hauptteil Ihrer Antwort aufnehmen.
  • Sie können die Wörter entweder in Groß- oder Kleinbuchstaben eingeben. Mischfälle sind verboten.
  • Die Eingabe hat garantiert mindestens eine Lösung.
  • Alle Wörter bestehen aus mindestens 2 verschiedenen Buchstaben.
  • Ihr Code muss für eine gültige Eingabe funktionieren. Es wird mit einer geheimen Liste von Wörtern getestet, um sicherzustellen, dass es nicht auf fest codierten Ergebnissen beruht.
  • Ich behalte mir das Recht vor, die Größe der Testsuite jederzeit zu erhöhen, um sicherzustellen, dass die Einsendungen nicht für die ersten Testfälle optimiert sind.

Wortlisten

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 (jetzt gelöscht).
Arnauld


Wenn Sie die folgende Regel einschließen: "Ihr Code muss für jede Liste weniger als 1 Minute ausgeführt werden", kann es sinnvoll sein, anzugeben, wo er ausgeführt werden soll. Code, der in einer Minute auf einem Computer ausgeführt wird, kann auf einem anderen Computer Stunden dauern.
Mypetlion

@mypetlion Was hier wirklich wichtig ist, ist, dass der Code tatsächlich etwas ausgibt (und nicht nur für immer läuft), also habe ich diese Regel gelockert.
Arnauld

" Eine Tastatur gilt als gültig, wenn jedes Wort eine eindeutige Wischsequenz erzeugt. " - Was bedeutet hier eindeutig? Ist beispielsweise die alphabetische Reihenfolge eine ungültige Lösung für die Wörter "abda", "acda"?
20.

Antworten:


5

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

Dadurch werden immer optimale Lösungen gefunden (aber es wird viel Code dafür ausgegeben). Die Tests 1–9 werden in wenigen Sekunden ausgeführt, Test 10 in sechs Minuten und Test 11 in einer Minute.

Code

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

Ergebnis

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

Ergebnis überprüfen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.