Inspirado em um artigo recente do Daily WTF ...
Escreva um programa ou função que use um GUID (sequência no formato XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
, em que cada X representa um dígito hexadecimal) e produz o GUID incrementado por um.
Exemplos
>>> 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
- Diferentemente do artigo vinculado, o incremento de um GUID que termina em F deve "transportar" para o dígito hexadecimal anterior. Veja exemplos acima.
- Você pode assumir que a entrada não será
ffffffff-ffff-ffff-ffff-ffffffffffff
. - Para dígitos hexadecimais acima de 9, você pode usar maiúsculas (AF) ou letras minúsculas (af).
- Sim, os GUIDs podem começar com a
0
. - Sua saída deve consistir em exatamente 32 dígitos hexadecimais e 4 hífens no formato esperado, incluindo quaisquer
0
s iniciais necessários . - Você não precisa preservar o número da versão ou outros bits fixos do GUID. Suponha que seja apenas um número inteiro de 128 bits em que nenhum dos bits tem algum significado especial. Da mesma forma, supõe-se que os GUIDs classifiquem em ordem lexicográfica direta e não na ordem binária de uma
GUID
estrutura do Windows . - Se uma função de escrita, a entrada pode ser de qualquer sequcia-de-
char
tipo de dados:string
,char[]
,List<char>
, etc.
GUID
estrutura do Windows .89f25f2f-2f7b-4aa6-b9d7-46a98e3cb29f
para garantir que as respostas possam fazer a transição9 -> a
.foreach (char ch in theInput)
seja válido.Respostas:
05AB1E ,
171518 bytesGuardado 2 bytes graças a Kevin Cruijssen
Experimente online! ou como um conjunto de testes
Explicação
fonte
žKÃ
vez de'-K
. Aliás, você pode salvar 2 bytes mudando•É]•S3+
paraŽ¦˜S·
.Ž
agora ...Python 2 , 50
Experimente online!
fonte
JavaScript (ES6), 85 bytes
A sequência de saída está em minúscula.
Experimente online!
Comentado
fonte
Python 2 , 82 bytes
Experimente online!
Nenhuma importação ou conversão hexadecimal.
Isso digitaliza a partir da parte de trás da corda, movendo cada caractere ao longo do ciclo
0123456789abcdef
,-
indo para si mesmo. Depois de atingir um símbolo diferente def
ou-
, ele para de digitalizar para a esquerda e retorna o restante inalterado. Esta solução não é específica para o formato UUID - qualquer número de blocos de qualquer número de letras hexadecimais funcionaria.O caso base de
[str,f][s[-1]in'f-'](s[:-1])
é um truque que eu nunca vi usado em um golfe antes. Ele termina a recursão sem qualquerif
,and
,or
, ou outro controle de fluxo explícito.Com base na condição
[s[-1]in'f-']
do último caractere, o código retornaf(s[:-1])
ous[:-1]
permanece inalterado. Comostr
é a identidade nas strings, podemos selecionar uma das funções[str,f]
e aplicá-las[:-1]
. Observe que a chamada recursiva comf
não é feita se não for escolhida, contornando o problema comum que o Python avalia avidamente opções não utilizadas, levando a uma infinita regressão nas recursões.fonte
APL (Dyalog Unicode) , SBCS de 46 bytes
Função de prefixo tácito anônimo.
Experimente online!
⎕CY'dfns'
c op y a biblioteca "NDR" (para obterhex
edec
)(
…)
⊢
O argumento≠
difere de'-'
um traço(
…)@
no subconjunto que consiste nos locais nos quais o critério acima é verdadeiro, aplique:dec¨
converta cada caractere hexadecimal em um número decimal…
@32
na posição 32 (o último dígito), aplique:1+
incremento16(
…)⍣≡
aplique repetidamente com argumento esquerda 16 até estável:=
comparar (dá mascarar onde os dígitos hexadecimais são 16)1⌽
um passo ciclicamente rotação para a esquerda (este é o carry bit)|+
para que, adicione o resto da divisão quando dividido (por dezesseis anos, tornando assim todos os 16 para 0) vez dígitos em comprimento e um de caracteres hexadecimal representações £ nlist (flatten)1hex
∊
fonte
Java 11,
152149111108 bytes-38 bytes obrigado a @ OlivierGrégoire .
-3 bytes graças a @ ASCII-only .
Experimente online.
Explicação:
Resposta antiga de 149 bytes:
Experimente online.
Explicação:
fonte
Ruby
-pl
,625755 bytesExperimente online!
fonte
Python 3 , 50 bytes
Experimente online!
fonte
Python 2 ,
113112 bytesExperimente online!
Sem importações
fonte
Retina 0.8.2 , 21 bytes
Experimente online! O link inclui casos de teste.
9
torna-sea
. Explicação: A expressão regular corresponde a todos arrastof
s e-
s mais uma personagem anterior. A transliteração então incrementa ciclicamente esses caracteres como se fossem dígitos hexadecimais. Abordagem alternativa, também 21 bytes:Experimente online! O link inclui casos de teste. Funciona com minúsculas na entrada para simplificar a transliteração. Seria, portanto, 15 bytes se tivesse apenas que suportar letras minúsculas. Experimente online! O link inclui casos de teste.
fonte
MATLAB, 138 bytes
Corrigido um bug no caso de um pedaço ser todos zeros. Também jogou muito, abusando do try / catch. Resultado líquido: 0 bytes salvos.
Uma tentativa de "trapacear" usando
java.util.UUID
falha porque olong
valor retornadojava.util.UUID.get[Most/Least]SignificantBits
é convertido em umdouble
que incorre em perda de precisão. Convido você a dar uma olhada nesta mesa e dizer silenciosamente "... mas por quê? "Explicação
A
hex2dec
função cospe adouble
, portanto, não pode processar o GUID inteiro de uma só vez para evitar excederflintmax
. Em vez disso, temos que processar o pedaço GUID por chunck, usandosplit
. A variávela
verifica se precisamos carregar um e, também, enganosamente, é o incremento inicial que adicionamos. A condição para transportar é se os comprimentos das seqüências originais e incrementadas não são mais iguais.A versão original tinha pouco menos de 160 bytes, então eu gostaria de pensar que isso não deve ser fácil de superar.
fonte
Python 2 , 99 bytes
Experimente online!
Sem
uuid.UUID
uso.fonte
C # (compilador interativo do Visual C #) , 77 bytes
Experimente online!
-1 byte graças a @ASCIIOnly!
Função anônima que recebe a
char[]
como entrada e sai modificando um argumento .A entrada é digitalizada da direita para a esquerda e substituída usando as seguintes regras.
-
personagem é ignorado e o processamento continuaF
caractere é convertido0
e o processamento continua9
caractere é convertidoA
e o processamento é interrompidoA-E
e0-8
são incrementados por 1 e pára o processamentofonte
==70
->>69
Powershell, 101 bytes
Experimente online!
Nenhuma biblioteca externa ou conversão hexadecimal. Qualquer comprimento de string. Minúsculas e maiúsculas são permitidas. A string de entrada correspondente a também
^[f-]*$
é permitida.Esse script varre a parte de trás da string e aumenta cada caracter pelo valor da hashtable:
-
: incremento = 1-19
: incremento = 1 + 7, resultado =A
F
: incremento = 1-23, resultado =0
f
: incremento = 1-55, resultado =0
Em seguida, o script usa
$p
para determinar se incrementa o caractere atual.Script de teste:
Saída:
fonte
Perl 6 , 65 bytes
Teste-o
fonte
Gelatina , 20 bytes
-2 (e uma correção de bug) graças a Dennis!
Experimente online!
fonte
PowerShell , 126 bytes
Experimente online!
Resposta bastante trivial. Apenas pensei em adicionar o amado PowerShell à lista :)
fonte
JavaScript (Node.js) , 78 bytes
Experimente online!
fonte
Perl 5, 64 bytes
O número de parênteses necessários aqui me deixa triste, mas
->
se liga muito bem, como->as_hex
é a maneira mais rápida que posso encontrar para obter uma saída no formato hexadecimal.Corra com
perl -Mbigint -p
. Basicamente, ele apenas converte o número em um hexadecimal bigint, adiciona um e subtitula os dígitos do resultado novamente no valor original, deixando os traços intocados.fonte
Ferrugem, 258 bytes
sim é longo .. mas tecnicamente é a única linha com 1 expressão? e sem bibliotecas chiques? e não falhará em uma entrada de penugem? ungolf:
experimentá-lo no parque infantil ferrugem
fonte
Código de montagem x86 de 16/32/64 bits, 28 bytes
bytes: 83C623FDAC3C2D74FB403C3A7502B0613C677502B03088460173E9C3
código:
Ligue com o ESI apontando para GUID. Substitua ESI por SI por 16 bits ou RSI por 64 bits (e +2 bytes).
fonte
C (clang) , 62 bytes
Experimente online!
fonte
Lisp comum, 166 bytes
Experimente online!
fonte