introduction
Mon grand-père est fan de James Bond, mais il ne sait toujours pas comment classer ses acteurs préférés. À ce titre, il fait toujours des listes, ce qui représente beaucoup de travail. Il m'a demandé de produire un programme qui va lui faciliter la vie, mais je n'ai pas le temps pour ça, je dois travailler! Je vais donc compter sur vous.
Défi
Le défi est simple. L'entrée consistera en une liste, au format suivant:
<number> <space> <actor's name> <newline>
Votre tâche consiste à les trier en fonction du nombre au début de la ligne, en commençant par le dernier et en terminant par le premier. Tous les numéros doivent être supprimés.
Cependant, mon grand-père fait parfois des erreurs. À ce titre, vous devrez valider les données. Si l'un des noms de la liste ne fait pas référence à l'un des acteurs qui ont joué Bond, vous devez le jeter. En cas de répétitions, les répétitions doivent être supprimées et le nom doit conserver le poids le plus bas auquel il a été associé (exemple # 3).
Il n'y a pas de limite au nombre de lignes.
La sortie ne doit être qu'une liste quelconque, que ce soit un tableau, une chaîne séparée par des virgules, juste des valeurs séparées par des espaces, ou autre chose entièrement
Pierce Brosnan, Sean Connery, David Niven
Un retour à la ligne ou un espace de fin est autorisé.
Exemple d'entrée et de sortie
Contribution:
1 Sean Connery
2 Emma Watson
5 Timothy Dalton
4 Roger Moore
3 Daniel Craig
Sortie:
Timothy Dalton, Roger Moore, Daniel Craig, Sean Connery
Contribution:
2 Timothy Dalton
4 George Lazenby
5 George Lazenby
3 Bob Simmons
Sortie:
George Lazenby, Bob Simmons, Timothy Dalton
Contribution:
3 Sean Connery
2 Pierce Brosnan
1 Sean Connery
Sortie:
Pierce Brosnan, Sean Connery
Comme il s'agit d'un code golf, le code le plus court (en octets) gagne!
appendice
Liste des acteurs qui ont joué le rôle de Bond:
- Barry Nelson
- Bob Simmons
- Sean Connery
- Roger Moore
- David Niven
- George Lazenby
- Timothy Dalton
- Pierce Brosnan
- Daniel Craig
echo Sean Connery
parce que tout le monde le sait, il n'y a qu'un seul lienRéponses:
Pyth,
136132 octetsEssayez-le ici!
Explication
la source
Retina ,
201 197191Essayez-le en ligne!
6 octets économisés grâce à Martin!
Whee, tri à bulles avec regex. Notez que dix octets sont consacrés à la conversion décimale en unaire au début, si l'entrée unaire est correcte, cela n'est pas nécessaire. De plus, si les nombres ne peuvent pas être dans les noms des personnes, alors quelques octets supplémentaires peuvent être enregistrés en déplaçant la ligne qui supprime les acteurs non-Bond à la fin et en supprimant le
1+
(non testé avec la\D
version).Explication:
Un programme Retina est composé de plusieurs étapes, je vais donc expliquer chaque étape séparément.
Étape 1:
Remplace les nombres dans l'entrée par unaire. Cela utilise le jeton de remplacement spécial de Retina:
$*
qui répète le personnage après un nombre de fois égal à la valeur de base 10 du jeton précédent.Étape 2:
Le truc avant une
`
étape change le mode utilisé. Cela active le mode grep, ce qui signifie que chaque ligne qui ne correspond pas à l'expression régulière est supprimée. Les ancres sont nécessaires pour empêcher les allumettes proches de glisser.Étape 3:
Il s'agit de l'étape de tri. Le
+
mode signifie que cette étape doit être répétée jusqu'à ce que le remplacement ne change pas lorsqu'il est appliqué (c'est-à-dire que nous atteignons un point fixe). L'expression régulière trouve une limite de mot, suivie d'un certain nombre de1
s, puis de tout le reste de la ligne jusqu'à la nouvelle ligne. Ensuite, si la ligne suivante a plus de1
s que cela, l'expression régulière correspondra et nous échangeons les lignes.Étape 4:
Cette étape utilise à
+
nouveau le mode, mais permet égalements
de faire correspondre le.
méta-caractère aux nouvelles lignes. Cela supprime les lignes en double, en faisant correspondre les doublons exacts après le1
s et en capturant le contenu après le premier doublon pour remplacer toute la correspondance par lui. Cela fonctionnera sans avoir à prendre en compte l'ordre de départage, car les noms sont déjà triés de manière appropriée, avec les plus grands nombres ci-dessus, par conséquent, nous conserverons toujours les valeurs les plus petites.Étape 5:
Vraiment simple ici, tout est en ordre, sauf que nous avons un tas de
1
s devant nos obligations, donc nous les remplaçons et l'espace après eux avec rien.la source
TSQL 426 octets (y compris les données + entrée)
Solution golfée:
Essayez-le ici
SQL excelle (sans jeu de mots) dans ce type de tâche: relier des ensembles, ordonner, supprimer les doublons, etc.
Tout ce dont vous avez besoin est de créer et de remplir un tableau d'acteurs comme celui-ci:
Maintenant, si nous utilisons une variable de table en entrée, nous avons juste besoin d'obtenir l'intersection des deux ensembles. La suppression des doublons et la commande dans SQL sont vraiment faciles.
Exemple 1:
Exemple 2:
La version golfée est juste la chose complète, par exemple l'entrée 3
En plus, ce SQL peut fonctionner pour les anciennes versions de SGBD (même être réécrit sur ANSI SQL) et s'exécuter sans problème sur des ordinateurs plus anciens que la plupart des langues.
la source
order by min(R) desc
avec la sélection interne et supprimermin(R)
la sélection. Cela devrait économiser 21 octets.char
au lieu devarchar
permettra d'économiser 6 autres octets.Perl,
242179217 octetsVersion formatée plus agréable, avec commentaires:
La plus grande partie de la taille est la liste des obligations; Je ne peux pas trouver un bon moyen de compresser cette expression régulière sans autoriser les faux positifs.
la source
eval
en Perl, et un système de compression intégré ...Python 2, 250 octets:
Démo:
la source
PowerShell v3 +,
227219 octets121 octets ne sont que la liste des acteurs ...
Prend entrée
$args
et-split
s sur les nouvelles lignes avec`n
. Dirigez-le verssort
, qui triera les entrées par ordre croissant, ce qui est OK pour l'instant. Nous les redirigeons vers une boucle foreach|%{...}
, chaque itération prend l'entrée,-split
celle - ci sur les espaces, puis-join
la seconde moitié en arrière avec un espace (c'est-à-dire en supprimant les nombres du début). Ces noms (ascendants) triés sont maintenant laissés sur le pipeline. Nous les dirigeons vers un endroit où?
cela garantit qu'ils sont-in
la liste approuvée des acteurs. Enfin, nous n'avonsselect
que les-u
entrées niques, qui pour les doublons sélectionneront la première qu'elle rencontre (c'est-à-dire la plus faible pondérée) et rejetterons le reste. Nous stockons le tableau de noms résultant dans$a
.Donc, maintenant, nous avons une liste ascendante triée d'acteurs. Étant donné que le défi nécessite une descente, nous effectuons une opération d'inversion sur place
$a
en indexant de$a.count
bas en haut0
.Exemple
Edit - pas besoin d'utiliser [array] :: Reverse () quand l'indexation fera l'affaire
la source
sort -Des
plutôt que l'inversion de tableau? Certes, cela pourrait être cassé dans les versions ultérieures de PowerShell, mais je ne pense pas que ce soit probable ou un vrai problème;)select -u
et conserveraient l' ordre le plus élevé, plutôt que le plus bas, donc pour mon exemple, les positions de Daniel Craig et Roger Moore s'échangeraient. Mes tentatives de correction ont entraîné un code plus long que l'inversion du tableau.Python
309286 octetsla source
print
ou après un)
ou]
JavaScript (ES6), 232 octets
Explication
la source