Vous êtes responsable de la construction d'une nouvelle autoroute. Cependant, il mène à travers des terres montagneuses et a donc besoin de nombreux ponts et tunnels. L'autoroute elle-même devrait rester à un seul niveau.
Contribution
Vous obtenez une description ASCII approximative de l'apparence des montagnes sur une entrée standard, comme suit:
/\
/ \
/\ / \
/\ / \/ \
/ \ / \ /\
/ \/ \ / \
_ / \ /\ / \
\ / \ / \ / \ /\
\ / \ / \/ \/ \
\ / \ /
\/ \/
Le _
dans la première colonne marque le début et le niveau de la route. La chaîne de montagnes est contiguë et si le dernier segment sera un pont, il aura un nombre pair de caractères.
Vous pouvez supposer qu'une ligne d'entrée ne dépasse jamais 100 caractères et qu'il n'y a pas plus de 15 lignes. Chaque ligne a la même longueur qui est éventuellement remplie d'espace à la fin. La route ne démarre jamais dans une montagne ou comme un pont. La première chose qui suit la tuile route dans l'entrée est soit une pente vers le bas ou vers le haut.
Sortie
La sortie est la même chaîne de montagnes, sauf qu'il y a maintenant une route où auparavant n'était que son début. La sortie est donnée sur la sortie standard.
Pour cela, il existe de nombreuses règles:
La route doit commencer à l'endroit indiqué dans l'entrée et rester au même niveau tout au long. Pour vous faciliter la tâche, nous avons préparé un certain nombre de carreaux routiers préfabriqués qui ressemblent à ceci
_
::_______ \ / \/\/
La route doit s'étendre jusqu'à l'extrémité de la chaîne de montagnes (c'est-à-dire que la longueur des lignes d'entrée dicte jusqu'où la route va).
Les tunnels doivent être forés chaque fois qu'une montagne est l'endroit où la route doit aller. Les tunnels traversent directement la montagne et laissent des trous au début et à la fin (c'est-à-dire qu'un tunnel remplace la pente de la montagne avec une parenthèse fermante à son début et une parenthèse ouvrante à sa fin).
Les tunnels laissent, bien, un tunnel dans la montagne qui a généralement un plafond. Heureusement, nos carreaux de route préfabriqués peuvent être utilisés pour renforcer le plafond afin que le tunnel ne s'effondre pas (la ligne au-dessus du tunnel doit être utilisée
_
pour renforcer le tunnel):/\ / \ /____\ ___)______(__ \/ \/
Le tunnel n'a pas besoin d'être renforcé lorsque la montagne n'est pas assez haute au-dessus. Cela me semble bizarre aussi, mais on m'a dit que les carreaux de route préfabriqués sont suffisamment solides pour tenir même lorsqu'ils sont espacés dans ce cas (aucun plafond de tunnel n'est dessiné lorsqu'il y a une pente directement au-dessus du tunnel):
/\ /\/__\ ___)______(__ \/ \/
Des ponts sont nécessaires chaque fois que la route doit traverser un gouffre. Pour les ponts courts, les tuiles routières préfabriquées sont suffisamment solides mais ont encore besoin d'un peu de support au début et à la fin du pont (la première pente descendante sous le pont et la dernière pente ascendante sont remplacées par de
Y
sorte qu'il y ait une poutre de support pour le pont ):_____ Y Y \/
Les ponts plus longs nécessitent un support supplémentaire. Un long pont est celui qui a plus de six tuiles routières non supportées d'affilée. Les ponts longs ont besoin d'un pilier en leur centre. Les piliers sont facilement construits avec nos poutres piliers de préconstruits qui ressemblent à ceci:
|
. Chaque pilier a besoin de deux d'entre eux et ils s'étendent jusqu'au fond du gouffre:_____________________________ Y || Y \ /\ || /\ /\/ \ /\ / \||/ \ /\/ \/ \/ \/ \/
Étant donné que l'entrée ne représente qu'une partie de toute la chaîne de montagnes à travers laquelle l'autoroute doit être construite, elle peut se terminer brusquement au milieu d'un pont ou d'un tunnel. La règle du pont long s'applique toujours au segment final et vous pouvez supposer que la première partie au-delà de l'entrée donnée prend à nouveau en charge le pont.
En suivant les règles ci-dessus, nous obtenons ce qui suit pour notre contribution:
/\
/ \
/\ / \
/\ / \/ \
/ \ / \ /\
/____\/______________\ /__\
_________)______________________(________)(____)____(______
Y Y Y Y Y Y Y YY
\ / \ / \/ \/ \
\ / \ /
\/ \/
Le code le plus court par nombre de caractères gagne. Les espaces de fin dans les lignes sont ignorés pour la validation.
Exemple d'entrée 1
_
\ /\
\ / \
\ / \
\ /\ / \ /\ /
\ /\ / \ / \ /\ /\/ \ /
\ / \ / \/ \ / \/ \/\ /
\/ \ / \ / \/
\ / \/
\/
Exemple de sortie 1
____________________________________________________________
Y || YY ||
\ || / \ ||
\ || / \ ||
\ || /\ / \ || /\ /
\ /\ || / \ / \ /\ |/\/ \ /
\ / \ || / \/ \ / \/ \/\ /
\/ \ || / \ / \/
\||/ \/
\/
Exemple d'entrée 2
/\ /\
/ \/ \ /
/\ / \ /\ /
/\ / \ / \/ \ /
/ \ / \/\ / \ /\ /
/ \/ \ / \ / \ /
_/ \ / \/ \/
\ /
\ /\/
\ /\ /
\/ \ /
\ /
\/
Exemple de sortie 2
/\ /\
/ \/ \ /
/\ / \ /\ /
/\ / \ / \/ \ /
/ \ / \/\ / \ /\ /
/____\/________\ /__________________\ /__\ /____
_)________________(__________________)____________________()____()_____
Y || Y
\ || /\/
\ /\ || /
\/ \|| /
\| /
\/
Remarque
Les espaces de fin dans la sortie sont ignorés pour la comparaison avec les solutions de référence.
Condition gagnante
Le code le plus court gagne, comme c'est la coutume dans le golf. En cas d'égalité, la solution précédente l'emporte.
Cas de test
Il existe deux scripts de test, contenant des cas de test identiques:
L'invocation est dans les deux cas:, <test script> <my program> [arguments]
par exemple ./test ruby bridges.rb
ou ./test.ps1 ./bridges.exe
.
Une autre note
Cette tâche faisait partie d'un concours de golf organisé dans mon université en 2011-S24. Les scores et les langues de nos candidats étaient les suivants:
- 304 - Perl
- 343 - C
- 375 - C
- 648 - Python
Notre propre solution (grâce à Ventero) était
- 262 - Rubis
Réponses:
Perl,
210195194193 193 caractèresmise à jour
Mêmes idées, mais appliquées très différemment, pour la plupart.
Exécuter avec
perl -p0
(4 caractères comptés pour les commutateurs).Cela nécessite également une modification du script de test bash, afin de ne pas surestimer les arguments:
BTW, j'apprécie vraiment les scripts de test, @Joey.
a commenté:
modifications :
{3,}
" par 3 espaces littéraux et le+
quantificateur, pour enregistrer un autre caractère1while(...)
formulaire, où je peux omettre le point-virgule à la fin du scriptoriginal (voir l'historique pour la version commentée)
Je n'ai délibérément pas regardé la solution Perl de @ Howard jusqu'à ce que la mienne fonctionne, mais j'ai pu améliorer mon golf en regardant par la suite.
En particulier, les regexps pour les plafonds des tunnels et les piliers d'extension ont aidé. Bien joué, Howard.
Inversement, mon alternative pour obtenir la longueur de ligne, en utilisant le $ _ implicite pour l'impression, en laissant le dernier point-virgule et en supprimant les nouvelles lignes pourrait raccourcir Howard à 222 caractères.
la source
bash
script de test, remerciez Ventero. Je viens de prendre ce qu'il a créé et je l'ai critiqué jusqu'à ce que ça marche quelque peu ;-)Perl, 234 caractères
Il s'agit d'une solution perl regex uniquement. Il passe tous les cas de test donnés.
La version identique mais plus lisible montre les étapes suivies pour obtenir le résultat:
la source
C ++,
662622598 caractères, 4 lignesÇa devrait être ça, j'ai testé ça avec le script powershell donc ça devrait aller ...
Modifier 1
Remplacement de toutes les constantes char par des nombres, suppression des appels successifs à std :: cout + quelques autres modifications mineures.
Modifier 2
dernière modification, juste pour obtenir moins de 600. Supprimé g [t] [f] en tant que #define et déplacé quelques éléments.
la source
#define
std::
?Ruby,
382356353 caractèresJ'ai pensé donner un coup de feu à une solution non regex.
Le plus grand économiseur d'espace ici est d'utiliser l'
||
opérateur conditionnel au lieu deif - elsif - end
. Donc, au lieu d'écrire,if(a) lorem_ipsum end
j'ai écrit!a||lopem_ipsum
. Des blocs plus grands peuvent être inclus à l'aide de parenthèses!a||(block)
. Si la condition inclut des&&
opérateurs, ils doivent être annulés en utilisant des parenthèses et un!
ou en utilisant les lois de De Morgan.Et voici la même chose avec plus de mots
la source
Scala, 462 caractères
Pas particulièrement compétitif, mais j'ai beaucoup appris sur les expressions régulières aujourd'hui. :-)
la source
Erlang, 1182 caractères
Pas du tout compétitif. Pour être honnête, j'étais simplement intéressé par la production d'un bel art ascii, pas tellement dans le golf. Notez que cela n'utilise pas d'expressions régulières, au lieu de cela, j'ai écrit la machine d'état moi-même. Cela nécessitera également le correctif de sur-cotation dans le script shell, mentionné dans la solution perl ci-dessus.
la source
Powershell,
300295 287 octetsCorrection de -8 octets sur la réponse de DCharness .
Script de test non golfé:
Sortie:
Bande dessinée explicative:
la source