การเพิ่มประสิทธิภาพการปัดบนคีย์บอร์ด 1D


16

นี่คือการด้วยระบบการให้คะแนนที่กำหนดเองซึ่งคะแนนต่ำสุดชนะ

บทนำ

สมาร์ทโฟนหลายตัวอนุญาตให้ป้อนข้อความโดยเลื่อนนิ้วของคุณผ่านแป้นพิมพ์เสมือน 2D เทคโนโลยีนี้มักจะรวมกับอัลกอริทึมการทำนายที่แสดงรายการคำที่เดาซึ่งเรียงลำดับจากโอกาสที่จะเป็นไปได้น้อยที่สุด

ในความท้าทายนี้:

  • เราจะปัดข้ามแป้นพิมพ์หนึ่งมิติไปที่ชุดย่อยของตัวอักษร 26 ตัว
  • จะไม่มีอัลกอริทึมการทำนาย : เราต้องการให้แต่ละคำระบุเฉพาะโดย 'swipe sequence'
  • เราต้องการให้คีย์บอร์ดได้รับการปรับให้เหมาะสมในลักษณะที่จำนวนการย้ายทั้งหมดสำหรับรายการคำที่กำหนดจะลดลง

รูดในมิติเดียว

ด้านล่างนี้เป็นคีย์บอร์ด 1D เรียงตามพจนานุกรมด้วยตัวอักษรทั้งหมด:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

หมายเหตุ: สิ่งนี้อาจปรากฏขึ้นในหลายแถวหากคุณเรียกดูจากมือถือ กรุณาคิดว่ามันเป็นแถวเดียว

ในการป้อนคำว่า ' GOLF ' บนแป้นพิมพ์เราจะ:

  • เริ่มต้นที่ G
  • ปัดไปทางขวาเพื่อ O
  • ปัดไปทางซ้ายเพื่อ F

เพราะLตั้งอยู่ระหว่างOและFเราเพิ่งเลื่อนโดยไม่หยุด

ดังนั้นลำดับรูด ' กอล์ฟ ' GOFบนแป้นพิมพ์นี้คือ

ให้เป็นปกติมากกว่านี้:

  • ตัวอักษรตัวแรกและตัวสุดท้ายจะรวมอยู่เสมอ
  • ตัวอักษรอื่น ๆ จะรวมอยู่หากจำเป็นต้องมีการเปลี่ยนทิศทางหลังจากนั้นเท่านั้น
  • ตัวอักษรที่ซ้ำกันจะต้องได้รับการปฏิบัติเช่นเดียวกับตัวอักษรเดียว ตัวอย่างเช่นบนแป้นพิมพ์ด้านบน:

    • ' LOOP ' จะถูกเข้ารหัสเป็นLP(โดยไม่หยุดอยู่O)
    • ' GOOFY ' จะถูกเข้ารหัสเป็นGOFY( Oรวมอยู่เนื่องจากมีการเปลี่ยนแปลงทิศทาง - ไม่ใช่เพราะมันเพิ่มเป็นสองเท่า)

การปรับคีย์บอร์ดให้เหมาะสม

ลองพิจารณารายการคำต่อไปนี้: ['การเขียนโปรแกรม ', ' PUZZLES ', ' AND ', ' CODE ', ' GOLF ']

เราต้องการตัวอักษร 16 ตัวเพื่อพิมพ์คำเหล่านี้ดังนั้นเราแค่ต้องการแป้นพิมพ์ 16 ตัว รายการต่อไปนี้คือ - อีกครั้ง - เรียงตามพจนานุกรม:

ACDEFGILMNOPRSUZ

ด้วยคีย์บอร์ดนี้คำจะถูกเข้ารหัสด้วยวิธีนี้:

  • การเขียนโปรแกรม : PRGRAMING(9 ย้าย)
  • ปริศนา : PZES(4 การเคลื่อนไหว)
  • และ : AND(3 ย้าย)
  • รหัส : CODE(4 ย้าย)
  • GOLF : GOF(3 การเคลื่อนไหว)

นั่นคือทั้งหมด23 การเคลื่อนไหวสำหรับทุกคำ

แต่เราสามารถทำได้ดียิ่งขึ้นด้วยแป้นพิมพ์นี้:

CGODSELZNUIFRPAM

ซึ่งจะช่วยให้:

  • การเขียนโปรแกรม : PGMG(4 ย้าย)
  • ปริศนา : PS(2 ย้าย)
  • และ : AD(2 ย้าย)
  • รหัส : CE(2 ย้าย)
  • GOLF : GF(2 ย้าย)

สำหรับการเคลื่อนย้ายทั้งหมดเพียง12ครั้ง

การให้คะแนนแป้นพิมพ์

n

Σk=1nม.k2

ม.kk -th

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

ยิ่งต่ำยิ่งดี

ความท้าทาย

  • รับรายการคำรหัสของคุณจะต้องส่งออกแป้นพิมพ์ที่ถูกต้องสำหรับรายการนี้ คีย์บอร์ดถือว่าใช้ได้ถ้าคำแต่ละคำสร้างลำดับการปัดแบบเฉพาะ
  • คุณจะได้รับรายชื่อ 11 คำที่เป็นอิสระ คะแนนของคุณจะเท่ากับ:

    S+L
    SL

    คุณสามารถใช้สคริปต์นี้เพื่อตรวจสอบคะแนนของคุณ 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

Sandbox (ตอนนี้ถูกลบ)
Arnauld

เดาว่าใครจะรู้การต่อสู้ ...
Erik the Outgolfer

หากคุณกำลังจะรวมกฎนี้: "รหัสของคุณจะต้องทำงานในเวลาน้อยกว่า 1 นาทีสำหรับแต่ละรายการ" มันอาจจะดีที่จะระบุว่ามันจะทำงานอยู่ที่ไหน รหัสที่ทำงานบนคอมพิวเตอร์เครื่องหนึ่งในหนึ่งนาทีอาจใช้เวลาหลายชั่วโมงในอีกเครื่องหนึ่ง
mypetlion

@mypetlion สิ่งที่สำคัญจริงๆที่นี่คือรหัสเอาท์พุทอะไรบางอย่าง (และไม่เพียงแค่ทำงานตลอดไป) ดังนั้นฉันจึงผ่อนคลายกฎนี้
Arnauld

" คีย์บอร์ดถือว่าใช้ได้ถ้าแต่ละคำสร้างลำดับการปัดแบบเฉพาะ " - ความหมายเฉพาะที่นี่มีอะไรบ้าง ตัวอย่างเช่นลำดับตัวอักษรคือคำตอบที่ไม่ถูกต้องสำหรับคำว่า '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. 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

ตรวจสอบคะแนน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.