Dada uma entrada de sequência, escreva um programa que imprima um valor de verdade para STDOUT ou equivalente se a entrada for um UUID válido, sem usar expressões regulares.
Um UUID válido é
32 dígitos hexadecimais, exibidos em cinco grupos separados por hífens, no formato 8-4-4-4-12, para um total de 36 caracteres (32 caracteres alfanuméricos e quatro hífens).
Casos de teste
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)
Regras
- Expressões regulares não são permitidas
- Correspondência de padrão literal que é como uma regex não é permitida. Por exemplo, usando
[0-9a-fA-F]
ou outros identificadores hexadecimais (nós chamaremos isson
) e, em seguida, correspondendonnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn
oun[8]-n[4]-n[4]-n[4]-n[12]
não é permitido - A entrada pode ser retirada de
STDIN
ou como argumento para uma função - A entrada não diferencia maiúsculas de minúsculas
- É seguro assumir que a entrada não conterá feeds de linha ou novas linhas.
- A entrada pode conter caracteres ASCII imprimíveis (espaços incluídos)
- Um valor de verdade deve ser impresso
STDOUT
ou equivalente se a entrada for um uuid válido - Um valor de falsey deve ser impresso
STDOUT
ou equivalente se a entrada não for um uuid válido - Se estiver usando uma função, em vez de usar
STDOUT
, a saída pode ser o valor de retorno da função - O valor de verdade / falsey não pode ser impresso em
STDERR
. - Aplicam-se brechas padrão
- Isso é código-golfe , então o programa mais curto em bytes vence. Boa sorte!
Entre os melhores
Este é um snippet de pilha que gera um placar de líderes e uma visão geral dos vencedores por idioma.
Para garantir que sua resposta seja exibida, inicie sua resposta com um título, usando o seguinte modelo de remarcação
## Language Name, N bytes
Onde N é o tamanho, em bytes, do seu envio
Se você deseja incluir vários números no seu cabeçalho (por exemplo, localizar pontuações antigas ou incluir sinalizadores na contagem de bytes), verifique se a pontuação real é o último número no cabeçalho
## Language Name, <s>K</s> X + 2 = N bytes
fonte
\h{8}-\h{4}-\h{4}-\h{4}-\h{12}
(onde\h
é um dígito hexadecimal) são válidas.Respostas:
CJam,
313029 bytesExecute todos os casos de teste aqui.
Explicação
Em vez de o padrão corresponder diretamente à entrada, primeiro a transformamos em um formato mais simples, que pode ser facilmente comparado a uma única sequência de padrões.
fonte
JavaScript ES6,
735556 caracteresA versão anterior de 55 caracteres tem um problema com espaços à direita no grupo:
Teste:
fonte
PowerShell,
2921844937 bytesMuito obrigado às pessoas nos comentários que auxiliam neste golfe para acompanhar as novas regras - TessellatingHeckler , iFreilicht , Jacob Krall e Joey . Consulte o histórico de edições para obter revisões e versões mais antigas.
Esta revisão recebe entrada como
$g
, em seguida, cria uma nova tabela de hash@{}
com um elemento, o índice36
é definido igual a$g-as[guid]
. Isso usa o-as
operador interno para tentar a conversão entre dois tipos de dados .NET - de[string]
para[guid]
. Se a conversão for bem-sucedida, um[guid]
objeto será retornado, e mais$null
será retornado. Esta parte garante que a sequência de entrada seja um .NET GUID válido.O próximo passo é indexar na tabela de hash com
[$g.length]
. Se$g
não tiver exatamente 36 caracteres, a tabela de hash retornará$null
, que será exibida como um valor falsey. Se$g
tiver 36 caracteres, o resultado da chamada do .NET será gerado. Se$g
não for um GUID .NET válido (de qualquer forma), será$null
exibido como um valor falsey. Caso contrário, ele produzirá um objeto GUID do .NET como um valor verdadeiro - a única maneira de gerar esse resultado é se ele corresponder ao formato solicitado do desafio.Exemplos
Aqui estou encapsulando a chamada de script em parens e explicitamente lançando como um booleano para maior clareza.
fonte
!!($args[0]-as[guid])
com 21 bytes.!!()
? Como os valores$NULL
e[guid]
são mutuamente exclusivos, eles se qualificam para representar valores verdadeiros e falsos, não é? Enfim, ótima maneira de converter para booleano, adore a solução!True
para0FCE98AC13264C798EBC94908DA8B034
, que não tem hífens0FCE98AC-1326-4C79-8EBC-94908DA8B034D
(D extra no final), retorna falsey$TRUE
, pois apenas apara o dígito ofensivo e os 36 primeiros caracteres são válidos.Emacs Lisp, 236 bytes
Ungolfed:
fonte
Devido a alterações nas regras , esta resposta não é mais competitiva :(
C, 98
Principalmente bastante auto-explicativo. O
%n
especificador de formato fornece o número de bytes lidos até agora, que deve ser 36.scanf()
retorna o número de itens correspondentes, que devem ser 6. A final%c
não deve corresponder a nada. Se isso acontecer, haverá um texto à direita escanf()
retornará 7.Compile com
-w
para suprimir os avisos traquinas (existem vários).fonte
JavaScript ES6, 70
83NOTA thx para @Qwertiy por encontrar um erro (e sugerir algumas melhorias e correções)
Thx @ CᴏɴᴏʀO'Bʀɪᴇɴ 2 bytes salvos
Outros 9 bytes salvos simplificando a verificação de comprimento (a maneira complexa foi mais curta no primeiro rascunho, mas não agora)
Explicado
Snippet de teste
fonte
-1-('0x'+h)
=>1/('0x'+h)
00000000-0000-0000-000 -000000000000
every
chamadau
há uma string, não uma matrizDevido a alterações nas regras , esta resposta não é mais competitiva :(
Pure Bash (sem utilitários externos), 78
Recebe entrada da linha de comando.
printf
cria a seguinte seqüência de caracteres- - - -
.p=
linha transforma este com o seguinte padrão:[[: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:]]
. Observe que isso se parece muito com uma expressão regular. No entanto, não é neste contexto. É um padrão para correspondência de padrões de shell . O conceito é semelhante a uma expressão regular, mas é uma construção (e sintaxe) diferente.Idiomatic to shell, um código de retorno 0 indica sucesso / VERDADEIRO e 1 indica falha / FALSO. O código de retorno pode ser inspecionado
echo $?
após a execução do script.fonte
tr
também usa classes de caracteres Posix, mas não é um analisador de expressões regulares.Jolf, 32 bytes
Experimente aqui!
Devido a um erro no meu código, isso é mais longo do que deveria. :(
[8,4,4,4,12]
deve ser o mesmo que{8444*26}
, mas}
também é o fechamento de uma função: Pfonte
MATL , 55 bytes
Abstive-me de usar a
Yb
função (strsplit
) porque é um pouco semelhante aregexp(..., 'split')
. Isso usa apenas indexação e comparações de caracteres.Exemplo
Explicação
fonte
CJam,
5242 bytesExperimente online . Emite a string original, se true, em branco, se false ( isso é permitido ).
Explicação:
fonte
A7*)<
não removerá muitos caracteres inválidos, como espaços+
,?
...Julia, 86 bytes
Esta é uma função anônima que aceita uma string e retorna um booleano. Para chamá-lo, dê um nome, por exemplo
f=s->...
.Ungolfed:
fonte
Bytes em C # 196
Ungolfed:
O método
T
pode ser chamado com qualquer sequência não nula e retornarátrue
para GUIDs válidos,false
caso contrário. Esta é uma validação em tempo constante; ao custo de três caracteres, você pode sair antecipadamente do método (alterari < v.Length
parai < v.Length && r
).Tentará diminuir o número de bytes mais tarde.
Obviamente, deixei de lado o
Guid.ParseExact
caminho, porque é que está divertido nisso? Aqui está, sem muita tentativa de avançar ainda mais em 86 bytes :Ungolfed:
fonte
Python 2,
99112 bytesEm uma entrada válida, ele imprime
True
. Em uma entrada inválida, ela é impressaFalse
ou0
, dependendo do motivo da invalidez.False
e0
são ambos falsey em Python.A função tem que verificar 3 coisas:
ABCDEF
Aqui está um detalhamento para mostrar como ele os verifica. Está um pouco desatualizado, mas estou com fome, por isso vou atualizá-lo mais tarde.
fonte
return
comprint
. (Caso em que você definitivamente vai querer estar em Python 2, porqueprint
funciona de maneira diferente em Python 3.)map
agora retorna um "objeto de mapa", não uma lista.int
função permite espaços -0FCE98ac-1326-4c79-8EBC-94908da8B03
com um espaço à direita. Veja o comentário na resposta Pyth excluída aqui, se possível.Python 2, 57 bytes
Graças a Deus por embutido! - inclua cadeias entre aspas.
fonte
1
para entrada12345678123456781234567812345678
.try:print uuid.UUID(input())
porque tudo o que é necessário é que você imprima um valor truthyPitão, 39 bytes
Experimente aqui .
fonte
\
caractereK\-k
, por isso ele não é executado como está.Perl 6 ,
8367 bytes(as contagens não incluem novas linhas ou recuos, pois não são necessárias)
uso:
fonte
Lisp comum - 161
O valor retornado se true for o hash, como um número, que é um resultado útil a ter.
Ungolfed
fonte
F # 44 caracteres
Em F #, funções com
out
parâmetros podem ser chamadas omitindo o parâmetro out; seu valor no retorno será combinado com o verdadeiro valor de retorno da função em uma tupla.Aqui, a tupla é canalizada para o
fst
função, que retorna seu primeiro membro, que nesse caso é o valor de retorno booleano de TryParseExact, indicando o sucesso ou falha da chamada.Como verificação do formato correto, retornamos
true
apenas se a sequência tiver 36 caracteres.Antes de ver a resposta em C # do RobIII, eu não tinha pensado em usar o TryParseExact, então minha resposta foi ter três caracteres a mais:
TryParse(string, Guid)
aceita entrada nos seguintes formatos:Destes, apenas o segundo tem 36 caracteres.
fonte
Python 2,
938985 bytesA
map()
chamada garante que as seções tenham o comprimento correto eall()
testa cada caractere como sendo um hífen ou um dígito hexadecimal de caso arbitrário. A expressão do gerador está testando cada caractere iterando toda a cadeia, portanto, não é o método mais eficiente, receio, mas deve satisfazer os casos de teste:fonte
f=
espaços ao redor da cadeia noall
bloco.all(..)
para definir testes inclusão:set(u)<=set("-0123456789abcdefABCDEF")
.SAS,
171144141Na verdade, usa stdin e stdout - um dos recursos menos conhecidos desse idioma em particular. Trabalhos para os exemplos dados até agora, mas possivelmente não em todos os casos. Provavelmente pode ser melhorado.
Melhor abordagem - um personagem de cada vez:
Golfou outros 6 caracteres fora da expressão central!
Ungolfed:
Isso gera alguns avisos e notas no log, mas não os imprime em stdout ou stderr, então acho que este é um jogo justo.
fonte
C, 391 bytes
fonte
MATLAB, 126 bytes
fonte
Python 3, 134 bytes
int (k, 16) tenta converter k em uma base 16 int. Em um caractere diferente de 0-9a-fA-F-, ele falha; nesse caso, retornamos 0, o que é falso. Adicione 1 a esse int e obteremos um valor de verdade garantido - removemos todos os hífens com str.split () para que não possamos obter o valor -1 e todos os ints diferentes de 0 são verdadeiros.
fonte
Função C, 102
Uma mudança de regra não permitiu minha
scanf()
resposta anterior baseada em c , então aqui está outra resposta c usando aisxdigit()
qual acho que deveria poder competir :Experimente online.
-
caracteres (ASCII 45) nas posições relevantes - se houver, substitua-os por0
s (ASCII 48 (= 45 + 3))isxdigit()
fonte
Lote,
148139 + 2 =150141 bytesAdicionado 2 bytes porque você precisa usar o
/v
switch paraCMD.EXE
.Sai com ERRORLEVEL 0 em caso de sucesso, 1 em caso de falha.
Editar: salvou alguns bytes principalmente porque não
:=
diferencia maiúsculas de minúsculas, mas também houve outros ajustes.fonte
Java, 345 bytes
A entrada é o primeiro argumento da linha de comandos. Saída é código de erro (0 significa UUID válido, 1 significa inválido)
Ungolfed com comentários:
EDIT: Não percebeu a parte STDOUT. Opa, corrigido agora.
fonte
if(b.length>36||b.length<36)
com simplesmenteif(b.length!=36)
. Além disso, como é possível imprimir valores reais , você pode simplesmente imprimir em0
vez de1<0
e em1
vez de1>0
.if(truthy_value){ doSomethingOnYes(); } else{ doSomethingOnFalse(); }
Assim, em Java um booleano é um valor truthy, mas1
ou0
não é. Somente quando o OP de um desafio diz algo como: " Sua saída pode ser verdadeiro / falso, 0/1, vazia / não vazia; contanto que você especifique o que você usa. ", Então você pode realmente usar0
e1
, em vez detrue/false
como truthy / valor de falsey.if(b.length!=36)
;||
pode estar|
em vários lugares, bem como&&
para&
;if(...!='-')
pode serif(...!=45)
;int i=-1; ... while(++i<b.length){
pode ser substituído porfor(int i=-1;++i<b.length;){
;'F'
pode ser70
('f'
poderia ser 102, mas isso não importa, pois é a mesma contagem de bytes). Eu gosto de como você usoujava.io.PrintStream u=System.out;
btw, eu devo lembrar disso! Então obrigado.Swift 3, 50 bytes
Passar em uma string
s
fonte
PHP, 109 bytes
imprime 1 para verdadeiro e 0 para falso
$i>7&$i<24&!($i%5-3)
é 5 bytes mais curto que oin_array($i,[8,13,18,23])
112 bytes
113 bytes
fonte
Java,
172 bytes168 bytes (Thanks Wheat Wizard)Meio barato desde que eu usei java.util.UUID, mas aqui vai:
Versão não destruída:
fonte
try
e{
.String[]
ea
. Além disso, você poderá substituirprintln
porprint
.java.util.UUID.fromString
vez de importar.AWK, 98 bytes
Simplesmente divide a linha em cada caractere e verifica se cada caractere é um dígito hexadecimal e se há hífens nos locais apropriados.
strtonum
converte caracteres inválidos em0
. Fazer a comparação entre0
em
(e caractere inválido escolhido arbitrariamente) requer etapas adicionais. Felizmente,01
é um número hexadecimal válido, masm1
não é.Inicialmente, escrevi dois
for
loops, mas economizei 1 byte pressionando-os. :)NOTA:
GAWK
pode ler a entrada como números hexadecimais, mas isso requer uma opção de linha de comando muito longa.fonte