Baris yang mana yang menjadi kunci?

39

Diberikan salah satu karakter berikut (atau baris baru):

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

Program Anda harus menampilkan baris yang ada di keyboard


Karena keyboard saya hampir kehabisan baterai, kode Anda harus sesingkat mungkin


Keyboard yang harus digunakan program Anda (untuk pencarian baris), akan terlihat seperti:


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                                                   

Di mana   returnbaris baru. Kunci kosong tidak berarti apa-apa.

Contohnya

"$"
1

"R"
2

"a"
3

"?"
4

"\n"
3

" "
5

di mana \nkarakter baris baru.

Spesifikasi

  • Program Anda harus peka terhadap huruf besar-kecil
  • Program Anda hanya perlu menangani karakter pada keyboard yang ditampilkan
Downgoat
sumber
3
Mungkin klasifikasi ?
lirtosiast
3
Apakah itu bersarang ganda kbd?
Conor O'Brien
Saya ingat beberapa tahun yang lalu menggunakan beberapa bahasa yang mengembalikan penekanan tombol sebanyak 100 × baris + posisi ... Pasti cocok untuk ini, tapi sayangnya saya tidak ingat apa itu. Mungkin semacam BASIC ...
Adám
@NBZ Apakah itu Blitz Basic?
wizzwizz4
1
@ wizzwizz4 Sudahkah Anda mencoba BlitzPlus? gratis dan sepertinya itu yang Anda inginkan.
HolyBlackCat

Jawaban:

6

Pyth, 62 66 65 byte

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

Cobalah online.

Menggunakan string yang dikemas mewakili angka dalam heks yang, ketika dipotong menjadi dua-bit, mewakili deretan setiap karakter kecuali dan !sebagai nilai dari 0 hingga 3. Kami meninggalkan dan !jadi kami tidak perlu menyimpan 4 atau memiliki a 0 pada awal angka ini, lalu tambahkan nilai barisnya menggunakan +,4Z. Setelah kami mengubah string menjadi nilai baris, yang harus kita lakukan adalah menggunakan kode karakter dari input untuk mengindeks ke dalam array nilai, dan kemudian menambahkan 1.

Newline ditangani secara terpisah karena ditafsirkan oleh Pyth sebagai string kosong dan memiliki kode karakter 0.

Ini akan lebih pendek jika saya bisa mengetahui cara menggunakan basis 256 di Pyth, tapi saya tidak bisa membuatnya berfungsi.

Luke
sumber
4
o.0 mulai menekan Japt
nicael
ini membuatku malu
JuanPotato
:( Saya lupa tentang baris baru! @Nicael Anda kembali berada di atas.
Luke
Sekarang kita sudah mati!
Lukas
Anda harus lolos dari byte nol di 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

Penjelasan

Di JavaScript testmengembalikan boolean yang bertindak sama 1atau 0jadi saya kalikan dengan baris mereka. Pengujian untuk baris 2 mengambil byte terbanyak jadi saya menggunakan yang itu sebagai default jika tidak ada yang cocok.

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

Uji

pengguna81655
sumber
1
> NaN XOR 2 = 2 - ???
lirtosiast
1
@ThomasKwa Begitulah cara kerja JS. Jika c="q", ++c= NaN, NaN*7= NaN, NaN^2mengubah operan menjadi bilangan bulat (uncastables like NaNmenjadi 0) kemudian melakukan 0 XOR 2yang mana 2.
user81655
5

Glava 1,5 , 164 byte

Glava adalah dialek Jawa yang membuat kode Java lebih pendek. Sayangnya kode ini tidak kompetitif karena komit (2 jam terlambat ...) yang digunakan dibuat setelah tantangan ini, yang memperbaiki beberapa bug penting yang tidak memungkinkan program ini bekerja.

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

Ini adalah program lengkap yang mengambil input melalui argumen baris perintah. Bekerja hanya dengan menguji baris regex yang cocok, lalu menampilkan nomor yang sesuai.

GamrCorps
sumber
Glava = Jambu + Jawa?
Downgoat
2
@ Doᴡɴɢᴏᴀᴛ Glava = Golf + Java (itu ide Conor)
GamrCorps
Memang! @ Doᴡɴɢᴏᴀᴛ
Conor O'Brien
4

Python 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)

Mungkin ada cara yang lebih pendek yang saya hadapi ¯ \ _ (ツ) _ / ¯

JuanPotato
sumber
4

Pyth , 98

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

tidak yakin bagaimana agar rentang 0-9 berfungsi karena beberapa alasan: |, terinspirasi oleh jawaban pengguna81655

JuanPotato
sumber
Anda dapat menggunakan jkUTuntuk string dengan rentang 0 hingga 9, tidak yakin apakah ada cara yang lebih pendek. Anda juga dapat menggunakan string yang dikemas untuk menyimpan beberapa byte, misalnya ."!~WÏù¹_(<]úÝ"untuk "~`!@#$%^&*()_-=+".
Lukas
Dari @benstopics, ini gagal untuk
metacharacters
4

Bash, 108

Tidak ada jawaban Bash? Bash menjawab. grep -Finjelas merupakan alat yang tepat untuk pekerjaan ini.

Program ini dalam dua file.

k, 73 byte

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

Ada 5 baris, yang terakhir adalah spasi. Jika Anda mengalami masalah dalam mereproduksi file, base64 adalah:

YDEyMzQ1Njc4OTAtPX4hQCMkJV4mKigpXysKcXdlcnR5dWlvcFtdXHt9fAphc2RmZ2hqa2w7JzoiCnp4Y3Zibm0sLi88Pj8KIA==

b, 34 byte

Ini adalah program itu sendiri, dibutuhkan input sebagai satu-satunya argumen baris perintah.

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

Nilai: 34 + 73 + 1 (untuk knama file) = 108 byte

Tidak disatukan

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

Penjelasan

  • grep - mencari file untuk baris yang cocok dengan string atau ekspresi reguler, hanya output baris tersebut
  • -Falias --fixed-strings- menonaktifkan ekspresi reguler sehingga [dll ditangani dengan benar
  • -ialias -yalias --ignore-case- pencocokan case-insensitive
  • -nalias --line-number- tampilkan nomor baris dan: sebelum setiap baris (mis. 4:zxcvbnm,./<>?)
  • "$1" - mencari argumen baris perintah skrip pertama, tanda kutip diperlukan untuk menangani baris baru dan spasi
  • k - Pencarian dalam file k
  • grepPerintah ini akan cocok dengan semua lima baris jika inputnya adalah baris baru, dan hanya satu baris sebaliknya.
  • | - pipa, kirim output standar dari satu perintah ke input standar berikutnya
  • tail - mengeluarkan garis N terakhir atau karakter dari input standar
  • -n3alias --lines=3- output 3 baris terakhir
  • Jika input bukan baris baru, hanya ada satu baris untuk diproses, yang dimulai dengan nomor baris karena -nbendera menyala grep. Kalau tidak, perintah ini hanya mengambil baris 3, 4 dan 5 (3 baris terakhir).
  • | - pipa
  • head - output garis N pertama atau karakter input standar
  • -c1alias --bytes=1- menampilkan karakter pertama
  • Jika input bukan baris baru, ini mengambil karakter pertama, yaitu nomor baris tempat input ditemukan. Jika input adalah baris baru, diperlukan karakter pertama dari baris 3, 4 dan 5 yang digabungkan, yaitu 3, yang merupakan nomor baris yang benar untuk baris baru.

sumber
4

Japt, 73 70 66 byte

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

Cobalah online! (dalam contoh, input secara harfiah adalah baris baru)

nicael
sumber
Bagus, terpendek sejauh ini!
ETHproduksi
@ Ya, setidaknya sekali saya harus mengirim sesuatu yang singkat: D
nicael
@ Eth Heh, !1adalah sesuatu yang cocok dengan "false", akhirnya saya tahu bagaimana melakukannya, terima kasih :)
nicael
@Eth halp, perlu 5 byte untuk mengalahkan 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))));}}

Saya bukan ahli, dan ini adalah usaha pertama saya bermain golf, tetapi saya pikir, apa-apaan, kenapa tidak? Di atas adalah versi program lengkap, kode aktual yang masuk ke dalamnya kemungkinan besar akan menghilangkan sejumlah karakter.

Andrew
sumber
hanya memperhatikan itu crash dengan input kosong (baris baru / carriage return). akan diperbaiki ketika saya bisa
Andrew
Selamat datang di komunitas!
Erik the Outgolfer
Selamat datang (agak terlambat sejak Anda memposting pada Januari xD). Anda dapat golf sedikit tanpa mengubah pendekatan Anda saat ini seperti ini: 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 ) Saya menghapus beberapa tanda kurung yang tidak perlu; dipersingkat args; dihapus public ; langsung menggunakan String dan Scanner; dan menghapus impor sekarang yang java.util.Scannerdigunakan sekali.
Kevin Cruijssen
219 byte Anda tidak perlu menggunakan Scanner untuk ini
PrincePolka
3

Pyth, 105 byte

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

Penjelasan:

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.

Saya memutuskan untuk memilih baris pertama sebagai baris "harus jika tidak ada yang lain" karena itu memerlukan byte paling banyak untuk mewakili bahkan setelah bermain golf.

benstopik
sumber
Selamat Datang di Programming Puzzles dan Code Golf! Gunakan komentar untuk membuat @JuanPotato mendapatkannya. Namun, itu perlu 50 rep. Jadi kamu harus bekerja.
user48538
3

Perl 6, 128 byte

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

Saya membuat daftar regex yang berisi kelas karakter bersama dengan ruang literal string. Saya kemudian memanggil firstmetode pada daftar (yang hanya versi metode dari firstfungsi tingkat tinggi), menggunakan smartmatch untuk membandingkan argumen yang diteruskan ke program terhadap item saat ini dalam daftar. Perhatikan bahwa smartmatch melakukan "hal yang benar" untuk regex dan string literal. The :kparameter opsional untuk firstpenyebab metode untuk mengembalikan indeks dari item yang cocok dalam daftar, yang kemudian saya tambahkan 1 ke dan output melalui say.

Perhatikan bahwa saat menggunakan program ini Anda harus keluar dari karakter tertentu seperti `dan spasi di shell Anda. Misalnya: perl6 keyboard.p6 \ `

sotong
sumber
Karena belum ada yang mengatakannya, selamat datang di Programming Puzzles & Code Golf!
Erik the Outgolfer
2

JavaScript ES6, 114 byte

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

Solusi JavaScript lainnya. Prinsipnya adalah untuk mengembalikan indeks input char dalam array baris ditambah 2 (sehingga 0-9 baris mengembalikan -1, yaitu tidak ada, -1 + 2 = 1. qadalah dalam string pertama array, sehingga mengembalikan 0 + 2 = baris ke-2).

nicael
sumber
2

Perl, 96 77 76 byte

Jalankan menggunakan perl -p. Pastikan Anda memberinya hanya karakter tunggal; misalnya, untuk menjalankannya dari file key.pl(untuk menghindari mucking sekitar dengan urutan shell escape) echo -n q|perl -p key.pl.

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

Menyalahgunakan fungsi rentang regex itu menyenangkan.

Menandai
sumber
Bagi saya ini tidak berhasil, menjalankannya saya mendapatkan indeks dari baris + 3 (yaitu 3 bukannya 0, 7 bukannya 4, dll.).
ChatterOne
Ini sensitif terhadap bagaimana Anda memberikan input. Anda mungkin memberikan karakter yang diikuti oleh baris baru. Saya gunakan echountuk mengontrol input - misalnya. echo -n q|perl -n key.pl, yang menghasilkan dengan benar 2.
Markus
Oh begitu. Nah, itu juga menjelaskan mengapa Anda tidak memberi chompinput.
ChatterOne
1
Jika saya chompmengedit input, saya tidak akan dapat mengembalikan '3' untuk kunci kembali.
Markus
1
Hai @Mark, Anda tidak perlu $_=~untuk pertandingan, m//(yang adalah apa /.../) bekerja $_secara otomatis! Juga jika Anda menggunakan -palih-alih, -nAnda dapat menggunakan $_=alih-alih printmenyimpan beberapa byte lagi. Menggunakan baris baru literal bukannya \ndapat menghemat byte lain juga! Itu harus mengurangi kode Anda sedikit! Mungkin layak menambahkan contoh penggunaan juga sehingga pengujian siapa pun tahu Anda perlu menggunakan echo -n:)
Dom Hastings
2

PHP, 173 byte

Idenya di sini adalah menggunakan regex capturing nomor grup sebagai indeks baris. Mungkin beberapa optimasi lagi di regex itu sendiri.

$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];

The preg_match()panggilan akan menciptakan sebuah array $mdari pertandingan, dan jika kita mencetak itu, akan terlihat seperti ini (dengan asumsi zitu input):

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

Membalik array itu, dengan menukar kunci dan nilai, bergerak dari kiri ke kanan dan hanya menyimpan kunci berbeda terakhir, jadi kita berakhir dengan:

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

Kemudian kami menggunakan karakter input sebagai indeks dalam array untuk mendapatkan hasil kami.

Cobalah di sini .

nickb
sumber
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;}

Ini menggunakan index()dari POSIX.1-2001 dan sudah usang di POSIX.1-2008. Ini mengasumsikan ASCII dan 32 bit int.

plafon
sumber
2

Python 3, 89 byte

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

Karena saya belum dapat berkomentar, saya memposting peningkatan untuk jawaban Python 3 saat ini secara terpisah.

Sunting : Semua kode printsekarang dan lebih lanjut diubah.

pengkodean kreatif
sumber
Ini hanya cuplikan dan karenanya bukan jawaban yang valid, Anda harus membungkusnya dalam pernyataan cetak (menjadikannya program yang lengkap) atau mengubahnya menjadi fungsi.
FlipTack
@FlipTack: Anda benar. Saya telah memasukkan saran Anda.
creativecoding
Selamat datang di PPCG!
Martin Ender
@ MartinEnder: Terima kasih! :-)
creativecoding
1

Ruby , 82 byte

->i{1+((0>r=i.ord-33)?r%5:"bc7xdutvz4ind3bwqf6mcu5vxiahnmlfs93c".to_i(36)>>2*r&3)}

Cobalah online!

GB
sumber
0

CJam, 125 byte

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

Penjelasan

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
Zach Gates
sumber
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)

Saya menggunakan string panjang di mana setiap baris panjangnya 26 karakter (# 34 adalah kode untuk kutipan ganda dan # 13 adalah kode untuk pengembalian).

Kemudian cetak hasil posisi pembulatan / 26.

Brian
sumber
0

C # 6, 201 byte

Tidak ada yang istimewa di sini. Saya menemukan lebih murah untuk hanya menulis kedua case daripada menggunakan ToUpper () karena lebar string yang tetap.

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);}

Bertakuk:

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);
}
Makanan Tangan
sumber
1
Saya tidak bisa melihat ini berfungsi untuk ~ atau `?
Ash Burlaczenko
@ AshBurlaczenko, terima kasih! Saya melewatkan kunci itu. Diperbaiki tanpa perubahan pada skor saya.
Hand-E-Food
0

Python 2, 146 byte

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

Excel, 132 byte

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

Mencoba menggunakan case in-sensitive SEARCH()bukannya FIND()mengungkapkan bahwa Excel cocok ~, *dan ?to (tick). The matching of? means we can't useSEARCH () `, yang akan mencukur 5 byte besar ...

Wernisch
sumber