Déterminer le type d'une entrée

15

Le défi est simple: déterminer le type d'une entrée et produire un identifiant indiquant de quel type il s'agit.

  • "UI", Entier non signé: 0, 1, 34,111111111111111111111111111111111111111111
  • "SI", Signé entier: +0,+1 , +42, -1, -3,-111111111111111111111111111111111111111111
  • "UD", décimal non signé: 0.0 , 1.23,1234.1234
  • "SD", décimal signé: -0.0 , +0.0,-1.235
  • "LE", Lettre: a - zet A-Z
  • "SY", symbole: points de code ASCII: [32-47, 58-64, 91-96, 123-126](c'est-à-dire tous les caractères sauf les chiffres et les lettres)
  • "ST", chaîne: deux caractères ou plus qui ne peuvent pas être analysés comme l'un des formats numériques ci-dessus

Règles:

  • L'entrée comportera de 1 à 99 caractères
  • L'entrée ne contiendra que des caractères ASCII imprimables, points de code: 32-126.
  • La sortie doit être les deux lettres identifiantes telles que définies ci-dessus (UI, SI ...)
  • Les règles d'E / S standard s'appliquent

Exemples:

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
la source
Peut SYêtre plus d'un personnage?
FryAmTheEggman
Je ne considérerais 111111111111111111111111111111111111111111pas être de type entier.
Matt
@FryAmTheEggman sy n'est qu'un caractère.
Stewie Griffin
Nous prenons donc l'entrée comme une chaîne?
lirtosiast
6
@Matt, ce n'est peut-être pas un uint8ou int64, mais c'est certainement un entier .
Stewie Griffin

Réponses:

0

Pyth - 47 octets

Peut prolonger le golf de quelques octets avec quelques astuces de découpage.

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

Suite de tests .

Maltysen
la source
5

JavaScript (ES6), 99

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

Tester

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
la source
1
J'étais à peu près sûr que quelqu'un serait en mesure d'optimiser pour les cas partagés, mais j'aime votre utilisation de parseInt pour détecter les lettres.
Neil
Le premier () dans votre expression
régulière
@Awashi c'est nécessaire car j'ai besoin d'un groupe de capture pour que le signe différencie S ou U.
edc65
@WashingtonGuedes non, cela pourrait être, (\+|-)mais aucun octet n'a été enregistré
edc65
3

Code de la machine de Turing, 1544 octets

Essayez-le en ligne!

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
Leaky Nun
la source
3
Veuillez inclure une version complète du code. Si l'espace ne peut pas être supprimé, il doit être compté dans le nombre d'octets.
Mego
2
On dirait qu'il ne peut pas être supprimé, le programme ne fonctionne pas correctement sans espaces entre les symboles.
Matthew Smith
Il ne semble pas classer "+ -1" (à partir des exemples) comme ST.
Xantix
2

Rétine, 98 97 octets

Une belle façon de pratiquer mes compétences d'expression rationnelle en effet.

Essayez-le en ligne!

^(?![+-]?\d+(\.\d+)?$)..+
ST
^([+-]?)\d+$
$1UI
^([+-]?)\d+\.\d+$
$1UD
i`^[a-z]$
LE
^.$
SY
[+-]U
S
Leaky Nun
la source
4
Vous pouvez changer ^[a-zA-Z]$pour i`^[a-z]$enregistrer un octet
daavko
1

Lua, 157 octets

Essayez-le en ligne!

Golfé:

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")

Non golfé:

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
Leaky Nun
la source
1

JavaScript (ES6), 125 120 bytes

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

Version alternative, également 120 octets:

s=>"STUISIUDSDLESY".substr(s.match(/^(?:(\d+)|([+-]\d+)|(\d+\.\d+)|([+-]\d+\.\d+)|([A-Z])|(.)|.*)$/i).lastIndexOf(s)*2,2)
Neil
la source
Assurément, la regex peut être jouée avec un eval(`/regex/`)constructeur de regex + des chaînes de modèle
Downgoat
0

Java, 192 octets

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
la source
return (v.length()==1?"SY":"ST");peut être return v.length()<2?"SY":"ST";(-3 octets) Ou il peut être ceci: 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 octets ) Et en plus vous pouvez changer String t(String v)à v->lorsque vous utilisez un lambda Java 8.
Kevin Cruijssen
0

Javascript (ES6), 138 octets

J'ai essayé d'utiliser un replace pour être plus "chic".

Cela crée une fonction anonyme qui renvoie la chaîne du type.

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')))

Tous les conseils pour améliorer cela seront les bienvenus.

Ismael Miguel
la source
1
1.devrait être ST, non UD. Changez \d*pour\d+
edc65
@ edc65 Comment? C'est une décimale. C'est la même chose que 1.0.
Ismael Miguel
Cela pourrait être valide ou non (je n'écris pas à la 1.place de 1) MAIS Ce n'est pas votre choix ou le mien: il y a les cas de test
edc65
@ edc65 Vous avez raison. J'ai sauté la liste TRÈS énorme. Je l'ai corrigé. Merci!
Ismael Miguel
0

Python 3.5 - 241240 octets:

( Enregistré 1 octet grâce à @CatsAreFluffy )

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'

Cela peut être un peu long, mais fait parfaitement le travail. C'était un très bon moyen d'améliorer mes compétences d'expression régulière. Merci pour le défi. :) Je vais essayer de raccourcir davantage si je peux.

R. Kap
la source
Vous pouvez déplacer l' importation vers l'extérieur de la fonction pour économiser de l'espace. (Clavier iPad stupide sans points de retrait)
CalculatorFeline
@CatsAreFluffy Ouais, je n'y ai pas pensé. Je vous remercie! :)
R. Kap
@CatsAreFluffy: En fait, le clavier iOS ne permet des accents graves! J'ai découvert cela l'autre jour lorsque j'ai eu besoin d'écrire une démarque à l'aide de mon iPhone :) meta.stackexchange.com/questions/133673/…
homersimpson
@CatsAreFluffy Nice! C'est bon à savoir.
R. Kap
Aussi len(d)>0==d>[]
CalculatorFeline
0

Tcl 414 octets

implémentation non gérée, lisible:

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
la source