Là từ có thể đánh máy với các phím liền kề nhau?


13

Trước khi đọc, tôi khuyên bạn nên đọc câu đố nhỏ này: /puzzling/11408/longest-word-with-adjighbor-letters-on-a-keyboard

Tôi muốn bạn tạo một chương trình lấy một đối số, một từ (chỉ chữ cái viết thường) và xuất ra "Có" nếu từ đó có thể được gõ bằng các phím liền kề trên bàn phím (xem bài viết) và "Không" nếu từ đó có thể Không được gõ bằng các chữ cái liền kề.

Đây là cách bố trí bàn phím được sử dụng trong thử thách này:

 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
 | 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 |
     └───┴───┴───┴───┴───┴───┴───┘

Hãy nhớ rằng: đây là codegolf nên câu trả lời ngắn nhất sẽ thắng!


Chúng ta có thể giả sử rằng đầu vào chỉ bao gồm các chữ cái? Chúng ta có thể cho rằng tất cả chúng được đưa ra trong một trường hợp duy nhất?
Martin Ender

2
Tôi bối rối bởi điều này: "Hai khóa liền kề có thể có tối đa 1,5 * khoảng trống của một phím giữa chúng." Chắc chắn các phím liền kề thực sự liền kề, nghĩa là chúng không có khoảng cách giữa chúng, như trong câu đố được liên kết?
Luke

Làm thế nào để tranh luận? STDIN? Một chức năng?
theonlygusti

Câu trả lời:


9

Bình dương, 66

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

Hãy thử nó ở đây.

Tôi đã rất ngạc nhiên khi biết Pyth không có chức năng thôi miên, vì vậy điều này có thể sẽ bị đánh bại bởi một ngôn ngữ khác. Tôi sẽ đề xuất một chức năng thôi miên cho Pyth, vì vậy sự tàn bạo này sẽ không xảy ra trong tương lai.

Giải trình

Tôi biến đổi bàn phím thành cái này:

┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
| 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 |
    └───┴───┴───┴───┴───┴───┴───┘

Mà sau đó tôi mã hóa thành "qwertyuiopasdfghjkl*zxcvbnm". Sau đó, tôi đã sử dụng divmod với modulo 9.5 để tìm ra tọa độ 2D của mọi phím. Sau đó, tôi tính khoảng cách giữa các phím liên tiếp và kiểm tra xem khoảng cách bình phương <2.


3

CJam, 83 75 74 byte

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

Hãy thử trực tuyến.

Giải trình

Cách tiếp cận chung là tạo ra một chuỗi kề lớn chứa mọi cặp ký tự bàn phím liền kề và sau đó kiểm tra xem mọi cặp ký tự đầu vào liền kề có được chứa trong chuỗi đó không.

Tôi khá hài lòng với cách tôi quản lý để xây dựng chuỗi kề, sử dụng logic rất đơn giản và gọn nhẹ.

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.";

Vậy đó, tôi đang học CJam.
Soham Chowdhury

@octatoan Có vẻ như cả hai chúng ta đều tốt hơn khi học Pyth. : P
Runer112

Haha, có lẽ trong trường hợp này, vâng.
Soham Chowdhury

2

J, 77 byte

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

Sử dụng:

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

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

Phương pháp:

Đối với mỗi chữ cái đầu vào tôi tạo ra tọa độ 2D (tương tự như hình ảnh trong câu hỏi) dựa trên chỉ mục của chuỗi trong chuỗi 'qazwsxedcrfvtgbyhnujmikXolX'. Đối với mỗi cặp chữ cái trong đầu vào, tôi kiểm tra xem khoảng cách Manhattan của tọa độ của chúng có nhỏ hơn 2. Nếu tất cả đều, tôi xuất ra Yes, Nonếu không (bằng cách lạm dụng toán tử `).

Hãy thử trực tuyến tại đây.


Bạn quên thư p.
mbomb007

@ mbomb007 Đối với các ký tự không tìm thấy, i.toán tử trả về index of the last element + 1để tôi có thể lưu 1 byte bằng cách không viết ra pvà vẫn lấy được chỉ mục chính xác.
Randomra

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.