Bàn phím một dòng


20

Các thách thức

Mục tiêu của thử thách này là xác định xem một Chuỗi đã cho có thể được nhập bằng cách chỉ sử dụng một dòng của bàn phím QWERTY tiêu chuẩn của Vương quốc Anh hay không.

Đây là code golf, giải pháp ngắn nhất trong byte thắng!


Tôi

Đầu vào sẽ là một Chuỗi gồm 0 hoặc nhiều ký tự trong phạm vi thập phân ASCII bao gồm 32-126. Bạn có thể giả định cho thử thách này rằng một Chuỗi trống không yêu cầu gõ và do đó có thể được gõ bằng một dòng duy nhất.

Bạn có thể lấy đầu vào dưới dạng Chuỗi, danh sách các ký tự hoặc dạng tương đương cho ngôn ngữ của bạn.

Đầu ra phải là một giá trị trung thực cho bất kỳ Chuỗi nào có thể được nhập bằng một dòng duy nhất hoặc falsey cho một chuỗi không thể.


Bố trí bàn phím

Để làm rõ bất kỳ sự mơ hồ nào về cách bố trí bàn phím tiêu chuẩn bên dưới là danh sách các phím có sẵn trên mỗi dòng, bao gồm các phím trên thay thế (được truy cập bằng cách sử dụng shift).

  • Dòng 1
    • Tiêu chuẩn: `1234567890-=
  • Dòng 2
    • Tiêu chuẩn: qwertyuiop[]
  • Dòng 3
    • Tiêu chuẩn: asdfghjkl;'#
    • Chữ hoa: ASDFGHJKL
    • Đặc biệt: Mũ khóa
  • Dòng 4
    • Tiêu chuẩn: \zxcvbnm,./
    • Luân phiên: |<>?
    • Chữ hoa: ZXCVBNM
    • Đặc biệt: Ca
  • Dòng 5
    • Đặc biệt: Space Bar

Các phím trên thay thế chỉ có thể được nhấn nếu Shift cũng nằm trên cùng một dòng và các phím chữ hoa chỉ có thể được truy cập thông qua Caps Lock hoặc Shift. Bạn thực sự chỉ có thể sử dụng một dòng bàn phím!


Các trường hợp thử nghiệm

            -> true     (empty string)
45-2=43     -> true     (line 1)
qwerty      -> true     (line 2)
tryitout    -> true     (line 2)
Qwerty      -> false    (no shift or caps on line 2)
#sad        -> true     (line 3)
AsDf        -> true     (caps lock used)
@sDF        -> false    (no shift for alternate upper)
zxcvbn?     -> true     (line 4)
zxc vbn     -> false    (spacebar on separate line)
123abc      -> false    (multiple lines)
            -> true     (just space bar)
!!!         -> false    (exclamation marks cannot be printed by a single line)

Vì vậy, đây là nghiêm ngặt bố trí bàn phím Mỹ? (Tôi đã có một bố cục của Vương quốc Anh).
ngụy trang

2
@urdyak Ngược lại, đó hoàn toàn chỉ là cách bố trí bàn phím QWERTY của Anh
Luke Stevens

@Arnauld Có tôi đã làm, cảm ơn vì đã chú ý!
Luke Stevens

Vâng, tôi bắt đầu nhìn vào cả hai và nhận thấy bố cục của bạn dường như tuân theo bố cục bàn phím ở Vương quốc Anh, không phải ở Mỹ. Hmmm ... Tự hỏi người Áo của tôi trông như thế nào khi so sánh.
ngụy trang

Chúng ta có được phép lấy đầu vào làm danh sách các ký tự không, hay nó phải là một chuỗi?
Kevin Cruijssen

Câu trả lời:



9

Võng mạc 0.8.2 , 72 71 byte

`^([-=\d`]+|[][eio-rtuwy]+|(?i)[adfghjkls;'#]+|[\\bcnmvxz,./|<>?]+| *)$

Hãy thử trực tuyến! Giải thích: Mỗi luân phiên khớp với một hàng khác nhau của bàn phím. Ở (?i)giữa mẫu làm cho toàn bộ phần còn lại của mẫu được khớp với trường hợp không nhạy cảm. Chỉnh sửa: Đã lưu 1 byte nhờ @KirillL.


opqrcó thể thay đổi thành o-r-1. Ngoài ra, bạn đã quên một ký tự backtick cho Dòng 1, tôi không thấy nó?
Kirill L.

@KirillL. Rất tiếc, đã vô tình bỏ lỡ việc chọn nó khi sao chép / dán, cảm ơn vì đã phát hiện ra điều đó.
Neil

tốt đẹp [][...:)
mazzy

8

05AB1E , 66 47 byte

žh…`-=«žS„[]«žTDu…;'#««žUDu"\,./|<>?"««ð)εISåP}O

Lấy đầu vào là một danh sách các ký tự.

-19 byte nhờ @Emigna . Hoàn toàn quên chúng tôi đã có nội dung liên tục bàn phím qwerty. : D

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

žh                # Push "0123456789"
  …`-=            # Push "`-="
      «           # Merge them together
žS                # Push "qwertyuiop"
  „[]             # Push "[]"
     «            # Merge them togeter
žT                # Push "asdfghjkl"
  Du              # Duplicate, and toUppercase the copy
    …;'#          # Push ";'#"
        ««        # Merge all three together
žU                # Push "zxcvbnm"
  Du              # Duplicate, and toUppercase the copy
    "\,./|<>?"    # Push "\,./|<>?"
              ««  # Merge all three together
ð                 # Push a space
 )                # Wrap all string in an array
  ε   }           # Map each to:
   I              #  Take the input (list of characters)
    å             #  Check for each if it's in the current string of the map-iteration
     P            #  Take the product (1 if all are truthy, 0 otherwise)
       O          # Take the sum (either 1 or 0, so truthy/falsey), and output implicitly



5

JavaScript (Node.js) , 99 98 95 byte

x=>/^([-`=\d]+|[wetyuio-r[\]]+)$/.test(x)|/^([asdfghjkl;'#]+|[zxcvbnm,./<>?\\|]+| *)$/i.test(x)

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

-1 từ nhận xét của @Kirill L. trong câu trả lời Retina.
-3 cảm ơn @Ismael Miguel và @Arnauld vì nỗ lực kết hợp của họ.


Tại sao bạn có asdfghjklASDFGHJKLtrong đó? Tại sao bạn không sử dụng icờ, như thế x=>/.../i.test(x)nào?
Ismael Miguel

@IsmaelMiguel vì QWERTYUIOPkhông nên kết hợp với regex. Việc kiểm tra thêm sẽ có chi phí cao hơn so với việc mã hóa các chữ cái viết hoa trực tiếp vào biểu thức chính quy.
Shieru Asakoto

Nevermind, nó là lỗi. x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)có cùng độ dài
Ismael Miguel

@IsmaelMiguel Sử dụng bitwise |tiết kiệm 1 byte.
Arnauld

1
@IsmaelMiguel Đây là một phần của đặc tả ECMAScript. Các chỉ có 3 nhân vật mà cần phải được thoát trong một lớp nhân vật là \ , ]-(xem ClassAtomNoDash trong spec). Dấu gạch ngang cũng có thể không xuất hiện nếu đó là ký tự đầu tiên hoặc ký tự cuối cùng (nếu không, nó được hiểu là dấu phân cách phạm vi ký tự).
Arnauld

5

Perl 6 , 102 101 100 byte

-1 byte nhờ nwellnhof!

->\a{max map {a.combcomb $_~.lc:},|<eqwrtyuiop[] ASDFGHJKL;'# ZXCVBNM\,./|<>?>,' ',"`-="~[~] ^10}

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

Thực hiện khá chuẩn. Có lẽ có một giải pháp dựa trên regex ngắn hơn cho vấn đề này, nhưng tôi không biết regex của Perl 6 đủ tốt để thực hiện một nỗ lực.


Bạn có thể sử dụng maxthay vì ?any(và minthay vì ?all).
nwellnhof

1
Đối với những gì nó có giá trị, một giải pháp dựa trên regex sẽ là 84 byte hoặc 80 byte sử dụng các biểu thức Perl 5 với m:P5//. Nhưng tôi không nghĩ ai trong số họ đáng để đăng lên làm câu trả lời.
nwellnhof

4

Java 10, 209 208 byte

s->{int l=0,t;for(var p:s){t=p.matches("[[0-9]`\\-=]")?1:"qwertyuiop[]".contains(p)?2:p.matches("(?i)[asdfghjkl;'#]")?3:"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?4:p.equals(" ")?5:9;l=l<1?t:l!=t?9:l;}return l<6;}

-1 byte nhờ @TFeld .

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

Giải trình:

s->{                    // Method with String-array parameter and boolean return-type
  int l=0,              //  Line-integer, starting at 0
      t;                //  Temp integer
  for(var p:s){         //  Loop over the characters
    t=p.matches("[[0-9]`\\-=]")?
                        //   If it's a character from the first line: 
       1                //    Set `t` to 1
      :"qwertyuiop[]".contains(p)?
                        //   Else-if it's a character from the second line:
       2                //    Set `t` to 2
      :p.matches("(?i)[asdfghjkl;'#]")?
                        //   Else-if it's a character from the third line
       3                //    Set `t` to 3
      :"\\zxcvbnm,./|<>?ZXCVBNM".contains(p)?
                        //   Else-if it's a character from the fourth line:
       4                //    Set `t` to 4
      :p.equals(" ")?   //   Else-if it's a space from the fifth line:
       5                //    Set `t` to 5
      :                 //   Else (invalid character):
       9;               //    Set `t` to 9
    l=l<1?              //   If `l` is still 0:
       t                //    Set it to `t`
      :l!=t?            //   Else-if `t` is a different line than `l`:
       9                //    Set `l` to 9 (non-existing line)
      :                 //   Else (`t` is the same line as `l`):
       l;}              //    Leave `l` the same
  return l<6;}          //  Return whether `l` is not 9

Giải pháp tốt đẹp, nhưng nó trả về đúng cho !!!dù dấu chấm than không thể được in bởi bất kỳ dòng nào. Tôi vừa thêm vào đó như một trường hợp thử nghiệm
Luke Stevens

@LukeStevens Ah, tôi giả định rằng đầu vào luôn hợp lệ cho một trong năm dòng. Tôi sẽ sửa đổi giải pháp của tôi. Đó là một sửa chữa đơn giản (nhưng sẽ thêm một số byte ..)
Kevin Cruijssen

Tại sao không sử dụng (?i)cho các chữ cái viết hoa khác?
Neil

@Neil Do lối thoát cần thiết cho dấu gạch chéo, nó cũng có 209 byte .
Kevin Cruijssen

Đề xuất p==" "thay vìp.equals(" ")
trần

4

Powershell, 87 byte

Regex của cảng Neil Retex .

"$args"-cmatch"^([-=\d``]+|[][eio-rtuwy]+|(?i)[adfghjkls;'#]+|[\\bcnmvxz,./|<>?]+| *)$"

4

Thạch , 55 byte

ØDW;Øq;Œu$€3,4¦;"“rɠ3“Ż²“¿µ|“aƲƘ0ÞḅzḂ»⁶ṭ
¢f€ẈṠSỊafƑ¢F¤$

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

Dòng đầu tiên đưa ra danh sách các dòng bàn phím và dòng thứ hai kiểm tra xem đầu vào chương trình có được chứa trên một dòng (hoặc không) hay không và không có ký tự nào không thể gõ (như QWE!@#).


3

C , 150 byte

x;f(char*s){for(x=0;*s;x|="@               "[*s++-32]);return!(x&x-1);}

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

Nó sẽ không giành được bất kỳ giải thưởng nào, nhưng đây là một cách tiếp cận thú vị: chúng tôi ánh xạ các ký tự trên năm hàng của bàn phím 4 8 16 32 64và mọi ký tự không hợp lệ 3. Chúng tôi bit bit HOẶC giá trị cho từng ký tự trong chuỗi với nhau và kiểm tra xem kết quả có thỏa mãn hay không x&(x-1) == 0, điều này đúng khi xcó công suất 2 hoặc 0, tức là bất cứ khi nào xcó nhiều nhất một bit được đặt.


2

LUA , 282 262 259 270 byte

s=io.read()l=0
t=0
for c in s:gmatch"."do
f=c.find
t=f(c,"[0-9%`-=]")or 0|(f(c,"[qwertyuiop%[%]]")or 0)*2|(f(c,"[aAsSdDfFgGhHjJkKlL:'@#~]")or 0)*4|(f(c,"[\\zxcvbnm,./|<>?ZXCVBNM]")or 0)*8|(f(c," ")or 0)*16
t=t==0 and 17or t
l=l<1 and t or l~=t and 17or l
end
print(l<17)

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


2

PHP, 98 byte

Tôi rất buồn vì không có gì ngắn hơn regex. Nó có thể không phải là giải pháp nhanh nhất.

<?=preg_match("%^([`\d=-]*|[wetyuio-r[\]]*|(?i)[asdfghjkl;'#]*|[\\\zxcvbnm,./|<>?]*| *)$%",$argn);

Chạy như ống với -Fhoặc thử trực tuyến .


Giải pháp phi regex ngắn nhất tôi tìm thấy (124 byte; ngắt dòng và tab để đọc thuận tiện):

foreach(["`1234567890-=","qwertyuiop[]","asdfghjkl;'#ASDFGHJKL","zxcvbnm,./\|<>?ZXCVBNM"," "]as$d)
    trim($argn,$d)>""||die(1);

thoát với mã 1cho sự thật, 0cho giả. Chạy như ống với -R.
Yêu cầu PHP 5.4 trở lên; đối với PHP cũ hơn, hãy sử dụng array(...)thay vì [...](+5 byte)
hoặc sử dụng 123 byte này với -nRPHP <7:

foreach(split(_,"`1234567890-=_qwertyuiop[]_asdfghjkl;'#ASDFGHJKL_zxcvbnm,./\|<>?ZXCVBNM_ ")as$d)
    trim($argn,$d)>""||die(1);

2

AWK , 163 119 113 byte

Đây là câu trả lời AWK, trả về chuỗi 1 số đúng, 0 chuỗi sai. (Được viết dưới dạng AWK gọi dưới dạng tệp awk -f để sử dụng tương tác.)

{print/^[-`1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}

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

Tuy nhiên, không xử lý ký tự TAB như được viết (phần mở rộng tầm thường) không phải là một phần của thông số kỹ thuật.


4
"Tất cả các giải pháp cho các thử thách nên: (Mạnh) Trở thành một ứng cử viên nặng ký cho các tiêu chí chiến thắng được sử dụng. Ví dụ: một mục tham gia một cuộc thi golf mã cần phải được đánh gôn, và tham gia một cuộc thi tốc độ sẽ khiến một số nỗ lực phải nhanh chóng . " - trung tâm trợ giúp Không cần phải khai báo 2 biến đó và chắc chắn không cần phải biến chúng thành chuỗi. Và một lần printlà đủ: Hãy thử trực tuyến!
manatwork

Nhận xét của bạn rằng các giải pháp nên nghiêm túc là hợp lệ nhưng tôi cho rằng bất kỳ giải pháp nào do đó sau khi sửa đổi 05AB1E, do đó, không liên quan vì chúng không thể phù hợp hoặc tốt hơn kết quả. Tôi không thấy cách bạn không thể sử dụng in hai lần để có cả đúng và sai (chắc chắn đối với thứ gì đó đọc chuỗi cho đến khi kết thúc đầu vào). Và tôi đã nói tối ưu hóa không tối ưu tại thời điểm đó. Nhờ suy nghĩ của bạn, nó có thể giảm xuống còn 143 ký tự.
Phil F

Và trên thực tế, tất cả các cách sẽ tạo thành 121 ký tự ...
Phil F

2
code-golf không phải là một cuộc cạnh tranh cho mã ngắn nhất nói chung, nhưng ngắn nhất cho ngôn ngữ của bạn. Nếu bạn có thể cải thiện giải pháp của mình, thì tôi khuyên bạn nên làm như vậy
Jo King

@Jo King, cảm ơn bạn đã làm rõ (s). mã sửa đổi sẽ / có thể là: {print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
Phil F

1

Bash , 119 byte

Bao gồm một tiếng vang để cung cấp đầu ra "có thể đọc được". Nếu bạn đặt một trình bao bọc phù hợp (lựa chọn của bạn) xung quanh nó để bao gồm in / đầu ra, thì bạn có thể lưu 8 byte. Việc đọc thử thách của tôi cho thấy giải pháp sẽ xuất ra một dấu hiệu đầu ra phù hợp để tôi gắn bó với 119 byte.

[[ "$@" =~ ^[asdfghjklASDFGHJKL\;\'#]*$|^[-\`0-9=]+$|^[]qwertyuiop\[]*$|^[zxcvbnm,./\|\<\>\?ZXCVBNM]*$|^\ *$ ]];echo $?

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


Lưu ý rằng giải pháp Bash cũng có nghĩa là giải pháp AWK / manatwork của tôi có thể giảm xuống còn 113 byte.
Phil F
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.