Les six principaux acteurs de la sitcom américaine Friends ont tous convenu qu'ils recevraient le même salaire tout au long de la série (après la saison 2, au moins). Mais cela ne signifie pas qu'ils avaient tous la même quantité de temps d'antenne ou qu'ils interagissaient tous à l'écran avec la même quantité.
Dans ce défi, vous écrirez un programme qui pourrait aider à déterminer quels amis Friends étaient vraiment les meilleurs.
Installer
Pensez à regarder un épisode ou une scène de Friends et à noter exactement qui est à l'écran pendant chaque prise de vue et pendant combien de temps.
Nous abrégerons le nom de chaque personnage:
C
est pour ChandlerJ
est pour JoeyM
est pour MonicaP
c'est pour PhoebeR
est pour RachelS
est pour Ross
Ensuite, pour chaque prise de vue (ou chaque fois qu'un personnage entre / sort la prise), nous répertorions qui était à l'écran. Par exemple:
504 CRS
200 J
345 MP
980
2000 CJMPRS
Cela veut dire que:
- Pendant 504 ms, Chandler, Rachel et Ross étaient à l'écran.
- Puis pendant 200 ms, Joey était.
- Puis pendant 345 ms, Monica et Phoebe l'ont été.
- Puis pendant 980 ms, aucun des 6 personnages principaux n'était à l'écran.
- Puis pendant 2 secondes, ils l'ont tous été.
(Ce n'est pas à partir d'un clip réel, je l'ai inventé.)
Notez que ce qui suit serait équivalent:
504 CRS
1 J
199 J
345 MP
980
2000 CJMPRS
Pour analyser les combinaisons de caractères ayant le plus de temps d'écran, nous examinons les 64 sous-ensembles possibles des 6 caractères et totalisons le temps d'écran qu'ils avaient. Si tous les membres d'un sous-ensemble apparaissent à l'écran pendant une prise de vue, même s'il y a plus de caractères que ceux du sous-ensemble , la durée de cette prise de vue est ajoutée à la durée totale d'écran de ce sous-ensemble.
Il y a une exception pour le sous-ensemble vide - seules les scènes avec aucun des 6 personnages principaux sont comptées.
Ainsi, l'analyse de l'exemple ci-dessus serait:
980
2504 C
2200 J
2345 M
2345 P
2504 R
2504 S
2000 CJ
2000 CM
2000 CP
2504 CR
2504 CS
2000 JM
2000 JP
2000 JR
2000 JS
2345 MP
2000 MR
2000 MS
2000 PR
2000 PS
2504 RS
2000 CJM
2000 CJP
2000 CJR
2000 CJS
2000 CMP
2000 CMR
2000 CMS
2000 CPR
2000 CPS
2504 CRS
2000 JMP
2000 JMR
2000 JMS
2000 JPR
2000 JPS
2000 JRS
2000 MPR
2000 MPS
2000 MRS
2000 PRS
2000 CJMP
2000 CJMR
2000 CJMS
2000 CJPR
2000 CJPS
2000 CJRS
2000 CMPR
2000 CMPS
2000 CMRS
2000 CPRS
2000 JMPR
2000 JMPS
2000 JMRS
2000 JPRS
2000 MPRS
2000 CJMPR
2000 CJMPS
2000 CJMRS
2000 CJPRS
2000 CMPRS
2000 JMPRS
2000 CJMPRS
Nous pouvons voir que J
(juste Joey) avait 2200 ms de temps d'écran parce qu'il en avait 200 par lui-même et 2000 avec tout le monde.
Défi
Écrivez un programme qui accepte une chaîne ou un fichier texte tel que
504 CRS
200 J
345 MP
980
2000 CJMPRS
où chaque ligne a le formulaire [time in ms] [characters on screen]
, et affiche le temps total que chacun des 64 sous-ensembles des 6 caractères a passé à l'écran, où chaque ligne a le formulaire [total time in ms for subset] [characters in subset]
(comme ci-dessus).
L'entrée peut être considérée comme une chaîne de stdin, la ligne de commande ou une fonction, ou il peut s'agir du nom d'un fichier texte contenant les données.
- Les nombres en millisecondes seront toujours des entiers positifs.
- Les lettres des caractères seront toujours dans l'ordre
CJMPRS
(alphabétique). - Vous pouvez éventuellement supposer qu'il y a un espace de fin lorsqu'il n'y a pas de personnages dans la scène (par exemple
980
). - Vous pouvez éventuellement supposer qu'il existe une nouvelle ligne de fin.
- L'entrée aura au moins 1 ligne et peut en avoir arbitrairement plusieurs.
La sortie doit être imprimée, renvoyée ou écrite dans un autre fichier texte sous la forme d'une chaîne de 64 lignes.
- Les lignes peuvent être dans n'importe quel ordre.
- Les lettres de caractères n'ont pas besoin d'être dans l'
CJMPRS
ordre. - Avec le temps total des sous - ensembles de 0ms ne doivent être énumérés.
- Il peut éventuellement y avoir un espace de fin après le total de sous-ensemble vide.
- Il peut éventuellement y avoir une nouvelle ligne de fin.
(Ce problème peut bien sûr être généralisé à plus de personnages, mais nous nous en tiendrons aux 6 personnages CJMPRS
amis .)
Le code le plus court en octets gagne.
Notez que j'apprécie réellement les amis et ne pense pas que certains personnages sont plus importants que les autres. Les statistiques seraient cependant intéressantes. ;)
la source
Réponses:
Pyth, 37 octets
Essayez-le en ligne: Démonstration
Explication:
la source
cM
utiliser l'.*
extension de la carte. Peut-être qu'une exception devrait être faitec
car je ne peux pas imaginer quelqu'un voulant l'utiliser comme ça dans une carteHaskell, 187 octets
f
est une fonction qui prend l'entrée, sous la forme d'une chaîne multi-lignes unique, et renvoie la sortie multi-lignes sous la forme d'une chaîne unique. Il reste probablement beaucoup de terrain de golf ici.la source
SWI-Prolog, 381 octets
Cela devrait être exécuté comme:
Notez que vous devrez peut-être remplacer tous les
`
vers"
et tous"
les'
si vous avez une ancienne version de SWI-Prolog.Je pourrais raser plus de 100 octets si je n'avais pas à utiliser une chaîne comme entrée.
la source
Haskell,
150136 octetsExemple d'utilisation:
Approche différente de la réponse de @ MtnViewMark : pour toutes les combinaisons
c
de caractères, trouvez les lignes de la chaîne d'entrée où la différencec
et la liste des lignesy
sont vides (attention au cas spécial où aucun caractère n'est à l'écran (par exemple980
) ->c
ne doit pas être vide ouc == y
). Extraire le nombre et la somme.la source
CJam,
6758 octetsEssayez-le en ligne dans l' interpréteur CJam .
la source
Perl 5 (5.10+), 128 octets
2 octets par ligne de sortie.
use feature "say"
non inclus dans le nombre d'octets.Non-golfé:
la source
K, 95
Prend une chaîne comme
"504 CRS\n200 J\n345 MP\n980 \n2000 CJMPRS"
la source