introduction
Des golfeurs avertis nous ont préparés pour l'inondation du jugement dernier . Les zones à risque ont été évacuées et la population s'est déplacée vers les hauteurs.
Nous avons sous-estimé le déluge (ou peut-être qu'il y avait un bogue dans le code de @ user12345). Certaines zones d'altitude approchent rapidement du niveau de la mer. Des murs doivent être érigés afin d'assurer la survie des campements désormais densément peuplés. Malheureusement, le gouvernement a un approvisionnement limité en murs.
Problème
Notre scénario apocalyptique est décrit par deux nombres sur une seule ligne, n
et m
. Après cette ligne se trouvent des n
lignes avec des m
valeurs par ligne, séparées uniquement par un seul espace. Chaque valeur sera l'un des quatre caractères.
x
Infranchissable. L'eau ne peut pas couler ici. Les murs ne peuvent pas être érigés ici.-
Instable. L'eau peut y circuler ici. Les murs ne peuvent pas être érigés ici..
Stable. L'eau peut y circuler. Des murs peuvent être érigés ici.o
Campement. L'eau peut y circuler. Si c'est le cas, tout le monde meurt. Les murs ne peuvent pas être construits ici.
L'eau coulera de tous les bords de la carte, à moins que le bord ne soit infranchissable ou qu'un mur soit construit sur la tuile. Écrivez un programme capable de produire le nombre minimum de murs requis pour protéger un campement.
Exemple d'entrée
6 7
x . . x x x x
x . . x - - x
x . x x - - x
x . o o o - .
x . o o o - .
x x x x x x x
Exemple de sortie
3
Hypothèses
- L'eau s'écoule uniquement orthogonalement
- Les campements n'existent que sous la forme d'un bloc contigu orthonagonalement par scénario
- Une solution existera toujours (bien qu'elle puisse nécessiter de grandes quantités de murs)
- Les campements ne peuvent pas être situés sur un bord, car le scénario n'aurait alors aucune solution
- 2
n
<<16 - 2
m
<<16 - L'entrée peut être fournie par stdin, lue depuis "city.txt" ou acceptée comme un seul argument
Le code le plus court gagne!
Réponses:
Mathematica,
257253 caractèresL'entrée est lue
"city.txt"
.Explication:
Mathematica a de nombreuses fonctions pour traiter les graphiques.
Tout d'abord, j'ai lu les données de
"city.txt"
.Ensuite, je construis un graphique en grille avec 'm' * 'n' sommets (
GridGraph@d[[1,{2,1}]]
), et j'y ajoute un "sommet à l'infini" qui est connecté à chaque sommet sur les "bords" du graphique. Ce sommet est d'où l'eau coule.Et
o
,x
ets
désignent les positions de "o", "x" et "." respectivement.Ensuite, pour tout sous
w
- ensemble des
(les sous-ensembles sont triés par longueur), je supprime les sommets dansx
etw
depuisg
(VertexDelete[g,x⋃w]
), et je trouve la longueur du chemin le plus court du "sommet à l'infini" au campemento
. Si la longueur est infinie, le camp sera sûr. Ainsi, la longueur du premierw
est le nombre minimum de murs requis pour protéger un campement.la source
C,
827 799522Golfé:
L'entrée est donnée avec la hauteur et avec comme arguments de ligne de commande, puis la grille est lue comme une chaîne unique sur stdin comme ceci:
./a.out 6 7 < input
où l'entrée est sous cette forme (de gauche à droite, de haut en bas):"Lisible":
Nulle part aussi courte que la solution de @Claudiu, mais elle est extrêmement rapide. Au lieu de se remplir par les inondations depuis les bords, il trouve le campement et fonctionne vers l'extérieur à partir des jetons «o».
Exemples d'emplacements muraux:
la source
@
). J'ai essayé d'exécuter votre code moi-même, mais cela ne semble pas fonctionnerPython,
553525512449414404387368 caractères (+4? Pour l'invocation)J'ai eu beaucoup trop de plaisir à jouer au golf. Il fait 82 octets de plus si vous essayez de le compresser! Voilà une mesure de compacité et de manque de répétition.
Les niveaux d'indentation sont des espaces, des tabulations.
Utilisation :
Lit de
city.txt
:Appelez comme suit:
Il
2>X
s'agit de masquer stderr puisque le programme se termine en levant une exception. Si cela est jugé injuste, n'hésitez pas à ajouter 4 caractères pour l'invocation.Explication :
Force brute simple.
C
fait un remplissage et retourne vrai s'il atteint un campement. Pas de rembourrage supplémentaire car il a fallu trop d'espace pour configurer correctement le rembourrage.D
, étant donné un ensemble de murs à remplir, appelleC
de tous les points sur le bord de sorte que celaC
explique ces murs, et imprime la longueur et les sorties si aucun d'entre eux n'a atteint le campement. La liste des murs est également utilisée pour garder une trace du remblai, donc aucune copie de la planche n'est requise! Trickily,C
ajoute également tous les espaces vides qu'il trouve à une liste, deS
sorte que la fonctionD
est également utilisée pour construire d'abord la liste des espaces vides. Pour cette raison, j'utilise à lasum
place deany
, pour garantir que tous les.
s sont collectés lors de la première exécution.J'invoque
D
une fois, puis je copie la liste des espaces vides dans laZ
mesure oùS
cela continuera d'être ajouté à (inefficace, mais moins cher en fonction du nombre de caractères). Ensuite, j'utiliseitertools.combinations
pour sélectionner chaque combo de spots vides, à partir de 0 spots. J'exécute chaque comboD
et il affiche la longueur du premier qui fonctionne, levant une exception pour quitter le programme. Si aucune réponse n'est trouvée, rien n'est imprimé.Notez qu'actuellement, le programme ne fonctionne pas si aucun mur n'est nécessaire. Ce serait +3 caractères pour s'occuper de ce cas; Je ne sais pas si c'est nécessaire.
Notez également qu'il s'agit d'un
O(2^n)
algorithme, oùn
est le nombre de cases vides. Donc, pour une planche 15x15 complètement vide avec un campement au milieu, cela prendra2^(15*15-1)
=2.6959947e+67
itérations pour terminer, ce qui va être très long en effet!la source
Groovy:
841805754Non golfé:
Beaucoup plus de golf à venir ...
Renvoie 2E9 si aucune solution.
la source
Dyalog APL , 91 octets
⊃∊{1∊a[⍸×{(×d)∧s 3∨/3∨⌿⍵}⍣≡4=d←0@⍵⊢a]:⍬⋄≢⍵}¨c[⍋≢¨c←(,⍳2⊣¨b)/¨⊂b←⍸2=a←(s←(4,4,⍨⍉)⍣2)'xo.'⍳⎕]
suppose
⎕IO=0
, utilise les fonctionnalités de v16.0 (@
et⍸
), le temps d'exécution est exponentiel en nombre de.
-s⎕
est évalué en entrée, doit être une matrice de caractères'xo.'⍳
remplacerx
par 0,o
par 1,.
par 2 et tous les autres par 3s←(4,4,⍨⍉)⍣2
une fonction qui entoure une matrice avec 4sa←
affecter la matrice numérique entourée de 4 à une variablea
b←⍸2=
b
est la liste des paires de coordonnées où les 2 (c'est-à-dire les.
-s) sont(,⍳2⊣¨b)/¨⊂b
générer toutes les combinaisons d'éléments deb
c[⍋≢¨c←...]
les trier par taille{... :⍬⋄≢⍵}¨
pour chaque combinaison, vérifiez quelque chose et renvoyez sa longueur ou une liste vide⊃∊
le premier résultat non vided←0@⍵⊢a
d
esta
avec certains éléments remplacés par 04=
créer une matrice booléenne - où sont les 4? c'est-à-dire la frontière que nous avons ajoutée{...}⍣≡
continuez d'appliquer la fonction{}
jusqu'à ce que le résultat se stabilise3∨/3∨⌿⍵
"booléen ou" chaque élément avec ses voisinss
le résultat sera plus petit, alors recréons la bordure(×d)∧
appliquer les éléments non nuls ded
(les non-murs) comme un masque booléena[⍸× ...]
qu'est-ce quia
correspond aux 1 de notre matrice booléenne?1∊
y a-t-il des 1, c'esto
-à- dire des campements?la source