Który rząd jest włączony?

39

Biorąc pod uwagę dowolny z następujących znaków (lub nowego wiersza):

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

Twój program musi wypisać wiersz, który znajduje się na klawiaturze


Ponieważ moja klawiatura jest (prawie) rozładowana, twój kod musi być jak najkrótszy


Klawiatura, której powinien używać Twój program (do wyszukiwania wierszy), powinna wyglądać następująco:


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                                                   

Gdzie   returnjest nowa linia. Puste klucze nic nie znaczą.

Przykłady

"$"
1

"R"
2

"a"
3

"?"
4

"\n"
3

" "
5

gdzie \njest znak nowej linii.

Dane techniczne

  • W twoim programie nie jest rozróżniana wielkość liter
  • Twój program musi obsługiwać tylko znaki na pokazanej klawiaturze
Downgoat
źródło
3
Może klasyfikacja ?
lirtosiast
3
Czy to jest podwójnie zagnieżdżone kbd?
Conor O'Brien
Pamiętam lata temu, używając języka, który zwracał naciśnięcia klawiszy jako 100 × wiersz + pozycja ... Byłoby do tego idealne, ale niestety nie pamiętam, co to było. Może jakaś forma BASIC ...
Adám
@NBZ Czy to Blitz Basic?
wizzwizz4
1
@ wizzwizz4 Czy próbowałeś BlitzPlus? jest bezpłatny i wygląda na to, czego chcesz.
HolyBlackCat

Odpowiedzi:

6

Pyth, 62 66 65 bajtów

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

Wypróbuj online.

Wykorzystuje pakowane ciąg reprezentujący liczbę w hex który, gdy pokrojone na kawałki dwóch bitów, reprezentujący rząd każdego znaku z wyjątkiem i !jako wartość od 0 do 3. Wychodzimy na zewnątrz i !tak nie mamy do przechowywania 4 albo mieć 0 na początku tego numeru, a następnie dodaj ich wartości wiersza za pomocą +,4Z. Po przekształceniu ciągu w wartości wierszy wystarczy użyć kodu wejściowego, aby zindeksować tablicę wartości, a następnie dodać 1.

Newline jest obsługiwany osobno, ponieważ jest interpretowany przez Pyth jako pusty ciąg znaków, a zatem ma kod znakowy 0.

Byłoby to krótsze, gdybym mógł wymyślić, jak korzystać z bazy 256 w Pyth, ale nie jestem w stanie sprawić, żeby działała.

Łukasz
źródło
4
o.0 zaczyna ściskać Japt
nicael
to mnie zawstydza
JuanPotato
:( Zapomniałem o nowej linii! @Nicael wróciłeś do bycia na topie.
Luke
Teraz nawet nie żyjemy!
Łukasza
Musisz uciec przed bajtami zerowymi w Pyth.
lirtosiast
12

JavaScript (ES6), 105 102 101 bajtów

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

Wyjaśnienie

W JavaScript testzwraca wartość logiczną, która działa tak samo jak 1i 0tak pomnożyć im przez rząd. Testowanie rzędu 2 zajęło najwięcej bajtów, więc użyłem tego jako domyślnego, jeśli nie pasowało żadne inne.

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

Test

użytkownik 81655
źródło
1
> NaN XOR 2 = 2 - ???
lirtosiast
1
@ThomasKwa Tak właśnie działa JS lol. Jeśli c="q", ++c= NaN, NaN*7= NaN, NaN^2konwertuje argumentów do liczb całkowitych (uncastables lubię NaNstać 0), a następnie robi 0 XOR 2co jest 2.
user81655
5

Glava 1,5 , 164 bajty

Glava to dialekt języka Java, który powoduje, że kod Java jest krótszy. Ten kod jest niestety niekonkurencyjny, ponieważ zastosowane zostało zatwierdzenie (opóźnienie 2 godziny ...) po tym wyzwaniu, które naprawiło kilka istotnych błędów, które nie pozwalały na działanie tego programu.

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

Jest to pełny program, który pobiera dane wejściowe za pomocą argumentów wiersza polecenia. Działa, po prostu testując, dla którego wyrażenia regularnego pasuje, a następnie wyświetla odpowiednią liczbę.

GamrCorps
źródło
Glava = Guava + Java?
Downgoat,
2
@ Doᴡɴɢᴏᴀᴛ Glava = Golf + Java (to był pomysł Conora)
GamrCorps
W rzeczy samej! @ 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)

Prawdopodobnie jest krótszy sposób, że przeoczam ¯ \ _ (ツ) _ / ¯

JuanPotato
źródło
4

Pyth , 98

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

nie jestem pewien, jak uruchomić zakres 0–9 z jakiegoś powodu: |, zainspirowany odpowiedzią user81655

JuanPotato
źródło
Możesz użyć jkUTciągu z zakresem od 0 do 9, nie jestem pewien, czy istnieje krótszy sposób. Możesz także użyć spakowanych ciągów, aby zaoszczędzić kilka bajtów, np . ."!~WÏù¹_(<]úÝ"Dla "~`!@#$%^&*()_-=+".
Łukasza
Od @benstopics, to nie kończy się na metaznakach regularnych
FryAmTheEggman
4

Bash, 108

Brak odpowiedzi Bash? Bash odpowiedź. grep -Finjest zdecydowanie właściwym narzędziem do tego zadania.

Ten program jest w dwóch plikach.

k, 73 bajty

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

Jest 5 linii, ostatnia to spacja. Jeśli masz problemy z odtworzeniem pliku, base64 to:

YDEyMzQ1Njc4OTAtPX4hQCMkJV4mKigpXysKcXdlcnR5dWlvcFtdXHt9fAphc2RmZ2hqa2w7JzoiCnp4Y3Zibm0sLi88Pj8KIA==

b, 34 bajty

To jest sam program, który pobiera dane wejściowe jako jedyny argument wiersza poleceń.

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

Wynik: 34 + 73 + 1 (dla knazwy pliku) = 108 bajtów

Bez golfa

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

Wyjaśnienie

  • grep - wyszukaj plik w poszukiwaniu linii pasujących do ciągu lub wyrażenia regularnego, wypisz tylko te linie
  • -Faka --fixed-strings- wyłącz wyrażenia regularne, aby [itd. były obsługiwane poprawnie
  • -iaka -yaka --ignore-case- dopasowanie bez rozróżniania wielkości liter
  • -naka --line-number- pokaż numer linii i: przed każdą linią (np. 4:zxcvbnm,./<>?)
  • "$1" - wyszukaj pierwszy argument wiersza polecenia skryptu, cudzysłowy są niezbędne do obsługi znaku nowej linii i spacji
  • k - szukaj w pliku k
  • To greppolecenie dopasuje wszystkie pięć wierszy, jeśli dane wejściowe to nowa linia, a tylko jedna linia w przeciwnym razie.
  • | - potok, wyślij standardowe wyjście jednego polecenia na standardowe wejście następnego
  • tail - wypisuje ostatnie N wierszy lub znaków standardowego wejścia
  • -n3aka --lines=3- wypisuje ostatnie 3 linie
  • Jeśli dane wejściowe nie były znakiem nowej linii, przetwarzany jest tylko jeden wiersz, który zaczyna się od numeru wiersza z powodu -nwłączonej flagi grep. W przeciwnym razie to polecenie pobiera tylko wiersze 3, 4 i 5 (ostatnie 3 wiersze).
  • | - rura
  • head - wypisuje pierwsze N ​​wierszy lub znaków standardowego wejścia
  • -c1aka --bytes=1- wypisuje pierwszy znak
  • Jeśli dane wejściowe nie były znakiem nowej linii, pobierany jest pierwszy znak, który jest numerem wiersza, w którym znaleziono dane wejściowe. Jeśli dane wejściowe to nowa linia, bierze pierwszy znak linii 3, 4 i 5 łącznie, czyli 3, co jest przypadkiem poprawnym numerem wiersza dla nowej linii.

źródło
4

Japt, 73 70 66 bajtów

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

Wypróbuj online! (w tym przykładzie dane wejściowe to dosłownie nowa linia)

Nicość
źródło
Fajne, najkrótsze jak dotąd!
ETHproductions
@ Eth tak, przynajmniej raz powinienem
napisać
Kilka bajtów krócej
ETHproductions
@Eth Heh, !1jest coś, co pasuje do „false”, w końcu wiem, jak to zrobić, dzięki :)
nicael
@Eth halp, potrzebuje 5 bajtów, aby pokonać Pytha.
nicael
4

Java, 300 bajtów

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

Nie jestem ekspertem i to moja pierwsza próba gry w golfa, ale pomyślałem, co do cholery, dlaczego nie? Powyżej znajduje się pełna wersja programu, rzeczywisty kod, który do niej wejdzie, najprawdopodobniej usunąłby przyzwoitą liczbę znaków.

Andrzej
źródło
właśnie zauważyłem, że ulega awarii przy pustym wejściu (powrót do nowej linii / karetki). naprawię, kiedy będę mógł
Andrew
Witamy w społeczności!
Erik the Outgolfer,
Witamy (nieco późno, odkąd opublikowałeś w styczniu xD). Możesz grać w golfa całkiem bez zmiany obecnego podejścia w ten sposób: 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 bajty ) Usunąłem niepotrzebne nawiasy; skrócone args; usunięty public ; bezpośrednio używał napisu i skanera; i usunąłem import, który java.util.Scannerjest używany raz.
Kevin Cruijssen
219 bajtów , w tym celu nie musisz używać skanera
PrincePolka
3

Pyth, 105 bajtów

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

Wyjaśnienie:

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.

Zdecydowałem się wybrać pierwszy rząd jako wiersz „musi być, jeśli nic innego”, ponieważ wymagał największej liczby bajtów do przedstawienia nawet po grze w golfa.

benstopics
źródło
Witamy w Programowaniu zagadek i Code Golf! Użyj komentarzy, aby @JuanPotato go otrzymał. Wymaga to jednak 50 powtórzeń. Więc musisz pracować.
user48538,
3

Perl 6, 128 bajtów

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

Tworzę listę wyrażeń regularnych zawierających klasy znaków wraz z ciągiem dosłownym. Następnie wywołuję firstmetodę z listy (która jest tylko wersją metody funkcji firstwyższego rzędu), używając smartmatch do porównania argumentu przekazanego do programu z bieżącym elementem na liście. Zauważ, że smartmatch robi „właściwą rzecz” zarówno dla wyrażeń regularnych, jak i literału ciągowego. :kOpcjonalny parametr do firstprzyczyn metoda zwraca indeks zgodnego elementu na liście, które następnie dodać 1 do i wyjście poprzez say.

Zauważ, że podczas używania tego programu będziesz musiał poprawnie uciec od pewnych znaków, takich jak `i spacja w swojej powłoce. Na przykład: perl6 keyboard.p6 \ `

mątwa
źródło
Ponieważ nikt tego jeszcze nie powiedział, witamy w Programowanie Puzzle i Code Golf!
Erik the Outgolfer,
2

JavaScript ES6, 114 bajtów

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

Kolejne rozwiązanie JavaScript. Zasadą jest zwrócenie indeksu znaku wejściowego w tablicy wierszy plus 2 (tak jak wiersz 0-9 zwraca -1, tzn. Nie istnieje, -1 + 2 = 1. qJest w pierwszym ciągu tablicy, więc zwraca 0 + 2 = 2. rząd).

Nicość
źródło
2

Perl, 96 77 76 bajtów

Uruchom za pomocą perl -p. Upewnij się, że karmisz go tylko pojedynczymi postaciami; na przykład, aby uruchomić go z pliku key.pl(aby uniknąć mijania się z sekwencjami ucieczki powłoki) echo -n q|perl -p key.pl.

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

Nadużywanie funkcji zakresu wyrażeń regularnych jest zabawne.

znak
źródło
Dla mnie to nie działa, uruchamiając go, otrzymuję indeks wiersza + 3 (tj. 3 zamiast 0, 7 zamiast 4 itd.).
ChatterOne
Jest wrażliwy na sposób wprowadzania danych. Zapewne podajesz postać, po której następuje nowa linia. Używam echodo precyzyjnego sterowania wejściem - np. echo -n q|perl -n key.pl, który poprawnie produkuje 2.
Mark
Rozumiem. To wyjaśnia również, dlaczego nie chompwkładasz danych.
ChatterOne
1
Gdybym chompedytował dane wejściowe, nie byłbym w stanie zwrócić „3” dla klawisza powrotu.
Mark
1
Hej @Mark, nie potrzebujesz $_=~zapałek, m//(co /.../jest) działa $_automatycznie! Również, jeśli używasz -pzamiast -n, możesz użyć $_=zamiast printzaoszczędzić kilka dodatkowych bajtów. Użycie dosłownego nowego wiersza zamiast \nmoże również zaoszczędzić kolejny bajt! To powinno znacznie zredukować twój kod! Warto też dodać przykładowe użycie, aby każdy testujący wiedział, że musisz użyć echo -n:)
Dom Hastings
2

PHP, 173 bajtów

Pomysł polegał na wykorzystaniu numeru grupy przechwytywania wyrażeń regularnych jako indeksu wiersza. Prawdopodobnie jeszcze więcej optymalizacji samego wyrażenia regularnego.

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

preg_match()Wezwanie utworzy tablicę $mzapałek, a gdybyśmy wydrukować, że to wyglądać mniej więcej tak (zakładając zbyło wejście):

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

Odwrócenie tej tablicy, poprzez zamianę klawiszy i wartości, przesuwa się od lewej do prawej i zachowuje tylko ostatni wyraźny klucz, więc otrzymujemy:

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

Następnie używamy znaku wejściowego jako indeksu w tablicy, aby uzyskać nasz wynik.

Wypróbuj tutaj .

nickb
źródło
2

C, 145 143 136 132 127 106 bajtów

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

To używa index()z POSIX.1-2001 i jest przestarzałe w POSIX.1-2008. Zakłada się, że ASCII i 32-bitowe int.

sufitowy
źródło
2

Python 3, 89 bajtów

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

Ponieważ nie mogę jeszcze komentować, ulepszenie dla bieżącej odpowiedzi w języku Python 3 publikuję osobno.

Edycja : Cały kod jest printteraz i dalej poprawiany.

kodowanie twórcze
źródło
Jest to tylko fragment kodu i dlatego nie jest poprawną odpowiedzią, musisz zawinąć go w instrukcję print (czyniąc go pełnym programem) lub przekształcić w funkcję.
FlipTack,
@FlipTack: Masz rację. Uwzględniłem twoją sugestię.
kreatywne
Witamy w PPCG!
Martin Ender,
@MartinEnder: Dziękujemy! :-)
twórcze
1

Rubin , 82 bajty

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

Wypróbuj online!

GB
źródło
0

CJam, 125 bajtów

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

Wyjaśnienie

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
źródło
0

SpecBAS - 178 bajtów

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)

Użyłem długiego łańcucha, w którym każdy wiersz ma 26 znaków (nr 34 to kod podwójnego cudzysłowu, a nr 13 to kod powrotu).

Następnie wydrukuj wynik zaokrąglenia pozycji / 26.

Brian
źródło
0

C # 6, 201 bajtów

Nic specjalnego. Okazało się, że tańsze jest pisanie obu przypadków zamiast używania ToUpper () ze względu na stałą szerokość łańcucha.

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

Zębaty:

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);
}
Hand-E-Food
źródło
1
Nie widzę, żeby to działało dla ~ lub `?
Ash Burlaczenko
@AshBurlaczenko, dzięki! Brakowało mi tego klucza. Naprawiono bez zmiany mojego wyniku.
Hand-E-Food
0

Python 2, 146 bajtów

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

Excel, 132 bajty

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

Próby wykorzystania przypadek w wrażliwych SEARCH()zamiast FIND()ujawniła, że Excel mecze ~, *a ?do (tick). The matching of? means we can't useSEARCH () `, który ogoliłby masywne 5 bajtów ...

Wernisch
źródło