Cuando publicamos algún software, le asignamos un número de versión. Y los usuarios pueden querer actualizar a la última versión de algún software. Entonces, es el momento de averiguar qué versión debería ser más nueva.
Entrada
Ingrese dos números de versión como cadenas.
En el contexto de este desafío, solo admitimos números de versión que son algunos dígitos unidos por puntos.
- Un número de versión es una cadena que solo puede contener dígitos (
0
~9
) y puntos (.
). - Los puntos no serían el primer / último carácter de un número de versión.
- Debe haber algunos dígitos entre puntos. No pueden aparecer dos puntos continuamente.
- Todos los números en un número de versión serían menores que 2 16 .
Salida
Compare los números de versión ingresados y genere si el primero es mayor que / igual a / menor que el segundo. Puede elegir una de las siguientes presentaciones:
- Use número positivo / cero / número negativo, mientras que cero significa igual;
- Use tres valores distintos constantes;
Comparando
No es necesario que implemente el algoritmo descrito en esta sección. Su envío es válido siempre que resulte el mismo resultado con este algoritmo.
- Los números de versión son algunos números decimales unidos por puntos. Primero dividimos los dos números de versión en matrices de números;
- Rellenar el final de las matrices con ceros para que tengan la misma longitud;
- Compare desde el primer elemento hasta el último:
- Si los dos elementos de la matriz son diferentes, el número mayor significa un número de versión mayor
- Si son iguales, continúe comparando los siguientes elementos;
- Si todos los elementos de la matriz son iguales, las dos versiones son iguales.
Casos de prueba
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 >
Respuestas:
Python 2 ,
847976 bytesPruébalo en línea!
Salidas
-1,0,1
para<,=,>
fuente
05AB1E (heredado) ,
151413 bytesSalidas
-1 [] 1
para< = >
respectivamente.-1 byte gracias a @Emigna .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
0K
lugar deʒĀ}
.R , 32 bytes
Pruébalo en línea!
Usando un R incorporado
Salidas
1 2
,1.5 1.5
,2 1
por menos, igual, mayor.Mejor hasta ahora, sin construir:
R ,
151 142 125107 bytesPruébalo en línea!
Código desenrollado con explicación:
Salidas
-1
,NULL
,1
por menos, igual, mayor.Concepto original, golfizado usando
sapply
,[<-
y%*%
:R , 129 bytes
Pruébalo en línea!
Ahora tiene una lista de dos vectores de enteros de igual longitud. Calcule las diferencias por pares usando
Reduce
y genere el primer elemento que no sea cero usando la pequeña y delicadaw[!!w][1]
forma al final.Salidas
-1
,NA
,1
por menos, igual, mayor.fuente
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]
(o 106 si desea devolver -1, NA, 1 no (negativo), NA, (positivo).0
y no (implícitamente)NA
. He respondido un Wiki de la comunidad para que cualquiera que pueda solucionarlo pueda agregarlo.Find(c,x)
. Creo que es un nuevo truco.APL (Dyalog Unicode) ,
1817 bytes1 byte guardado gracias a @ Adám por usar en
⍤1
lugar de∘↑(...)¨
y cambiando el formato de entrada de una matriz anidada a una matrizPruébalo en línea!
Toma la entrada como una matriz de caracteres como el argumento correcto, donde cada cadena de versión está en su propia fila. Salidas
¯1 1
,0 0
,1 ¯1
para<
,=
,>
respectivamente.(⍎¨∊∘⎕D⊆⊢)⍤1
en cada fila∊∘⎕D⊆⊢
agrupar todas las apariciones de dígitos, es decir, dividir en.
⍎¨
y convertir cada una de estas ocurrencias en un número↑
convertir a una matriz, donde la primera entrada está en la fila superior y la segunda en la parte inferior, rellenando con0
s donde sea necesario(⍋-⍒)
y-
sustraer⍒
los índices en las filas que los ordenarían en orden descendente⍋
igual que la parte superior pero para orden ascendentefuente
Perl 6 ,
63 4722 bytesPruébalo en línea!
Resulta que Perl 6 tiene un tipo de versión que se ajusta bastante a la descripción. Este es un bloque de código anónimo que toma una lista de dos cadenas de versión y devuelve
More
,Same
oLess
.Explicación:
O, sin tipos incorporados para 47 bytes:
Pruébalo en línea!
Bloque de código anónimo que toma dos cadenas y devuelve
More
si el segundo es mayor,Less
si el segundo es más pequeño yNil
si son iguales.Explicación:
fuente
Brachylog ,
4940 bytes... Sigue siendo bastante impresionante.
Espera una lista de dos cadenas. Usos
positive number / zero / negative number
como> / = / <
.Pruébalo en línea!
Explicación
Dividiendo las entradas
Dada una entrada que no unificar con
[0, 0]
, tales como["1.02.0", "1.2.0.1.0"]
, el siguiente salidas de segmento, por ejemplo,[[1, "02.0"], [1, "2.0.1.0"]]
.Comparar las entradas
Dado, por ejemplo,
[[1, "02.0"], [1, "2.0.1.0"]]
comprime las sublistas[[1, 1], ["02.0", "2.0.1.0"]]
y compara los valores en el encabezado ([1,1]
). Recurre en la segunda sublista. Tenga en cuenta que el predicado zipz
recorre las listas más cortas, de modo que comprimir con[0,0]
es equivalente a comprimir con[0]
, por lo tanto, el paso anterior se unifica0
con0
sin agregar más valores.fuente
JavaScript (ES6),
7368 bytesGuardado 5 bytes gracias a @redundancy
(a)(b)
Pruébalo en línea!
fuente
replace
confill
. Los operandos para-
se intercambian ya que ambos deben ser obligados a un número. Pruébalo en línea!a
eventualmente recorra esos valores 0 sib
contiene más segmentos de números quea
. Sucede que el método más corto para garantizar que sea así es dividirlo en unab
cadena de longitud de '.' aprovechando la división existente aplicada aa
.Java (JDK 10) ,
2019689 bytesPruébalo en línea!
Devuelve un número negativo si la primera versión es más pequeña que la segunda, una positiva si la primera versión es mayor que la segunda y
0
si son iguales.Sí, eso es un trabajo pesado para "simplemente" llamar a un incorporado!
Créditos
fuente
try-finally
para que el if-check pueda simplificarse; intentado volver dentro del bucle ift!=0
; intentado usarInteger
yi.compare(i.valueOf(...),i.valueOf(...))
; intenté usar genéricos como este<T>T[]g(T s){return(T[])(s+"").replaceAll("(\\.0+)*$","").split("\\.");}
; etc. Todos son 2-6 bytes más largos. Si usted (o alguien más) encuentra algo más, hágamelo saber por favor. Curioso por saber qué. :)2^16
". Rangos cortos de - (2 ^ 15) a 2 ^ 15-1.Python 2 , 87 bytes
Pruébalo en línea!
Salidas -1,0,1 para <, =,>, respectivamente.
fuente
Retina 0.8.2 , 54 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Utiliza el valor del separador como salida de igualdad, por lo que, por conveniencia, el encabezado convierte el separador de entrada,
=
pero podría ser cualquier cosa que no esté dentro[.\d]
. Explicación:Convierte a unario.
Elimina repetidamente el primer carácter de cada lado hasta que difieran o un lado se agote. Esto es mucho más rápido que intentar unir prefijos, aunque posiblemente no sea más golfista. En este punto, las cadenas están en una de varias formas, que deben decodificarse para obtener un resultado de comparación.
1
entonces el resultado es=
1
entonces el resultado es>
1
entonces el resultado es<
<
>
Otra forma de pensar en esto es que si una cadena contiene a
1
y la otra no comienza con a,1
entonces esa cadena es mayor, sin embargo, eso resulta ser un byte más largo.Verifique el caso 3 o el caso 4 sin el caso 1.
Si la cadena izquierda todavía contiene un a
1
en este punto, entonces es mayor.De lo contrario, elimine cualquier sobrante de
.
s.Firefox Browser Console REPL, 19 bytes
Creo que esta función interna realiza la comparación requerida. Devuelve -1, 0 o 1.
fuente
Cu.import("resource://gre/modules/Services.jsm");
contarse?PHP , 38 bytes
Salidas
-1 → < | 0 → = | 1 → >
Pruébalo en línea!
fuente
1.0.0
y1
C (gcc) ,
140134 bytesEste código genera un negativo,
0
o un positivo para<
,=
o>
respectivamente.Pruébalo en línea!
Ediciones:
fuente
Ruby , 75 bytes
Pruébalo en línea!
fuente
JavaScript (Node.js) ,
1058880 bytes-17 bytes de @redundancy. ¡Guauu!
-8 bytes eliminando Math.sign. Gracias @tsh
Devuelve un valor negativo, cero o positivo.
Pruébalo en línea!
fuente
exec
para dividir cadenas. Pruébalo en línea!Japt ,
1611 bytes-5 bytes de @Shaggy
Salidas:
<
null
o0
) para=
>
Pruébalo en línea!
fuente
< = >
respectivamente, pero no sé si la entrada puede tomarse como una matrizLimpio ,
116111 bytesPruébalo en línea!
Emite un número negativo cuando el primer argumento es menor que el segundo, cero cuando son equivalentes y un número positivo cuando es mayor que el segundo.
fuente
Swift 4 , 155 bytes
Encabezado (sin contar: el código no es recursivo):
Código
Pruébalo en línea!
Explicaciones
Constantes devueltas
fuente
JavaScript 64 bytes
Pruébalo en línea!
Con comentarios:
fuente
Perl 5 , 55 bytes
Pruébalo en línea!
fuente
Burlesque - 17 bytes
Si desea salida en '> <=', agregue
?i"<=>"j!!Q
.fuente
Powershell, 88 bytes
Devuelve
0
para igual, apositive integer
para mayor que o anegative integer
para menor que.Menos guión de prueba de golf:
Salida:
fuente
Dart ,
277231 bytesPruébalo en línea!
fuente
Swift 4 + Foundation ,
160 bytes (142 + 18), 155 bytes (142 + 13)Importar (13 bytes, incluso
;
para separar del código):Esto importará Foundation, pero es 5 bytes más corto que
import Foundation
.Encabezado (sin contar: el código no es recursivo):
Código (142 bytes):
Pruébalo en línea!
Explicaciones
Constantes devueltas
fuente
import
declaración, por lo que publiqué una respuesta separada que no requiereFoundation
y con un recuento de bytes entre 142 bytes (sin contar la importación) y 160 bytes (contando la importación).Zsh , 54 bytes
Pruébalo en línea! ¡Prueba una suite de prueba!
Esto
eval
es para las siguientes ocho declaraciones:Entonces los tres valores únicos son:
fuente