Mettez la ligne dans le code que vous écrivez et secouez le tout

10

À 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

( paroles complètes )

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.

Loisirs de Calvin
la source
"Ecrire 5 programmes qui sortent chacun une ligne différente ..." n'est-ce pas impossible?
feersum
@feersum Les lignes sont différentes. Il se trouve que trois d'entre eux ont le même texte.
Calvin's Hobbies
Et si j'ai un fichier Java contenant 5 classes, chacune avec une mainméthode? Alors, qui doit être exécuté lors de l'exécution du programme?
feersum
@feersum Eh bien, que fait votre compilateur? Je ne sais pas ce que fait Java lorsque plusieurs classes du même fichier ont toutes les deux main.
Calvin's Hobbies
2
La façon dont je me souviens de celle-ci est celle d'une annonce Coca-Cola où ils "ont mis la chaux dans le Coca-Cola" ...
Joe Z.

Réponses:

9

CJam, 120 permutations valides, 334 299 290 octets

"She put the lime in the coconut, she drank them both up"N+
"Brother bought a coconut, he bought it for a dime"N+]$~
"She put the lime in the coconut, she drank them both up"N+
"His sister had another one, she paid it for a lime"N+]$~
"She put the lime in the coconut, she drank them both up"N+

Logique assez simple:

  • Mettez chaque ligne de la chanson dans chacun des 5 programmes
  • Envelopper tout sur la pile dans un tableau
  • Trier le tableau
  • Déballez le tableau pour que le programme suivant puisse utiliser la même logique
  • À chaque étape, nous avons les paroles partielles dans un tableau. Heureusement, le tri du tableau donne l'ordre correct des paroles.

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 :)

Optimiseur
la source
8

Prélude , 120 permutations, 2045 2035 octets

9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                          (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+9409-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-5809-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-992++87993++96+209-9-9-9-9-9-9-1-99+58992++96+99+09-9-9-3-                                             (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                 (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-594+993+09-9-9-9-9-9-9-1-109-9-9-9-9-9-9-1-99+96+609-9-9-9-9-9-9-1-992++909-9-9-9-9-9-9-1-49197+09-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-595+96+09-9-9-9-9-9-9-1-99+58992++96+95+109-9-9-9-9-9-9-1-41809-9-9-9-9-9-9-1-99+5992++991++9991++09-9-9-9-9-9-9-1-991++909-9-6-                                                           (9+9+9+9+9+9+9+9+9+9+6+!)
9-9-9-9-9-9-9-9-9-5-97+993++09-9-9-9-9-9-9-1-8992++96+209-9-9-9-9-9-9-1-94+58992++09-9-9-9-9-9-9-1-92+95+199+409-9-9-9-9-9-9-1-58991++09-9-9-9-9-9-9-1-09-9-9-9-9-7-992++993++95+96+396+309-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-95+909-9-9-9-9-9-9-1-594+993+09-9-9-9-9-9-9-1-58992++09-9-9-9-9-9-9-1-992++993++97+09-9-9-9-9-9-9-1-5809-4-                                                                                                   (9+9+9+9+9+9+9+9+9+9+6+!)

Cela 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

"push line 4"               print
"push line 1"print
"push line 3"          print
"push line 2"     print
"push line 5"                    print

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'un 0est 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:

"Brother bought a coconut, he bought it for a dime
"W%{i96-_0<{zLa*9/:,'-*'-+0\+}{La*9/:,_,'+*W<}?}%

Enfin, juste pour le plaisir, pourquoi je pense que ce serait vraiment court si Prelude avait un concept de cordes:

"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emid a rof ti thguob eh ,tunococ a thguob rehtorB"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!
"emil a rof ti diap ehs ,eno rehtona dah retsis siH"N+!
"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"N+!

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.

Martin Ender
la source
7

Ruby, 120 permutations valides, 430 octets

$*[1]='His sister had another one, she paid it for a lime';a||=at_exit{puts($*-[p])}
$*[0]='Brother bought a coconut, he bought it for a dime';a||=at_exit{puts($*)}
$*[2]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[3]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}
$*[4]='She put the lime in the coconut, she drank them both up';a||=at_exit{puts($*-[p])}

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.

histocrate
la source
La question dit "5 programmes à ligne unique". Cela ne signifie-t-il pas que chaque ligne doit être dans un programme distinct? Pas tout en un?
bacchusbeale du
1
Juste une question de formatage. Chaque ligne fonctionne comme son propre programme.
histocrate
6

> <> , 120 permutations, 703 octets

<    /a"emid a rof ti thguob eh ,tunococ a thguob rehtorB"0a.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<   / a"emil a rof ti diap ehs ,eno rehtona dah retsis siH"09.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
<  /  a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"08.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
< /   a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"07.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"
</    a"pu htob meht knard ehs ,tunococ eht ni emil eht tup ehS"06.#.!50padpacpabpaapa9pa8pa7p97p87p77p67p57p95p84p73p62p51"/////\\\\\>l0=?;o"

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écutant

"o;?=0l>\\\\\\/////"15p26p37p48p59p75p76p77p78p79p7ap8ap9apaapbapcapdap

Il s'agit d'une série d' pinstructions (put) qui place les caractères jusqu'à ce que le tableau ressemble à ceci:

<    /<lyrics1>0a.#.!50<blah>
<   / <lyrics2>09.#.!50<blah>
<  /  <lyrics3>08.#.!50<blah>
< /   <lyrics4>07.#.!50<blah>
</    <lyrics5>06.#.!50<blah>
 /     \
  /    \
   /   \
    /  \
     / \
       >l0=?;o

Le #.!50programme retourne ensuite à nouveau vers la droite, avant de passer à la ligne 5. Ce qui suit est le suivant:

  • Suivre le /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.
  • Suivre le /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.
  • Suivre le /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!

Sp3000
la source