Оптимизация пролистывания 1D клавиатуры


16

Это с пользовательской системой подсчета очков, где выигрывает самый низкий балл.

Вступление

Многие смартфоны позволяют вводить текст, проводя пальцем по виртуальной клавиатуре 2D. Эта технология обычно сочетается с алгоритмом прогнозирования, который выводит список угаданных слов, отсортированный от наиболее вероятного к наименее вероятному.

В этом вызове:

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

Смахивание в одном измерении

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

ABCDEFGHIJKLMNOPQRSTUVWXYZ

Примечание: это может отображаться в нескольких строках, если вы просматриваете с мобильного. Пожалуйста, подумайте об этом как один ряд.

Чтобы ввести слово « ГОЛЬФ » на такой клавиатуре, мы будем:

  • начать с G
  • проведите вправо до O
  • проведите влево, чтобы F

Потому Lчто расположен между Oи F, мы просто продолжаем смахивать, не останавливаясь там.

Таким образом, последовательность « GOLF » на этой клавиатуре GOF.

В более общем смысле:

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

    • ' LOOP ' будет закодирован как LP(без остановки на O)
    • « GOOFY » будет кодироваться как GOFY( Oвключено, потому что там есть изменение направления, а не потому, что оно удвоено)

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

Давайте рассмотрим следующий список слов: [« ПРОГРАММИРОВАНИЕ », « ГОЛОВОЛОМКИ », « И », « КОД », « ГОЛЬФ »].

Нам нужно 16 различных букв для ввода этих слов, поэтому нам просто нужна 16-буквенная клавиатура. Следующий снова - лексикографически отсортирован:

ACDEFGILMNOPRSUZ

С этой клавиатурой слова будут закодированы следующим образом:

  • ПРОГРАММИРОВАНИЕ : PRGRAMING(9 ходов)
  • ЗАГАДКИ : PZES(4 хода)
  • И : AND(3 хода)
  • КОД : CODE(4 хода)
  • ГОЛЬФ : GOF(3 хода)

Это всего 23 хода для всех слов.

Но мы можем сделать намного лучше с этой клавиатурой:

CGODSELZNUIFRPAM

Который дает:

  • ПРОГРАММИРОВАНИЕ : PGMG(4 хода)
  • ЗАГАДКИ : PS(2 хода)
  • И : AD(2 хода)
  • КОД : CE(2 хода)
  • ГОЛЬФ : GF(2 хода)

всего 12 ходов .

Оценка клавиатуры

N

ΣКзнак равно1NмК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

Песочница (сейчас удалена).
Арно

Угадайте, кто еще знает о борьбе ...
Эрик Outgolfer

Если вы собираетесь включить это правило: «Ваш код должен выполняться менее чем за 1 минуту для каждого списка», было бы целесообразно указать, где он будет выполняться. Код, который запускается на одном компьютере за одну минуту, может занять часы на другом.
mypetlion

@mypetlion Что здесь действительно важно, так это то, что код на самом деле что-то выводит (а не просто работает вечно), поэтому я ослабил это правило.
Арно

« Клавиатура считается действительной, если каждое слово генерирует уникальную последовательность пролистывания». Что здесь означает «уникальный»? Например, является ли алфавитный порядок неправильным решением для слов «abda», «acda»?
нг

Ответы:


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. DOLC, 20
  3. TNSECA, 13
  4. Рацион 80
  5. TYKCIDBRFHJUEVOXWNGZALQMPS, 32
  6. Ревинтуфабмпи, 66
  7. FYCWORTMHAGINDKVESULB, 125
  8. TSHRDABXLYOWUPMIENGCF, 213
  9. PVKEFDLBMUSWOIHACNYTRG, 212
  10. XHGTPMCKSUABYORDLJEIWNFV, 596
  11. ПЫЛЬФНАВЭКБОЧТРГДСИЗУМ, 601

Проверить счет

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.