Dans ce défi, vous obtenez une carte d'un terrain à deux dimensions, vu de côté. Malheureusement, certaines parties du terrain flottent dans l'air, ce qui signifie qu'elles vont s'écraser. Votre travail consiste à prédire où ils atterriront.
L'entrée
Votre entrée est une ou plusieurs chaînes séparées par des retours à la ligne de longueurs égales, contenant uniquement les caractères #
(un signe numérique, signifiant un rocher) ou .
(un point, signifiant un espace vide).
Le résultat
Votre sortie a le même format que l'entrée, mais avec la modification suivante. Voyons la chaîne d'entrée comme une grille de roches à deux dimensions. Chaque roche dans l'entrée qui est reliée au bas de la grille par un chemin de roches adjacentes est ferme ; d'autres roches sont lâches . Les roches adjacentes en diagonale ne sont pas considérées comme adjacentes. Toutes les roches lâches tomberont directement vers le bas et finiront comme une pile au-dessus d'une roche ferme ou de la rangée inférieure. Les roches lâches ne sont pas attachées les unes aux autres, elles tombent donc individuellement, pas comme de grosses formations. La sortie est la grille résultante.
Exemples
L'entrée
..###. .##.#. .#.... .##.#.
ne contient pas de roches en vrac, donc la sortie est identique à celle-ci.
L'entrée
...#.. .#..#. .#..## .#...# .##### .#...#
contient une roche meuble en haut, qui tombe sur la roche ferme en dessous. La sortie est
...... .#..#. .#..## .#.#.# .##### .#...#
L'entrée
.#####.... .#....#### ###.###..# #.#...##.. .####..#.# ......###. ..#...#..# ..#...#..#
a un grand groupe de roches lâches sur la gauche. Le groupe tombe en panne lorsque les rochers tombent, donc la sortie est
.......... ....###### ..#.###..# . #...##.. .##....#.. .##...#### ####..#..# #####.#..#
Clarifications
- Vous pouvez soit prendre l'entrée de STDIN et la sortie vers STDOUT, soit écrire une fonction.
- C'est le code-golf, donc le programme le plus court (en octets) est le gagnant.
- Les failles standard ne sont pas autorisées.
Réponses:
CJam,
180 ... 133 101 ... 94 9087 octetsIl y a certainement beaucoup de golf possible, mais je voulais le poster d'abord après l'avoir fait fonctionner complètement.Reprend la grille des roches (composée
.
ou#
non d'une nouvelle ligne de fin) de STDIN et imprime la sortie dans STDOUTMISE À JOUR : Utilisation d'un remblayage partiel inefficace mais plus court pour déterminer les roches fermes.
MISE À JOUR 2 : Modification de l'algorithme pour faire tomber les roches. Beaucoup plus court maintenant!
MISE À JOUR 3 : A fait plusieurs petites optimisations et à la fin j'ai pu ramener le nombre d'octets à la moitié du code d'origine!
Comment ça marche :
Pour le remblai, nous itérons sur toute la longueur de la grille (grille) fois. À chaque itération, nous sommes garantis de convertir au moins 1
#
qui touche directement un espace en(espace). L'espace représente ici un groupe de rock ferme. Ainsi, à la fin des itérations de longueur (grille), nous sommes garantis que toutes les roches fermes sont représentées par des espaces.
Essayez-le en ligne ici
la source
Perl 5: 98
98 comprenant 2 drapeaux de ligne de commande.
Explication:
la source
JavaScript (ES6) 232
En tant que fonction avec un paramètre de chaîne et renvoyant une chaîne.
Au début, ajoutez une rangée inférieure de «1» pour identifier la ligne de fond.
La première boucle recherche les roches fixes (qui sont proches d'un «1») et les marque également comme «1». La recherche est répétée jusqu'à ce qu'aucune autre pierre ferme ne soit trouvée.
La deuxième boucle déplace les caractères «#» restants vers la ligne du bas. Encore une fois, cela se répète jusqu'à ce qu'aucun rocher ne puisse être déplacé.
Enfin, remplacez le «1» par «#» et coupez la rangée du bas.
Moins golfé
Test (Vous pouvez avoir des preuves de ce que les roches sont fermes et ce qui est tombé)
la source
APL,
130119Puisqu'il n'est pas possible (pour autant que je sache) d'entrer des retours à la ligne lorsque la saisie est demandée, ce programme prend une matrice de caractères en entrée.
L'algorithme utilisé est d'abord la conversion en une matrice binaire (
0
est de l'air et1
est de la roche) puis le remplissage par inondation de la rangée du bas pour marquer les roches fermes comme2
. Ensuite, partitionnez chaque colonne en "espaces entre les roches fermes" et triez chaque partition pour faire "tomber" la roche meuble dans l'air.Edit1: Golfé certains en utilisant un algorithme de remplissage d'inondation différent
Essais
Exécuter 1
Définissez une matrice de caractères
A
et imprimez-la:Ensuite, alimentez
A
le programme:Exécuter 2
la source
JS - 443 octets
L'inondation remplit les roches par le bas, puis fait descendre les roches non inondées. Utilise beaucoup de récursivité avec le remplissage d'inondation, ce qui peut retarder un peu votre navigateur.
C'est une fonction - appelez-la avec
g("input")
JSFiddle: http://jsfiddle.net/mh66xge6/1/
JSFiddle non golfé: http://jsfiddle.net/mh66xge6/
la source
Python 3, 364 octets
Je suis sûr que plus pourrait être évincé de cela ... mais ça ne va jamais rivaliser avec CJam et Perl.
Similaire à d'autres réponses. Une bizarrerie est qu'elle tourne la grille à l'envers en premier (pour rendre les indices de boucle plus pratiques) et ajoute une ligne et une colonne supplémentaires de
.
(pour éviter les problèmes avec les-1
indices de bouclage ). Exécutez en appelantP(string)
.la source