Оптимізація перегортання по 1D клавіатурі


16

Це з зі спеціальною системою балів, де виграє найнижчий бал.

Вступ

Багато смартфонів дозволяють вводити текст, проводячи пальцем по 2D віртуальній клавіатурі. Ця технологія зазвичай поєднується з алгоритмом прогнозування, який виводить список відгаданих слів, відсортованих від найімовірніших до найменш вірогідних.

У цьому виклику:

  • Ми переходимо по одновимірній клавіатурі, обмеженій підмножиною з 26 літер.
  • Не буде алгоритму прогнозування : ми хочемо, щоб кожне слово було однозначно ідентифіковане за його "проведенню послідовності".
  • Ми хочемо, щоб клавіатура була оптимізована таким чином, щоб загальна кількість рухів для заданого списку слів була мінімізована.

Проведення в одному вимірі

Нижче наведена лексикографічно впорядкована 1D клавіатура з усіма літерами:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

Примітка. Це може відображатися в декількох рядках, якщо ви переглядаєте з мобільного телефону. Будь ласка, думайте про це як про один ряд.

Щоб ввести слово " GOLF " на такій клавіатурі, ми:

  • почати о G
  • проведіть пальцем праворуч до O
  • проведіть пальцем ліворуч до F

Тому що Lрозташований між Oі F, ми просто продовжуємо прокручуватися, не зупиняючись там.

Таким чином, проведіть послідовністю " GOLF " на цій клавіатурі GOF.

Більш загально:

  • Перший і останній листи завжди включаються.
  • Інші літери включаються лише тоді, коли після них потрібно змінити напрямок.
  • Повторні букви повинні трактуватися так само, як і окремі букви. Наприклад, на наведеній вище клавіатурі:

    • ' LOOP ' кодується як LP(без зупинки O)
    • " GOOFY " буде кодовано як GOFY( Oвключений, тому що там є зміна напрямку - не тому, що воно подвоєне)

Оптимізація клавіатури

Розглянемо наступний перелік слів: [' ПРОГРАММУВАННЯ ', ' PUZZLES ', ' І ', ' КОД ', ' GOLF '].

Для введення цих слів нам потрібно 16 різних літер, тому нам просто потрібна клавіатура з 16 літер. Наступне - знову - лексикографічно відсортовано:

ACDEFGILMNOPRSUZ

За допомогою цієї клавіатури слова будуть закодовані таким чином:

  • ПРОГРАММУВАННЯ : PRGRAMING(9 ходів)
  • PUZZLES : PZES(4 ходи)
  • І : AND(3 ходи)
  • КОД : CODE(4 ходи)
  • GOLF : GOF(3 ходи)

Це всього 23 ходи на всі слова.

Але ми можемо зробити набагато краще за допомогою цієї клавіатури:

CGODSELZNUIFRPAM

Що дає:

  • ПРОГРАММУВАННЯ : PGMG(4 ходи)
  • PUZZLES : PS(2 ходи)
  • І : AD(2 ходи)
  • КОД : CE(2 ходи)
  • GOLF : GF(2 ходи)

загалом лише 12 ходів .

Оцінка клавіатури

н

к=1нмк2

мкк -го слова.

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

Чим нижче, тим краще.

Змагання

  • Враховуючи список слів, ваш код повинен вивести дійсну клавіатуру для цього списку. Клавіатура вважається дійсною, якщо кожне слово генерує унікальну послідовність пальців.
  • Вам дадуть 11 незалежних списків слів. Ваш рахунок буде дорівнює:

    S+L
    SL

    Ти можеш використовувати цей сценарій, щоб перевірити свій рахунок . score()Функція очікує вашу довжину коду в якості першого параметра і масив 11 клавішних рядків в якості другого параметра (в разі не має значення).

  • Виграє подання з найменшим балом. У разі вирівнювання матчу подання, яке було подано першим, виграє.

Додаткові правила

  • Ваш код повинен бути детермінованим (тобто він повинен завжди повертати один і той же вихід для заданого вводу).
  • Ви повинні або A) надати тестове посилання (наприклад, на TIO), яке не вичерпується, або B) включати створені клавіатури в тілі вашої відповіді.
  • Ви можете взяти слова в повному регістрі або в повному регістрі. Змішані справи заборонені.
  • Вхід гарантовано мати хоча б одне рішення.
  • Усі слова складаються щонайменше з двох відмінних літер.
  • Ваш код повинен працювати для будь-якого дійсного введення. Він буде перевірений нерозкритим списком слів, щоб переконатися, що він не покладається на жорстко кодовані результати.
  • Я залишаю за собою право збільшити розмір тестового набору в будь-який час, щоб переконатися, що матеріали не оптимізовані для початкових тестових випадків.

Списки слів

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

Пісочниця (зараз видалено).
Арнольд

Здогадайтесь, хто ще знає боротьбу ...
Ерік Атголфер

Якщо ви будете включати це правило: "Ваш код повинен працювати менше ніж 1 хвилину для кожного списку", можливо, буде добре вказати, де він буде працювати. Код, який працює на одному комп’ютері за одну хвилину, на іншому може зайняти години.
mypetlion

@mypetlion Що насправді важливо, це те, що код насправді щось виводить (а не просто працює назавжди), тому я послабив це правило.
Арнольд

" Клавіатура вважається дійсною, якщо кожне слово генерує унікальну послідовність проведення пальцем ". - Що тут означає унікальне? наприклад, чи алфавітний порядок є недійсним рішенням для слів "abda", "acda"?
ngn

Відповіді:


5

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

Це завжди знаходить оптимальні рішення (але витрачає багато коду для цього). Він запускає тести 1–9 за кілька секунд, тестує 10 за шість хвилин і тестує 11 за одну хвилину.

Код

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

Результат

  1. SEH, 13
  2. ДОЛК, 20
  3. TNSECA, 13
  4. СТАНЦІЯ, 80
  5. TYKCIDBRFHJUEVOXWNGZALQMPS, 32
  6. ПОВТОРНЕННЯ ЗАВДАННЯ, 66
  7. FYCWORTMHAGINDKVESULB, 125
  8. TSHRDABXLYOWUPMIENGCF, 213
  9. PVKEFDLBMUSWOIHACNYTRG, 212
  10. XHGTPMCKSUABYORDLJEIWNFV, 596
  11. PYLFNAVEKBOCHTRGDSIZUM, 601

Перевір бал

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.