Zielsetzung
Schreiben Sie ein Programm oder eine Funktion, die prüft, ob ein Variablenname gültig ist und 1 ausgibt oder True
ob er gültig ist, 0,5, wenn er gültig ist, aber mit einem Unterstrich (_) beginnt, und 0, oder False
wenn er ungültig ist.
Regeln
- Ein Variablenname ist in den meisten Sprachen gültig, wenn er mit einem Unterstrich oder Buchstaben (az, AZ, _) beginnt und die restlichen Zeichen entweder Unterstriche, Buchstaben oder Zahlen sind. (az, AZ, 0-9, _)
- Ausgang 1 oder
True
wenn der Variablenname gültig ist und 0 oderFalse
wenn nicht gültig. - Es ist jedoch nicht ratsam, eine Variable mit einem Unterstrich zu beginnen. Geben Sie also 0,5 zurück, wenn sie mit einem Unterstrich beginnt und der Name gültig ist.
Testfälle
Eingang
abcdefghijklmnop
Ausgabe
1
Eingang
_test_
Ausgabe
0.5
(beginnt mit einem Unterstrich)
Eingang
123abc
Ausgabe
0
(beginnt mit einer Zahl)
Eingang
A_b1C_23
Ausgabe
1
Eingang
_!
Ausgabe
0
(nicht 0,5, weil es nicht gültig ist)
Eingang
magical pony1
Ausgabe
0
(kein Platz)
Es gelten Standardlücken .
Das ist Code-Golf , also gewinnt der kürzeste Code.
Bonus: -10%, wenn Ihr Programm / Ihre Funktion 0
eine leere Zeichenfolge ausgibt ( ""
).
__init__
; auch, nein, Klassen nicht brauchen eine__init__
aber in der Regel eine habenAntworten:
JavaScript (ES6), 37 - 10% = 33,3 Byte
4 Bytes gespart dank @ edc65
5,6 Bytes dank @Mateon eingespart
quelle
05AB1E ,
25242019 BytesCode:
Erläuterung:
Kurz gesagt
s
lautet die Formel für die Zeichenfolge im Pseudocode:Probieren Sie es online!
Verwendet CP-1252- Codierung.
quelle
PHP (50 - 10% = 45)
Danke an Schism für den -2 :)
Ich wollte nicht mit den Golflang-Antworten mithalten, aber ich dachte, ich würde es trotzdem versuchen.
Zu beachten ist, dass in PHP ohne den
/u
Modifikator\w
nur ASCII-Buchstaben ausgewählt werden. In einigen anderen Sprachen / Regex-Varianten funktioniert dieses Muster nicht.Bearbeiten : Ich sehe viele Leute, die in ihren Antworten \ w und \ d verwenden, wenn sie eine Sprache verwenden, die auch Nicht-ASCII-Buchstaben und -Ziffern enthält. Das ist NICHT das Rätsel. Sie liegen falsch. (Ich kann noch nicht abstimmen / kommentieren, es tut mir leid, dass ich das so sagen muss.)
quelle
[a-z].../i
.\d
ist genau das gleiche wie[0-9]
.\w
ist genau das gleiche wie[A-Za-z0-9_]
developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…Retina,
30 - 10% = 2728 - 10% = 25,229 - 10% = 26,1 BytesBeide Versionen sind für den Bonus qualifiziert, da sie leere Eingaben korrekt handhaben (Ausgaben
0
)Ich musste einen Fehler beheben, der durch eine der .NET-Regex-Funktionen verursacht wurde, bei denen einige (so viele) Unicode-Zeichen als "Wort" -Zeichen betrachtet werden. Zum Glück hat mich das in beiden Versionen nur ein einziges Byte gekostet. Es musste nur ein Modifikator hinzugefügt werden, um das Regex-Übereinstimmungsverhalten mit den ECMAScript-Standards in Einklang zu bringen. Mehr dazu hier .
Neue
2829-Byte-Version von @ MartinBüttner. Vielen Dank!Erläuterung
Zuerst prüfen wir, ob die Eingabe mit einem Unterstrich beginnt. In diesem Fall wird die Eingabe mit einem Zeilenumbruch dupliziert. Zum Beispiel:
_test_
->_test_\n_test_
, wo\n
ist der Zeilenumbruch. Dann versuchen wir , alles zu passen, die nicht mit einer Zahl beginnt, wird aber von einer beliebigen Anzahl von „Wort“ Zeichen (gefolgta-z
,A-Z
, Ziffern und Unterstrich) in jeder Zeile . Beachten Sie, dass, wenn die Eingabe mit einem Unterstrich begann und durch zwei Zeilen ersetzt wurde, beide Zeilen übereinstimmen. Dann überprüfen wir, ob wir 2 Übereinstimmungen hatten, und ersetzen sie durch0.5
. Leere oder ungültige Zeilen ergeben immer 0 Übereinstimmungen und gültige Variablennamen ergeben immer 1 Übereinstimmung.Meine eigene
3031-Byte-VersionErläuterung
Zunächst einmal überprüfen wir , ob Eingabe beginnt mit einer Ziffer oder ein Nicht-Wortzeichen enthält (etwas anderes als
a-z
,A-Z
, Ziffern und Unterstrich). Wenn dies der Fall ist, wird es verworfen, da es ungültig ist. Dann prüfen wir, ob es mit einem Unterstrich beginnt. Wenn ja, wird es durch ersetzt0.5
. Dann überprüfen wir , ob es mit einem nicht-stelligen Zeichen beginnt (an dieser Stelle das erste Zeichen ist entweder0
,a-z
oderA-Z
. Nura-z
undA-Z
sind nicht-Ziffern, natürlich). Wenn dies der Fall ist, wird es durch ein ersetzt1
. Dann suchen wir nach einer leeren Zeichenkette und ersetzen sie durch0
.Probieren Sie es online!
Probieren Sie es online! Alte Version
quelle
^\D.*
Bühne kann es mit einer 0 beginnen? Das ist komisch._
und durch ersetzt wurde0.5
. Dann geht esΨ
.\w
Nicht-ASCII-Zeichen übereinstimmen, was nicht möglich ist (ich habe versucht, esƜƝƞƟƠ
undᎳᎴᎵᎶᎷᎸᎹ
als Eingabe zu geben ). Ich werde das später untersuchen. Mögliche Lösung scheint zu ersetzen\w
mit[a-zA-Z\d_]
.MATL , 27 Bytes
Dies funktioniert in der aktuellen Version (15.0.0) der Sprache.
Die Eingabe ist eine Zeichenfolge mit einfachen Anführungszeichen.
Probieren Sie es online!
Erläuterung
quelle
Pyke , 21 Bytes
(Nicht konkurrierende, hinzugefügte String-Subtraktion, verschiedene String-Konstanten)
Erläuterung:
quelle
Python 3, 36 Bytes
Der Code ist 40 Byte lang und qualifiziert sich für den Bonus von -10% .
Beachten Sie, dass dies nur für Codepages korrekt funktioniert, die keine Nicht-ASCII-Buchstaben / Ziffern enthalten.
quelle
Pyth, 27 Bytes
Test Suite
quelle
Gogh , 29 Bytes
Ausführen mit:
Erläuterung
quelle
Perl, 21 Bytes
Die Punktzahl enthält +1 Byte für den
-p
Switch. Probieren Sie es auf Ideone .quelle
-$_||$_=...
, um die leere Antwort zu erklären? (mit-
weil+
ist ein Noop in Perl)Pyth, 19 Bytes
Probieren Sie es mit dem Pyth-Compiler .
Beachten Sie, dass dies nur für Codepages korrekt funktioniert, die keine Nicht-ASCII-Buchstaben / Ziffern enthalten.
Wie es funktioniert
quelle
Faktor 84 * 0,9 = 76,5
Läuft auf dem Listener (repl), definiert ein Zitat (anonyme Funktion), das eine Zeichenfolge annimmt und {0 | ausgibt 1/2 | 1}.
Wenn man es als ein Wort definiert, sind es 97 Zeichen:
Wie funktioniert es:
R/ [_a-zA-Z]\w*/ R/ _.*/
definiert zwei reguläre Ausdrücke.bi-curry@
Wendet das Zitat teilweise[ matches? 1 0 ? ]
auf jeden Regex an und belässt zwei Curry-Zitate auf dem Stapel.bi
Wendet jedes Zitat auf die Argumentzeichenfolge an.Jedes dieser (Curry-Zitate) hinterlässt entweder eine 1 oder eine 0, je nachdem, ob sie übereinstimmen. Der erste stimmt mit den wohlgeformten Namen überein, der zweite mit den Namen, die mit einem Unterstrich beginnen.
0 = 1 2 ? /
Der letzte Wert wird durch eine 1 ersetzt, wenn er 0 war, oder durch eine 2, wenn er 1 war. Dann wird der erste (1 oder 0, gültig oder nicht) durch den zweiten geteilt (2 oder 1, beginnt mit einem Unterstrich oder nicht) .Das ist langweilig! Alle Hinweise auf ein bisschen mehr geschätzt schrumpfen ...
Und ich hasse Regexps!
PS.
alle test bestanden;)
quelle
Dyalog APL , 19 Bytes - 10% = 17,1
{
...⍵
...}
anonyme Funktion , wo das rechte Argument dargestellt wird durch⍵
⊃⍵
erste Zeichen (Leerzeichen , wenn leer gibt)'_'=
1 , wenn gleich ‚underbar, 0 sonst1+
auswertet bis 2 , wenn anfänglicher underbar, 1 sonst⎕NC⍵
Klassennamen ; -1 wenn ungültiger Name, 0 wenn nicht definiert (aber gültiger Name), 2-9 wenn definiert (und somit gültig)quelle
Mathematica, 93 Bytes
Ich bin ehrlich gesagt nicht sicher , ob dies kann weiter golfed werden.
quelle
Perl, 34 + 1 = 35 Bytes
Verwendet die
-p
Flagge.Erläuterung
quelle
[_a-zA-Z]
->[^\W\d]
Wenn Perl genauso funktioniert wie JavaScript,\w*
\w+
.a
Python, 84 - 10% = 76 Bytes
quelle
JavaScript ES7, 37 Byte
Probieren Sie es online aus
Wie es funktioniert:
Port von @ Dennis's Perl Antwort
quelle
Ruby, 44 Bytes
quelle
/^([a-z_]).../i
anstatt/^(_|\d)?.../
Ruby, 57 - 10% = 51,3 Bytes
Ein ziemlich naiver Ansatz
quelle
->(s){s=~/^$|^\d|\W/?0:s=~/^_/?0.5:1}
Lua, 82-10% = 73,8
Testfälle:
quelle
Lua, 68 * .9 = 61,2 Bytes
Übernimmt Argumente in der Befehlszeile
quelle