Inspirado en un reciente artículo de Daily WTF ...
Escriba un programa o función que tome un GUID (cadena en el formato XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
, donde cada X representa un dígito hexadecimal), y genera el GUID incrementado en uno.
Ejemplos
>>> increment_guid('7f128bd4-b0ba-4597-8f35-3a2f2756dfbb')
'7f128bd4-b0ba-4597-8f35-3a2f2756dfbc'
>>> increment_guid('06b86883-f3e7-4f9d-87c5-a047e89a19fa')
'06b86883-f3e7-4f9d-87c5-a047e89a19fb'
>>> increment_guid('89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2cf')
'89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2d0'
>>> increment_guid('89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f')
'89f25f2f-2f7b-4aa6-b9d7-46a98e3cb2a0'
>>> increment_guid('8e0f9835-4086-406b-b7a4-532da46963ff')
'8e0f9835-4086-406b-b7a4-532da4696400'
>>> increment_guid('7f128bd4-b0ba-4597-ffff-ffffffffffff')
'7f128bd4-b0ba-4598-0000-000000000000'
Notas
- A diferencia del artículo vinculado, el incremento de un GUID que termina en F debe "llevar" al dígito hexadecimal anterior. Ver ejemplos arriba.
- Puede suponer que la entrada no será
ffffffff-ffff-ffff-ffff-ffffffffffff
. - Para dígitos hexadecimales superiores a 9, puede usar mayúsculas (AF) o minúsculas (af).
- Sí, los GUID pueden comenzar con a
0
. - Su salida debe constar de exactamente 32 dígitos hexadecimales y 4 guiones en el formato esperado, incluidos los
0
s iniciales necesarios . - No tiene que conservar el número de versión u otros bits fijos del GUID. Suponga que es solo un entero de 128 bits donde ninguno de los bits tiene un significado especial. Del mismo modo, se supone que los GUID se clasifican en un orden lexicográfico directo en lugar de en el orden binario de una
GUID
estructura de Windows . - Si escribir una función, la entrada puede ser de cualquier secuencia-de-
char
tipo de datos:string
,char[]
,List<char>
, etc.
GUID
estructura de Windows .89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f
para garantizar que las respuestas puedan hacer la transición9 -> a
.foreach (char ch in theInput)
sea válido el equivalente de C # de su idioma .Respuestas:
05AB1E ,
171518 bytesGuardado 2 bytes gracias a Kevin Cruijssen
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
žKÃ
lugar de'-K
. Por cierto, puede guardar 2 bytes cambiando•É]•S3+
aŽ¦˜S·
.Ž
es una cosa ahora ...Pitón 2 , 50
Pruébalo en línea!
fuente
JavaScript (ES6), 85 bytes
La cadena de salida está en minúsculas.
Pruébalo en línea!
Comentado
fuente
Python 2 , 82 bytes
Pruébalo en línea!
Sin importaciones o conversión hexadecimal.
Esto escanea desde la parte posterior de la cadena, moviendo cada personaje a lo largo del ciclo
0123456789abcdef
,-
yendo a sí mismo. Después de tocar un símbolo que no seaf
o-
, deja de escanear hacia la izquierda y solo devuelve el resto sin cambios. Esta solución no es específica del formato UUID: funcionaría cualquier cantidad de bloques de cualquier cantidad de letras hexadecimales.El caso base
[str,f][s[-1]in'f-'](s[:-1])
es un truco que nunca antes había visto en un golf. Se termina la recursión sinif
,and
,or
, u otro flujo de control explícito.Según la condición
[s[-1]in'f-']
del último carácter, el código vuelvef(s[:-1])
o simplementes[:-1]
no cambia. Comostr
es la identidad en las cadenas, podemos seleccionar una de las funciones[str,f]
y aplicarlas[:-1]
. Tenga en cuenta que la llamada recursiva conf
no se realiza si no se elige, evitando el problema de problema común que Python evalúa ansiosamente las opciones no utilizadas, lo que lleva a una regresión infinita en las recursiones.fuente
APL (Dyalog Unicode) , 46 bytes SBCS
Función de prefijo tácito anónimo.
Pruébalo en línea!
⎕CY'dfns'
c op y la biblioteca "dfns" (para obtenerhex
ydec
)(
...)
⊢
el argumento≠
difiere de'-'
un guión(
...)@
en el subconjunto que consiste en las ubicaciones en las que el criterio anterior es verdadero, aplique:dec¨
convierta cada carácter hexadecimal en un número decimal...
@32
en la posición 32 (el último dígito), aplique:1+
incremente16(
...)⍣≡
aplique repetidamente con argumento izquierdo 16 hasta que sea estable:=
compare (da la máscara donde los dígitos hexadecimales son 16)1⌽
gire cíclicamente un paso hacia la izquierda (este es el bit de acarreo)|+
a eso, agregue el resto de la división cuando se divide (por dieciséis, lo que convierte los 16 en 0) gire dígitos en longitud-uno representaciones de caracteres hexadecimal varepsilon nlist (aplanar)1hex
∊
fuente
Java 11,
152149111108 bytes-38 bytes gracias a @ OlivierGrégoire .
-3 bytes gracias a @ ASCII-only .
Pruébalo en línea.
Explicación:
Antigua respuesta de 149 bytes:
Pruébalo en línea.
Explicación:
fuente
Ruby
-pl
,625755 bytesPruébalo en línea!
fuente
Python 3 , 50 bytes
Pruébalo en línea!
fuente
Python 2 ,
113112 bytesPruébalo en línea!
Sin importaciones
fuente
Retina 0.8.2 , 21 bytes
Pruébalo en línea! El enlace incluye casos de prueba.
9
se conviertea
. Explicación: La expresión regular coincide con todos losf
s y-
s finales más un carácter anterior. La transliteración luego incrementa cíclicamente esos caracteres como si fueran dígitos hexadecimales. Enfoque alternativo, también 21 bytes:Pruébalo en línea! El enlace incluye casos de prueba. Funciona al poner en minúscula la entrada para simplificar la transliteración. Por lo tanto, tendría 15 bytes si solo tuviera que admitir minúsculas. Pruébalo en línea! El enlace incluye casos de prueba.
fuente
MATLAB, 138 bytes
Se corrigió un error en caso de que un fragmento sea todo ceros. También jugaba mucho al abusar del try / catch. Resultado neto: 0 bytes guardados.
Un intento de 'engañar' usando
java.util.UUID
falló porque ellong
valor devuelto porjava.util.UUID.get[Most/Least]SignificantBits
se convierte en undouble
que incurre en una pérdida de precisión. Los invito a echar un vistazo a esta mesa y pronunciar en silencio "... pero ¿por qué? "Explicación
La
hex2dec
función escupe adouble
, por lo que no puede procesar todo el GUID a la vez para evitar excederloflintmax
. En cambio, tenemos que procesar el fragmento GUID por fragmento, usandosplit
. La variablea
verifica si necesitamos llevar un uno, y con trampa también es el incremento inicial que agregamos. La condición para transferir es si las longitudes de las cadenas originales e incrementadas ya no son iguales.La versión original tenía poco menos de 160 bytes, así que me gustaría pensar que esto no debería ser fácil de superar.
fuente
Python 2 , 99 bytes
Pruébalo en línea!
Sin
uuid.UUID
usofuente
C # (compilador interactivo de Visual C #) , 77 bytes
Pruébalo en línea!
-1 byte gracias a @ASCIIOnly!
Función anónima que toma
char[]
como entrada y salida modificando un argumento .La entrada se escanea de derecha a izquierda y se reemplaza usando las siguientes reglas.
-
personaje se ignora y el procesamiento continúaF
personaje se convierte a0
y el procesamiento continúa9
personaje se convierte aA
y el procesamiento se detieneA-E
y0-8
se incrementan en 1 y el procesamiento se detienefuente
==70
->>69
Powershell, 101 bytes
Pruébalo en línea!
Sin biblioteca externa o conversión hexadecimal. Cualquier longitud de cuerda. Se permiten minúsculas y mayúsculas. La cadena de entrada que coincide también
^[f-]*$
está permitida.Este script escanea desde la parte posterior de la cadena y agrega a cada carácter el valor de la tabla hash:
-
: incremento = 1-19
: incremento = 1 + 7, resultado =A
F
: incremento = 1-23, resultado =0
f
: incremento = 1-55, resultado =0
A continuación, la secuencia de comandos se utiliza
$p
para determinar si se incrementa el carácter actual.Script de prueba:
Salida:
fuente
Perl 6 , 65 bytes
Pruébalo
fuente
Jalea , 20 bytes
-2 (y una corrección de errores) gracias a Dennis!
Pruébalo en línea!
fuente
PowerShell , 126 bytes
Pruébalo en línea!
Respuesta bastante trivial. Solo pensé que podría agregar el querido PowerShell a la lista :)
fuente
JavaScript (Node.js) , 78 bytes
Pruébalo en línea!
fuente
Perl 5, 64 bytes
La cantidad de paréntesis necesarios aquí me pone triste, pero
->
une muy estrechamente, ya que->as_hex
es la forma más rápida que puedo encontrar para obtener una salida con formato hexadecimal.Corre con
perl -Mbigint -p
. Básicamente, solo convierte el número en un bigint hexadecimal, agrega uno y luego sustituye los dígitos del resultado al valor original, dejando intactos los guiones.fuente
Óxido, 258 bytes
sí, es largo ... pero técnicamente es solo una línea con 1 expresión? y no hay bibliotecas elegantes? y no se bloqueará en una entrada fuzz? ungolf
Pruébalo en el patio de óxido
fuente
Código de ensamblado x86 de 16/32/64 bits, 28 bytes
bytes: 83C623FDAC3C2D74FB403C3A7502B0613C677502B03088460173E9C3
código:
Llame con ESI apuntando a GUID. Reemplace ESI con SI para 16 bits o RSI para 64 bits (y +2 bytes).
fuente
C (clang) , 62 bytes
Pruébalo en línea!
fuente
Lisp común, 166 bytes
Pruébalo en línea!
fuente