1Dキーボードでのスワイプの最適化


16

これは、カスタムスコアリングシステムによるであり、最低スコアが勝ちます。

前書き

多くのスマートフォンでは、2D仮想キーボード上で指をスワイプすることでテキストを入力できます。この技術は通常、推測された単語のリストを出力する予測アルゴリズムと組み合わされ、最も可能性の高いものから低いものへとソートされます。

この課題では:

  • 26文字のサブセットに制限された1次元キーボードをスワイプします。
  • 予測アルゴリズムはありません。各単語が「スワイプシーケンス」によって一意に識別されるようにします。
  • 特定の単語リストの移動の合計数が最小になるようにキーボードを最適化する必要があります。

1次元でのスワイプ

以下は、すべての文字で辞書式にソートされた1Dキーボードです。

ABCDEFGHIJKLMNOPQRSTUVWXYZ

注意:モバイルから閲覧している場合、これは複数の行に表示される場合があります。単一の行と考えてください。

そのようなキーボードで単語 ' GOLF ' を入力するには、次のようにします。

  • で始まる G
  • 右にスワイプして O
  • 左にスワイプして F

そのためLの間に位置しているOF、私たちはそこに停止せずにスワイプに行きます。

それで、このキーボードの' GOLF 'のスワイプシーケンスはGOFです。

より一般的に:

  • 最初と最後の文字は常に含まれます。
  • 他の文字は、方向の変更が必要な場合にのみ含まれます。
  • 繰り返される文字は、単一の文字と同じように扱われる必要があります。たとえば、上記のキーボードで:

    • ' LOOP 'は次のようにエンコードされますLP(停止なしO
    • GOOFY」は次のようにエンコードされますGOFYO方向が変更されたために含まれています-二重になっているためではありません)

キーボードの最適化

次の単語のリストを考えてみましょう:[' PROGRAMMING '、 ' PUZZLES '、 ' AND '、 ' CODE '、 ' GOLF ']。

これらの単語を入力するには16の異なる文字が必要なので、16文字のキーボードが必要です。次は、辞書式にソートされたものです。

ACDEFGILMNOPRSUZ

このキーボードを使用すると、単語は次のようにエンコードされます。

  • プログラミングPRGRAMING(9手)
  • パズルPZES(4手)
  • ANDAND(3手)
  • コードCODE(4手)
  • ゴルフGOF(3手)

これ、すべての単語に対して合計23の動きです。

ただし、このキーボードを使用すると、さらに改善できます。

CGODSELZNUIFRPAM

与えるもの:

  • プログラミングPGMG(4手)
  • パズルPS(2手)
  • ANDAD(2手)
  • コードCE(2手)
  • ゴルフGF(2手)

合計でわずか12の動きです。

キーボードスコアリング

n

k=1nmk2

mkk

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

低いほど良い。

チャレンジ

  • 単語のリストを指定すると、コードはこのリストに有効なキーボードを出力する必要があります。各単語が一意のスワイプシーケンスを生成する場合、キーボードは有効と見なされます。
  • 単語の11の独立したリストが与えられます。あなたのスコアは以下に等しくなります:

    S+L
    SL

    あなたはできるあなたのスコアを確認するには、このスクリプトを使用します。このscore()関数は、最初のパラメーターとしてコード長を、2番目のパラメーターとして11個のキーボード文字列の配列を想定しています(大文字と小文字は区別されません)。

  • 最低スコアの提出が勝ちです。同点の場合、最初に提出された提出物が勝ちます。

追加のルール

  • コードは確定的でなければなりません(つまり、指定された入力に対して常に同じ出力を返す必要があります)。
  • A)タイムアウトしないテストリンク(TIOなど)を提供するか、B)回答の本文に生成されたキーボードを含める必要があります。
  • 単語は大文字でも小文字でも構いません。混在するケースは禁止されています。
  • 入力には、少なくとも1つのソリューションがあることが保証されています。
  • すべての単語は、少なくとも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

サンドボックス(現在削除済み)。
アーナルド

他の誰が闘争を知って
いると思い

「リストごとに1分以内にコードを実行する必要があります」というルールを含める場合は、実行する場所を指定することをお勧めします。1つのコンピューターで1分で実行されるコードは、別のコンピューターで数時間かかる場合があります。
mypetlion

@mypetlionここで本当に重要なのは、コードが実際に何かを出力することです(永久に実行されるだけではありません)。そのため、この規則を緩和しました。
アーナルド

各単語が一意のスワイプシーケンスを生成する場合、キーボードは有効と見なされます。」-ここで一意とはどういう意味ですか?たとえば、アルファベット順は「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. RATION、80
  5. TYKCIDBRFHJUEVOXWNGZALQMPS、32
  6. REWINTHUVOFABMPY、66
  7. FYCWORTMHAGINDKVESULB、125
  8. TSHRDABXLYOWUPMIENGCF、213
  9. PVKEFDLBMUSWOIHACNYTRG、212
  10. XHGTPMCKSUABYORDLJEIWNFV、596
  11. PYLFNAVEKBOCHTRGDSIZUM、601

スコアを確認

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.