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

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.


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


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.


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 ¯ \ _ (ツ) _ / ¯


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


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.

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)


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.


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.


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 \ `


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


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.


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 .


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.


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.


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


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

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.


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

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

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 ...

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.