Mon premier post code golf, toutes mes excuses pour toute erreur ...
Le contexte
En escalade ( particulièrement en bloc ), les notes d’escalade V / Vermin (USA) commencent à «VB» (la note la plus facile), puis «V0», «V0 +», «V1», «V2», «V3» , 'V4', 'V5' etc. jusqu'à 'V17' (la classe la plus difficile).
Tâche
Vous prendrez en entrée une liste / un tableau de notes en montée et vous devrez retourner ou imprimer une liste / un tableau des notes triées du plus facile au plus difficile.
Si l'entrée est vide, retourne une structure de données vide. sinon, l'entrée sera toujours valide.
Cas de test
Input | Output
[] | []
['V1'] | ['V1']
['V7', 'V12', 'V1'] | ['V1', 'V7', 'V12']
['V13', 'V14', 'VB', 'V0'] | ['VB', 'V0', 'V13', 'V14']
['V0+', 'V0', 'V16', 'V2', 'VB', 'V6'] | ['VB', 'V0', 'V0+', 'V2', 'V6', 'V16']
Ceci est un défi de code-golf .
code-golf
array-manipulation
sorting
Chris_Rands
la source
la source
Réponses:
Python 2 ,
5854 octetsEssayez-le en ligne!
Comment ça marche
la source
a=>a.sort((a,b,B10=0)=>(g=s=>eval(s.slice(1)+10))(a)>g(b))
58 octets.a=>a.sort((a,b)=>(g=s=>eval(s.slice(B10=1)+10))(a)-g(b))
est 2 octets plus court, mais c'est encore trop long.JavaScript (ES6) / Firefox, 53 octets
Cas de test
Pour Firefox:
Afficher l'extrait de code
Pour Chrome ou Edge (+4 octets):
Afficher l'extrait de code
Comment?
Nous appliquons 3 transformations successives qui conduisent à des chaînes comparables lexicographiquement.
la source
a=>a.sort((a,b)=>(g=s=>parseInt(s,32)%334+s)(a)>g(b))
sur Chrome, il ne donne pas la réponse correcte àf(["VB","V0","V0+","V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","V11","V12","V13","V14","V15","V16","V17"])
je ne sais pas pourquoi; la version compatible avec les bords fonctionne bien sur le chrome.Husk , 5 octets
Essayez-le en ligne! Les résultats sont imprimés un par ligne, mais en interne, il s’agit d’une fonction qui prend et retourne une liste de chaînes.
Explication
Ceci est étonnamment similaire à la réponse de Martin à la rétine . Nous commençons par le faire
Öm±
, ce qui signifie "ordre par mappage est numérique" Cela metVB
,V0
etV0+
dans le bon ordre, car ils sont comparés comme[0,0]
,[0,1]
et[0,1,0]
. Ensuite nous le faisonsÖi
, ce qui signifie "ordre par valeur entière". Étant donné une chaîne,i
renvoie la première séquence de chiffres apparaissant dans celle-ci sous la forme d'un entier ou de 0 si aucun n'est trouvé. Les trois chaînes ci-dessus sont toutes mappées sur 0 et le tri est stable. Elles seront donc dans le bon ordre dans la sortie.la source
Rétine , 14 octets
Essayez-le en ligne!
Explication
Remplacez
B
par!
afin que l'ordre lexicographique des notes soit placéVB
(ou alorsV!
) devant toutes les notes numériques.Triez toutes les lignes d'entrée lexicographiquement. Cela ne donne pas le bon résultat mais ordonne
V! < V0 < V0+
correctement.Retourner
V!
dansVB
.Triez les lignes numériquement. Retina cherche simplement le premier nombre décimal d'une chaîne pour déterminer sa clé de tri. S'il n'y a pas de nombre (comme pour
VB
), la valeur est définie sur0
. Cela signifie tousVB
,V0
etV0+
ont la même clé de tri. Mais la sorte de Retina est stable et nous les avons déjà placées dans le bon ordre relatif.la source
V , 3 octets
Essayez-le en ligne!
Comment ça marche?
Cette commande est presque une solution valide, car chaque ligne qui ne peut pas être triée par numéros (AKA,
VB
) sera placée au début, sans que l'ordre ne soit modifié. Cependant, comme il ne s'agit que de chiffres, il ne peut pas distinguer entreV0
etV0+
. Puisque Vim utilise une sorte stable, celle qui est arrivée en premier restera la première après le tri. Alors...la source
C #,
121838283 octetsSauvegardé 39 octets grâce à TheLethalCoder et LiefdeWen
Essayez-le en ligne!
Le décompte comprend
using System.Linq
.Comment?
VB
, définissez la valeur sur -1, si elle est égale àVB0+
, définissez la valeur sur 0.V
.Peut-être un peu un bidouillage, mais ça marche! :)
la source
ToArray()
un, çaIOrderedEnumerable
devrait aller..Remove(0,1)
pour -1 octet supplémentaire :)Ruby ,
52 4241 octetsEssayez-le en ligne!
Comment ça marche:
Tournez le problème, créez la liste complète triée, puis obtenez l'intersection avec notre entrée.
Merci Lynn d'avoir sauvegardé 1 octet.
la source
->x{[?B,0,"0+",*1..17].map{|a|"V#{a}"}&x}
enregistre un octet.Pyth , 16 octets
Port de Python répond par OP.
Suite de test .
la source
05AB1E ,
17138 octetsEssayez-le en ligne!
la source
†
est meilleur queD"VB"åiÁ
par un tir long.Gelée , 9 octets
Un lien monadique prenant une liste de listes de caractères et renvoyant la liste triée.
Essayez-le en ligne! (le pied de page formate bien le résultat)
Comment?
la source
Haskell , 55 octets
Essayez-le en ligne!
la source
Pour commencer, voici ma solution Python 3 ...Apologies, posté trop tôt contre la convention, maintenant en train de republier ...Python 3 ,
6967 octetsEssayez-le en ligne!
la source
Swift 3 , 102 octets
Ceci est une fonction. Vous pouvez l'appeler comme tel:
Essayez-le en ligne!
Comment cela marche-t-il?
Ceci est fondamentalement un port de la réponse Javascript incroyable par @Arnauld , mais optimisé pour Swift.
Il mappe chacune des valeurs sur des chaînes ordonnées lexicographiquement, comme indiqué dans le tableau ci-dessous:
Explication du code
String((Int($0,radix:32) ?? 992)%334)
- Convertit chaque chaîne d'un nombre base 32 en nombre décimal. Dans le cas où la valeur est "V0 +", l'appel àInt(_:radix:)
retournera nil et nous prenons la valeur de "V0", 992. Nous prenons également le résultat demod 334
et finalement le convertissons en String.+$0
- Ajoute la valeur actuelle à la chaîne créée ci-dessus. Par exemple, si la chaîne estV9
, la fonction ci-dessus retourne333
et nous ajoutonsV9
, résultant333V9
.var r={...}
- Déclare une variabler
à une fermeture anonyme, car cela économise beaucoup d'octets puisqu'il est utilisé deux fois.func f(l:[String])
- Définit une fonctionf
avec un paramètrel
, une liste de chaînes.print(l.sorted(by:{r($0)<r($1)}))
- Imprime le résultat du tri de la liste donnée, la clé étant la variabler
définie ci-dessus.la source
PowerShell , 45 octets
Essayez-le en ligne!
Utilise le même processus que la réponse Ruby de GB pour construire la liste d'arguments complète dans un ordre trié, puis sélectionne ceux qui constituent
-in
la liste d'entrée.la source
Google Sheets, 142 octets
L'entrée est une chaîne
A1
avec chaque entrée séparée par une virgule.La sortie est la cellule de la formule plus les
n-1
cellules en dessous, oùn
est le nombre d'entréesA1
.C'est une longue formule en désordre, alors décompresons-la.
If(A1="","",~)
corrige l'entrée nulle. Sans cela, une entrée vide renvoie un#VALUE!
erreur car laSplit
fonction ne fonctionne pas sur des entrées vides.Transpose(Split(A1,","))
se sépareA1
à la virgule et le transpose dans une colonne car leSort
fonction ne fonctionne que sur des colonnes.Transpose(IfError(Find(),Value()+9))
est brise en ces morceaux:Find(Split(A1,","),"VBV0V0+")
essaie de trouver chaque paramètre dans cette chaîne. Ces trois premiers sont les seuls qui doivent être triés comme des chaînes de caractères afin que nous utilisionsFind
pour obtenir leur ordre de tri.Value(Mid(Split(A1,","),2,3))+9
obtient la valeur numérique de la note. Cela ne concerne que la V1 et les versions ultérieures, ce qui leur permet de trier très bien numériquement. Le+9
but ultime est de s’assurer que V1 vient après V0 + puisque saFind
valeur serait5
. Techniquement, alors, seulement+5
faut, mais cela ne me coûte pas plus d’octets pour faire en sorte que le tri soit plus sûr.IfError(Find(~),Value(~))
renvoie leFind
valeur si la chaîne a été trouvée (c'est-à-dire que la note est VB, V0 ou V0 +). S'il ne peut pas être trouvé, il retourne la valeur numérique de la note plus neuf.Transpose(IfError(~))
à nouveau le transforme en une colonne afin deSort
pouvoir l'utiliser.Sort(Transpose(Split(~)),Transpose(IfError(Find(~),Value(~)+9)),1)
le tout en triant l'entrée fractionnée en utilisant l'ordre de tri personnalisé croissant.ArrayFormula(~)
encapsule tout le contenu pour qu'il renvoie les résultats sous forme de tableau au lieu de simplement renvoyer la première valeur de ce tableau. C'est la raison pour laquelle la formule d'une cellule remplit également les cellules situées en dessous.la source
Bash + coreutils, 21
sort
Le-V
mode de tri par ersion de GNU fait presque ce que nous voulons. Commutez leB
pour un.
et nous avons terminé.Essayez-le en ligne .
la source
Haskell ,
90848361 octetsEssayez-le en ligne!
f
est une fonction qui convertit les notes d’escalade en chaînes pouvant être comparées. SiVB
la chaîne convertie pour obtenir la priorité la plus élevée, elle est remplacéeV1
par desX
chaînes de trois longues pour réduire la priorité deV10
-V17
. Pour le reste, nous ne faisons rien.Pour trier la liste, nous utilisons
Data.Lists
lasortOn
fonction (suggérée par Lynn) pour créer une fonction sans point.la source
g=sortOn f
, qui est aussi dansData.List
.f(_:'1':a)='X':a
sauve 4 octets![a]
sinon d'V1
un motif adapté, c'est le problème que j'essaie de contourner.R , 45 octets
Comment cela marche-t-il?
la source
Python2, 77 octets
la source
Gelée ,
17 à11 octetsEssayez-le en ligne!
la source
TXR Lisp : 45 octets
Courir:
la source
Perl 5 , 56 + 1 (-a) = 57 octets
Essayez-le en ligne!
la source