Ist es eine Ganzzahl, eine Zeichenfolge oder eine Dezimalzahl?

8

Ihre Herausforderung besteht darin, festzustellen, ob die angegebene Eingabe eine Ganzzahl, eine Zeichenfolge oder eine Dezimalzahl ist.

Regeln

  • Eine Zeichenfolge ist eine Eingabe, die keine Ganzzahl oder Gleitkommazahl ist
  • Eine Ganzzahl darf nur numerische Zeichen enthalten und darf nicht mit einer Null beginnen
  • Eine Dezimalstelle ist eine Eingabe, die den Punkt ( .) enthält, und der Punkt ist von numerischen Zeichen umgeben.

Hinweis: .01 wird nicht als gültige Dezimalzahl betrachtet.

  • Das Programm sollte eine Rohzeichenfolge entweder "Zeichenfolge", "Ganzzahl" oder "Dezimalzahl" ausgeben.
  • Sie können davon ausgehen, dass nur druckbare ASCII-Zeichen verwendet werden

Fälle:

asdf -> string
asdf3.4 -> string
2 -> integer
2.0 -> decimal
02 -> string
40. -> string
. -> string
.01 -> string
0.0 -> decimal
.9.9.9 -> string
[empty space] -> string

EDIT: Tippfehler behoben. Ich meinte 0,01 ohne die führende Null, nicht mit. Wenn das es unklar machte, ist es jetzt behoben!

Dies ist , also gewinnt die kürzeste Antwort.

noɥʇʎԀʎzɐɹƆ
quelle
5
Warum ist 02 keine ganze Zahl? Diese fühlen sich einfach wie willkürliche Einschränkungen an, um die Schwierigkeit der Herausforderung zu erhöhen.
Addison Crump
1
Ich denke, 02wird nicht als Ganzzahl betrachtet, da die meisten Sprachen führende Nullen kürzen, wenn der Typ ein ist, integeraber führende Nullen behalten, wenn er als gespeichert wird string. Obwohl ich mit @isaacg bin 0.0, 0.01sollte es auch sein, wenn dies als Dezimalzahl betrachtet wird . .01Nicht zählen macht Sinn, denke ich ...
Hargasinski
3
@Zequ .01 nicht zählen macht Sinn, denke ich ... - warum? Es ist in fast jeder Sprache gültig.
mınxomaτ
2
Willkommen bei Programming Puzzles & Code Golf! Sie müssen nicht unnötig jeden anpingen, der Ihre Frage kommentiert hat. Durch Ihre Bearbeitung wird Ihre Frage automatisch in die Wiedereröffnungswarteschlange gestellt, wo sie bei Bedarf erneut geöffnet wird. Darüber hinaus scheinen viele Ihrer Herausforderungen abgeschlossen zu sein. Vielleicht möchten Sie sie zuerst durch unsere Sandbox laufen lassen . Vielen Dank!
Türknauf
1
@CrazyPython Ich denke, die Idee, auf die Sie mit "gültiger Ganzzahl" und "gültiger Dezimalzahl" kommen, ist die Idee einer kanonischen Darstellung. Soweit ich Ihre Regeln verstehe, gibt es genau eine Möglichkeit, jede Ganzzahl und jede Dezimalstelle zu schreiben. Wenn dies beabsichtigt ist, wird durch Hinzufügen zur Herausforderung klargestellt, warum die Regeln so sind, wie sie sind.
isaacg

Antworten:

3

Pyth, 33 Bytes (39 ohne gepackte Zeichenfolge)

@_c."at%¸Ã`9hàãáÊ"7.x/`MsB+vz0z0

Einige Bytes werden aufgrund von Markdown entfernt. Offizieller Code und Testsuite.

Ohne gepackte Schnur:

@_c"integerdecimalstring"7.x/`MsB+vz0z0

Es besteht alle oben genannten Testfälle. Um zu überprüfen, ob eine Zeichenfolge eine Ganzzahl oder eine Dezimalzahl ist, wird grundsätzlich geprüft, ob die Zeichenfolge als Python-Literal ( v) ausgewertet werden kann. Wenn ja, können Sie 0 hinzufügen und in die Zeichenfolgendarstellung zurückverfolgen und abrufen die Eingabezeichenfolge. Wenn ja, ist es eine Ganzzahl oder eine Dezimalzahl. Wenn Sie es auch in ein int umwandeln und trotzdem die ursprüngliche Zeichenfolge zurückerhalten können, ist es eine Ganzzahl.

isaacg
quelle
2

Javascript, 112 121 87 Bytes

Vielen Dank an @ edc65 für das Speichern von 34 Bytes durch Konvertieren des Originalcodes (in der Erklärung) in ES6. Ich habe die Erklärung nicht geändert, weil sie die Logik besser zeigt.

b=a=>/^[1-9]\d*$/.test(a)?"integer":/^([1-9]\d+|\d)\.\d+$/.test(a)?"decimal":"str‌​ing"

Dadurch werden die Regeln für eine Ganzzahl und eine Dezimalzahl in der Frage in Regex-Prüfungen konvertiert und anhand der angegebenen Eingabe getestet. Wenn die Eingabe nicht übereinstimmt, muss es sich um eine Zeichenfolge handeln. Es besteht alle in der Frage angegebenen Tests.

Ungolfed + Erklärung

function b(a) {
    if(/^[1-9]\d*$/.test(a)) // regex check for the rules of an 'integer':
        return"integer";     // ^[1-9] - check to make sure the first digit
                             // \d* - check to make sure that it is followed by zero or more digits
                             // $ - ensures that the previous check continues to the end of the word
    if(/^([1-9]\d+|\d)\.\d+$/.test(a)) // regex check for the rules of a 'decimal', starting from the middle
        return"decimal";     // \. checks for a '.' in the word
                             // the ([1-9]\d+|\d) and \d+ check to make sure the '.' is surrounded by
                             // one or more numerical characters on each side.
                             // the ^,$ ensure that the match is for the whole word
return"string";              // none of the others match, so it must be a string.

}}

hargasinski
quelle
Dies scheint bei Eingaben wie z 01.23.
LegionMammal978
Ich habe es behoben, es besteht den b("0.123")Fall. Entschuldigung, da in der Frage nur explizit erwähnt wurde, dass eine Ganzzahl keine führenden Nullen haben kann, habe ich angenommen, dass dies nicht für Dezimalstellen gilt.
Hargasinski
Auf ES6 verkürzt ist 83 a=>/^[1-9]\d*$/.test(a)?"integer":/^([1-9]\d+|\d)\.\d+$/.test(a)?"decimal":"string"... sowieso nicht die kürzestmögliche
edc65
Vielen Dank, ich habe den Code aktualisiert und musste ihn hinzufügen, b=damit er in Chrome funktioniert. Für mich zeigt es, dass das Original, das Sie gepostet haben, 85 Bytes statt 83 ist, plus die 2 Bytes für insgesamt 87.
hargasinski
@Zequ Das Zuweisen der Funktion zu einer Variablen ( b=) wird normalerweise nicht gezählt. Und der Rest ist 83, hüte dich vor seltsamen unsichtbaren Zeichen, die vom Kommentareditor eingefügt wurden - es gibt einige in meinem vorherigen Kommentar zwischen "str" ​​und "ing"
edc65
1

Java, 133 Bytes

String t(String v){if(v.matches("[1-9]\\d*"))return "integer";if(v.matches("(0|[1-9]\\d+)\\.\\d+"))return "decimal";return "string";}
SuperJedi224
quelle
1

JavaScript (ES6), 74 75

Bearbeiten Sie 1 Byte gespeichert thx Zequ

f=i=>(i=i.match(/^(0|[1-9]\d*)(\.\d+)?$/))?i[2]?'decimal':'integer':'string'

Prüfung

f=i=>(i=i.match(/^(0|[1-9]\d*)(\.\d+)?$/))?i[2]?'decimal':'integer':'string'

console.log=x=>O.textContent +=x +'\n';

// test cases from the question and some more
s=['asdf','asdf3.4','02','40.','.','.01','.9.9.9','','0.0.0','00.00','02.00']
i=['2', '11', '1000']
d=['2.0','0.0', '1.009', '911.1','123.4567890']

console.log('Strings:')
s.forEach(x=>console.log('<'+x+'> -> '+f(x)))
console.log('Integers:')
i.forEach(x=>console.log('<'+x+'> -> '+f(x)))
console.log('Decimals:')
d.forEach(x=>console.log('<'+x+'> -> '+f(x)))
<pre id=O></pre>

edc65
quelle
Sie könnten ein Byte sparen, indem Sie [^0\D]das Regex-Match auf[1-9]
hargasinski
@Zequ guter Hinweis, danke ... mit einem zusammengesetzten Bereich schien so klug :(
edc65
1

Perl 5, 59 Bytes

Mit dem -pArgument in der Befehlszeile (das in die Byteanzahl berechnet wird):

chop;$_=!/\D|^0/?"integer":/^\d+\.\d+$/?"decimal":"string"
Codefun64
quelle
Schlägt für jede 00.nn fehl (versuchen Sie 00.00)
edc65
1
Fest. Aber vielleicht sollte das in den angegebenen Testfällen sein.
Codefun64
Es sollte. Andererseits decken die Testfälle häufig nicht alle möglichen Fälle ab.
edc65
Immer noch falsch, jetzt gibt es 'Integer' für die Eingabe .0. Wofür ist das chop?
edc65
Fest. Das Interesse an dieser Herausforderung verloren. Ich bin mir nicht sicher, ob ich dieses Update hätte optimieren können oder nicht. Chop war in einer früheren Iteration des Skripts erforderlich. Die neue Zeile aus Benutzereingaben gefiel ihm nicht.
Codefun64
0

Perl 6 , 61 Bytes

{<string integer decimal>[?/^[(\d+\.\d+)|<[1..9]>\d*]$/+?$0]} # 61

Verwendungszweck:

say «asdf asdf3.4 2 2.0 02 40. . .01 0.0 .9.9.9 ''».map: {...}
(string string integer decimal string string string string decimal string string)
Brad Gilbert b2gills
quelle
0

Python 2, 148 Bytes

def f(s):
 try:
  t=float(s);assert s[0]!='0'
  if `t+0`==s:return'decimal'
  if `int(t)`==s:return'integer'
  return'string'
 except:return'string'


assert f('asdf') == 'string'
assert f('asdf3.4') == 'string'
assert f('2') == 'integer'
assert f('2.0') == 'decimal'
assert f('.') == 'string'
assert f('.01') == 'string'
assert f('.9.9.9') == 'string'
assert f(' ') == 'string'    
assert f('40.') == 'string'
assert f('02') == 'string'
assert f('0.0') == 'string'
assert f('00.00') == 'string'
Willem
quelle
0

JavaScript ES6, 74 70 Bytes

w=>w.match(/^\d+\.\d+$/)?"decimal":w.match(/^\d+$/)?"integer":"string"
nicael
quelle
es schlägt mit den Testfällen aus der Frage fehl. Wirklich, bitte testen Sie vor dem Posten.
edc65
@edc Danke für das Feedback, aber kannst du mir bitte sagen, welche Fälle außer scheitern 02?
Nicael
Schön, dass Sie es selbst finden
edc65
Schauen Sie sich meine Antwort für eine Geige an.
Pavlo
Es sollte mit den Testfällen funktionieren, wenn Sie /^\d+$/auf ^[1-9]\d*(75 Bytes) geändert haben .
Chiru