Apakah kata tersebut dapat diketik dengan kunci yang berdekatan?

13

Sebelum membaca ini saya sarankan membaca puzzle kecil ini: /puzzling/11408/longest-word-with-adjacent-letters-on-a-keyboardboard

Saya ingin Anda membuat program yang mengambil satu argumen, satu kata (hanya huruf kecil), dan menghasilkan "Ya" jika kata itu dapat diketik dengan tombol yang berdekatan pada keyboard (lihat artikel) dan "Tidak" jika kata itu dapat diketik dengan huruf yang berdekatan.

Berikut tata letak keyboard yang digunakan dalam tantangan ini:

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

Ingat: ini codegolf sehingga jawaban terpendek menang!

Loovjo
sumber
Bisakah kita berasumsi bahwa input hanya terdiri dari huruf? Bisakah kita berasumsi bahwa mereka semua diberikan dalam satu kasus?
Martin Ender
2
Saya bingung dengan ini: "Dua kunci yang berdekatan dapat memiliki 1,5 * ruang kunci di antara mereka." Tentunya kunci yang berdekatan sebenarnya berdekatan, yaitu, mereka tidak memiliki ruang di antara mereka, seperti dalam puzzle yang ditautkan?
Luke
Bagaimana cara mengambil argumen? STDIN? Sebuah fungsi?
theonlygusti

Jawaban:

9

Pyth, 66

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

Coba di sini.

Saya terkejut mengetahui Pyth tidak memiliki fungsi miring, jadi ini kemungkinan akan dikalahkan oleh bahasa yang berbeda. Saya akan mengusulkan fungsi miring ke Pyth, jadi kekejaman ini tidak akan terjadi di masa depan.

Penjelasan

Saya mengubah keyboard menjadi ini:

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

Yang kemudian saya encode sebagai "qwertyuiopasdfghjkl*zxcvbnm". Kemudian saya menggunakan divmod dengan modulo 9.5 untuk mengetahui koordinat 2D dari setiap kunci. Lalu saya menghitung jarak antara tombol berurutan, dan memeriksa apakah jarak kuadrat <2.

orlp
sumber
3

CJam, 83 75 74 byte

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

Cobalah online.

Penjelasan

Pendekatan umum adalah untuk menghasilkan string adjacency besar yang berisi setiap pasangan karakter keyboard yang berdekatan dan kemudian memeriksa bahwa setiap pasangan karakter input yang berdekatan terkandung dalam string itu.

Saya cukup senang dengan bagaimana saya berhasil membangun string adjacency, yang menggunakan logika yang sangat sederhana dan kompak.

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.";
Runer112
sumber
Itu saja, saya sedang belajar CJam.
Soham Chowdhury
@octatoan Sepertinya kita berdua akan lebih baik belajar Pyth. : P
Runer112
Haha, mungkin dalam hal ini, ya.
Soham Chowdhury
2

J, 77 byte

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

Pemakaian:

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

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

Metode:

Untuk setiap huruf input yang saya hasilkan adalah koordinat 2D (mirip dengan gambar dalam pertanyaan) berdasarkan indeks dalam string 'qazwsxedcrfvtgbyhnujmikXolX'. Untuk setiap pasangan huruf dalam input saya memeriksa apakah jarak Manhattan koordinat mereka lebih kecil dari 2. Jika semuanya, saya output Yes, Nosebaliknya (dengan menyalahgunakan operator `).

Cobalah online di sini.

randomra
sumber
Anda lupa surat itu p.
mbomb007
@ mbomb007 Untuk karakter yang tidak ditemukan i.operator mengembalikan index of the last element + 1sehingga saya dapat menyimpan 1 byte dengan tidak menulis pdan masih mendapatkan indeks yang benar.
randomra
1

CJam, 75

r(1$+]z[1AB]"qwertyuiop asdfghjkl  zxcvbnm"f/:zSff+s_W%+f{\_|#}W&"No""Yes"?

Coba di sini ( Firefox di sini ).

Mengabaikan bagian Ya / Tidak ... Diperbaiki.

jimmy23013
sumber