Je sais qu'il existe un (vieux) thread similaire à celui-ci ( ici ), mais j'aimerais le redémarrer avec quelques modifications.
L'objectif: générer un labyrinthe d' apparence aléatoire à l' aide d'un algorithme de votre choix, puis générer le labyrinthe sous forme graphique (le nombre d'impressions).
- La largeur et la hauteur sont déterminées par vous.
- Il devrait y avoir au moins un chemin d’au moins une entrée à au moins une sortie.
- Le format du labyrinthe (comment vous l'affichez, marquez les entrées ou les sorties) dépend également de vous.
- Le plus joli, mieux c'est.
- Les labyrinthes triviaux (par exemple, les labyrinthes vierges, les labyrinthes en treillis, les labyrinthes de taille 1x1) sont déconseillés.
- Les cycles dans le labyrinthe sont autorisés et sont encouragés si le résultat est raisonnable.
- Abus de langage encouragé.
- Le labyrinthe doit avoir une apparence raisonnablement aléatoire (mais un algorithme complètement déterministe (par exemple chaotique) générant ceci est également utile).
Edit: l'objectif principal est de réaliser la plus petite implémentation possible. Cependant, je souhaite laisser une marge de manœuvre dans le cadre de cette contrainte pour encourager la brillance. J'ai délibérément laissé exactement quelles «fonctionnalités» le labyrinthe est ouvert, mais comme ligne de conduite approximative, vous devriez essayer de placer le maximum de coup dans le dollar lexical.
code-golf
popularity-contest
maze
imallett
la source
la source
Réponses:
C:
265253 octets(Nécessite un terminal de 65 caractères) Génère un labyrinthe relativement aléatoire de 31x31 avec un chemin garanti de l’entrée à la sortie.
Exemple de sortie (avec terminal simulé à 65 caractères):
la source
int p,int c
.p,c
est suffisant ...Mathematica,
144132 octetsDepuis sa création, nous connaissons tous le moyen le plus efficace de dessiner un labyrinthe .
Ungolfed et exemple de sortie:
Bien sûr, les lignes sont les murs. Vous êtes le minotaure qui commence au centre et doit sortir.
la source
C: 364 octets
Remarque: dans ce qui précède, j'ai ajouté des nouvelles lignes pour l'adapter à la page. Sortie attendue (sur un terminal à 80 caractères) (notez le début et la fin en haut à gauche):
la source
Mathematica,
134130 caractèresEn fait, nous pouvons utiliser cet algorithme pour générer un labyrinthe à partir de n’importe quel graphe (non dirigé).
Par exemple, générez un labyrinthe à partir du graphe de la tournée du chevalier 8 * 8 (
KnightTourGraph[8,8]
):la source
Bash, 53 octets
Idée similaire au code C64. Utilise des caractères Unicode en tant que barres obliques car ils sont beaucoup plus agréables dans un terminal prenant en charge Unicode. Exemple de sortie sur terminal OS X (police Menlo):
la source
yes 'c=(╱ ╲);printf ${c[RANDOM%2]}'|bash
. Voir cet articleJavaScript (ES6), 174
C'est le constructeur de labyrinthe que j'ai utilisé dans cet autre défi , juste joué au golf. C'est une fonction avec 2 paramètres: lignes et colonnes. Le labyrinthe est totalement connecté sans boucles, donc n'importe quel emplacement peut être le point de départ ou d'arrivée.
Exemple
Sortie
Tester
la source
ZX Basic - 54 caractères
Voici le labyrinthe montrant une route à travers elle (espaces entre les lignes)
et un petit extrait de la première fois où je l'ai fait (il y a plusieurs années) et où j'ai passé un peu de temps à faire de meilleurs graphiques.
la source
BBC BASIC, 18 octets
Une amélioration de la longueur de la version de la boucle infinie C64 à 23 octets de @nneonneo. La VDU envoie un seul caractère au contrôleur de la VDU: 2 + 1 * 45 = ASCII 47
/
ou 2 + 2 * 45 = ASCII 92\
BBC BASIC, 35 octets /
107 à95 octets35 octets ne représentent que la dernière ligne, ce qui donne un labyrinthe de 25 lignes en 40 colonnes. MODE1 garantit qu'aucun espace supplémentaire n'est laissé entre les lignes. Le reste du programme est optionnel et améliore la mise en forme. Les instructions VDU23 redéfinissent la police des caractères 47 et 92 (8 octets formant un bitmap 8x8). J'inclus un pixel clair dans les quatre coins pour empêcher les lignes droites d'être pincées. L'effet secondaire de ceci est qu'un point apparaît dans les diamants vides. 107 octets au total, y compris 2 nouvelles lignes.
Vous pouvez réduire ce programme à 95 octets en codant certains des codes de la VDU à 8 bits en petites valeurs finales de 16 bits (indiquées par un point-virgule après celles-ci au lieu d’une virgule) et en représentant l’instruction MODE sous la forme d’une paire de codes de la VDU, comme suit .
Sortie
Utilisation de BBC Basic pour Windows de bbcbasic.co.uk
Dernière ligne seulement, 35 octets
Programme entier,
10795 octetsComme je l'ai commenté sur la réponse de @ Brian, la barre oblique divise le carré en 2 triangles noirs, chacun ayant exactement 2 entrées / sorties. Cela garantit un chemin (trivial, non ramifié) de n'importe quel point du bord du labyrinthe à un autre point du bord du labyrinthe. Beaucoup d’entre elles sont très courtes, mais il semble toujours y en avoir quelques-unes longues. Bien sûr, au milieu du labyrinthe, il y a aussi des boucles.
Comme d’autres réponses ne l’ont pas mentionné, j’aimerais bien examiner les zones claires. Celles-ci sont délimitées par des zones sombres. Par conséquent, corollairement à la déclaration ci-dessus, une zone claire délimitée extérieurement par N zones sombres touche le bord du champ en N (exactement autant) points. Par conséquent, il existe des zones de lumière assez grandes qui forment des labyrinthes intéressants et ramifiés.
Dans l'exemple ci-dessous, vous pouvez voir la sortie brute (monochrome) de mon programme. En dessous (avec Windows Paint), j'ai coloré en bleu les deux zones sombres les plus longues. Ensuite, j'ai coloré la plus grande zone lumineuse en jaune et les deux zones délimitées en bleu en rouge et vert. Les labyrinthes jaunes, verts (et même les rouges) sont assez intéressants et non triviaux.
EDIT - Cueillette automatique des labyrinthes et sélection des débuts / fins
Pour une ligne supplémentaire (59 caractères), le programme peut sélectionner automatiquement jusqu'à 6 labyrinthes en choisissant des carrés au hasard et en remplissant les couleurs rouge, vert, jaune, bleu, magenta et cyan. Il ne trouve pas toujours un 6 entier, car s'il choisit un carré aléatoire qui a déjà été coloré, il ne fait rien.
Le reste du code ci-dessous choisit un début pour chaque couleur en balayant chaque colonne de haut en bas et de gauche à droite, puis en sélectionnant la première case rencontrée. Il choisit une fin en balayant dans la direction opposée.
Cela produit un ensemble de labyrinthes colorés et entrelacés. Parfois, ils sont tellement liés que les labyrinthes doivent traverser quelque part. Mais bien sûr, ils ne le font pas!
Code et sortie supplémentaires 59 + 187 = 246 caractères supplémentaires à ajouter à la fin du programme d'origine (pour une amélioration au-delà de la spécification de question)
la source
C: 235 octets
Remarque: dans ce qui précède, j'ai ajouté des nouvelles lignes pour l'adapter à la page. Sortie attendue (sur un terminal à 80 caractères):
Je regrette que ce n'est pas un labyrinthe très difficile (en fait, il n'est pas nécessaire de revenir en arrière sur les anneaux intérieurs (et vous devriez être capable de trouver un chemin du périmètre au centre de manière triviale). Cependant, il a une belle implémentation du cercle de Bresenham algorithme de dessin à sa base.
la source
i+=2
ài+=3
, il sera peut-être plus clair ce qui se passe.J'ai aidé mon enfant à faire cela, à apprendre un peu de programmation: http://jsfiddle.net/fs2000/4KLUC/34/ comment ça te plaît?
la source
Commodore 64 BASIC - 38 octets
Ce n'est pas mon invention, je ne fais que répéter un très beau programme court du temps passé. En fait, il existe un livre entier intitulé «
10 PRINT CHR$(205.5+RND(1)); : GOTO 10
Célébrer ce code!Vous pouvez voir le résultat sur cette vidéo YouTube ; voici un screencap:
Ici à cette question StackOverflow sont plus d'implémentations de ce programme générateur de labyrinthe. La mise en œuvre la plus courte du programme est le programme BASIC C64 de 23 octets suivant posté par l'auteur de cette question:
où les lettres minuscules sont entrées telles quelles et les lettres majuscules à l'aide de la touche Maj (elles ont une apparence différente sur un écran C64 réel).
la source
Java: 700
Voici un sommateur mural récursif. L'algorithme est décrit sur ce site :
Fondamentalement, il divise chaque rectangle en deux avec un mur (et un passage), puis en deux, etc. Il génère un labyrinthe "parfait" - un cycle sans cycles - qui a un chemin allant de point en point. Beaucoup d'impasses, donc ce n'est pas "trivial" dans tous les sens pour les plus grands labyrinthes.
Ainsi, l'entrée et la sortie peuvent être décidées arbitrairement. Si je dois en choisir un, il suffit de dire haut / gauche et bas / droite.
Il est dessiné au format ASCII double largeur, il est donc judicieux de diriger la sortie vers un fichier si vous utilisez un fichier de toute taille. Voici une console 20x20:
Et un 100x100 dans le bloc-notes ++ (je devais effectuer un zoom arrière pour avoir tout ça, alors c'est un peu ... petit ):
Code avec sauts de ligne:
la source
ZX Basic - 281 caractères
Il s’agit plus d’un labyrinthe "correct", moins golfeur, mais plus mazier. Ce que l’on appelle l’algorithme du labyrinthe binaire, chaque cellule peut avoir une sortie en descente ou à droite, mais pas les deux. (Inclut maintenant les points de départ «S» et fin «E» marqués pour éviter de continuer tout droit d’un côté).
Le "::" est la méthode utilisée par ZXB pour saisir les caractères graphiques Spectrum dans un fichier texte, ce qui équivaut à un caractère de bloc vendu.
la source
C-244
Voici à quoi ça ressemble:
Remarque: cette solution est inspirée du jeu non approuvé du niveau 8: dans les bois.
la source