Il s'agit d'un défi de golf de code assez simple. Votre programme, étant donné une chaîne ASCII, doit analyser cette chaîne en deux chaînes, qu'il évaluera. Si la deuxième chaîne est "plus tard" que la première, elle renverra un 1, si elle est "plus tôt" que la première, elle renverra un -1, et si elles sont identiques, elle renverra 0. Pour clarifier ce que "plus tard" et "plus tôt" signifient, jetons un coup d'œil aux codes de caractères ASCII. Vous devez comparer chaque caractère de la chaîne, en traitant chacun d'eux comme des chiffres d'un nombre. Plus tard, fait référence à un plus grand nombre, survenant après un plus petit nombre. Les chaînes seront formatées avec un trait d'union pour séparer les deux groupes d'entrée.
Jetez un œil à cet exemple:
7-9
comme entrée devrait revenir1
.
7
convertit en code ASCII55
et9
convertit en code ASCII57
.Comme cela
57
se produit numériquement après55
,9
est postérieur à7
.
Un autre exemple:
LKzb-LKaj
comme entrée devrait retourner-1
Les séquences de code ASCII pour cela sont
76-75-122-98
et76-75-97-106
Il s'agit d'un défi de golf de code, et le nombre d'octets est la façon dont les entrées seront notées.
Toute entrée à partir des 95 caractères ASCII imprimables est acceptée, à l'exclusion des espaces et des tirets pour tout sauf la séparation de l'entrée. De plus, les cordes ne sont pas garanties d'avoir la même longueur.
Bonne chance!
EDIT: Pour être plus clair, chaque caractère doit être traité comme un chiffre dans un nombre. Dans l'exemple LKzb-LKaj
, bien qu'il j
soit postérieur à b
, z
est postérieur à a
, et puisqu'il s'agit d'un chiffre plus significatif, il a priorité. Une chaîne fournie contiendra toujours au moins 3 caractères, éliminant les chaînes vides de l'étendue de ce problème.
EDIT: Voici quelques cas de test supplémentaires, pour votre aide:
A-9
->-1
11-Z
->-1
3h~J*-3h~J*
->0
Xv-Y0
->1
la source
11-Z
->-1
n'a aucun sens étant donné le libellé actuel de la question.Z
(90) est supérieur à1
(49) et est la lettre la plus significative. Veuillez préciser comment les chaînes de différentes longueurs sont comparées.A-AA
?11>Z
dans vos exemples quand1<Z
. Il doit y avoir un comportement indéfini à faire avec des chaînes de longueurs différentes ou l'exemple est incorrect.~
à 126, puis incrémenteriez le chiffre suivant d'une unité, en retournant le chiffre initial à!
. Chaque augmentation du chiffre le plus significatif équivaut à incrémenter le deuxième chiffre le plus significatif de 127.Réponses:
Pyth - 11 octets
Facile, utilise le
._
signe pour obtenir le signe etC
pour obtenir les codes de caractères.Essayez-le en ligne ici .
Suite de tests .
la source
CJam, 12 octets
Essayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
la source
Java,
86118Une façon très étrange de comparer des cordes. A fait une solution rapide pour qu'il passe des cas de test supplémentaires, recherchera plus de golfiness plus tard.
Merci à Vartan dans les commentaires pour la
signum
suggestionla source
return s[0].compareTo(s[1]);
11-Z
retour-1
, ça revient1
."A".compareTo("Z")
renvoie-25
. Malheureusement.i = a!=b ? b-a : s[1].compareTo(s[0]);
Je ne semble pas comprendre ... De plus, vous pourriez peut-être utiliser Math.signum et vous sauver en déclarant i;Perl, 31 octets
30 octets + 1 octet pour
-p
. Accepte une entrée sur STDIN.Explication
Lorsque les opérandes
cmp
ont des longueurs différentes, commechicken
etegg
, ils sont alignés comme ceci:de sorte que
egg
>chicken
(\0
est un octet nul). Mais nous voulons qu'ils soient alignés comme ceci:pour que
chicken
>egg
.Pour ce faire, nous les concaténons, une fois avec
chicken
avantegg
et une fois avecegg
avantchicken
:Maintenant que nos deux chaînes ont la même longueur, nous supprimons le premier mot en utilisant un XOR pour obtenir:
Et maintenant, nous pouvons utiliser
cmp
pour trouver ce qui est arrivé en premier. (Là, je l'ai dit!)la source
Python 2, 88 caractères
cmp
ne fait pas la bonne chose lorsque vous avez deux chaînes de longueur différente, donc je dois les remplir toutes les deux avec le caractère nul (qui seord
convertit en0
) pour gérer ce cas. Malheureusement, cela a ajouté environ 35 caractères, et c'est maintenant deux lignes au lieu d'une car j'ai besoin à la fois de la longueur de l'entrée et de l'itérer.la source
1-2
qui devrait renvoyer des1
retours-1
. Un travail intelligent cependant.11-A
, qui devrait retourner-1
, au lieu de revenir1
dans cet exemple.R, 54 octets
Cela nécessite la bibliothèque pracma. Il divise la chaîne d'entrée sur le
-
. La droite justifie les cordes. Les classe et fait un diff.Donc pour 11-7 on se retrouve avec les cordes "11" et "7". Le rang de ces derniers est [2, 1]. La différence est -1. Pour 3h ~ J * -3h ~ J * nous obtenons "3h ~ J *" et "3h ~ J *". Le rang de ces derniers est [1,5, 1,5] avec un diff de 0.
Exemples de tests
la source
CoffeeScript,
143140139Voici un jsfiddle avec les résultats (regardez dans la console)
la source
PERL,
4636 octetsConvertit la liste argv en une chaîne, se divise par le tiret en un argument sans espace sur les côtés gauche et droit, puis renvoie un appel cmp.
la source
"@ARGV"=~/-/;print$`cmp$'
(non testé)cmp
, mais cela ne fonctionne pas lorsque les longueurs de chaîne sont différentes."A" cmp "9"
vaut 1 tandis que"11" cmp "Z"
vaut -1, même si les deux entrées doivent renvoyer la même valeur pour ce défi.Python 3, 84 octets
Divisez la chaîne entrée par
"-"
. Convertissez les chaînes unicode en chaînes d'octets, puis interprétez ces chaînes d'octets comme des entiers big-endian. Enfin, faites la comparaison - (un) heureusementcmp
n'est plus disponible dans Python 3.Python 2, 69 octets
la source
print
etcmp
.Python 2, 79 octets
Solution assez simple et facile à comprendre. Compare les longueurs de chaînes, puis compare les chaînes lexigraphiquement.
Essayez-le ici
la source
perl5, 64
Il suffit de l'exécuter à partir de la ligne de commande. bien que cela aurait l'air mieux avec une nouvelle ligne, mais cela coûte 1 car.
Cette version plus longue gère correctement les longueurs incompatibles.
la source
/-/,$_=$`cmp$'
serait plus facile, et vous pouvez sauter le-aF-
bit. En outre, je compte cela comme un 20 (16 pour$_=$F[1]cmp$F[0]
et 4 pourpaF-
, enregistré dans un fichier et exécuté sousperl -paF- file.pl
).cmp
cela ne fonctionne pas lorsque les deux cordes sont de longueurs différentes, comme avec11-Z
./-/;$_=length$'<=>length$`||$' cmp$`
et-p
. ($`
stocke tout avant la correspondance regex,$'
stocke tout après.) L'utilisationmap
coûte en fait plus d'octets que d'appelerlength
deux fois.F #, 53
Il s'agit sous la forme d'une fonction anonyme (lambda), vous devez donc la coller et fournir le paramètre directement après is (ou, en utilisant la notation de tuyauterie). Par exemple (en FSI):
la source
JavaScript ES6,
4643 octetsla source
11-Z
devrait revenir-1
mais il revient1
.'11'>'Z'
lorsqu'il'11'<'ZZ'
n'y a rien dans la question sur la façon de comparer une chaîne de différentes longueurs ou sur la valeur d'une chaîne vide.Rubis, 59 octets
la source
05AB1E ,
12119 octetsEssayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source