Quand il s'agit de manger des bonbons, je me tiens à des normes plus élevées que le laïc typique. Il existe un équilibre délicat entre "mélanger" et "conserver le meilleur pour la fin".
Dans ce défi, vous recevrez une chaîne de caractères dans laquelle chaque caractère représente un bonbon. Différents caractères (sensibles à la casse) représentent différents types de bonbons. Votre programme doit ensuite déterminer le bon ordre de consommation de bonbons, en suivant la procédure ci-dessous. Vous pouvez écrire un programme complet (STDIN / STDOUT) ou une fonction nommée pour accomplir cette tâche.
Disons que ma réserve de bonbons est oroybgrbbyrorypoprr
. Premièrement, je trie les bonbons en piles du même type, avec de plus grandes quantités en haut, en utilisant des valeurs de caractères ASCII plus faibles comme point de départ.
rrrrrr
oooo
bbb
yyy
pp
g
Ensuite, je prends chaque rangée de bonbons et les espace de manière égale le long d'un intervalle. Par exemple, s'il y a 3 bonbons, l'un est placé à 1/3 du chemin, aux 2/3 du chemin et à la fin.
.r.r.r.r.r.r
..o..o..o..o
...b...b...b
...y...y...y
.....p.....p
...........g
Ensuite, je descends chaque colonne pour créer ma dernière commande de bonbons rorbyroprbyorrobypg
.
Contribution
Une chaîne qui contient la réserve de bonbons. L'entrée pour l'exemple ci-dessus aurait pu être:
oroybgrbbyrorypoprr
Sortie
Une chaîne contenant les bonbons réorganisée dans le bon ordre de consommation.
rorbyroprbyorrobypg
Notation
C'est du code golf. La réponse la plus courte en octets l'emporte. Les règles standard de code-golf s'appliquent.
Réponses:
CJam,
78 68 61 45 42 39 3130 octetsPrend la chaîne d'entrée via STDIN
Inspiré par l'approche récursive, mais un peu différent. Pas besoin de transposer ou de rectangle du tout!.
Comment ça marche:
(Triste que CJam ne puisse plus utiliser Pyth à cause de la nécessité d'une syntaxe trop lourde)
Essayez-le ici
la source
{_@_@{_@\%}h;/*}
par:
.Pyth , 25
Utilise un tout nouvel algorithme, inspiré de cette réponse .
Pas à pas:
Premièrement, nous avons trié les caractères selon leur caractère commun, les liens brisés par ordre alphabétique. C'est
o_/zZSz
.o
est identique à celle de Pythonsorted(<stuff>,key=<stuff>)
, avec une expression lambda pour la clé, sauf qu'elle la conserve sous forme de chaîne.Ensuite, nous générons une liste des préfixes de cette chaîne, de longueur
len(z)
en longueur 1.>
est équivalent à celui de python<stuff>[<int>:]
.Ensuite, nous réorganisons cette liste de chaînes de préfixe en fonction de l'emplacement fractionnaire, 0 étant le bord gauche et 1, le droit, du premier caractère du préfixe sur la présentation rectangulaire vue dans la question.
/NhN
compte le nombre de fois où le premier caractère du préfixe apparaît dans le préfixe, tandis que/zhN
le nombre d'occurrences du premier caractère du préfixe dans la chaîne est un trou. Ceci assigne à chaque préfixe dirigé par chaque caractère d'un groupe une fraction différente, de1/k
l'occurrence la plus à droite de ce caractère àk/k
la plus à gauche. Réorganiser la liste de préfixes avec ce numéro donne la position appropriée dans la présentation. Les égalités sont brisées en utilisant l'ordre précédent, qui était d'abord compté puis alphabétique, comme vous le souhaitez.Enfin, nous devons extraire le premier caractère de chaque chaîne de préfixe, les combiner en une seule chaîne et les imprimer. Extraire les premiers caractères est
hC
.C
effectue une transposition de matrice sur la liste, en réalitézip(*x)
en Python 3.h
extrait la première ligne de la matrice résultante. Il s’agit en fait de la seule ligne, car la présence du préfixe 1 caractère empêche la formation d’autres lignes complètes.s
résume les caractères de ce tuple en une seule chaîne. L'impression est implicite.Tester:
Programme incrémentiel sur
oroybgrbbyrorypoprr
:Ancienne réponse:
Pyth , 34
Ce programme calcule le nombre de fois qu'une réplique donnée est répliquée. La sous-liste ressemble à
['', '', '', '', ... , 'r']
. La longueur totale de cette sous-liste est le produit du nombre d'occurrences de tous les autres bonbons, c'est-à-direu*G/zHS{-zd1
. La sous-liste complète est construite en répliquant la liste de la chaîne vide]k
, celle-ci plusieurs fois, puis en supprimant l'élémentt
et en ajoutant le nom du bonbon à la fin+d
.Ensuite, cette sous-liste est répliquée autant de fois que ce bonbon se trouve dans l'entrée,
/zd
en s'assurant que la liste de chaque bonbon est de longueur égale.Maintenant, avec cette fonction mappée sur tous les bonbons uniques dans le bon ordre trié (
o_/zNS{z
), nous avons un rectangle similaire à celui de l'instruction de question, mais avec des chaînes vides au lieu de points. Faire une matrice transpose (C
) suivie de deux sommations (ss
) donne la chaîne finale.Vérification:
la source
Perl 5 - 62
61 code + 1 drapeau.
Commencez par diviser l’entrée en tableau de caractères
/./g
.Ajouter un indice d’occurrence à chaque lettre en laissant les nombres dans les variables
$a
..$z
avecmap++$$_.$_
. Maintenant, le tableau est:Ensuite, convertissez-la en une clé de tri concaténant: ratio
$_/$$1
, count tie breaker~$_
et valeur ASCII$_
. Cela se traduira par (ici avec des espaces ajoutés pour plus de clarté).Ceci peut être trié par ordre lexicographique (par défaut). À la fin, extrayez le dernier caractère et imprimez:
print map/(.$)/
la source
Python 3.x - 124 octets
la source
Mathematica,
123119118 octetsDéfinit une fonction nommée
f
. Ungolfed:L'utilisation de types rationnels intégrés semblait être une bonne idée pour cela. Bien sûr, cela n’est nulle part près de CJam. Fondamentalement, je représente la grille indiquée dans le défi sous forme de liste de paires. La première chose dans la paire est le code de caractère, la seconde est sa position en tant que fraction inférieure ou égale à 1 (la dernière colonne étant 1). Après m'être assuré que les caractères individuels sont déjà dans le bon ordre, il me suffit de trier celle-ci de manière stable par fraction pour obtenir le résultat souhaité.
la source
Python 45
47 48 51Cela pourrait aussi presque certainement être joué au golf plus loin;)
Travaille en construisant une liste de listes, où chaque liste interne est une rangée de chaînes vides et le nom du bonbon. Cette liste est transposée, puis les listes internes sont jointes, suivies de ces listes.
Merci @isaacg de m'avoir rappelé la somme!
la source
s
sur une liste de chaînes fonctionne commej""
.APL: 38
Explication:
Peut être testé sur tryapl.org
la source
R - 166 caractères
version non golfée
Explication:
order
est stable dans le tri, donc conservera l'ordre de nommage le plus fréquent / lexical quand un lien dans l'index est particulièrement important avec les derniers bonbons)La nature matricielle du problème m'a fait penser que R pourrait peut-être essayer, mais la meilleure interprétation littérale de l'algorithme que je pouvais utiliser était de 211 caractères:
ungolfed:
la source
Pyth, 29 octets
Ceci est une traduction directe de mon réponse CJam en Pyth
Essayez-le en ligne ici
Cette solution a une histoire assez longue et @isaacg m'a beaucoup aidé à comprendre ce nouveau langage.
Idéalement, il s'agit de la traduction exacte mot à mot de mon code CJam ( 17 octets ):
ce qui signifie:
Mais malheureusement, Python ne renvoie rien dans un
+=
appel, ce qui n’était pas un code Python valide, donc un code Pyth non valide comme dans Pyth, un lambda ne peut être qu’une déclaration de retour.Ensuite, j'ai examiné diverses méthodes et finalement trouvé que Python
list.append
renvoie uneNone
valeur que je peux utiliser. Rendre le code à être ( 19 octets ):ce qui signifie:
Mais malheureusement, le support de
a
(append) a été retiré de Pyth et la version qui le supporte n’a pas le support pouro
.Mise à jour :
a
support a été ajouté à nouveau dans Pyth maintenant afin que le code de 19 octets ci-dessus fonctionne dans le compilateur en ligne. Mais comme il s’agit d’une nouvelle fonctionnalité qui a été ajoutée après l’opération, je ne l’affiche pas comme mon score et ne laisse pas le code à 29 octets comme solution.Par conséquent, je devais compter sur Python brut dans ce cas, ce qui rendait le code
la source