introduction
Ma nièce veut faire une piste de course. Elle a des pièces en bois qui s'assemblent pour former la piste. Chaque pièce est de forme carrée et contient une forme différente. Je vais utiliser les caractères de dessin de tuyau pour illustrer:
│
: la route qui va verticalement─
: la route qui va horizontalement┌
┐
└
┘
: les routes qui tournent dans une direction┼
: Un pont avec un passage souterrain
Curieusement, il n'y a pas de pièces de jonction en T.
Voici un exemple de piste de course possible:
┌─┐
│ │┌─┐
│ └┼─┘
└──┘
Les règles pour une piste de course automobile valide sont les suivantes:
- Il ne peut y avoir de routes qui ne mènent nulle part.
- Il doit former une boucle (et toutes les pièces doivent faire partie de la même boucle).
- Aux ponts / passages souterrains, vous ne pouvez pas tourner (vous devez donc les traverser directement).
Malheureusement, les morceaux de piste de voiture de course que ma nièce et moi avons sont limités. Mais nous voulons vraiment les utiliser tous sur la piste. Écrivez un programme qui, étant donné une liste des pièces qui sont dans notre inventaire, génère une piste de voiture de course qui utilise toutes ces pièces.
Description de l'entrée
Nous aimerions que l'entrée entre via STDIN, des arguments de ligne de commande, la lecture de fichier ou une fonction d'entrée utilisateur (comme raw_input
ou prompt
). L'entrée est des entiers positifs séparés par des virgules sous la forme
│,─,┌,┐,└,┘,┼
où chacun représente le montant de cette pièce particulière que nous avons. Ainsi, par exemple, l'entrée:
1,1,1,1,1,1,1
signifierait que nous avions un de chaque morceau.
Description de la sortie
Sortez une piste de course en utilisant les caractères de dessin de tuyaux répertoriés ci-dessus. La piste de course devrait utiliser exactement le nombre de chaque pièce spécifié dans l'entrée - ni plus, ni moins. Il y aura au moins une piste de course valide pour chaque entrée.
Exemples d'entrées et de sorties
Contribution: 3,5,2,2,2,2,1
Une sortie possible:
┌─┐
│ │┌─┐
│ └┼─┘
└──┘
Contribution: 0,0,1,4,4,1,3
Une sortie possible:
┌┐
└┼┐
└┼┐
└┼┐
└┘
Réponses:
Ruby 664
671 677 687 701(678 octets)Ce n'est pas le programme le plus court que j'ai pu trouver, mais j'ai sacrifié une certaine brièveté pour la vitesse d'exécution.
Vous pouvez expérimenter avec le programme ici . Notez que ideone a une limite de temps d'exécution, donc pour les entrées composées de plus d'environ 12 pièces, le programme expirera probablement.
Il existe également une suite de tests pour le programme. Notez que les deux derniers tests sont désactivés sur ideone, en raison du délai mentionné ci-dessus. Pour activer ces tests, supprimez le
x_
préfixe de leurs noms.Le programme trouve une solution en utilisant la recherche en profondeur d'abord; il place les pièces une à une et garde une trace des extrémités libres. La recherche s'arrête lorsqu'il n'y a plus d'extrémités lâches (non connectées) et que toutes les pièces ont été placées.
Voici le programme non golfé:
la source