1D 키보드에서 스 와이프 최적화


16

이것은 가장 낮은 점수를 얻는 사용자 정의 점수 시스템으로 입니다 .

소개

많은 스마트 폰 에서 2D 가상 키보드를 손가락 으로 스 와이프 하여 텍스트를 입력 할 수 있습니다. 이 기술은 일반적으로 가장 가능성이 높거나 가장 낮은 것으로 정렬 된 추측 단어 목록을 출력하는 예측 알고리즘과 결합됩니다.

이 도전에서 :

  • 26 자 중 일부로 제한된 1 차원 키보드 를 쓸어 넘기겠습니다 .
  • 예측 알고리즘없습니다 . 각 단어를 '스 와이프 시퀀스'로 고유하게 식별하기를 원합니다.
  • 주어진 단어 목록에 대한 총 이동 수가 최소화 되도록 키보드를 최적화하고자합니다 .

한 차원으로 스 와이프

아래는 모든 문자를 포함하는 사전 순으로 정렬 된 1D 키보드입니다.

ABCDEFGHIJKLMNOPQRSTUVWXYZ

주의 : 모바일에서 탐색하는 경우 여러 행에 표시 될 수 있습니다. 그것을 한 줄로 생각하십시오.

그러한 키보드에서 ' 골프 ' 라는 단어를 입력하려면 다음을 수행하십시오 .

  • ~에서 시작하다 G
  • 오른쪽으로 스 와이프 O
  • 왼쪽으로 스 와이프 F

때문에 L사이에 위치 O하고 F, 우리는 단지 거기에 멈추지 않고 강타 이동합니다.

따라서이 키보드에서 ' GOLF ' 의 스 와이프 시퀀스 는 GOF입니다.

더 일반적으로:

  • 첫 글자와 마지막 글자가 항상 포함됩니다.
  • 다른 문자는 바로 뒤에 방향 변경이 필요한 경우에만 포함됩니다.
  • 반복되는 글자는 한 글자와 같은 방식으로 취급해야합니다. 예를 들어 위 키보드에서 :

    • ' LOOP '은 다음 LP과 같이 인코딩됩니다 (중지되지 않음 O).
    • ' GOOFY '는 다음과 같이 인코딩됩니다 GOFY( O두 배가 아니라 방향 변경이 있기 때문에 포함됩니다)

키보드 최적화

[ ' PROGRAMMING ', ' PUZZLES ', ' AND ', ' CODE ', ' GOLF '] 단어 목록을 고려해 봅시다 .

이 단어를 입력하려면 16 개의 고유 한 문자가 필요하므로 16 자 키보드 만 있으면됩니다. 다음은 사전 식으로 정렬됩니다.

ACDEFGILMNOPRSUZ

이 키보드를 사용하면 단어가 다음과 같이 인코딩됩니다.

  • 프로그래밍 : PRGRAMING(9 움직임)
  • 퍼즐 : PZES(4 이동)
  • AND : AND(3 이동)
  • 코드 : CODE(4 이동)
  • 골프 : GOF(3 이동)

그것은 모든 단어에 대해 총 23 개의 동작 입니다.

그러나 우리는이 키보드로 훨씬 더 잘할 수 있습니다 :

CGODSELZNUIFRPAM

다음을 제공합니다.

  • 프로그래밍 : PGMG(4 이동)
  • 퍼즐 : PS(2 움직임)
  • AND : AD(2 이동)
  • 코드 : CE(2 이동)
  • 골프 : GF(2 움직임)

12 번만 움직 입니다.

키보드 채점

케이=1미디엄케이2

미디엄케이케이

92+42+2+42+2=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

누가 그 투쟁을 알고 있는지 맞춰보세요 ...
Outgolfer Erik

이 규칙을 포함 시키려면 "코드가 각 목록에 대해 1 분 이내에 실행되어야합니다"라는 규칙을 포함 시키려면 코드가 실행될 위치를 지정하는 것이 좋습니다. 한 컴퓨터에서 1 분 안에 실행되는 코드는 다른 컴퓨터에서 몇 시간이 걸릴 수 있습니다.
mypetlion

@mypetlion 여기서 중요한 것은 코드가 실제로 무언가를 출력하고 (영원히 실행되지는 않음)이 규칙을 완화했다는 것입니다.
Arnauld

" 각 단어가 고유 한 스 와이프 시퀀스를 생성하면 키보드가 유효한 것으로 간주됩니다. "-여기서 고유 한 것은 무엇입니까? 예를 들어, 알파벳 순서는 단어 'abda', 'acda'에 대한 잘못된 솔루션입니까?
ngn

답변:


5

Python 3 + Google OR 도구 , 1076 + 1971 = 3047

이것은 항상 최적의 솔루션을 찾습니다 (그러나 그렇게하기 위해 많은 코드를 소비합니다). 몇 초 안에 1–9 테스트를 실행하고 6 분 안에 10을 테스트하고 1 분 안에 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. 213 위 TSHRDABXLYOWUPMIENGCF
  9. PVKEFDLBMUSWOIHACNYTRG, 212
  10. XHGTPMCKSUABYORDLJEIWNFV, 596
  11. PYLFNAVEKBOCHTRGDSIZUM, 601

점수 확인

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.