Quando publicamos algum software, atribuímos um número de versão a ele. E os usuários podem querer atualizar para a versão mais recente de alguns softwares. Portanto, é hora de descobrir qual versão deve ser mais nova.
Entrada
Insira dois números de versão como seqüências de caracteres.
No contexto desse desafio, suportamos apenas números de versão, que são alguns dígitos unidos por pontos.
- Um número de versão é uma sequência que pode conter apenas dígitos (
0
~9
) e pontos (.
). - Pontos não seriam o primeiro / último caractere de um número de versão.
- Deve haver alguns dígitos entre os pontos. Dois pontos não podem aparecer continuamente.
- Todos os números em um número de versão seriam menores que 2 16 .
Saída
Compare os números de versão introduzidos e produza se o primeiro é maior que / igual a / menor que o segundo. Você pode escolher uma das seguintes apresentações:
- Use número positivo / zero / número negativo, enquanto zero significa igual;
- Use três valores distintos constantes;
Comparando
Você não é obrigado a implementar o algoritmo descrito nesta seção. Seu envio é válido desde que resulte a mesma saída com este algoritmo.
- Os números de versão são alguns números decimais unidos por pontos. Primeiro, dividimos os dois números de versão em matrizes de números;
- Preenchendo o final de matrizes com zeros para torná-los com o mesmo comprimento;
- Compare do primeiro item ao último:
- Se os dois itens da matriz forem diferentes, o número maior significa um número de versão maior
- Se forem iguais, continue a comparar os seguintes itens;
- Se todos os itens da matriz forem iguais, as duas versões serão iguais.
Casos de teste
version1 version2 result
2 1 >
1.0.0 1 =
1.0 1.0.0 =
1.2.42 1.2.41 >
1.1.56789 1.2.0 <
1.10 1.2 >
1.20 1.150 <
18.04 18.4 =
7.010 7.8 >
1.0.0.1.0 1.00.00.2 <
00.00.01 0.0.0.1 >
0.0.1 0.1 <
42.0 4.2.0 >
999.999 999.999.1 <
2018.08.1 2018.08 >
Respostas:
Python 2 ,
847976 bytesExperimente online!
Saídas
-1,0,1
para<,=,>
fonte
05AB1E (herdado) ,
151413 bytesSaídas
-1 [] 1
para< = >
respectivamente.-1 byte graças a @Emigna .
Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
0K
vez deʒĀ}
.R , 32 bytes
Experimente online!
Usando um R embutido
Saídas
1 2
,1.5 1.5
,2 1
para menos, igual, maior.Melhor até agora, sem embutido:
R ,
151 142 125107 bytesExperimente online!
Código desenrolado com explicação:
Saídas
-1
,NULL
,1
para menos, igual, maior.Conceito original, golfed para baixo usando
sapply
,[<-
e%*%
:R , 129 bytes
Experimente online!
Agora você tem uma lista de dois vetores de comprimento igual de números inteiros. Calcule as diferenças entre pares usando
Reduce
e produza o primeiro elemento diferente de zero usando a pequenaw[!!w][1]
forma complicada no final.Saídas
-1
,NA
,1
para menos, igual, maior.fonte
scan
function(a,b,d=scan(t=a,se='.'),e=scan(t=b,se='.'),f=1:max(lengths(list(d,e))),g=d[f]-e[f])g[!!g][1]
(ou 106 se você quiser retornar -1, NA, 1 não (negativa), NA, (positivo).0
e não (implicitamente)NA
. Fiz a resposta em um Wiki da comunidade para que quem puder consertá-lo possa adicioná-lo.Find(c,x)
. Eu acho que é um novo truque.APL (Dyalog Unicode) ,
1817 bytes1 byte salvo graças a @ ADAM para usar
⍤1
em vez de∘↑(...)¨
e, alterando o formato de entrada a partir de uma matriz aninhada para uma matrizExperimente online!
Recebe a entrada como uma matriz de caracteres como o argumento correto, em que cada string de versão está em sua própria linha. Saídas
¯1 1
,0 0
,1 ¯1
para<
,=
,>
respectivamente.(⍎¨∊∘⎕D⊆⊢)⍤1
em cada linha∊∘⎕D⊆⊢
agrupe todas as ocorrências de dígitos, ou seja, divida em.
⍎¨
e converta cada uma dessas ocorrências em um número↑
converter para uma matriz, onde a primeira entrada está na linha superior e a segunda na parte inferior, preenchendo com0
s quando necessário(⍋-⍒)
e-
subtrair⍒
os índices nas linhas que os ordenariam em ordem decrescente⍋
igual ao topo, mas por ordem crescentefonte
Perl 6 ,
63 4722 bytesExperimente online!
Acontece que o Perl 6 tem um tipo de versão que praticamente se encaixa na descrição. Este é um bloco de código anônimo que pega uma lista de duas seqüências de versão e retorna ou
More
,Same
ouLess
.Explicação:
Ou, sem tipos internos para 47 bytes:
Experimente online!
Bloco de código anônimo que pega duas cadeias e retorna
More
se a segunda for maior,Less
se a segunda for menor eNil
se forem iguais.Explicação:
fonte
Braquilog ,
4940 bytes... Ainda é bastante inexpressivo.
Espera uma lista de duas cadeias. Usa
positive number / zero / negative number
como> / = / <
.Experimente online!
Explicação
Dividindo as entradas
Dada uma entrada que não se une
[0, 0]
, como, por exemplo["1.02.0", "1.2.0.1.0"]
, as saídas do segmento abaixo, por exemplo[[1, "02.0"], [1, "2.0.1.0"]]
,.Comparando as entradas
Dado, por exemplo,
[[1, "02.0"], [1, "2.0.1.0"]]
fecha os sublistas[[1, 1], ["02.0", "2.0.1.0"]]
e compara os valores na cabeça ([1,1]
). Recorra na segunda sublist. Observe que o predicado zipz
percorre listas mais curtas, de modo que fechar com[0,0]
é equivalente a fechar com[0]
, portanto, a etapa anterior se unifica0
com0
sem valores adicionais anexados.fonte
JavaScript (ES6),
7368 bytesGuardado 5 bytes graças a @redundancy
(a)(b)
Experimente online!
fonte
replace
porfill
. Os operandos de-
são trocados, pois agora ambos devem ser coagidos a um número. Experimente online!a
eventualmente alterne entre esses valores 0 seb
contiver mais segmentos numéricos quea
. Acontece que o método mais curto de garantir isso é dividir-se em umab
cadeia de comprimento de '.' aproveitando a divisão existente aplicada aa
.Java (JDK 10) ,
2019689 bytesExperimente online!
Retorna um número negativo se a primeira versão for menor que a segunda, um positivo se a primeira versão for maior que a segunda e
0
se forem iguais.Sim, isso é um trabalho pesado para "apenas" chamar um built-in!
Créditos
fonte
try-finally
para que a verificação do if possa ser simplificada; tentei retornar dentro do loop ift!=0
; tentei usarInteger
ei.compare(i.valueOf(...),i.valueOf(...))
; tentou usar genéricos como este<T>T[]g(T s){return(T[])(s+"").replaceAll("(\\.0+)*$","").split("\\.");}
; etc. Todos têm de 2 a 6 bytes. Se você (ou qualquer outra pessoa) encontrar algo mais, entre em contato. Curioso para saber o que. :)2^16
". Curtos intervalos de - (2 ^ 15) a 2 ^ 15-1.Python 2 , 87 bytes
Experimente online!
Saídas -1,0,1 para <, =,>, respectivamente.
fonte
Retina 0.8.2 , 54 bytes
Experimente online! O link inclui casos de teste. Usa o valor do separador como saída de igualdade, portanto, por conveniência, o cabeçalho converte o separador de entrada em,
=
mas pode ser qualquer coisa que não esteja presente[.\d]
. Explicação:Converta para unário.
Exclua repetidamente o primeiro caractere de cada lado até que eles diferam ou um lado acabe. Isso é muito mais rápido do que tentar combinar prefixos, embora possivelmente não seja um jogador de golfe. Nesse ponto, as cadeias estão em uma das várias formas, que precisam ser decodificadas para um resultado de comparação.
1
, o resultado será=
1
, o resultado será>
1
, o resultado será<
<
>
Outra maneira de pensar sobre isso é que, se uma string contém um
1
e o outro não inicia com um1
, essa string é maior, no entanto, isso acaba sendo um byte mais longo.Verifique o caso 3 ou o caso 4 sem o caso 1.
Se a string esquerda ainda contiver
1
a nesse ponto, será maior.Caso contrário, exclua as sobras de
.
s.Console do navegador Firefox REPL, 19 bytes
Acredito que essa função interna realize a comparação necessária. Retorna -1, 0 ou 1.
fonte
Cu.import("resource://gre/modules/Services.jsm");
ser contado?PHP , 38 bytes
Saídas
-1 → < | 0 → = | 1 → >
Experimente online!
fonte
1.0.0
e1
C (gcc) ,
140134 bytesEste código emite um negativo,
0
ou um positivo para<
,=
ou>
respectivamente.Experimente online!
Edições:
fonte
Ruby , 75 bytes
Experimente online!
fonte
JavaScript (Node.js) ,
1058880 bytes-17 bytes de @redundancy. Uau!
-8 bytes removendo Math.sign. Obrigado @tsh
Retorna um valor negativo, zero ou positivo
Experimente online!
fonte
exec
para dividir seqüências de caracteres. Experimente online!Japonês ,
1611 bytes-5 bytes de @Shaggy
Saídas:
<
null
ou0
) para=
>
Experimente online!
fonte
< = >
, respectivamente, mas não sei se a entrada pode ser tomado como uma matrizLimpo ,
116111 bytesExperimente online!
Emite um número negativo quando o primeiro argumento é menor que o segundo, zero quando são equivalentes e um número positivo quando é maior que o segundo.
fonte
Swift 4 , 155 bytes
Cabeçalho (não contado: o código não é recursivo):
Código
Experimente online!
Explicações
Constantes retornadas
fonte
JavaScript 64 bytes
Experimente online!
Com comentários:
fonte
Perl 5 , 55 bytes
Experimente online!
fonte
Burlesco - 17 bytes
Se você deseja saída em '> <=', adicione
?i"<=>"j!!Q
.fonte
PowerShell, 88 bytes
Retorna
0
para igual, apositive integer
para maior que ou anegative integer
para menor que.Script de teste com menos golfe:
Saída:
fonte
Dardo ,
277231 bytesExperimente online!
fonte
Swift 4 + Foundation ,
160 bytes (142 + 18), 155 bytes (142 + 13)Importação (13 bytes, incluindo
;
para separar do código):Isso importará o Foundation, mas é 5 bytes menor que
import Foundation
.Cabeçalho (não contado: o código não é recursivo):
Código (142 bytes):
Experimente online!
Explicações
Constantes retornadas
fonte
import
declaração, então postei uma resposta separada que não exigeFoundation
e com uma contagem de bytes entre 142 bytes (sem contar a importação) e 160 bytes (sem contar a importação).Zsh , 54 bytes
Experimente online! Experimente uma suíte de testes!
Trata-
eval
se das oito declarações a seguir:Portanto, os três valores únicos são:
fonte