À l'aide d'un langage de programmation, écrivez 5 programmes sur une seule ligne, chacun produisant une ligne différente du premier couplet de la chanson de 1972 de Harry Nilsson " Coconut " lorsqu'elle est exécutée individuellement:
Frère a acheté une noix de coco, il l'a acheté pour un sou
Sa sœur avait un autre, elle a payé pour une chaux
Elle a mis la chaux dans la noix de coco, elle les a bu à la fois en
elle mis la chaux dans la noix de coco, elle les a bu à la fois en
elle mettre le citron vert dans la noix de coco, elle les a bu tous les deux
Les 3 dernières lignes ont les mêmes paroles, donc vos 3 derniers programmes pourraient l'être aussi.
Il existe 5 façons factorielles ou 120 façons dont ces 5 programmes à ligne unique peuvent être organisés un par ligne dans un seul programme à 5 lignes. Vous devez optimiser vos programmes sur une seule ligne de telle sorte que pour autant de ces 120 combinaisons que possible, le programme sur 5 lignes affiche l' intégralité du verset dans son ordre , exactement comme il apparaît ci-dessus.
Exemple
La réponse la plus simple aurait 5 instructions d'impression sur une seule ligne, les 3 dernières identiques:
print('Brother bought a coconut, he bought it for a dime')
print('His sister had another one, she paid it for a lime')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
print('She put the lime in the coconut, she drank them both up')
La sortie vers les programmes à 5 lignes sera le verset dans son ordre correct tant que les deux premiers doublons seront à leur place. Seuls 6 des 120 arrangements possibles y parviennent.
Notation
La soumission avec le plus de cas de travail parmi les 120 gagne. Le bris d'égalité va à l'ensemble des programmes avec le nombre d'octets cumulé le plus bas (les nouvelles lignes ne sont pas comptées). L'exemple a 309 octets.
Détails
Vos programmes peuvent ne pas lire leur propre code source. Ils ne doivent pas non plus lire d'autres fichiers externes ou nécessiter une connexion réseau.
Sortie vers sortie standard ou alternative la plus proche. Vous pouvez également exporter vers un fichier avec le nom de votre choix.
Les "programmes sur une seule ligne" sont des chaînes qui contiennent tous les caractères sauf les terminateurs de ligne (vous aurez probablement juste à vous soucier des sauts de ligne).
Lorsque vous composez les lignes simples dans les 5 lignes, vous devez ajouter exactement 4 nouvelles lignes, une entre chaque paire adjacente de lignes simples. Vous pouvez éventuellement ajouter une nouvelle ligne de fin.
la source
main
méthode? Alors, qui doit être exécuté lors de l'exécution du programme?main
.Réponses:
CJam, 120 permutations valides,
334 299290 octetsLogique assez simple:
UPDATE : Il s'avère que vous n'avez pas besoin du cycle wrap-sort-unwrap après les 3 similaires et apparaissant aux dernières lignes de la chanson. Je peux expliquer pourquoi si ce n'est pas si apparent :)
la source
Prélude , 120 permutations,
20452035 octetsCela m'a finalement convaincu que Prelude et CJam ont besoin d'un enfant. S'il n'y avait pas le jeu d'instructions très limité de Prelude, cette soumission serait en fait très compétitive, si elle ne battait même pas CJam.
L'idée principale est la suivante
Dans Prelude, chaque ligne est sa propre "voix" avec sa propre pile, et ces voix sont exécutées en parallèle. C'est-à-dire que dans le programme complet, chaque ligne va simplement construire individuellement la chaîne et l'imprimer à la fin. Mais en raison des décalages des instructions d'impression, l'ordre des lignes n'a aucune importance pour l'ordre de la sortie, car l'exécution est de gauche à droite, pas de haut en bas.
Maintenant, pourquoi les lignes sont-elles si longues? Prelude ne stocke que des nombres sur sa pile. De plus, il ne peut pousser qu'un nombre à un chiffre à la fois, donc des nombres plus grands doivent être construits à partir de l'addition et de la soustraction (il n'y a pas non plus de multiplication ou d'autre arithmétique). Donc, la plus grande partie du code est simplement de calculer et de pousser les bons codes de caractères. Pour raccourcir un peu cela, je les ai compensés par
96
. À la fin, pour imprimer, je boucle jusqu'à ce que la pile soit vide (c'est-à-dire qu'un0
est rencontré), ajoute 96 à chaque numéro et l'imprime.Notez que les chaînes sont poussées en sens inverse, car elles sont imprimées du dernier au premier caractère.
Cela suppose que l'interpréteur Python avec
NUMERIC_OUTPUT = False
(c'est ainsi que la spécification définit les E / S).J'ai utilisé le code CJam suivant pour générer la construction de la chaîne:
Enfin, juste pour le plaisir, pourquoi je pense que ce serait vraiment court si Prelude avait un concept de cordes:
Maintenant, les instructions d'impression
!
sont déjà dans le bon ordre, donc je n'aurais même pas besoin de les compenser. Je pense que je vais commencer à mettre cela en œuvre un certain temps.la source
Ruby, 120 permutations valides, 430 octets
Fonctionne dans n'importe quel ordre ou individuellement. Chaque ligne modifie l'état global, puis définit un hook à exécuter à la fin du programme, sauf si le hook a déjà été défini.
la source
> <> , 120 permutations, 703 octets
La restriction à une ligne était assez difficile pour un langage 2D, j'ai donc dû trouver un moyen de tirer le meilleur parti de l'
.
instruction de téléportation.L'initiale
<
fait circuler le programme vers la gauche, s'enroulant et exécutantIl s'agit d'une série d'
p
instructions (put) qui place les caractères jusqu'à ce que le tableau ressemble à ceci:Le
#.!50
programme retourne ensuite à nouveau vers la droite, avant de passer à la ligne 5. Ce qui suit est le suivant:/
miroir de la ligne 5 trouve les paroles 5, qui sont poussées sur la pile. Nous nous téléportons ensuite à la ligne 6./
miroir de la ligne 6 trouve les paroles 4, qui sont poussées sur la pile. Nous nous téléportons ensuite sur la ligne 7./
miroir sur la ligne 7 trouve les paroles 3 ...Cela se produit jusqu'à ce que nous poussions les paroles 1, point auquel nous nous téléportons vers la ligne 10. Il s'agit d'une boucle pour imprimer la pile entière jusqu'à ce qu'elle soit vide.
Si une seule ligne du programme est présente, les
\
miroirs font le même travail que les téléports sur chaque ligne de paroles.Si le programme est brouillé, l'explication ci-dessus s'applique toujours, donc le programme fonctionne pour toutes les permutations!
la source