Lorsque nous publions un logiciel, nous lui attribuons un numéro de version. Et les utilisateurs peuvent vouloir mettre à jour vers la dernière version de certains logiciels. C'est donc le moment de découvrir quelle version devrait être la plus récente.
Contribution
Saisissez deux numéros de version sous forme de chaînes.
Dans le cadre de ce défi, nous ne prenons en charge que les numéros de version qui sont des chiffres joints par des points.
- Un numéro de version est une chaîne qui ne peut contenir que des chiffres (
0
~9
) et des points (.
). - Les points ne seraient pas le premier / dernier caractère d'un numéro de version.
- Il doit y avoir des chiffres entre les points. Deux points ne peuvent apparaître en continu.
- Tous les numéros d'un numéro de version seraient inférieurs à 2 16 .
Sortie
Comparez les numéros de version saisis et indiquez si le premier est supérieur / égal à / inférieur au second. Vous êtes autorisé à choisir l'une des présentations suivantes:
- Utilisez un nombre positif / zéro / nombre négatif, tandis que zéro signifie égal;
- Utilisez trois valeurs distinctes constantes;
Comparant
Vous n'êtes pas obligé d'implémenter l'algorithme décrit dans cette section. Votre soumission est valide tant qu'elle donne la même sortie avec cet algorithme.
- Les numéros de version sont des nombres décimaux joints par des points. Nous avons d'abord divisé les deux numéros de version en tableaux de nombres;
- Remplir la fin des tableaux avec des zéros pour leur donner la même longueur;
- Comparez du premier article au dernier:
- Si les deux éléments du tableau sont différents, le plus grand nombre signifie un plus grand numéro de version
- S'ils sont identiques, continuez à comparer les éléments suivants;
- Si tous les éléments du tableau sont égaux, les deux versions sont égales.
Cas de test
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 >
Réponses:
Python 2 ,
847976 octetsEssayez-le en ligne!
Sorties
-1,0,1
pour<,=,>
la source
05AB1E (hérité) ,
151413 octetsSorties
-1 [] 1
pour< = >
respectivement.-1 octet grâce à @Emigna .
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
0K
place deʒĀ}
.R , 32 octets
Essayez-le en ligne!
Utilisation d'un R intégré
Sorties
1 2
,1.5 1.5
,2 1
moins, égal, supérieur.Meilleur jusqu'à présent, sans intégré:
R ,
151 142 125107 107 octetsEssayez-le en ligne!
Code déroulé avec explication:
Sorties
-1
,NULL
,1
moins, égal, supérieur.Concept original, golfé en utilisant
sapply
,[<-
et%*%
:R , 129 octets
Essayez-le en ligne!
Vous avez maintenant une liste de deux vecteurs d'entiers de longueur égale. Calculez les différences par paire en utilisant
Reduce
et sortez le premier élément non nul en utilisant la petitew[!!w][1]
forme délicate à la fin.Sorties
-1
,NA
,1
moins, égal, supérieur.la source
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 si vous souhaitez renvoyer -1, NA, 1 non (négatif), NA, (positif).0
et non (implicitement)NA
. J'ai fait de la réponse un wiki communautaire pour que quiconque puisse le réparer puisse simplement l'ajouter.Find(c,x)
. Je pense que c'est une nouvelle astuce.APL (Dyalog Unicode) ,
1817 octets1 octet enregistré grâce à @ Adám pour avoir utilisé à la
⍤1
place∘↑(...)¨
et en changeant le format d'entrée d'un tableau imbriqué à une matriceEssayez-le en ligne!
Prend l'entrée comme une matrice de caractères comme argument de droite, où chaque chaîne de version est sur sa propre ligne. Sorties
¯1 1
,0 0
,1 ¯1
pour<
,=
,>
respectivement.(⍎¨∊∘⎕D⊆⊢)⍤1
sur chaque rangée∊∘⎕D⊆⊢
regrouper toutes les occurrences de chiffres, c'est-à-dire diviser.
⍎¨
et convertir chacune de ces occurrences en un nombre↑
convertir en une matrice, où la première entrée se trouve sur la rangée du haut et la seconde en bas, en remplissant avec0
s si nécessaire(⍋-⍒)
et-
soustraire⍒
les indices dans les lignes qui les trieraient par ordre décroissant⍋
comme le haut mais pour l'ordre croissantla source
Perl 6 ,
63 4722 octetsEssayez-le en ligne!
Il s'avère que Perl 6 a un type de version qui correspond à peu près à la description. Il s'agit d'un bloc de code anonyme qui prend une liste de deux chaînes de version et renvoie soit
More
,Same
soitLess
.Explication:
Ou, sans types intégrés pour 47 octets:
Essayez-le en ligne!
Bloc de code anonyme qui prend deux chaînes et renvoie
More
si la seconde est supérieure,Less
si la seconde est plus petite etNil
si elles sont égales.Explication:
la source
Brachylog ,
4940 octets... C'est encore assez peu impressionnant.
Attend une liste de deux chaînes. Utilise
positive number / zero / negative number
comme> / = / <
.Essayez-le en ligne!
Explication
Fractionner les entrées
Étant donné une entrée qui ne s'unifie pas
[0, 0]
, comme["1.02.0", "1.2.0.1.0"]
les sorties de segment ci-dessous, par exemple[[1, "02.0"], [1, "2.0.1.0"]]
.Comparaison des entrées
Étant donné, par exemple,
[[1, "02.0"], [1, "2.0.1.0"]]
zippe les sous-listes[[1, 1], ["02.0", "2.0.1.0"]]
et compare les valeurs dans la tête ([1,1]
). Revenez sur la deuxième sous-liste. Notez que le prédicat zipz
parcourt des listes plus courtes de sorte que le zip avec[0,0]
est équivalent au zip avec[0]
, d'où l'étape précédente s'unifie0
avec0
sans autres valeurs ajoutées.la source
JavaScript (ES6),
7368 octets5 octets enregistrés grâce à @redundancy
(a)(b)
Essayez-le en ligne!
la source
replace
parfill
. Les opérandes de-
sont échangés car les deux doivent maintenant être contraints à un nombre. Essayez-le en ligne!a
finit par parcourir ces valeurs 0 s'ilb
contient plus de segments numériques quea
. Il se trouve que la méthode la plus courte pour s'assurer qu'il en est ainsi consiste à diviser sur uneb
chaîne de longueur "." en tirant parti de la répartition existante appliquéea
.Java (JDK 10) ,
2019689 octetsEssayez-le en ligne!
Renvoie un nombre négatif si la première version est plus petite que la seconde, un positif si la première version est supérieure à la seconde et
0
s'ils sont égaux.Oui, c'est un gros travail d'appeler "juste" un intégré!
Crédits
la source
try-finally
pour que le if-check puisse être simplifié; essayé de retourner à l'intérieur de la boucle sit!=0
; essayé d'utiliserInteger
eti.compare(i.valueOf(...),i.valueOf(...))
; essayé d'utiliser des génériques comme celui-ci<T>T[]g(T s){return(T[])(s+"").replaceAll("(\\.0+)*$","").split("\\.");}
; etc. Tous sont de 2 à 6 octets de plus. Si vous (ou quelqu'un d'autre) trouvez quelque chose de plus, faites le moi savoir s'il vous plaît. Curieux de savoir quoi. :)2^16
." Courts intervalles de - (2 ^ 15) à 2 ^ 15-1.Python 2 , 87 octets
Essayez-le en ligne!
Sorties -1,0,1 pour <, =,>, respectivement.
la source
Retina 0.8.2 , 54 octets
Essayez-le en ligne! Le lien inclut des cas de test. Utilise la valeur du séparateur comme sortie d'égalité.Par conséquent, pour plus de commodité, l'en-tête convertit le séparateur d'entrée en
=
mais il peut ne pas être dans[.\d]
. Explication:Convertissez en unaire.
Supprimez à plusieurs reprises le premier caractère de chaque côté jusqu'à ce qu'ils diffèrent ou qu'un côté s'épuise. C'est beaucoup plus rapide que d'essayer de faire correspondre des préfixes, bien que ce ne soit pas un golfeur. À ce stade, les chaînes se présentent sous plusieurs formes, qui doivent être décodées en résultat de comparaison.
1
le résultat est=
1
le résultat est>
1
le résultat est<
<
>
Une autre façon de penser à ce sujet est que si une chaîne contient un
1
et que l'autre ne commence pas par un,1
cette chaîne est plus grande, mais cela se révèle être un octet plus long.Vérifiez le cas 3 ou le cas 4 sans le cas 1.
Si la chaîne de gauche contient toujours un
1
à ce stade, il est supérieur.Sinon, supprimez les restes de l'
.
art.Firefox Browser Console REPL, 19 octets
Je crois que cette fonction interne effectue la comparaison requise. Il renvoie -1, 0 ou 1.
la source
Cu.import("resource://gre/modules/Services.jsm");
être compté?PHP , 38 octets
Les sorties
-1 → < | 0 → = | 1 → >
Essayez-le en ligne!
la source
1.0.0
et1
C (gcc) ,
140134 octetsCe code produit un négatif,
0
ou positif pour<
,=
ou>
respectivement.Essayez-le en ligne!
Modifications:
la source
Rubis , 75 octets
Essayez-le en ligne!
la source
JavaScript (Node.js) ,
1058880 octets-17 octets de @redundancy. Hou la la!
-8 octets supprimant Math.sign. Merci @tsh
Renvoie une valeur négative, nulle ou positive
Essayez-le en ligne!
la source
exec
pour fractionner les chaînes. Essayez-le en ligne!Japt ,
1611 octets-5 octets de @Shaggy
Les sorties:
<
null
ou0
) pour=
>
Essayez-le en ligne!
la source
< = >
mais je ne sais pas si l'entrée peut être prise comme un tableauNettoyer ,
116111 octetsEssayez-le en ligne!
Génère un nombre négatif lorsque le premier argument est inférieur au second, zéro lorsqu'ils sont équivalents et un nombre positif lorsqu'il est supérieur au second.
la source
Swift 4 , 155 octets
En-tête (non compté: le code n'est pas récursif):
Code
Essayez-le en ligne!
Explications
Constantes retournées
la source
JavaScript 64 octets
Essayez-le en ligne!
Avec commentaires:
la source
Perl 5 , 55 octets
Essayez-le en ligne!
la source
Burlesque - 17 octets
Si vous voulez une sortie dans '> <=' alors ajoutez
?i"<=>"j!!Q
.la source
Powershell, 88 octets
Renvoie
0
pour égal, apositive integer
pour supérieur à ou anegative integer
pour inférieur à.Script de test moins golfé:
Sortie:
la source
Dart ,
277231 octetsEssayez-le en ligne!
la source
Swift 4 + Foundation ,
160 octets (142 + 18), 155 octets (142 + 13)Importation (13 octets, y compris
;
pour séparer du code):Cela importera Foundation, mais est 5 octets plus court que
import Foundation
.En-tête (non compté: le code n'est pas récursif):
Code (142 octets):
Essayez-le en ligne!
Explications
Constantes retournées
la source
import
déclaration, j'ai donc posté une réponse distincte qui ne nécessite pasFoundation
et avec un nombre d'octets compris entre 142 octets (sans compter l'importation) et 160 octets (compter l'importation).Zsh , 54 octets
Essayez-le en ligne! Essayez une suite de tests!
Cela correspond
eval
aux huit déclarations suivantes:Les trois valeurs uniques sont donc:
la source