优化一维键盘上的滑动


16

这是具有自定义评分系统的,评分最低者获胜。

介绍

许多智能手机允许通过在2D虚拟键盘上滑动手指来输入文本。该技术通常与预测算法结合,该预测算法输出从最可能到最不可能排序的猜词列表。

在这个挑战中:

  • 我们将在仅限于26个字母的子集的一维键盘上滑动。
  • 不会有预测算法:我们希望每个单词都通过其“滑动顺序”来唯一标识。
  • 我们希望对键盘进行优化,以使给定单词列表的移动总数最小化。

一维扫动

以下是按字母顺序排序的一维键盘,其中包含所有字母:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

注意:如果您是通过手机浏览的,则可能显示在多行上。请认为它是单行。

要在这样的键盘上输入单词“ GOLF ”,我们将:

  • 开始于 G
  • 向右滑动至 O
  • 向左滑动 F

因为L位于O和之间F,所以我们只是继续刷卡而不停在那。

因此,此键盘上的“ GOLF ” 滑动顺序为GOF

更普遍:

  • 始终包含首字母和尾字母。
  • 当且仅当紧随其后需要换向时,才包括其他字母。
  • 重复字母必须与单个字母一样对待。例如,在上面的键盘上:

    • LOOP ”将被编码为LP(不停止O
    • GOOFY ”将被编码为GOFYO之所以包含在内,是因为那里的方向发生了变化-并不是因为它被加倍了)

键盘优化

让我们考虑以下单词列表:[' PROGRAMMING ',' PUZZLES ',' AND ',' CODE ',' GOLF ']。

我们需要16个不同的字母来键入这些单词,因此我们只需要一个16个字母的键盘即可。以下是-再次-按字典顺序排序:

ACDEFGILMNOPRSUZ

使用此键盘,单词将以这种方式编码:

  • 编程PRGRAMING(9个动作)
  • 拼图PZES(4个动作)
  • ANDAND(3个动作)
  • CODECODE(4个移动)
  • 高尔夫球GOF(3个动作)

所有单词总共有23个动作

但是我们可以使用此键盘做得更好:

CGODSELZNUIFRPAM

这使:

  • 编程PGMG(4个动作)
  • 拼图PS(2个动作)
  • ANDAD(2个动作)
  • CODECE(2个移动)
  • 高尔夫球GF(2个动作)

总共只有12个动作

键盘计分

ñ

ķ=1个ñķ2

ķķ

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

越低越好。

挑战

  • 给定单词列表,您的代码必须为该列表输出有效的键盘。如果每个单词生成唯一的滑动序列,则认为键盘有效。
  • 您将获得11个独立的单词列表。您的分数将等于:

    小号+大号
    小号大号

    您可以使用此脚本检查分数。该score()函数将您的代码长度作为第一个参数,并将11个键盘字符串的数组作为第二个参数(大小写无关紧要)。

  • 得分最低的提交者获胜。如果是平局,则首先提交的提交将获胜。

附加规则

  • 您的代码必须是确定性的(即,对于给定的输入,它必须始终返回相同的输出)。
  • 您必须A)提供一个不会超时的测试链接(例如,在TIO上),或B)将生成的键盘包含在答案的正文中。
  • 您可以将单词全部大写或全部小写。禁止混合使用。
  • 输入保证至少有一个解决方案。
  • 所有单词均由至少2个不同的字母组成。
  • 您的代码必须适用于任何有效输入。它将使用未公开的单词列表进行测试,以确保它不依赖于硬编码的结果。
  • 我保留随时增加测试套件大小的权利,以确保未针对初始测试用例优化提交内容。

词表

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

猜猜还有谁知道这斗争吗……
Egg the Outgolfer

如果要包括以下规则:“每个列表的代码必须在1分钟内运行”,则最好指定它将在哪里运行。一分钟在一台计算机上运行的代码在另一台计算机上可能要花费数小时。
mypetlion

@mypetlion在这里真正重要的是代码实际上输出了一些内容(而不是永远运行),因此我放宽了此规则。
Arnauld

如果每个单词生成唯一的滑动序列,则认为键盘有效。 ”-唯一在这里意味着什么?例如,字母顺序对于单词“ abda”,“ acda”是否无效?
ngn

Answers:


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. REWINTHUVOFABMPY,66岁
  7. FYCWORTMHAGINDKVESULB,125
  8. TSHRDABXLYOWUPMIENGCF,213
  9. PVKEFDLBMUSWOIHACNYTRG,212
  10. XHGTPMCKSUABYORDLJEIWNFV,596
  11. PYLFNAVEKBOCHTRGDSIZUM,601

检查分数

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.