shCoc/NhN/zhNm>o_/zZSzdUz
Utilise un tout nouvel algorithme, inspiré de cette réponse .
(implicit) z = input()
(implicit) print
s combine list of strings into one string
h first list in
C matrix transpose of (e.g. first characters in first list, etc.)
o order_by(lambda N:
c float_div(
/NhN N.count(N[0]),
/zhN z.count(N[0])),
m map(lambda d:
> slice_head(
o order_by(lambda Z:
_/zZ -1*z.count(Z),
Sz sorted(z)),
d d),
Uz range(len(z))
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 Python sorted(<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, de 1/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:
$ pyth -c 'shCoc/NhN/zhNm>o_/zZSzdUz' <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg
Programme incrémentiel sur oroybgrbbyrorypoprr
:
Sub-Piece Output
Sz bbbgoooopprrrrrryyy
o_/zNSz rrrrrroooobbbyyyppg (uses N because o uses N on first use.)
m>o_/zNSzdUz ['rrrrrroooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrroooobbbyyyppg', 'rrroooobbbyyyppg', 'rroooobbbyyyppg', 'roooobbbyyyppg', 'oooobbbyyyppg', 'ooobbbyyyppg', 'oobbbyyyppg', 'obbbyyyppg', 'bbbyyyppg', 'bbyyyppg', 'byyyppg', 'yyyppg', 'yyppg', 'yppg', 'ppg', 'pg', 'g']
oc/NhN/zhNm>o_/zZSzdUz ['roooobbbyyyppg', 'obbbyyyppg', 'rroooobbbyyyppg', 'byyyppg', 'yppg', 'rrroooobbbyyyppg', 'oobbbyyyppg', 'pg', 'rrrroooobbbyyyppg', 'bbyyyppg', 'yyppg', 'ooobbbyyyppg', 'rrrrroooobbbyyyppg', 'rrrrrroooobbbyyyppg', 'oooobbbyyyppg', 'bbbyyyppg', 'yyyppg', 'ppg', 'g']
Coc/NhN/zhNm>o_/zZSzdUz [('r', 'o', 'r', 'b', 'y', 'r', 'o', 'p', 'r', 'b', 'y', 'o', 'r', 'r', 'o', 'b', 'y', 'p', 'g')]
shCoc/NhN/zhNm>o_/zZSzdUz rorbyroprbyorrobypg
Ancienne réponse:
ssCm*+t*u*G/zHS{-zd1]kd/zdo_/zNS{z
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-à-dire u*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ément t
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:
$ pyth programs/candy.pyth <<< 'oroybgrbbyrorypoprr'
rorbyroprbyorrobypg