Determinar el tipo de entrada


15

El desafío es simple: determinar el tipo de entrada y generar un identificador que indique de qué tipo es.

  • "UI", número entero sin signo: 0,1 , 34,111111111111111111111111111111111111111111
  • "SI", firmado entero: +0, +1, +42,-1 , -3,-111111111111111111111111111111111111111111
  • "UD", Decimal sin signo: 0.0,1.23 ,1234.1234
  • "SD", decimal con signo: -0.0,+0.0 ,-1.235
  • "LE", Carta: a- zyA -Z
  • "SY", símbolo: puntos de código ASCII: [32-47, 58-64, 91-96, 123-126] (es decir, todos los caracteres excepto números y letras)
  • "ST", cadena: dos o más caracteres que no se pueden analizar como ninguno de los formatos de números anteriores

Reglas:

  • La entrada tendrá 1-99 caracteres de longitud.
  • La entrada solo contendrá caracteres ASCII imprimibles, puntos de código: 32-126.
  • La salida debe ser las dos letras de identificación como se definió anteriormente (UI, SI ...)
  • Aplican reglas estándar de E / S

Ejemplos:

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

¿Puede SYser más de un personaje?
FryAmTheEggman

No consideraría 111111111111111111111111111111111111111111ser de tipo entero.
Matt

@FryAmTheEggman sy es solo un personaje.
Stewie Griffin

Entonces, ¿tomamos la entrada como una cadena?
lirtosiast

66
@ Matt, puede que no sea un uint8o int64, pero definitivamente es un número entero .
Stewie Griffin

Respuestas:


0

Pyth - 47 bytes

Puede jugar al golf unos pocos bytes con algunos trucos de corte.

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

Test Suite .


5

JavaScript (ES6), 99

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

Prueba

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>


1
Estaba bastante seguro de que alguien podría optimizar para casos compartidos, pero me gusta su uso de parseInt para detectar letras.
Neil

El primer () en su expresión regular no es necesario
Awashi

@Awashi es necesario ya que necesito un grupo de captura para que el signo diferencie S o U.
edc65

@WashingtonGuedes no, podría ser (\+|-)pero no se guardaron bytes
edc65

3

Código de máquina de Turing, 1544 bytes

Pruébalo en línea!

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

3
Incluya una versión totalmente desarrollada del código. Si el espacio en blanco no se puede eliminar, debe contarse en el recuento de bytes.
Mego

2
Parece que no se puede eliminar, el programa no funciona correctamente sin espacios entre los símbolos.
Matthew Smith el

No parece clasificar "+ -1" (de los ejemplos) como un ST.
Xantix

2

Retina, 98 97 bytes

Una buena manera de practicar mis habilidades de expresiones regulares.

Pruébalo en línea!

^(?![+-]?\d+(\.\d+)?$)..+
ST
^([+-]?)\d+$
$1UI
^([+-]?)\d+\.\d+$
$1UD
i`^[a-z]$
LE
^.$
SY
[+-]U
S

44
Puede cambiar ^[a-zA-Z]$para i`^[a-z]$guardar un byte
daavko

1

Lua, 157 bytes

Pruébalo en línea!

Golfizado:

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

Sin 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

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)

Versión alternativa, también 120 bytes:

s=>"STUISIUDSDLESY".substr(s.match(/^(?:(\d+)|([+-]\d+)|(\d+\.\d+)|([+-]\d+\.\d+)|([A-Z])|(.)|.*)$/i).lastIndexOf(s)*2,2)

Seguramente, la expresión regular se puede jugar con un eval(`/regex/`)constructor de expresiones regulares + cadenas de plantilla
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");}

return (v.length()==1?"SY":"ST");puede ser return v.length()<2?"SY":"ST";(-3 bytes) O puede ser esto: 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 ) Y además, puede cambiar String t(String v)a v->cuando usa un lambda Java 8.
Kevin Cruijssen

0

Javascript (ES6), 138 bytes

Traté de usar a replacepara ser más "elegante".

Esto crea una función anónima que devuelve la cadena del tipo.

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

Cualquier consejo para mejorar esto será totalmente bienvenido.


1
1.debería ser ST, no UD. Cambie su \d*a\d+
edc65

@ edc65 ¿Cómo? Eso es un decimal. Eso es lo mismo que 1.0.
Ismael Miguel

Podría ser válido o no (no escribo en 1.lugar de 1) PERO No es su elección ni la mía: existen los casos de prueba
edc65

@ edc65 Tienes razón. Me salté la lista MUY enorme. Lo he arreglado ¡Gracias!
Ismael Miguel

0

Python 3.5 - 241 240 bytes:

( Guardado 1 byte gracias a @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'

Puede ser un poco largo, pero hace el trabajo casi a la perfección. Esta fue una muy buena manera de mejorar mis habilidades de expresión regular. Gracias por el reto. :) Intentaré acortarlo más si puedo.


Puede mover la importación hacia fuera de la función para ahorrar espacio. (Estúpido teclado iPad sin retroceso)
CalculatorFeline

@CatsAreFluffy Sí, no pensé en eso. ¡Gracias! :)
R. Kap

@CatsAreFluffy: En realidad, el teclado de iOS hace permitir acentos abiertos! Descubrí esto el otro día cuando necesitaba escribir un descuento usando mi iPhone :) meta.stackexchange.com/questions/133673/…
homersimpson

@CatsAreFluffy Nice! Es bueno saberlo.
R. Kap

También len(d)>0==d>[]
CalculatorFeline

0

Tcl 414 bytes

Implementación sin golf, legible:

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]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.