Die Herausforderung
Das Ziel dieser Herausforderung besteht darin, zu bestimmen, ob eine bestimmte Zeichenfolge mit nur einer Zeile einer Standard-QWERTZ-Tastatur in Großbritannien eingegeben werden kann.
Dies ist code golf
, so dass die kürzeste Lösung in Bytes gewinnt!
IO
Die Eingabe ist eine einzelne Zeichenfolge mit null oder mehr Zeichen im ASCII-Dezimalbereich von 32-126 einschließlich. Sie können für diese Herausforderung annehmen, dass eine leere Zeichenfolge keine Eingabe erfordert und daher mit einer einzigen Zeile eingegeben werden kann.
Sie können die Eingabe als eine Zeichenfolge, eine Liste von Zeichen oder eine äquivalente Form für Ihre Sprache annehmen.
Die Ausgabe sollte ein wahrer Wert für jeden String sein, der mit einer einzelnen Zeile eingegeben werden kann, oder ein falscher Wert für einen String, der nicht eingegeben werden kann.
Tastaturbelegung
Um Unklarheiten in Bezug auf das Standard-Tastaturlayout zu beseitigen, finden Sie in jeder Zeile eine Liste der verfügbaren Tasten, einschließlich alternativer oberer Tasten (Zugriff über Umschalttaste).
- Linie 1
- Standard:
`1234567890-=
- Standard:
- Zeile 2
- Standard:
qwertyuiop[]
- Standard:
- Zeile 3
- Standard:
asdfghjkl;'#
- Großbuchstaben:
ASDFGHJKL
- Besonderheit: Feststelltaste
- Standard:
- Zeile 4
- Standard:
\zxcvbnm,./
- Wechseln:
|<>?
- Großbuchstaben:
ZXCVBNM
- Spezial: Schicht
- Standard:
- Zeile 5
- Spezial: Leertaste
Alternative obere Tasten können nur gedrückt werden, wenn sich die Umschalttaste ebenfalls in derselben Zeile befindet, und auf Großbuchstaben kann nur über die Feststelltaste oder die Umschalttaste zugegriffen werden. Sie können wirklich nur eine Tastaturzeile verwenden!
Testfälle
-> true (empty string)
45-2=43 -> true (line 1)
qwerty -> true (line 2)
tryitout -> true (line 2)
Qwerty -> false (no shift or caps on line 2)
#sad -> true (line 3)
AsDf -> true (caps lock used)
@sDF -> false (no shift for alternate upper)
zxcvbn? -> true (line 4)
zxc vbn -> false (spacebar on separate line)
123abc -> false (multiple lines)
-> true (just space bar)
!!! -> false (exclamation marks cannot be printed by a single line)
quelle
Antworten:
Python 2 ,
130123121115 BytesProbieren Sie es online!
Python 3 , 111 Bytes
Probieren Sie es online!
-4 Bytes, danke an nedla2004
quelle
Retina 0.8.2 ,
7271 BytesProbieren Sie es online! Erläuterung: Jede Abwechslung entspricht einer anderen Tastaturzeile. Die
(?i)
Mitte des Musters bewirkt, dass der gesamte Rest des Musters unabhängig von Groß- und Kleinschreibung abgeglichen wird. Bearbeiten: 1 Byte dank @KirillL gespeichert.quelle
opqr
kanno-r
für -1 geändert werden . Hast du auch ein Backtick-Zeichen für Zeile 1 vergessen, ich sehe es nicht?[][...
:)05AB1E ,
6647 BytesÜbernimmt die Eingabe als Liste von Zeichen.
-19 Bytes dank @Emigna . Völlig vergessen, dass wir QWERTY-Tastatur-Konstanten eingebaut hatten. : D
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Perl 5
-pl
, 76 BytesProbieren Sie es online!
Der offensichtliche Regex-Ansatz.
quelle
Ruby
-n
,8681 BytesProbieren Sie es online!
quelle
JavaScript (Node.js) ,
999895 ByteProbieren Sie es online!
-1 aus dem Kommentar von @Kirill L. in der Retina-Antwort.
-3 danke @Ismael Miguel und @Arnauld für ihren gemeinsamen Einsatz.
quelle
asdfghjkl
undASDFGHJKL
da drin? Warum benutzt du nicht diei
Flaggex=>/.../i.test(x)
?QWERTYUIOP
sollte der Regex nicht mithalten . Der zusätzliche Scheck kostet mehr als das direkte Codieren dieser Großbuchstaben in den regulären Ausdruck.x=>/^([-`=\d]+|[wetyuio-r\[\]]+)$/.test(x)||/^([asdfghjkl;'#]+|[zxcvbnm,.\/<>?\\|]+| *)$/i.test(x)
ist die gleiche Länge|
1 Byte gespeichert .\
, sind]
und-
(siehe ClassAtomNoDash in der Spezifikation). Der Bindestrich kann auch ohne Auslassungszeichen angezeigt werden, wenn es sich um das erste oder das letzte Zeichen handelt (andernfalls wird er als Zeichenbereichstrennzeichen interpretiert).Perl 6 ,
102 101100 Bytes-1 byte dank nwellnhof!
Probieren Sie es online!
Ziemlich Standardimplementierung. Es gibt wahrscheinlich eine kürzere, auf Regex basierende Lösung, aber ich kenne Perl 6s Regex nicht gut genug, um einen Versuch zu unternehmen.
quelle
max
anstelle von?any
(undmin
anstelle von?all
) verwenden.m:P5//
. Aber ich denke nicht, dass es sich lohnt, eine Antwort zu schreiben.Java 10,
209208 Bytes-1 Byte dank @TFeld .
Probieren Sie es online aus.
Erläuterung:
quelle
!!!
obwohl Ausrufezeichen nicht von einer einzelnen Zeile gedruckt werden können. Ich habe das gerade als Testfall hinzugefügt(?i)
für die anderen Großbuchstaben verwenden?p==" "
stattdessen vorp.equals(" ")
Powershell, 87 Bytes
Port von Neils Retina-Regex .
quelle
Jelly , 55 Bytes
Probieren Sie es online!
Die erste Zeile liefert eine Liste der Tastaturzeilen und die zweite prüft, ob die Programmeingabe in einer einzelnen Zeile (oder in einer Nullzeile) enthalten ist und ob es keine Zeichen gibt, die nicht eingegeben werden können (wie
QWE!@#
).quelle
C 150 Bytes
Probieren Sie es online!
Es wird keine Preise gewinnen, aber das ist ein lustiger Ansatz: Wir ordnen Zeichen in den fünf Zeilen der Tastatur
4 8 16 32 64
und jedem ungültigen Zeichen zu3
. Wir führen eine bitweise ODER-Verknüpfung der Werte für jedes Zeichen in der Zeichenfolge durch und prüfen, ob das Ergebnis zufriedenstellendx&(x-1) == 0
ist. Dies ist der Fall, wennx
eine Potenz von 2 oder Null vorliegt, dh wennx
höchstens ein Bit gesetzt ist.quelle
LUA ,
282262259270 BytesProbieren Sie es online!
quelle
PHP, 98 Bytes
Ich bin ein bisschen traurig, dass es nichts kürzeres als Regex gibt. Es ist wahrscheinlich nicht die schnellste Lösung.
Laufen Sie als Pipe mit
-F
oder versuchen Sie es online .Kürzeste nicht-reguläre Lösung, die ich gefunden habe (124 Bytes; Zeilenumbruch und Tabulator zur Vereinfachung des Lesens):
Exits mit Code
1
für Wahrhaftigkeit,0
für Falschheit. Als Rohr mit laufen lassen-R
.Benötigt PHP 5.4 oder neuer; Verwenden Sie für älteres PHP
array(...)
anstelle von[...]
(+5 Bytes)oder verwenden Sie diese 123 Bytes mit
-nR
in PHP <7:quelle
AWK ,
163119113 BytesDies ist eine AWK-Antwort, die eine numerische 1-Zeichenfolge für true und eine 0-Zeichenfolge für false zurückgibt. (Als AWK geschrieben, als awk -f-Datei für die interaktive Verwendung aufrufen.)
Probieren Sie es online!
Behandelt TAB-Zeichen jedoch nicht als geschrieben (einfache Erweiterung), da sie nicht Teil der Spezifikation sind.
quelle
print
ist genug: Probieren Sie es online!{print/^[-```1234567890=]*$/||/^[]qwertyuiop\[]*$/||/^[asdfghjkl;'#ASDFGHJKL]*$/||/^[zxcvbnm,.\/\|<>?ZXCVBNM]*$/||/^ *$/}
Bash , 119 Bytes
Enthält ein Echo für eine "lesbare" Ausgabe. Wenn Sie einen geeigneten Shell-Wrapper (Ihrer Wahl) verwenden, um Print / Output einzuschließen, können Sie 8 Bytes einsparen. Meine Lektüre der Herausforderung legt nahe, dass die Lösung eine geeignete Ausgabeanzeige ausgeben sollte, also halte ich mich an 119 Bytes.
Probieren Sie es online!
quelle