คำนี้พิมพ์ด้วยปุ่มที่อยู่ติดกันหรือไม่?


13

ก่อนที่จะอ่านสิ่งนี้ฉันขอแนะนำให้อ่านปริศนาเล็ก ๆ นี้: /puzzling/11408/longest-word-with-advertise-letters-on-a-keyboard

ฉันต้องการให้คุณสร้างโปรแกรมที่ใช้อาร์กิวเมนต์หนึ่งคำ (ตัวอักษรตัวพิมพ์เล็กเท่านั้น) และส่งออก "ใช่" หากคำนั้นสามารถพิมพ์ด้วยปุ่มที่อยู่ติดกันบนแป้นพิมพ์ (ดูบทความ) และ "ไม่" ถ้าคำนั้นสามารถ ไม่ต้องพิมพ์ด้วยตัวอักษรที่อยู่ติดกัน

นี่คือรูปแบบแป้นพิมพ์ที่ใช้ในการท้าทายนี้:

 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
 | Q | W | E | R | T | Y | U | I | O | P |
 └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┘
   | A | S | D | F | G | H | J | K | L |
   └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┘
     | Z | X | C | V | B | N | M |
     └───┴───┴───┴───┴───┴───┴───┘

โปรดจำไว้ว่านี่คือ codegolf ดังนั้นคำตอบที่สั้นที่สุดชนะ!


เราสามารถสมมติว่าการป้อนข้อมูลประกอบด้วยตัวอักษรเท่านั้น? เราสามารถสันนิษฐานได้ว่าพวกเขาทั้งหมดได้รับในกรณีเดียว?
Martin Ender

2
ฉันสับสนโดย: "คีย์ที่อยู่ติดกันสองตัวสามารถมีได้สูงสุด 1.5 * ช่องว่างของคีย์ระหว่างพวกเขา" จริง ๆ แล้วกุญแจที่อยู่ติดกันนั้นอยู่ติดกันนั่นคือพวกมันไม่มีช่องว่างระหว่างพวกมันเหมือนกับในตัวต่อปริศนา
ลุค

วิธีการโต้แย้ง? STDIN? ฟังก์ชั่น?
theonlygusti

คำตอบ:


9

Pyth, 66

?"Yes".Am>2sm^-.uk2Cm.Dx"qwertyuiopasdfghjkl*zxcvbnm"b9.5dC,ztz"No

ลองที่นี่

ฉันประหลาดใจที่ได้เรียนรู้ Pyth ไม่มีฟังก์ชั่นด้านตรงข้ามมุมฉากดังนั้นสิ่งนี้น่าจะถูกเอาชนะด้วยภาษาอื่น ฉันจะเสนอฟังก์ชันด้านตรงข้ามมุมฉากกับ Pyth ดังนั้นความโหดร้ายนี้จะไม่เกิดขึ้นในอนาคต

คำอธิบาย

ฉันเปลี่ยนคีย์บอร์ดเป็นสิ่งนี้:

┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
| Q | W | E | R | T | Y | U | I | O | P |
└─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐
  | A | S | D | F | G | H | J | K | L | * |
  └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴───┘
    | Z | X | C | V | B | N | M |
    └───┴───┴───┴───┴───┴───┴───┘

"qwertyuiopasdfghjkl*zxcvbnm"ซึ่งผมก็เป็นเข้ารหัส จากนั้นฉันใช้ divmod กับ modulo 9.5 เพื่อหาพิกัด 2D ของทุกปุ่ม จากนั้นฉันคำนวณระยะทางระหว่างปุ่มที่ต่อเนื่องกันและตรวจสอบว่าระยะทางกำลังสอง <2


3

CJam, 83 75 74 ไบต์

l_1>]z["qwertyuiop asdfghjkl  zxcvbnm "[__B>]z+s_W%+_]zsf{\#)}:*"Yes""No"?

ลองออนไลน์

คำอธิบาย

วิธีการทั่วไปคือการสร้างสตริง adjacency ขนาดใหญ่ที่บรรจุอักขระของคีย์บอร์ดที่อยู่ติดกันทุกคู่แล้วตรวจสอบว่ามีอักขระอินพุตที่อยู่ติดกันทุกคู่ในสตริงนั้น

ฉันมีความสุขมากกับวิธีที่ฉันจัดการเพื่อสร้างสตริง adjacency ซึ่งใช้ตรรกะที่ง่ายและกะทัดรัด

l_1>]z          "Read a line of input and create a list of every pair of
                 adjacent input characters. There will be a trailing element
                 of just the final character, but that's okay since any single
                 lowercase letter can be found in the adjacency string.";
["qwertyuiop asdfghjkl  zxcvbnm "
              "^ Create the in-row forward adjacency string.";
[__B>]z         "Create the alternating-row forward adjacency string by
                 interleaving the in-row string with a substring of itself
                 starting with the middle row letters:
                   'q w e r t y u i o p   a s d f g h j k l  zxcvbnm '
                 + ' a s d f g h j k l     z x c v b n m  '[no interleave here]
                 -----------------------------------------------------
                   'qawsedrftgyhujikolp   azsxdcfvgbhnjmk l  zxcvbnm '";
+s              "Append the alternating-row forward adjacency string to the
                 in-row forward adjacency string.";
_W%+            "Append the reverse of the forward adjacency string (the
                 backward adjacency string) to the forward adjacency string.";
_]zs            "Double every character in the adjacency string so every
                 character is adjacent to itself.";
f{\#)}          "Map each pair of input characters to its 1-indexed location in
                 the adjacency string (0 if not found).";
:*              "Calculate the product of each pair's location in the adjacency
                 string. This will be nonzero if and only if every pair of
                 input characters are in fact adjacent.";
"Yes""No"?      "If the product is nonzero, produce 'Yes'; otherwise, produce
                 'No'.";
                "Implicitly print the result.";

ใช่ฉันกำลังเรียนรู้ CJam
Soham Chowdhury

@octatoan ดูเหมือนว่าเราทั้งคู่จะเรียนรู้ Pyth ได้ดีกว่า : P
Runer112

ฮ่าฮ่าบางทีในกรณีนี้ใช่
Soham Chowdhury

2

J, 77 ไบต์

No`Yes{::~[:*/2>+/"1@(2|@-/\3(|,.<.@%~+-:@|)'qazwsxedcrfvtgbyhnujmikXolX'i.])

การใช้งาน:

   f=.No`Yes{::~[:*/2>+/"1@(2|@-/\3(|,.<.@%~+-:@|)'qazwsxedcrfvtgbyhnujmikXolX'i.])

   f 'redresser'
Yes
   f 'qwergy'
No
   f 'ppcg'
No

วิธี:

สำหรับตัวอักษรทุกท่านผมสร้างมันเป็น 2D ประสานงาน (คล้ายกับภาพในคำถาม) 'qazwsxedcrfvtgbyhnujmikXolX'ตามที่เป็นของดัชนีในสตริง สำหรับคู่ของตัวอักษรในการป้อนข้อมูลทุกฉันจะตรวจสอบถ้าพิกัดของพวกเขาแมนฮัตตันทางมีขนาดเล็กกว่า 2. ถ้าทุกคนมีผมเอาท์พุทYes, Noมิฉะนั้น (โดยเหยียดหยามผู้ประกอบการ `)

ลองออนไลน์ได้ที่นี่


pคุณลืมจดหมาย
mbomb007

@ mbomb007 สำหรับอักขระที่ไม่พบi.ผู้ดำเนินการส่งคืนindex of the last element + 1ดังนั้นฉันสามารถบันทึก 1 ไบต์โดยไม่เขียนออกpและยังได้รับดัชนีที่ถูกต้อง
randomra

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