Dada una entrada de cadena, escriba un programa que imprima un valor verdadero en STDOUT o equivalente si la entrada es un UUID válido, sin usar expresiones regulares.
Un UUID válido es
32 dígitos hexadecimales, mostrados en cinco grupos separados por guiones, en la forma 8-4-4-4-12 para un total de 36 caracteres (32 caracteres alfanuméricos y cuatro guiones).
Casos de prueba
0FCE98AC-1326-4C79-8EBC-94908DA8B034
=> true
00000000-0000-0000-0000-000000000000
=> true
0fce98ac-1326-4c79-8ebc-94908da8b034
=> true
0FCE98ac-1326-4c79-8EBC-94908da8B034
=> true
{0FCE98AC-1326-4C79-8EBC-94908DA8B034}
=> false (the input is wrapped in brackets)
0GCE98AC-1326-4C79-8EBC-94908DA8B034
=> false (there is a G in the input)
0FCE98AC 1326-4C79-8EBC-94908DA8B034
=> false (there is a space in the input)
0FCE98AC-13264C79-8EBC-94908DA8B034
=> false (the input is missing a hyphen)
0FCE98AC-13264-C79-8EBC-94908DA8B034
=> false (the input has a hyphen in the wrong place)
0FCE98ACD-1326-4C79-8EBC-94908DA8B034
=> false (one of the groups is too long)
0FCE98AC-1326-4C79-8EBC-94908DA8B034-
=> false (has a trailing hyphen)
0FCE98AC-1326-4C79-8EBC-94908DA8B034-123
=> false (too many groups)
0FCE98AC13264C798EBC94908DA8B034
=> false (there is no grouping)
Reglas
- No se permiten expresiones regulares.
- La coincidencia de patrones literales que es como una expresión regular no está permitida. Por ejemplo, usar
[0-9a-fA-F]
u otros identificadores hexadecimales (lo llamaremosn
) y luego hacer coincidirnnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn
on[8]-n[4]-n[4]-n[4]-n[12]
no está permitido - La entrada puede tomarse
STDIN
o como argumento de una función - La entrada no distingue entre mayúsculas y minúsculas
- Es seguro asumir que la entrada no contendrá saltos de línea o saltos de línea.
- La entrada puede contener caracteres ASCII imprimibles (espacios incluidos)
- Se debe imprimir un valor verdadero
STDOUT
o equivalente si la entrada es un uid válido - Se debe imprimir un valor de falsey
STDOUT
o equivalente si la entrada no es un uuid válido - Si usa una función, en lugar de usar
STDOUT
, la salida puede ser el valor de retorno de la función - No se puede imprimir el valor verdadero / falso
STDERR
. - Se aplican lagunas estándar
- Este es el código de golf , por lo que gana el programa más corto en bytes. ¡Buena suerte!
Tabla de clasificación
Este es un fragmento de pila que genera una tabla de clasificación y una descripción general de los ganadores por idioma.
Para asegurarse de que su respuesta se muestre, comience con un título usando la siguiente plantilla de Markdown
## Language Name, N bytes
Donde N es el tamaño, en bytes, de su envío
Si desea incluir varios números en su encabezado (por ejemplo, tachar los puntajes antiguos o incluir marcas en el recuento de bytes), solo asegúrese de que el puntaje real sea el último número en su encabezado
## Language Name, <s>K</s> X + 2 = N bytes
fuente
\h{8}-\h{4}-\h{4}-\h{4}-\h{12}
(donde\h
es un dígito hexadecimal) son válidas.Respuestas:
CJam,
313029 bytesEjecute todos los casos de prueba aquí.
Explicación
En lugar de que el patrón coincida con la entrada directamente, primero lo estamos transformando en una forma más simple que se pueda comparar fácilmente con una sola cadena de patrón.
fuente
JavaScript ES6,
735556 caracteresLa versión anterior de 55 caracteres tiene un problema con los espacios finales en el grupo:
Prueba:
fuente
PowerShell,
2921844937 BytesMuchas gracias a la gente en los comentarios que ayudaron con este golf para mantenerse al día con las reglas cambiantes: TessellatingHeckler , iFreilicht , Jacob Krall y Joey . Consulte el historial de edición para revisiones y versiones anteriores.
Esta revisión toma datos como
$g
, luego crea una nueva tabla hash@{}
con un elemento, el índice36
se establece igual a$g-as[guid]
. Esto utiliza el-as
operador incorporado para intentar la conversión entre dos tipos de datos .NET: de[string]
a[guid]
. Si la conversión es exitosa,[guid]
se devuelve un objeto, de lo contrario$null
se devuelve. Esta parte garantiza que la cadena de entrada sea un GUID .NET válido.El siguiente paso es indexar en la tabla hash con
[$g.length]
. Si$g
no tiene exactamente 36 caracteres de longitud, se devolverá la tabla hash$null
, que se mostrará como un valor falsey. Si$g
tiene 36 caracteres de longitud, se generará el resultado de la llamada .NET. Si$g
no es un GUID .NET válido (en cualquier forma), se generará$null
como un valor falsey. De lo contrario, generará un objeto GUID .NET como un valor verdadero; la única forma en que se puede generar es si coincide con el formato solicitado del desafío.Ejemplos
Aquí estoy encapsulando la llamada del script en parens y explícitamente como Boolean para mayor claridad.
fuente
!!($args[0]-as[guid])
a los 21 bytes.!!()
? Como los valores$NULL
y[guid]
son mutuamente excluyentes, califican para representar los valores de verdad y falsey, ¿no? De todos modos, una excelente manera de convertir a booleano, ¡me encanta la solución!True
para0FCE98AC13264C798EBC94908DA8B034
, que no tiene guiones0FCE98AC-1326-4C79-8EBC-94908DA8B034D
(D adicional al final) devuelve falsey$TRUE
, ya que solo recorta el dígito ofensor y los primeros 36 caracteres son válidos.Emacs Lisp, 236 bytes
Sin golf:
fuente
Debido a cambios en las reglas , esta respuesta ya no es competitiva :(
C, 98
Mayormente bastante autoexplicativo. El
%n
especificador de formato proporciona el número de bytes leídos hasta ahora, que debería ser 36.scanf()
devuelve el número de elementos coincidentes, que debería ser 6. El final%c
no debe coincidir con nada. Si lo hace, entonces hay texto final yscanf()
devolverá 7.Compile
-w
para suprimir las molestas advertencias (hay varias).fuente
JavaScript ES6, 70
83NOTA gracias a @Qwertiy para encontrar un error (y sugerir algunas mejoras y correcciones)
Thx @ CᴏɴᴏʀO'Bʀɪᴇɴ 2 bytes guardados
Otros 9 bytes guardados simplificando la verificación de longitud (la forma compleja fue más corta en el primer borrador, pero no ahora)
Explicado
Fragmento de prueba
fuente
-1-('0x'+h)
=>1/('0x'+h)
00000000-0000-0000-000 -000000000000
every
llamadau
hay una cadena, no una matrizDebido a cambios en las reglas , esta respuesta ya no es competitiva :(
Pure Bash (sin utilidades externas), 78
Toma información de la línea de comando.
printf
construye la siguiente cadena- - - -
.p=
línea transforma esta a la siguiente distribución:[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]-[[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]][[:xdigit:]]
. Tenga en cuenta que esto se parece mucho a una expresión regular. Sin embargo, no es en este contexto. Es un patrón para la coincidencia de patrones de shell . Esto es similar en concepto a una expresión regular, pero es una construcción diferente (y sintaxis).Idiomático para shell, un código de retorno de 0 indica éxito / VERDADERO y 1 indica falla / FALSO. Se puede inspeccionar el código de retorno
echo $?
después de ejecutar el script.fuente
tr
también usa clases de caracteres Posix, pero no es un analizador de expresiones regulares.Jolf, 32 bytes
Pruébalo aquí!
Debido a un error en mi código, esto es más largo de lo que debería ser. :(
[8,4,4,4,12]
debería ser igual que{8444*26}
, pero}
también es el cierre de una función: Pfuente
MATL , 55 bytes
Me abstuve de usar la
Yb
función (strsplit
) porque es algo similar aregexp(..., 'split')
. Esto solo usa indexación y comparaciones de caracteres.Ejemplo
Explicación
fuente
CJam,
5242 bytesPruébalo en línea . Emite la cadena original si es verdadera, emite una cadena vacía si es falsa ( esto está permitido ).
Explicación:
fuente
A7*)<
no eliminará muchos caracteres no válidos, como espacios+
,?
...Julia, 86 bytes
Esta es una función anónima que acepta una cadena y devuelve un valor booleano. Para llamarlo, dale un nombre, por ejemplo
f=s->...
.Sin golf:
fuente
C # 196 bytes
Sin golf:
El método
T
se puede invocar con cualquier cadena no nula ytrue
, de lofalse
contrario , devolverá los GUID válidos . Esta es una validación de tiempo constante; a costa de tres caracteres, puede salir anticipadamente del método (cambiari < v.Length
ai < v.Length && r
).Intentará bajar el bytecount más tarde.
Obviamente, he dejado de
Guid.ParseExact
lado porque ¿dónde está la diversión en eso? Aquí está, sin mucho intento de reducirlo aún más en 86 bytes :Sin golf:
fuente
Python 2,
99112 bytesEn una entrada válida, se imprime
True
. En una entrada no válida, se imprimeFalse
o0
, dependiendo de por qué no fue válida.False
y0
ambos son falsey en Python.La función tiene que verificar 3 cosas:
ABCDEF
Aquí hay un desglose para mostrar cómo los verifica. Está un poco desactualizado pero tengo hambre, así que lo actualizaré más tarde.
fuente
return
conprint
. (En cuyo caso definitivamente querrás estar en Python 2, porqueprint
funciona de manera diferente en Python 3.)map
ahora devuelve un "objeto de mapa", no una lista.int
función permite espacios,0FCE98ac-1326-4c79-8EBC-94908da8B03
con un espacio final. Vea el comentario en la respuesta eliminada de Pyth aquí si puede.Python 2, 57 bytes
Gracias a Dios por incorporado! - asegúrese de incluir cadenas entre comillas.
fuente
1
para la entrada12345678123456781234567812345678
.try:print uuid.UUID(input())
porque todo lo que se requiere es imprimir un valor verdaderoPyth, 39 bytes
Pruébalo aquí .
fuente
\
carácterK\-k
, por lo que no puede ejecutarse tal cual.Perl 6 ,
8367 bytes(los recuentos no incluyen nuevas líneas o sangrías ya que no son necesarios)
uso:
fuente
Lisp común - 161
El valor devuelto si es verdadero es el hash, como un número, que es un resultado útil para tener.
Sin golf
fuente
F # 44 caracteres
En F #,
out
se pueden invocar funciones con parámetros omitiendo el parámetro out; su valor en el retorno se combinará con el verdadero valor de retorno de la función en una tupla.Aquí, la tupla se canaliza a la
fst
función, que devuelve su primer miembro, que en este caso es el valor de retorno booleano de TryParseExact, que indica el éxito o el fracaso de la llamada.Como comprobación del formato correcto,
true
solo devolvemos si la cadena tiene 36 caracteres.Antes de ver la respuesta C # de RobIII, no había pensado en usar TryParseExact, por lo que mi respuesta fue tener tres caracteres más:
TryParse(string, Guid)
acepta entradas en los siguientes formatos:De estos, solo el segundo tiene 36 caracteres de longitud.
fuente
Python 2,
938985 bytesLa
map()
llamada garantiza que las secciones tienen las longitudes correctas yall()
prueba que cada carácter sea un guión o un dígito hexadecimal de caso arbitrario. La expresión del generador está probando cada carácter iterando a través de toda la cadena, por lo que no es el método más eficaz, me temo, pero debería satisfacer los casos de prueba:fuente
f=
espacios y alrededor de la cadena en elall
bloque.all(..)
para establecer las pruebas de inclusión:set(u)<=set("-0123456789abcdefABCDEF")
.SAS,
171144141En realidad, usa stdin y stdout, una de las características menos conocidas de este lenguaje en particular. Funciona para los ejemplos dados hasta ahora, pero posiblemente no en todos los casos. Probablemente se puede mejorar.
Mejor enfoque: un personaje a la vez:
¡Golfó otros 6 caracteres de la expresión central!
Sin golf:
Esto genera bastantes advertencias y notas en el registro, pero no las imprime en stdout o stderr, así que creo que este es un juego justo.
fuente
C, 391 bytes
fuente
MATLAB, 126 bytes
fuente
Python 3, 134 bytes
int (k, 16) intenta convertir k en una base-16 int. En un carácter distinto de 0-9a-fA-F- falla, en cuyo caso devolvemos 0, que es falso. Agregue 1 a ese int y obtenemos un valor de verdad garantizado: hemos eliminado todos los guiones con str.split (), por lo que no podemos obtener el valor -1 y todas las entradas que no son 0 son verdaderas.
fuente
Función C, 102
Un cambio de regla rechazó mi
scanf()
respuesta anterior basada en c , así que aquí hay otra respuesta c con laisxdigit()
que creo que debería permitirse competir :Pruébalo en línea.
-
caracteres (ASCII 45) en las posiciones relevantes; de ser así, reemplácelos con0
s (ASCII 48 (= 45 + 3))isxdigit()
fuente
Lotes,
148139 + 2 =150141 bytesSe agregaron 2 bytes porque necesita usar el
/v
interruptor paraCMD.EXE
.Sale con ERRORLEVEL 0 en caso de éxito, 1 en caso de error.
Editar: guardé algunos bytes principalmente porque no
:=
distingue entre mayúsculas y minúsculas, pero también hubo otros ajustes.fuente
Java, 345 bytes
La entrada es el primer argumento de línea de comando. La salida es un código de error (0 significa UUID válido, 1 significa no válido)
Ungolfed con comentarios:
EDITAR: No noté la parte STDOUT. Vaya, arreglado ahora.
fuente
if(b.length>36||b.length<36)
con simplementeif(b.length!=36)
. Además, debido a que puede imprimir valores verdaderos , simplemente podría imprimir en0
lugar de1<0
y en1
lugar de1>0
.if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }
Entonces, en Java, un valor booleano es un valor de verdad, pero1
o0
no lo es. Solo cuando el OP de un desafío dice algo como: " Su resultado puede ser verdadero / falso, 0/1, vacío / no vacío; siempre y cuando especifique lo que usa ", entonces puede usarlo0
y1
notrue/false
serlo como verdadero / valor de falsey.if(b.length!=36)
;||
puede estar|
en múltiples lugares, así como&&
a&
;if(...!='-')
puede serif(...!=45)
;int i=-1; ... while(++i<b.length){
puede ser reemplazado confor(int i=-1;++i<b.length;){
;'F'
puede ser70
('f'
podría ser 102, pero eso no importa ya que es el mismo número de bytes). Me gusta cómo has usado porjava.io.PrintStream u=System.out;
cierto, ¡debería recordar eso! Así que gracias.Swift 3, 50 bytes
Pase en una cuerda
s
fuente
PHP, 109 bytes
imprime 1 para verdadero y 0 para falso
$i>7&$i<24&!($i%5-3)
es 5 bytes más corto quein_array($i,[8,13,18,23])
112 bytes
113 bytes
fuente
Java,
172 bytes168 bytes (Gracias Asistente de trigo)Un poco engañoso ya que usé java.util.UUID, pero aquí va:
Versión sin golf:
fuente
try
y{
.String[]
ya
. Además, debe poder reemplazarprintln
conprint
.java.util.UUID.fromString
lugar de importar.AWK, 98 bytes
Simplemente divide la línea en cada carácter y verifica si cada carácter es un dígito hexadecimal y si hay guiones en los lugares apropiados.
strtonum
convierte caracteres inválidos a0
. Hacer la comparación entre0
ym
(y caracteres inválidos elegidos arbitrariamente) requiere pasos adicionales. Afortunadamente01
es un número hexadecimal válido, perom1
no lo es.Inicialmente escribí dos
for
bucles, pero ahorré 1 byte al juntarlos. :)NOTA:
GAWK
puede leer la entrada como números hexadecimales, pero esto requiere una opción de línea de comando muy larga.fuente