Bestimmen Sie den Typ einer Eingabe

15

Die Herausforderung ist einfach: Bestimmen Sie den Typ einer Eingabe und geben Sie einen Bezeichner aus, aus dem hervorgeht, um welchen Typ es sich handelt.

  • "UI" unsigned integer: 0, 1, 34,111111111111111111111111111111111111111111
  • "SI", Signed integer: +0, +1, +42, -1, -3,-111111111111111111111111111111111111111111
  • "UD", Unsigned dezimal: 0.0, 1.23,1234.1234
  • "SD", Signed dezimal: -0.0, +0.0,-1.235
  • "LE", Buchstabe: a- zund A-Z
  • "SY", Symbol: ASCII-Codepunkte: [32-47, 58-64, 91-96, 123-126](dh alle Zeichen außer Ziffern und Buchstaben)
  • "ST", String: Zwei oder mehr Zeichen, die mit keinem der oben genannten Zahlenformate analysiert werden können

Regeln:

  • Die Eingabe wird 1-99 Zeichen lang sein
  • Die Eingabe enthält nur druckbare ASCII-Zeichen, Codepunkte: 32-126.
  • Die Ausgabe sollte aus den beiden oben definierten Kennbuchstaben (UI, SI ...) bestehen.
  • Es gelten die Standard-E / A-Regeln

Beispiele:

UI:
0
01
34
12938219383278319086135768712319838871631827319218923

SI:
-0
+01
+1
-123
+123

UD:
0.0
3.1415
2.718281828459045235360287471352662497757

SD:
+0.0
-3.1415
+2.718281828459045235360287471352662497757

LE:
a
k
L
Z

SY:
@
"
+
-

ST:
Hello, World!
f2!"
+23df
1234A
'"!
.012
1.
UI
+-1
5+3
Stewie Griffin
quelle
Kann SYmehr als ein Zeichen sein?
FryAmTheEggman
Ich würde nicht in Betracht ziehen 111111111111111111111111111111111111111111, vom Typ Integer zu sein.
Matt
@FryAmTheEggman sy ist nur ein Zeichen.
Stewie Griffin
Also nehmen wir die Eingabe als String?
Lirtosiast
6
@Matt, Es ist vielleicht kein uint8oder int64, aber es ist definitiv eine ganze Zahl .
Stewie Griffin

Antworten:

0

Pyth - 47 Bytes

Kann ein paar Bytes mit ein paar Tricks abschneiden.

.x-+?@z"+-"\S\U?@z\.\D\Isz?!tz?}rzZG"LE""SY""ST

Test Suite .

Maltysen
quelle
5

JavaScript (ES6), 99

x=>(z=x.match(/^([+-])?\d+(\.\d+)?$/))?'SU'[+!z[1]]+'DI'[+!z[2]]:x[1]?'ST':parseInt(x,36)?'LE':'SY'

Prüfung

f=x=>(z=x.match(/^([+-])?\d+(\.\d+)?$/))?'SU'[+!z[1]]+'DI'[+!z[2]]:x[1]?'ST':parseInt(x,36)?'LE':'SY'

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

;console.log(['0','01','34','12938219383278319086135768712319838871631827319218923'].map(x=>f(x)+' '+x).join`\n`)
;console.log(['-0','+01','+1','-123','+123'].map(x=>f(x)+' '+x).join`\n`)
;console.log(['0.0','3.1415','2.718281828459045235360287471352662497757'].map(x=>f(x)+' '+x).join`\n`)
;console.log(['+0.0','-3.1415','+2.718281828459045235360287471352662497757'].map(x=>f(x)+' '+x).join`\n`)
;console.log([...'akLZ'].map(x=>f(x)+' '+x).join`\n`)
;console.log([...'@"+-'].map(x=>f(x)+' '+x).join`\n`)
;console.log(['Hello, World!','f2!"','+23df','1234A',`'"!`,'.012','1.','UI','+-1','5+3'].map(x=>f(x)+' '+x).join`\n`)
<pre id=O></pre>

edc65
quelle
1
Ich war mir ziemlich sicher, dass jemand in der Lage sein würde, für gemeinsame Fälle zu optimieren, aber ich mag Ihre Verwendung von parseInt, um Buchstaben zu erkennen.
Neil
Das erste () in Ihrem
regulären Ausdruck
@Awashi es ist notwendig, da ich eine Erfassungsgruppe für das Zeichen brauche, um S oder U zu unterscheiden.
edc65
@WashingtonGuedes nein, es könnten (\+|-)aber keine Bytes gespeichert werden
edc65
3

Turing Machine Code, 1544 Bytes

Probieren Sie es online!

0 + _ r s
0 - _ r s
0 0 _ r u
0 1 _ r u
0 2 _ r u
0 3 _ r u
0 4 _ r u
0 5 _ r u
0 6 _ r u
0 7 _ r u
0 8 _ r u
0 9 _ r u
0 a _ r l
0 b _ r l
0 c _ r l
0 d _ r l
0 e _ r l
0 f _ r l
0 g _ r l
0 h _ r l
0 i _ r l
0 j _ r l
0 k _ r l
0 l _ r l
0 m _ r l
0 n _ r l
0 o _ r l
0 p _ r l
0 q _ r l
0 r _ r l
0 s _ r l
0 t _ r l
0 u _ r l
0 v _ r l
0 w _ r l
0 x _ r l
0 y _ r l
0 z _ r l
0 A _ r l
0 B _ r l
0 C _ r l
0 D _ r l
0 E _ r l
0 F _ r l
0 G _ r l
0 H _ r l
0 I _ r l
0 J _ r l
0 K _ r l
0 L _ r l
0 M _ r l
0 N _ r l
0 O _ r l
0 P _ r l
0 Q _ r l
0 R _ r l
0 S _ r l
0 T _ r l
0 U _ r l
0 V _ r l
0 W _ r l
0 X _ r l
0 Y _ r l
0 Z _ r l
0 * _ r y
s 0 _ r s
s 1 _ r s
s 2 _ r s
s 3 _ r s
s 4 _ r s
s 5 _ r s
s 6 _ r s
s 7 _ r s
s 8 _ r s
s 9 _ r s
s . _ r d
s _ _ r i
s * _ r T
u 0 _ r u
u 1 _ r u
u 2 _ r u
u 3 _ r u
u 4 _ r u
u 5 _ r u
u 6 _ r u
u 7 _ r u
u 8 _ r u
u 9 _ r u
u . _ r D
u _ _ r I
u * _ r T
l _ _ r L
l * _ r T
y _ _ r S
y * _ r T
d 0 _ r d
d 1 _ r d
d 2 _ r d
d 3 _ r d
d 4 _ r d
d 5 _ r d
d 6 _ r d
d 7 _ r d
d 8 _ r d
d 9 _ r d
d _ _ r e
d * _ r T
i 0 _ r i
i 1 _ r i
i 2 _ r i
i 3 _ r i
i 4 _ r i
i 5 _ r i
i 6 _ r i
i 7 _ r i
i 8 _ r i
i 9 _ r i
i _ _ r j
i * _ r T
D 0 _ r D
D 1 _ r D
D 2 _ r D
D 3 _ r D
D 4 _ r D
D 5 _ r D
D 6 _ r D
D 7 _ r D
D 8 _ r D
D 9 _ r D
D _ _ r E
D * _ r T
I 0 _ r I
I 1 _ r I
I 2 _ r I
I 3 _ r I
I 4 _ r I
I 5 _ r I
I 6 _ r I
I 7 _ r I
I 8 _ r I
I 9 _ r I
I _ _ r J
I * _ r T
L * L r M
M * E r halt
S * S r Y
Y * Y r halt
e * S r f
f * D r halt
j * S r k
k * I r halt
E * U r f
J * U r k
T _ S r U
T * _ r T
U * T r halt
Undichte Nonne
quelle
3
Bitte fügen Sie eine vollständige Version des Codes bei. Wenn das Leerzeichen nicht entfernt werden kann, muss es in der Byteanzahl gezählt werden.
Mego
2
Sieht aus wie es nicht entfernt werden kann, funktioniert das Programm nicht richtig ohne Leerzeichen zwischen den Symbolen.
Matthew Smith
Es scheint "+ -1" (aus den Beispielen) nicht als ST zu klassifizieren.
Xantix
2

Retina, 98 bis 97 Bytes

Eine schöne Art, meine Regex-Fähigkeiten zu üben.

Probieren Sie es online!

^(?![+-]?\d+(\.\d+)?$)..+
ST
^([+-]?)\d+$
$1UI
^([+-]?)\d+\.\d+$
$1UD
i`^[a-z]$
LE
^.$
SY
[+-]U
S
Undichte Nonne
quelle
4
Sie können ändern ^[a-zA-Z]$, i`^[a-z]$um ein Byte zu speichern
daavko
1

Lua, 157 Bytes

Probieren Sie es online!

Golf gespielt:

n=(...)m=string.match s=m(n,"^[+-]")and"S"or"U"print(m(n,"^[+-]?%d+%.%d+$")and s.."D"or m(n,"^[+-]?%d+")and s.."I"or m(n,"^%w$")and"LE"or#n==1 and"SY"or"ST")

Ungolfed:

n = "2.718281828459045"

s = n:sub(1,1):match("[+-]") and "S" or "U"

if n:match("^[+-]?%d+%.%d+$") then
    print(s.."D")
elseif n:match("^[+-]?%d+") then
    print(s.."I")
elseif n:match("^%w$") then
    print("LE")
elseif #n==1 then
    print("SY")
else
    print("ST")
end
Undichte Nonne
quelle
1

JavaScript (ES6), 125 - 120 Byte

s=>"UISIUDSDLESYST".substr(s.match(/^((\d+)|([+-]\d+)|(\d+\.\d+)|([+-]\d+\.\d+)|([A-Z])|(.)|(.*))$/i).indexOf(s,2)*2-4,2)

Alternative Version, auch 120 Bytes:

s=>"STUISIUDSDLESY".substr(s.match(/^(?:(\d+)|([+-]\d+)|(\d+\.\d+)|([+-]\d+\.\d+)|([A-Z])|(.)|.*)$/i).lastIndexOf(s)*2,2)
Neil
quelle
Sicherlich kann der Regex mit einem Regex- eval(`/regex/`)Konstruktor + Template-Strings gespielt werden
Downgoat
0

Java, 192 Bytes

String t(String v){for(String[]x:new String[][]{{"\\d+","UI"},{"[-+]\\d+","SI"},{"\\d+\\.\\d+","UD"},{"[-+]\\d+\\.\\d+","SD"}})if(v.matches(x[0]))return x[1];return (v.length()==1?"SY":"ST");}
SuperJedi224
quelle
return (v.length()==1?"SY":"ST");kann sein return v.length()<2?"SY":"ST";(-3 Bytes) Oder es kann sein: String t(String v){for(String x:"UI\\d+;SI[-+]\\d+;UD\\d+\\.\\d+;SD[-+]\\d+\\.\\d+".split(";"))if(v.matches(x.substring(2)))return x.substring(0,2);return v.length()<2?"SY":"ST";}( 179 Bytes ) Und zusätzlich könnten Sie ändern String t(String v), v->wenn Sie ein Java 8 Lambda verwenden.
Kevin Cruijssen
0

Javascript (ES6), 138 Byte

Ich habe versucht, einen replacezu verwenden, um "ausgefallener" zu sein.

Dadurch wird eine anonyme Funktion erstellt, die die Zeichenfolge des Typs zurückgibt.

s=>s.replace(/^((([+-])?(\d+)(\.\d+)?)|([a-z])|([ -~])|([^\0]*))$/i,(_,a,b,c,d,e,f,g)=>b?(c?'S':'U')+(e?'D':'I'):(f?'LE':'S'+(g?'Y':'T')))

Tipps zur Verbesserung dieses Verhaltens sind jederzeit willkommen.

Ismael Miguel
quelle
1
1.sollte STnicht sein UD. Ändern Sie Ihre \d*zu\d+
edc65
@ edc65 Wie? Das ist eine Dezimalstelle. Das ist das selbe wie 1.0.
Ismael Miguel
Es könnte gültig sein oder nicht (ich schreibe nicht 1.stattdessen 1), ABER es ist nicht deine Wahl oder meine: Es gibt die Testfälle
edc65
@ edc65 Du hast recht. Ich habe die SEHR große Liste übersprungen. Ich habe es behoben. Vielen Dank!
Ismael Miguel
0

Python 3.5 - 241 240 Bytes:

( 1 Byte dank @CatsAreFluffy gespeichert )

import re
def r(g):
 y={'^\d+$':'UI','^[+-]\d+$':'SI','^[0-9]\d*(\.\d+)?$':'UD','[+-](?=[0-9]\d*(\.\d+))':'SD','[a-zA-Z]+':'LE','^[^A-Za-z0-9]+$':'SY'};d=[y[i]for i in list(y.keys())if re.match(i,g)]
 if len(d)>0:return d[0]
 else:return'ST'

Es kann ein bisschen lang sein, aber macht den Job ziemlich perfekt. Dies war eine wirklich gute Möglichkeit, meine Fähigkeiten im Umgang mit regulären Ausdrücken zu verbessern. Danke für die Herausforderung. :) Ich werde versuchen, es weiter zu verkürzen, wenn ich kann.

R. Kap
quelle
Sie können den Import nach außerhalb der Funktion verschieben, um Platz zu sparen. (Dumme iPad Tastatur ohne Backticks)
CalculatorFeline
@CatsAreFluffy Ja, daran habe ich nicht gedacht. Vielen Dank! :)
R. Kap
@CatsAreFluffy: Eigentlich ist die iOS - Tastatur tut Backticks erlauben! Ich habe das neulich herausgefunden,
homersimpson
@CatsAreFluffy Schön! Das ist gut zu wissen.
R. Kap
Also len(d)>0==d>[]
CalculatorFeline
0

Tcl 414 Bytes

ungolfed implementierung, lesbar:

proc a b {
  if {[string index $b 0] eq "+" || [string index $b 0] eq "-"} {
    set c S
  } elseif {[string match {[A-Za-z]} $b]} {
    return LE
  } elseif {[regexp {^(?![+-]?\d+(\.\d+)?$)..+} $b]} {
    return ST
  } elseif {[regexp {[^a-zA-Z0-9.]} $b]} {
    return SY
  } else {
    set c U
  }
  if {[string match *.* $b]} {
    return $c\U
  } else {
    return $c\I
  }
}
puts [a $argv]
Legit Stack
quelle