Hàng nào là chìa khóa?


39

Cho bất kỳ ký tự nào sau đây (hoặc một dòng mới):

`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:"zxcvbnm,./ZXCVBNM<>?

Chương trình của bạn phải xuất ra hàng nằm trên bàn phím


Vì bàn phím của tôi sắp hết pin, mã của bạn phải càng ngắn càng tốt


Bàn phím mà chương trình của bạn nên sử dụng (để tra cứu hàng), sẽ giống như:


Row 1:~` !1@2 #3$4 %5^6 &7*8 (9)0 _-+=                          

Row 2:                         Q W E R T Y U I O P {[ }]    |\   
Row 3:                              A S D F G H J K L :; "' return  
Row 4:                                 Z X C V B N M <, >. ?/                 
Row 5:                                                    space                                                   

Trong trường hợp   returnlà một dòng mới. Phím trống không có nghĩa gì cả.

Ví dụ

"$"
1

"R"
2

"a"
3

"?"
4

"\n"
3

" "
5

nơi \nlà một ký tự xuống dòng.

Thông số kỹ thuật

  • Chương trình của bạn nên không phân biệt chữ hoa chữ thường
  • Chương trình của bạn chỉ cần xử lý các ký tự trên bàn phím được hiển thị

3
Có lẽ phân loại ?
lirtosiast

3
Đó có phải là một đôi kbd?
Conor O'Brien

Tôi nhớ cách đây nhiều năm bằng cách sử dụng một số ngôn ngữ trả về các phím bấm dưới dạng vị trí hàng 100 × + ... sẽ rất hoàn hảo cho việc này, nhưng tiếc là tôi không nhớ nó là gì. Có thể một số dạng CƠ BẢN ...
Adám

@NBZ Có phải là Blitz cơ bản?
wizzwizz4

1
@ wizzwizz4 Bạn đã thử BlitzPlus chưa? nó miễn phí và có vẻ như đó là những gì bạn muốn.
HolyBlackCat

Câu trả lời:


6

Pyth, 62 66 65 byte

?zh@+,4Zmid2c.Bi."0fÀÓ¸[9Ѷ¤KïLäHÉðbÀ`]ü©¬vS"16 2-CzCd3

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

Sử dụng một chuỗi được đóng gói đại diện cho một số trong hex, khi được cắt thành các đoạn hai bit, đại diện cho hàng của mỗi ký tự ngoại trừ !như một giá trị từ 0 đến 3. Chúng tôi bỏ qua !vì vậy chúng tôi không phải lưu trữ 4 hoặc có 0 ở đầu số này, sau đó thêm giá trị hàng của chúng bằng cách sử dụng +,4Z. Khi chúng ta đã biến chuỗi thành giá trị hàng, tất cả những gì chúng ta phải làm là sử dụng mã ký tự của đầu vào để lập chỉ mục thành mảng các giá trị, sau đó thêm 1.

Dòng mới được xử lý riêng vì nó được Pyth diễn giải dưới dạng một chuỗi rỗng và do đó có mã ký tự là 0.

Điều này sẽ ngắn hơn nếu tôi có thể tìm ra cách sử dụng cơ sở 256 trong Pyth, nhưng tôi hoàn toàn không thể làm cho nó hoạt động.


4
o.0 bắt đầu ép Japt
nicael

điều này khiến tôi xấu hổ
JuanPotato

:( Tôi đã quên về dòng mới! @Nicael bạn sẽ trở lại vị trí hàng đầu.
Luke

Bây giờ chúng tôi thậm chí đã chết!
Lu-ca

Bạn cần phải thoát byte rỗng trong Pyth.
lirtosiast

12

JavaScript (ES6), 105 102 101 byte

c=>/[~`0-9!@#-&^(-+_=-]/.test(c)+/[asdfghjkl;:'"\n]/i.test(c)*3+/[zxcvbnm,<.>/?]/i.test(c)*4||++c*7^2

Giải trình

Trong JavaScript testtrả về một boolean hoạt động giống như 1hoặc 0tôi nhân chúng với hàng của chúng. Việc kiểm tra hàng 2 lấy hầu hết các byte nên tôi đã sử dụng byte đó làm mặc định nếu không có cái nào khác khớp.

c=>
  /[~`0-9!@#-&^(-+_=-]/.test(c)   // row 1 regex
  +/[asdfghjkl;:'"\n]/i.test(c)*3 // row 3 regex
  +/[zxcvbnm,<.>/?]/i.test(c)*4   // row 4 regex
  ||++c                           // space ++ = 1, any character on row 2 ++ = NaN
    *7^2                          // 7 XOR 2 = 5, NaN XOR 2 = 2

Kiểm tra


1
> NaN XOR 2 = 2 - ???
lirtosiast

1
@ThomasKwa Đó chỉ là cách JS hoạt động lol. Nếu c="q", ++c= NaN, NaN*7= NaN, NaN^2chuyển đổi các toán hạng thành số nguyên (uncastables like NaNtrở thành 0) thì 0 XOR 2đó là 2.
dùng81655

5

Glava 1,5 , 164 byte

Glava là một phương ngữ của Java làm cho mã Java ngắn hơn. Rất tiếc, mã này không cạnh tranh vì cam kết (trễ 2 giờ ...) được sử dụng sau thử thách này, đã sửa một số lỗi quan trọng không cho phép chương trình này hoạt động.

p(A[0].matches("[`0-9-=~!@#$%^&*()_+]")?1:A[0].replace("\\n","\n").matches("(?i)[asdfghjkl;':\"\n]")?3:A[0].matches("(?i)[zxcvbnm,.\\/<>?]")?4:A[0].matches(" ")?5:2

Đây là một chương trình đầy đủ nhận đầu vào thông qua các đối số dòng lệnh. Hoạt động bằng cách đơn giản kiểm tra xem regex hàng nào khớp với nó, sau đó xuất ra số tương ứng.


Glava = ổi + Java?
Hạ cấp

2
@ Doᴡɴɢᴏᴀᴛ Glava = Golf + Java (đó là ý tưởng của Conor)
GamrCorps

Thật! @ Doᴡɴɢᴏᴀᴛ
Conor O'Brien

4

Trăn 3, 142

print(int(("~`!1@2#3$4%5^6&7*8(9)0_-+=""qwertyuiop{[}\|"+"]"*11+'asdfghjkl;:"\n'"'"*13+"zxcvbnm,<.>/""?"*14+" ").index(input().lower())/26)+1)

Có lẽ có một cách ngắn hơn mà tôi đang nhìn ¯ \ _ (ツ) _ /


4

Bình thường , 98

|+++l:"~`0123456789!@#$%^&*()_-=+"z1*l:"asdfghjkl;:'\"\n"rz0 1 3*l:"zxcvbnm,<.>/? "rz0 1 4 l:dz1 2

không chắc chắn làm thế nào để phạm vi 0-9 hoạt động vì một số lý do: |, lấy cảm hứng từ câu trả lời của user81655


Bạn có thể sử dụng jkUTcho chuỗi có phạm vi từ 0 đến 9, không chắc có cách nào ngắn hơn không. Bạn cũng có thể sử dụng dây đóng gói để tiết kiệm một vài byte, ví dụ như ."!~WÏù¹_(<]úÝ"cho "~`!@#$%^&*()_-=+".
Lu-ca

Từ @benstopics, điều này không thành công đối với các nhân vật chính của regex
FryAmTheEggman

4

Bash, 108

Không có câu trả lời Bash? Bash trả lời. grep -Finchắc chắn là công cụ phù hợp cho công việc này.

Chương trình này là trong hai tập tin.

k, 73 byte

`1234567890-=~!@#$%^&*()_+
qwertyuiop[]\{}|
asdfghjkl;':"
zxcvbnm,./<>?

Có 5 dòng, dòng cuối cùng là một khoảng trắng. Nếu bạn gặp khó khăn khi sao chép tệp, cơ sở64 là:

YDEyMzQ1Njc4OTAtPX4hQCMkJV4mKigpXysKcXdlcnR5dWlvcFtdXHt9fAphc2RmZ2hqa2w7JzoiCnp4Y3Zibm0sLi88Pj8KIA==

b, 34 byte

Đây là chương trình, nó lấy đầu vào làm đối số dòng lệnh duy nhất.

grep -Fin "$1" k|tail -n3|head -c1

Điểm: 34 + 73 + 1 (cho ktên tệp) = 108 byte

Bị đánh cắp

grep --fixed-strings --ignore-case --line-number "$1" k|tail --lines=3|head --bytes=1

Giải trình

  • grep - tìm kiếm tệp cho các dòng khớp với một chuỗi hoặc biểu thức chính quy, chỉ xuất ra các dòng đó
  • -Faka --fixed-strings- vô hiệu hóa các biểu thức thông thường để [vv được xử lý chính xác
  • -iaka -yaka --ignore-case- kết hợp không phân biệt chữ hoa chữ thường
  • -naka --line-number- hiển thị số dòng và: trước mỗi dòng (ví dụ 4:zxcvbnm,./<>?)
  • "$1" - tìm kiếm đối số dòng lệnh đầu tiên của tập lệnh, các trích dẫn là cần thiết để xử lý dòng mới và dấu cách
  • k - tìm kiếm trong tập tin k
  • Đây greplệnh sẽ phù hợp với tất cả năm dòng nếu đầu vào là một dòng mới, và chỉ có một dòng khác.
  • | - ống, gửi đầu ra tiêu chuẩn của một lệnh đến đầu vào tiêu chuẩn của lệnh tiếp theo
  • tail - xuất N dòng hoặc ký tự cuối cùng của đầu vào tiêu chuẩn
  • -n3aka --lines=3- xuất 3 dòng cuối
  • Nếu đầu vào không phải là một dòng mới, chỉ có một dòng để xử lý, bắt đầu bằng số hàng vì -ncờ được bật grep. Mặt khác, lệnh này chỉ mất các dòng 3, 4 và 5 (3 dòng cuối cùng).
  • | - ống
  • head - xuất N dòng hoặc ký tự đầu tiên của đầu vào tiêu chuẩn
  • -c1aka --bytes=1- xuất ký tự đầu tiên
  • Nếu đầu vào không phải là một dòng mới, cái này sẽ lấy ký tự đầu tiên, đó là số dòng nơi tìm thấy đầu vào. Nếu đầu vào là một dòng mới, nó sẽ lấy ký tự đầu tiên của các dòng 3, 4 và 5 kết hợp, đó là 3, đây là số hàng chính xác cho dòng mới.

4

Japt, 73 70 66 byte

2+`qØÆyuiop\{}[]|\\1dfghjkl;:
'1zxcvbnm,.<>?/\"1 `q1 ®bUv)<0} b!1

Hãy thử trực tuyến! (trong ví dụ, đầu vào theo nghĩa đen là một dòng mới)


Đẹp, ngắn nhất cho đến nay!
Sản phẩm ETH

@Eth yup, ít nhất một lần tôi nên đăng nội dung ngắn gọn: D
nicael


@Eth Heh, !1là một cái gì đó phù hợp với "sai", cuối cùng tôi biết cách làm điều đó, cảm ơn :)
nicael

@Eth halp, cần 5 byte để đánh bại Pyth.
nicael

4

Java, 300 byte

import java.util.Scanner;public class A{public static void main(String[] args){String g="~`!1@2#3$4%5^6&7*8(9)0_-+=qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\'\"\r";Scanner i=new Scanner(System.in);int f=g.indexOf((i.nextLine().charAt(0)));System.out.print(f<0?4:(f<26?1:(f<53?2:(f<76?3:5))));}}

Tôi không phải là một chuyên gia, và đây là nỗ lực đầu tiên của tôi khi chơi golf, nhưng tôi đã hiểu, cái quái gì vậy, tại sao không? Trên đây là phiên bản chương trình đầy đủ, mã thực tế đi vào nó rất có thể sẽ lấy đi một lượng ký tự kha khá.


chỉ cần lưu ý rằng nó gặp sự cố với đầu vào trống (dòng trở lại / vận chuyển mới). sẽ sửa chữa khi tôi có thể
Andrew

Chào mừng đến với cộng đồng!
Erik the Outgolfer

Chào mừng (hơi muộn kể từ khi bạn đăng vào tháng 1 xD). Bạn có thể chơi golf khá nhiều mà không thay đổi cách tiếp cận hiện tại của mình như sau: class A{public static void main(String[]a){int f="~'!1@2#3$4%5^6&7*8(9)0_-+=qQwWeErRtTyYuUiIoOpP[{]}\\|aAsSdDfFgGhHjJkKlL;:\'\"\r".indexOf(new java.util.Scanner(System.in).nextLine().charAt(0));System.out.print(f<0?4:f<26?1:f<53?2:f<76?3:5);}}( 243 byte ) Tôi đã xóa một số dấu ngoặc đơn không cần thiết; rút ngắn args; loại bỏ public ; trực tiếp sử dụng Chuỗi và Máy quét; và loại bỏ việc nhập bây giờ java.util.Scannerđược sử dụng một lần.
Kevin Cruijssen

219 byte bạn không cần sử dụng Máy quét cho việc này
PrincePolka

3

Bình thường, 105 byte

J?<l-c".^$*+?{}[]\|()"1]z14+\\zrz0?qJd5?:"qwertyuiop[]\|"J)2?:"asdfghjkl;':\"\n"J)3?:"zxcvbnm,./<>?"J)4 1

Giải trình:

J?<l-c".^$*+?{}[]\|()"1]z14+\\zrz0     # Escape input if regex metachar
?qJd5                                  # Check space
?:"qwertyuiop[]\|"J)2                  # Check second row
?:"asdfghjkl;':\"\n"J)3                # Check third row
?:"zxcvbnm,./<>?"J)4                   # Check fourth row
1                                      # If none of these, must be on first row.

Tôi quyết định chọn hàng đầu tiên là hàng "phải là nếu không có gì khác" bởi vì nó yêu cầu nhiều byte nhất để thể hiện ngay cả sau khi chơi golf.


Chào mừng bạn đến với Câu đố lập trình và Code Golf! Sử dụng nhận xét để làm cho @JuanPotato có được nó. Tuy nhiên, điều đó cần 50 rep. Vì vậy, bạn cần phải làm việc.
dùng48538

3

Perl 6, 128 byte

say 1+(/<[-\d=~!@#$%^&*()_+/`]>/,/<[qwertyuiop[\]\\{}|]>/,/<[asdfghjkl;':"\n]>/,/<[zxcvbnm,./<>?]>/,' ').first: @*ARGS.lc~~*,:k

Tôi tạo một danh sách các biểu thức chính có chứa các lớp ký tự cùng với một không gian chuỗi ký tự. Sau đó, tôi gọi firstphương thức trong danh sách (chỉ là phiên bản phương thức của hàm firstbậc cao hơn), sử dụng smartmatch để so sánh đối số được truyền cho chương trình với mục hiện tại trong danh sách. Lưu ý rằng smartmatch thực hiện "điều đúng" cho cả biểu thức chính quy và chuỗi ký tự. Các :ktham số tùy chọn để firstnguyên nhân phương pháp này để trả lại chỉ số của mặt hàng tương ứng trong danh sách, mà tôi sau đó thêm từ 1 tới và đầu ra qua say.

Lưu ý rằng khi sử dụng chương trình này, bạn sẽ phải thoát đúng các ký tự nhất định như `và khoảng trắng trong vỏ của bạn. Ví dụ: bàn phím perl6.p6 \ `


Vì chưa ai nói điều đó, chào mừng bạn đến với Câu đố lập trình & Golf Code!
Erik the Outgolfer

2

JavaScript ES6, 114 byte

n=>[`qwertyuiop{}[]|\\`,`asdfghjkl;:
'`,`zxcvbnm,.<>?/"`,` `].map(x=>+(x.indexOf(n.toLowerCase())<0)).indexOf(0)+2

Một giải pháp JavaScript khác. Nguyên tắc là trả về chỉ mục của char đầu vào trong mảng các hàng cộng với 2 (để hàng 0-9 trả về -1, tức là không tồn tại, -1 + 2 = 1. qNằm trong chuỗi đầu tiên của mảng, do đó, nó trả về 0 + 2 = hàng thứ 2).


2

Perl, 96 77 76 byte

Chạy bằng cách sử dụng perl -p. Hãy chắc chắn rằng bạn đang cho nó ăn các ký tự đơn lẻ; ví dụ, để chạy nó từ một tập tin key.pl(để tránh bị xáo trộn xung quanh với các chuỗi thoát vỏ) echo -n q|perl -p key.pl.

$_=/[\d~`!@#-&(-+_=-]/+/[adfghjkls"':;
]/i*3+/[bcnmvxz<>,.?\/]/i*4+/ /*5||2

Lạm dụng chức năng phạm vi regex là thú vị.


Đối với tôi điều này không hoạt động, chạy nó tôi nhận được chỉ số của hàng + 3 (tức là 3 thay vì 0, 7 thay vì 4, v.v.).
Trò chuyện

Nó nhạy cảm với cách bạn cung cấp đầu vào. Bạn có thể cung cấp một nhân vật theo sau bởi một dòng mới. Tôi sử dụng echođể kiểm soát chính xác đầu vào - ví dụ. echo -n q|perl -n key.pl, mà sản xuất chính xác 2.
Đánh dấu

Ồ, tôi hiểu rồi. Vâng, điều đó cũng giải thích tại sao bạn không chompnhập liệu.
Trò chuyện

1
Nếu tôi chompchỉnh sửa đầu vào, tôi sẽ không thể trả về '3' cho khóa trả về.
Đánh dấu

1
Xin chào @Mark, bạn không cần $_=~các trận đấu, m//(đó là những gì /.../) hoạt $_động tự động! Ngoài ra nếu bạn sử dụng -pthay vì -nbạn có thể sử dụng $_=thay vì printđể tiết kiệm thêm một vài byte. Sử dụng một dòng mới thay vì \ncó thể giúp bạn tiết kiệm một byte khác! Điều đó sẽ làm giảm mã của bạn một chút! Cũng có thể đáng để thêm một cách sử dụng ví dụ để bất kỳ ai thử nghiệm đều biết bạn cần sử dụng echo -n:)
Dom Hastings

2

PHP, 173 byte

Ý tưởng ở đây là sử dụng regex chụp số nhóm làm chỉ số hàng. Có lẽ một số tối ưu hóa hơn trong chính regex.

$i=$argv[1];preg_match("%([!#-&\(-+-0-9=@^-`~])|([EIO-RT-UWY[-]eio-rt-uwy{-}])|([\"':-;ADF-HJ-LSadf-hj-ls])|([,.-/<>-?B-CM-NVXZb-cm-nvxz])%",$i,$m);echo array_flip($m)[$i];

Cuộc preg_match()gọi sẽ tạo ra một loạt $mcác kết quả khớp và nếu chúng ta in nó, nó sẽ trông giống như thế này (giả sử zlà đầu vào):

Array ( [0] => 'z', [1] => '', [2] => '', [3] => '', [4] => 'z' )

Lật mảng đó, bằng cách hoán đổi các khóa và giá trị, di chuyển từ trái sang phải và chỉ giữ khóa riêng biệt cuối cùng, vì vậy chúng tôi kết thúc bằng:

Array ( 'z' => 4, '' => 3 )

Sau đó, chúng tôi sử dụng ký tự đầu vào làm chỉ mục trong mảng để có kết quả.

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


2

C, 145 143 136 132 127 106 byte

#define c 2124850936,91714965
b[]={8<<18,0,-218071008,7796<<19,c,c};f(a){return a-32?b[a>>4]>>a%16*2&3:4;}

Điều này sử dụng index()từ POSIX.1-2001 và không được dùng trong POSIX.1-2008. Điều này giả sử ASCII và int 32 bit.


2

Python 3, 89 byte

print("qwertyuiop{}[]\\|asdfghjkl;:\"\n'''zxcvbnm,.<>/???? ".find(input().lower())//16+2)

Như tôi chưa thể nhận xét, tôi đang đăng riêng phần cải tiến cho câu trả lời Python 3 hiện tại .

Chỉnh sửa : Tất cả các mã trong printbây giờ và điều chỉnh thêm.


Đây chỉ là một đoạn trích và do đó không phải là một câu trả lời hợp lệ, bạn cần phải bọc nó trong một câu lệnh in (biến nó thành một chương trình đầy đủ) hoặc biến nó thành một hàm.
FlipTack

@FlipTack: Bạn nói đúng. Tôi đã kết hợp đề xuất của bạn.
sáng tạo

Chào mừng đến với PPCG!
Martin Ender

@MartinEnder: Cảm ơn bạn! :-)
sáng tạo


0

CJam, 125 byte

q_" "={;5}{"`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\"    zxcvbnm,./ZXCVBNM<>?    "\#26/1+}?

Giải trình

q                          e# read input
 _" "=                     e# decide if the input is a space
      {;5}                 e# if it is, push 5
          {"..."\#26/1+}?  e# if it isn't, push the correct row

0

SpecBAS - 178 byte

1 a$="~`!1@2#3$4%5^6&7*8(9)0-_+=qQwWeErRtTyYuUiIoOpP{[}]|\aaaaAsSdDfFgGhHjJkKlL:;'"#34#13"zzzzzzzZxXcCvVbBnNmM<,>.?/"+" "*26
2 INPUT k$: IF k$="" THEN k$=#13
3  ?CEIL(POS(k$,a$)/26)

Tôi đã sử dụng một chuỗi dài trong đó mỗi hàng dài 26 ký tự (# 34 là mã cho trích dẫn kép và # 13 là mã trả về).

Sau đó in kết quả của vị trí làm tròn / 26.


0

C # 6, 201 byte

Không có gì đặc biệt ở đây. Tôi thấy rẻ hơn khi chỉ viết cả hai trường hợp thay vì sử dụng ToUpper () do độ rộng cố định của chuỗi.

using C=System.Console;class P{static void Main(string[]a)=>C.Write("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'\raASDFGHJKL:\"\nazxcvbnm,./zzzZXCVBNM<>?zzz ".IndexOf(a[0])/26+1);}

Thụt lề:

using C=System.Console;
class P{
    static void Main(string[]a)=>
        C.Write("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'\raASDFGHJKL:\"\nazxcvbnm,./zzzZXCVBNM<>?zzz ".IndexOf(a[0])/26+1);
}

1
Tôi không thể thấy cái này hoạt động cho ~ hay `?
Ash Burlaczenko

@AshBurlaczenko, cảm ơn! Tôi đã bỏ lỡ chìa khóa đó. Đã sửa mà không thay đổi điểm số của tôi.
Thực phẩm điện tử

0

Python 2, 146 byte

e="\n";lambda x:("`1234567890-=~!@#$%^&*()_+qwertyuiop[]\\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:\""+e*4+"zxcvbnm,./ZXCVBNM<>?"+e*13+" ").index(x)/26+1

0

Excel, 132 byte

=INT((FIND(A1,"`1234567890-=~!@#$%^&*()_+qwertyuiop[]\QWERTYUIOP{}|asdfghjkl;'ASDFGHJKL:""aaa zxcvbnm,./ZXCVBNM<>?zzzzzz ")-1)/26)+1

Cố gắng sử dụng các trường hợp nhạy cảm SEARCH()thay vì FIND()tiết lộ rằng Excel phù hợp ~, *?để (tick). The matching of? means we can't useTÌM KIẾM () `, sẽ cạo 5 byte lớn ...

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.