Tes Surat Berdekatan

12

Salah satu aspek pengujian kekuatan kata sandi adalah penggunaan huruf yang berdekatan pada keyboard. Dalam tantangan ini, sebuah program harus dibuat yang kembali truejika string berisi setiap berlari huruf yang berdekatan.

Apa yang dianggap sebagai serangkaian huruf yang berdekatan?

Untuk versi sederhana dari penguji kekuatan kata sandi ini, serangkaian karakter yang berdekatan adalah 3 atau lebih huruf yang bersebelahan dalam satu arah (kiri, kanan, atas atau bawah) pada keyboard QWERTY. Untuk tujuan tantangan ini tata letak keyboard terlihat seperti ini:

1234567890
QWERTYUIOP
ASDFGHJKL
ZXCVBNM

Dalam diagram di atas Qada di bawah 1tetapi tidak di bawah 2, jadi string yang berisi 1qaatau di aq1mana saja di dalamnya akan membuat program kembali true, tetapi 2qatidak mau.

Memasukkan

Kata sandi untuk diperiksa. Itu hanya akan berisi karakter [0-9a-z]atau [0-9A-Z](pilihan Anda).

Keluaran

Program harus mengembalikan nilai kebenaran jika kata sandi berisi satu atau lebih proses dari kunci yang berdekatan, atau salah jika tidak ada.

Contohnya

Input berikut harus menghasilkan true:

  • asd
  • ytrewq
  • ju7
  • abc6yhdef

Dan input ini seharusnya menghasilkan false:

  • abc
  • aaa
  • qewretry
  • zse
  • qwdfbn
  • pas

Aturan

  • Jawaban dapat berupa program atau fungsi yang lengkap.
  • Celah standar tidak diijinkan.
  • Ini adalah , skor terendah (dalam byte) menang!
pengguna81655
sumber

Jawaban:

3

Pyth - 66 62 60 byte

Pendekatan yang cukup mudah. Memeriksa apakah ada substring len 3 yang ada di salah satu rotasi keyboard. Akan menggunakan pengkodean dasar untuk keyboard.

.E}Rjb+J+Kc+jkS9"0
qwertyuiop
asdfghjkl
zxcvbnm"b.tKN_MJ.:z3

Test Suite .

Maltysen
sumber
@ user81655 diperbaiki, dan menyimpan dua byte.
Maltysen
2

Japt , 78 byte

Japt adalah versi singkat dari Ja vaScri pt . Penerjemah

V=1oA ¬+`0\nqØÆyuiop\n?dfghjkl \nzxcvbnm`;1+¡Y©(((VbX -VbUgY-1)-5 a -5 %A a)bB

Output 0untuk kasus falsey; jika tidak, bilangan bulat positif. Itu ?harus diganti dengan Unicode char U + 0086 yang tidak dapat dicetak, atau jika Anda tidak ingin mengalami semua masalah itu, cukup as.

Bagaimana itu bekerja

V=1oA q +"0\nqwertyuiop\nasdfghjkl \nzxcvbnm";1+Um@Y&&(((VbX -VbUgY-1)-5 a -5 %A a)bB
           // Implicit: U = input string
V=1oA q    // Set variable V to the digits 1-9, plus
+"...";    // this string.
Um@        // Take U and map each character X and its index Y with this function:
Y&&        //  If Y is 0, return Y; otherwise,
VbX -      //  take the index of X in V, subtract
VbUgY-1    //  the index of (char at position Y - 1 in U) in V,
-5 a -5    //  subtract 5, take the absolute value, subtract 5 again,
%A a       //  take modulo by 10, then take the absolute value.
           //  This returns 1 for any pair of characters that is adjacent
           //  within V, horizontally or vertically.
bB +1      // Take the index of 11 in the result and add one.
           // Implicit: output last expression
Produksi ETH
sumber
2

C #, 227

int h(string k){var q="1234567890,QWERTYUIOP,ASDFGHJKL,ZXCVBNM,1QAZ,2WSX,3EDC,4RFV,5TGB,6YHN,7UJM,8IK,9OL,";int i=0,j=0;for(;i<k.Length-2;i++)if((q+String.Concat(Enumerable.Reverse(q))).Contains(k.Substring(i,3)))j=1;return j;}

0 is falsey, 1 is true. Menyatukan semua tombol horizontal dan vertikal, dan terbalik, dan memeriksa apakah ada 3 karakter input yang terkandung di dalamnya.

C # benar-benar bertele-tele, harus menyelam ke bahasa lain :(

noisyass2
sumber
0

PHP, 173 +1 byte

while(~$argn[$i+2])($p=preg_match)($r=_.join(".{10}",str_split(($t=substr($argn,$i++,3))))."|$t"._,$d=_1234567890_qwertyuiop_asdfghjkl__zxcvbnm)||$p($r,strrev($d))?die(1):0;

Jalankan sebagai pipa dengan -nRinput huruf kecil atau coba online .

Titus
sumber
0

Clojure, 156 byte

#(some(set(for[R[["1234567890""QWERTYUIOP""ASDFGHJKL.""ZXCVBNM..."]]R[R(apply map list R)]r R p(partition 3 1 r)p((juxt seq reverse)p)]p))(partition 3 1 %))

Ini adalah tugas yang cukup menarik untuk diimplementasikan.

NikoNyrh
sumber