Auftakt:
Ich wollte üben, Testfälle zu machen, also werde ich sie an etwas Einfachem ausprobieren.
Herausforderung:
Nehmen Sie eine beliebige (String-) Eingabe (innerhalb des sichtbaren ASCII-Bereichs) und schließen Sie daraus, ob es sich um eine Zahl handelt, und geben Sie etwas aus, das zur Auswertung verwendet werden könnte.
Regeln:
- Eine Zahl enthält nur die Zeichen
-0123456789,.
- Antworten sind nur erforderlich, um Zahlen zwischen -1000000000 und 1000000000 (exklusiv) zu erkennen, können jedoch beliebig große Zahlen erkennen.
- Sie können ein vollständiges Programm oder eine Funktion schreiben.
- Wenn eine Zahl vorhanden ist, geben Sie alles zurück, was zum Erkennen der Zahl verwendet werden könnte, und dokumentieren Sie die Ausgabe in der Beschreibung (z. B.
My program outputs T if a number, F if not.
). - Die Eingabe ist eine beliebige Anzahl von Zeichen innerhalb des ASCII-Bereichs oder leer (wenn leer, geben Sie alles zurück, was Sie ausgeben würden, wenn keine Zahl).
- Zahlen können einen Dezimalpunkt enthalten (z. B.
3.14
). In diesem Fall müssen sie mindestens eine Ziffer vor dem Komma und mindestens eine nach dem Komma haben. - Zahlen können führende oder nachfolgende Nullen haben (z.
000001.00000
). - Der ganzzahlige Teil einer Zahl kann zur besseren Lesbarkeit in dreistellige Abschnitte mit Kommas (z. B.) unterteilt werden
1,000.23456
. In diesem Fall müssen sie alle drei Ziffern von rechts nach links unterteilt werden (ex.1,234,567
,10,000.202
,123,234.00
,0,123.293
). - Negative Zahlen werden durch ein vorangestelltes
-
(z. B.-1.23
) gekennzeichnet. Ein+
Anführungszeichen zur Angabe einer positiven Zahl ist nicht zulässig und sollte zu einer falschen Ausgabe führen. - Ausnahmen werden NICHT als gültige und erkennbare Ausgabe gezählt (es sei denn, sie können Ausgaben an den Standard-Out-Stream übergeben (z.
Exception on line N [...]
B. können als Ausgabe für eine Zahl / Nichtzahl eingegeben werden, wenn die Zeichenfolge an den Standard-Out-Stream übergeben wird).
Testfälle:
(unter der Annahme der My program outputs T if a number, F if not.
Version)
123 -> T [on integer]
-123 -> T [negative numbers need to be handled]
0 -> T [on zero]
123.456 -> T [on floating point]
123,456.789 -> T [on evenly divided by 3 digits with comas]
123456789 -> T [thousand separators are not required]
0000001.00000 -> T [on leading/trailing zeros]
00.00 -> T [on zero and leading/trailing zeros]
999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the maximum value]
-999999999.9999999999999999999999999999999999999999999999999999 -> T [on close to the minimum value]
-> F [on empty]
lolz -> F [on non-number value]
n4melyh4xor -> F [on non-number with digits]
1.2 -> F [on space-padded]
9.3 1.3 -> F [on anyhow separated multiple numbers]
1e5 -> F [no scientific notation]
50cl05e.buty3ts0f4r -> F [on input with letters obscuring the number]
1,2,3,4.5678 -> F [on badly readability-divided number]
1,234.5,678 -> F [on readability-divided floating point part]
.234 -> F [on no leading zero]
+1 -> F [no leading + sign]
1.234.3 -> F [only one decimal point]
12345,678 -> F [on separator stopping mid-way]
Code-Golf , am wenigsten Zeichen ist der Gewinner.
code-golf
number
decision-problem
n4melyh4xor
quelle
quelle
-123
es in Ordnung ist, was ist mit+456
-> gut oder schlecht. Oder ist+
von der Party ausgeschlossen?Antworten:
Retina ,
2829314034 BytesAusgänge
1
wenn truthy,0
anders. Soweit ich weiß, gibt Retina in diesem Fall die Anzahl der Übereinstimmungen aus, die der Regex für die Eingabe hat.Probieren Sie es online!
Test Suite
Bearbeitungen
RegExplanation
quelle
m
undg
) in der Netzhaut fest?`
vor den regulären Ausdruck, und dann gehen die Modifikatoren davor, zm`^.$
.g
existiert in .NET nicht, Übereinstimmungen sind standardmäßig global.JavaScript,
4649 BytesDies ist ein direkter Port meiner Retina-Antwort. Der einzige Grund, warum ich JS verwendet habe, ist, dass es eine einfache Möglichkeit gibt, den regulären Ausdruck mit dem folgenden Snack-Snippet zu testen
quelle
isNaN(+prompt())
für 16 Zeichen tun . So ist das Leben, nehme ich anPerl 6 , 42 Bytes
Versuch es
Erweitert:
quelle
PHP, 62 Bytes
Das Builtin kann keine Kommas verarbeiten und akzeptiert die wissenschaftliche Notation. also musste ich den regulären Weg gehen.
<?=is_numeric($argv[1]);
wäre 24 Bytes gewesen.quelle
Bash / Unix-Tools, 64 Byte
Speichern Sie dies als Datei und übergeben Sie die zu testende Zeichenfolge als erstes Argument an den Befehl.
Die Ausgabe ist 0 für eine Nicht-Nummer, 1 für eine Nummer.
Wenn Sie bereit sind, Eingaben von stdin zu akzeptieren und wenn Sie garantieren können, dass die Eingabe nur aus einer Zeile besteht, können Sie die <<< "$ 1" am Ende entfernen, was 57 Byte ergibt .
Was den Code selbst betrifft, zählt die Option -c, um egrep zu erstellen, die Anzahl der übereinstimmenden Zeilen (die entweder 0 oder 1 sein werden).
quelle
Pyth, 25 Zeichen
Komprimiert den regulären Ausdruck von Kritixi Lithos .
Probieren Sie es online aus. Verwendet Unicode-Zeichen außerhalb der mehrsprachigen Basisebene, die TIO anscheinend nicht verarbeiten kann? Diese kleine App meldet jedoch die falsche Größe für den String. Dieser Zeichen- / Bytezähler macht es richtig.
quelle
C89, 195 Bytes
Ungolfed:
quelle
Python 2, 79 Bytes
Regex-Lösung
Probieren Sie es online aus
quelle
c #, 75 bytes
quelle