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.


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.


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.

}}


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

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>


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"

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)

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'

0

JavaScript ES6, 74 70 Bytes

w=>w.match(/^\d+\.\d+$/)?"decimal":w.match(/^\d+$/)?"integer":"string"

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.