Auf welcher Zeile befindet sich der Schlüssel?

39

Mit einem der folgenden Zeichen (oder einer neuen Zeile):

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

Ihr Programm muss die Zeile ausgeben, in der es sich auf der Tastatur befindet


Da meine Tastatur (fast) leer ist, muss Ihr Code so kurz wie möglich sein


Die Tastatur, die Ihr Programm verwenden soll (für die Zeilensuche), sollte wie folgt aussehen:


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                                                   

Wo   returnist ein Zeilenumbruch? Leere Schlüssel bedeuten nichts.

Beispiele

"$"
1

"R"
2

"a"
3

"?"
4

"\n"
3

" "
5

Wo \nist ein Newline-Zeichen.

Spezifikationen

  • Ihr Programm sollte die Groß- und Kleinschreibung nicht berücksichtigen
  • Ihr Programm muss nur die Zeichen auf der angezeigten Tastatur verarbeiten
Downgoat
quelle
3
Vielleicht Klassifizierung ?
Lirtosiast
3
Ist das ein doppelt verschachteltes kbd?
Conor O'Brien
Ich erinnere mich, dass ich vor Jahren eine Sprache verwendet habe, die Tastendrücke als 100 × Zeile + Position zurückgab ... Wäre perfekt dafür gewesen, aber ich erinnere mich leider nicht, was es war. Vielleicht irgendeine Form von BASIC ...
Adám
@NBZ Ist es Blitz Basic?
wizzwizz4
1
@ wizzwizz4 Hast du schon BlitzPlus ausprobiert? Es ist kostenlos und sieht so aus, als ob es das ist, was Sie wollen.
HolyBlackCat

Antworten:

6

Pyth, 62 66 65 Bytes

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

Probieren Sie es online aus.

Verwendet ein gepackter String eine Zahl in hex darstellt , die, wenn sie in zwei-Bit - Stücke gehackt, mit Ausnahme der Zeile jedes Zeichen darstellt und !als ein Wert von 0 bis 3. Wir auslassen und !so haben wir bis 4 nicht speichern oder haben a 0 am Anfang dieser Zahl, dann addieren Sie ihre Zeilenwerte mit +,4Z. Nachdem wir die Zeichenfolge in Zeilenwerte umgewandelt haben, müssen wir nur den Zeichencode der Eingabe verwenden, um das Array der Werte zu indizieren, und dann 1 hinzufügen.

Newline wird separat behandelt, da es von Pyth als leere Zeichenfolge interpretiert wird und daher den Zeichencode 0 hat.

Dies wäre kürzer, wenn ich herausfinden könnte, wie Base 256 in Pyth verwendet wird, aber ich kann es nicht ganz zum Laufen bringen.

Luke
quelle
4
o.0 beginnt Quetschen Japt
nicael
das macht mich schade
JuanPotato
:( Ich habe Newline vergessen! @Nicael du bist wieder an der Spitze.
Luke
Jetzt sind wir sogar tot!
Luke
Sie müssen null Bytes in Pyth maskieren.
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

Erläuterung

In JavaScript testeinen Booleschen Wert zurück, die gleich wirkt wie 1oder 0so ich multiplizieren sie durch ihre Reihe. Das Testen von Zeile 2 hat die meisten Bytes in Anspruch genommen, daher habe ich diese als Standard verwendet, wenn keine anderen übereinstimmen.

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

Prüfung

user81655
quelle
1
> NaN XOR 2 = 2 - ???
Lirtosiast
1
@ThomasKwa Genau so funktioniert JS lol. Wenn c="q", ++c= NaN, NaN*7= NaN, NaN^2konvertiert die Operanden in ganze Zahlen (Uncastable wie NaNwerden 0), dann tut 0 XOR 2was ist 2.
user81655
5

Glava 1,5 , 164 Bytes

Glava ist ein Java-Dialekt, der Java-Code kürzer macht. Dieser Code ist leider nicht wettbewerbsfähig, da das verwendete Commit (2 Stunden zu spät ...) nach dieser Herausforderung durchgeführt wurde, wodurch einige wichtige Fehler behoben wurden, die das Funktionieren dieses Programms unmöglich machten.

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

Dies ist ein vollständiges Programm, das Eingaben über Befehlszeilenargumente entgegennimmt. Funktioniert, indem einfach getestet wird, für welche Zeile Regex passt, und dann die entsprechende Nummer ausgegeben wird.

GamrCorps
quelle
Glava = Guave + Java?
Trottel
2
@ Doᴡɴɢᴏᴀᴛ Glava = Golf + Java (es war Conors Idee)
GamrCorps
Tatsächlich! @ 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)

Es gibt wahrscheinlich einen kürzeren Weg, auf dem ich ¯ \ _ (ツ) _ / ¯ übersehen kann

JuanPotato
quelle
4

Pyth , 98

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

Ich bin mir aus irgendeinem Grund nicht sicher, wie ich den 0-9-Bereich zum Laufen bringen soll: |, inspiriert von der Antwort von user81655

JuanPotato
quelle
Sie können jkUTfür die Zeichenfolge den Bereich 0 bis 9 verwenden, nicht sicher, ob es einen kürzeren Weg gibt. Sie können auch gepackte Strings speichern ein paar Bytes, zB verwendet ."!~WÏù¹_(<]úÝ"für "~`!@#$%^&*()_-=+".
Luke
Von @benstopics schlägt dies für Regex-Metazeichen
fehl
4

Bash, 108

Keine Bash-Antwort? Bash Antwort. grep -Finist definitiv das richtige Werkzeug für diesen Job.

Dieses Programm besteht aus zwei Dateien.

k73 Bytes

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

Es gibt 5 Zeilen, die letzte ist ein Leerzeichen. Wenn Sie Probleme beim Wiedergeben der Datei haben, lautet der base64:

YDEyMzQ1Njc4OTAtPX4hQCMkJV4mKigpXysKcXdlcnR5dWlvcFtdXHt9fAphc2RmZ2hqa2w7JzoiCnp4Y3Zibm0sLi88Pj8KIA==

b34 Bytes

Dies ist das Programm selbst, es nimmt Eingaben als einziges Befehlszeilenargument entgegen.

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

Ergebnis: 34 + 73 + 1 (für k den Dateinamen) = 108 Bytes

Ungolfed

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

Erläuterung

  • grep - Durchsuchen Sie eine Datei nach Zeilen, die einem String oder regulären Ausdruck entsprechen, und geben Sie nur diese Zeilen aus
  • -Faka --fixed-strings- deaktiviere reguläre Ausdrücke, damit [etc. korrekt gehandhabt werden
  • -iaka -yaka --ignore-case- Matching ohne Berücksichtigung der Groß- und Kleinschreibung
  • -naka --line-number- zeige die Zeilennummer und: vor jeder Zeile (zB 4:zxcvbnm,./<>?)
  • "$1" - Suchen Sie nach dem ersten Befehlszeilenargument des Skripts. Die Anführungszeichen sind erforderlich, um mit Zeilenumbrüchen und Leerzeichen umzugehen
  • k - Suche in Datei k
  • Dieser grepBefehl stimmt mit allen fünf Zeilen überein, wenn es sich bei der Eingabe um eine neue Zeile handelt, andernfalls nur mit einer Zeile.
  • | - Pipe, Standardausgabe eines Befehls an die Standardeingabe des nächsten Befehls senden
  • tail - Die letzten N Zeilen oder Zeichen der Standardeingabe ausgeben
  • -n3 aka --lines=3 - gibt die letzten 3 Zeilen aus
  • Wenn die Eingabe keine neue Zeile war, muss nur eine Zeile verarbeitet werden, die mit der Zeilennummer beginnt, da das -nFlag aktiviert ist grep. Andernfalls übernimmt dieser Befehl nur die Zeilen 3, 4 und 5 (die letzten 3 Zeilen).
  • | - Pfeife
  • head - Die ersten N Zeilen oder Zeichen der Standardeingabe ausgeben
  • -c1aka --bytes=1- gibt das erste Zeichen aus
  • Wenn es sich bei der Eingabe nicht um eine neue Zeile handelt, wird das erste Zeichen verwendet. Dies ist die Zeilennummer, in der sich die Eingabe befindet. Wenn es sich bei der Eingabe um eine neue Zeile handelt, wird das erste Zeichen der Zeilen 3, 4 und 5 kombiniert. Dies ist 3, was zufällig die richtige Zeilennummer für die neue Zeile ist.

quelle
4

Japt, 73 70 66 Bytes

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

Probieren Sie es online! (In diesem Beispiel ist die Eingabe buchstäblich eine neue Zeile.)

nicael
quelle
Schön, bisher am kürzesten!
ETHproductions
@Eth yup, mindestens einmal sollte ich etwas kurzes
posten
Ein paar Bytes kürzer
ETHproductions
@Eth Heh, !1ist etwas, das "falsch" entspricht, endlich weiß ich, wie es geht, danke :)
nicael
@Eth halp, benötigt 5 Bytes, um Pyth zu schlagen.
Nicoleel
4

Java, 300 Bytes

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

Ich bin kein Experte, und dies ist mein erster Versuch, Golf zu spielen, aber ich dachte mir, was zur Hölle, warum nicht? Oben ist die Vollversion des Programms, der eigentliche Code, der in das Programm eingeht, würde höchstwahrscheinlich eine anständige Menge an Zeichen wegnehmen.

Andrew
quelle
Ich habe gerade bemerkt, dass es bei einer leeren Eingabe (neue Zeile / Wagenrücklauf) abstürzt. Wird
Andrew
Willkommen in der Community!
Erik der Outgolfer
Willkommen (etwas spät, seitdem du im Januar xD gepostet hast). Sie können ein gutes Stück Golf spielen, ohne Ihren aktuellen Ansatz zu ändern: 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 Bytes ) Ich habe einige unnötige Klammern entfernt. verkürzt args; entfernt public ; direkt verwendet die Zeichenfolge und Scanner; und entfernte den Import jetzt, java.util.Scannerder einmal verwendet wird.
Kevin Cruijssen
219 Bytes, für die Sie keinen Scanner benötigen
PrincePolka
3

Pyth, 105 Bytes

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

Erläuterung:

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.

Ich entschied mich, die erste Reihe als "Muss wenn nichts anderes" zu wählen, da die meisten Bytes auch nach dem Golfen dargestellt werden mussten.

benstopics
quelle
Willkommen bei Programming Puzzles und Code Golf! Verwenden Sie Kommentare, um @JuanPotato zum Abrufen zu bringen. Dies erfordert jedoch 50 Wiederholungen. Also musst du arbeiten.
User48538
3

Perl 6, 128 Bytes

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

Ich erstelle eine Liste von Regexen mit Zeichenklassen und einem String-Literal-Leerzeichen. Ich rufe dann die firstMethode in der Liste auf (die nur die Methodenversion der firstFunktion höherer Ordnung ist) und vergleiche mit smartmatch das an das Programm übergebene Argument mit dem aktuellen Element in der Liste. Beachten Sie, dass Smartmatch sowohl für reguläre Ausdrücke als auch für ein String-Literal "das Richtige" tut. Der :koptionale Parameter to firstbewirkt , dass die Methode den Index des übereinstimmenden Elements in der Liste zurückgibt, dem ich dann 1 hinzufüge und über ausgebesay .

Beachten Sie, dass Sie bei der Verwendung dieses Programms bestimmte Zeichen wie `und Leerzeichen in Ihrer Shell korrekt maskieren müssen. Zum Beispiel: perl6 keyboard.p6 \ `

Tintenfisch
quelle
Da es noch niemand gesagt hat, willkommen bei Programming Puzzles & Code Golf!
Erik der Outgolfer
2

JavaScript ES6, 114 Byte

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

Eine weitere JavaScript-Lösung. Das Prinzip besteht darin, den Index des Eingabezeichens in dem Array aus Zeilen plus 2 zurückzugeben (so wie die Zeile 0-9 -1 zurückgibt, dh nicht existiert, ist -1 + 2 = 1. Befindet qsich in der ersten Zeichenfolge des Arrays, es gibt also 0 + 2 = 2. Zeile zurück).

nicael
quelle
2

Perl, 96 77 76 Bytes

Führen Sie mit perl -p. Stellen Sie sicher, dass Sie nur einzelne Zeichen eingeben. Zum Beispiel, um es von einer Datei aus auszuführen key.pl(um nicht mit Shell-Escape-Sequenzen herumzuspielen) echo -n q|perl -p key.pl.

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

Es macht Spaß, die Funktionalität des Regex-Bereichs zu missbrauchen.

Kennzeichen
quelle
Für mich funktioniert das nicht, wenn ich es laufen lasse, erhalte ich den Index der Zeile + 3 (dh 3 anstelle von 0, 7 anstelle von 4 usw.).
ChatterOne
Es hängt davon ab, wie Sie die Eingabe bereitstellen. Sie geben wahrscheinlich einen Buchstaben gefolgt von einem Zeilenumbruch an. Ich benutze echo, um die Eingabe genau zu steuern - z. echo -n q|perl -n key.pl, was richtig produziert 2.
Mark
Oh, ich verstehe. Nun, das erklärt auch, warum Sie chompdie Eingabe nicht machen.
ChatterOne
1
Wenn ich chompdie Eingabe ändern würde, könnte ich für die Eingabetaste nicht '3' zurückgeben.
Mark
1
Hey @Mark, du brauchst das $_=~für die Matches nicht, m//(was ist das /.../) funktioniert $_automatisch! Auch wenn Sie -pstatt verwenden -n, können Sie $_=statt verwenden print, um ein paar weitere Bytes zu speichern. Wenn Sie stattdessen einen wörtlichen Zeilenumbruch verwenden, \nkönnen Sie auch ein weiteres Byte sparen! Das sollte Ihren Code ein wenig reduzieren! Könnte es wert sein, ein Beispiel hinzuzufügen, damit jeder, der es testet, weiß, dass Sie es brauchen echo -n:)
Dom Hastings
2

PHP, 173 Bytes

Die Idee dabei war, die Nummer der Regex-Erfassungsgruppe als Zeilenindex zu verwenden. Wahrscheinlich noch ein paar Optimierungen in der 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];

Der preg_match()Aufruf erzeugt eine Reihe $mvon Übereinstimmungen, und wenn wir das ausdrucken würden, würde es ungefähr so ​​aussehen (vorausgesetzt, zdie Eingabe war):

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

Wenn Sie dieses Array durch Vertauschen von Schlüsseln und Werten spiegeln, bewegen Sie sich von links nach rechts und behalten nur den letzten eindeutigen Schlüssel bei.

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

Dann verwenden wir das Eingabezeichen als Index im Array, um unser Ergebnis zu erhalten.

Probieren Sie es hier aus .

nickb
quelle
2

C 145 143 136 132 127 106 Bytes

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

Dies wird index()ab POSIX.1-2001 verwendet und ist in POSIX.1-2008 veraltet. Dies setzt ASCII und 32-Bit-Ints voraus.

Ceilingcat
quelle
2

Python 3, 89 Bytes

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

Da ich noch keinen Kommentar abgeben kann, veröffentliche ich die Verbesserung für die aktuelle Python 3-Antwort separat.

Bearbeiten : Alle Code printjetzt und weiter optimiert.

CreativeCoding
quelle
Dies ist lediglich ein Ausschnitt und daher keine gültige Antwort. Sie müssen ihn in eine print-Anweisung einbinden (was ihn zu einem vollständigen Programm macht) oder ihn in eine Funktion umwandeln.
FlipTack
@FlipTack: Du hast recht. Ich habe Ihren Vorschlag aufgenommen.
CreativeCoding
Willkommen bei PPCG!
Martin Ender
@MartinEnder: Danke! :-)
creativecoding
1

Ruby , 82 Bytes

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

Probieren Sie es online!

GB
quelle
0

CJam, 125 Bytes

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

Erläuterung

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
quelle
0

SpecBAS - 178 Bytes

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)

Ich habe eine lange Zeichenfolge verwendet, bei der jede Zeile 26 Zeichen lang ist (# 34 ist Code für doppelte Anführungszeichen und # 13 ist Code für die Rückgabe).

Drucken Sie dann das Ergebnis der Rundungsposition / 26 aus.

Brian
quelle
0

C # 6, 201 Bytes

Nichts besonderes hier. Ich fand es billiger, nur beide Fälle zu schreiben, anstatt ToUpper () zu verwenden, da der String eine feste Breite hat.

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

Eingerückt:

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
quelle
1
Ich kann nicht sehen, dass das für ~ oder `?
Ash Burlaczenko
@AshBurlaczenko, danke! Ich habe den Schlüssel verpasst. Ohne Änderung meiner Punktzahl behoben.
Hand-E-Food
0

Python 2, 146 Bytes

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

Excel, 132 Bytes

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

Versuche, die Groß- und Kleinschreibung SEARCH()zu FIND()ignorieren, haben ergeben, dass Excel übereinstimmt ~, *und ?zu (tick). The matching of? means we can't useSEARCH () `, die massive 5 Bytes rasiert hätte ...

Wernisch
quelle