Votre tâche consiste à jouer les rôles des deux personnages dans cette scène de Inception. Dans ce document, Cobb lance un défi à Ariane:
Vous avez deux minutes pour concevoir un labyrinthe qui prend une minute à résoudre.
Certaines libertés seront prises sur cette description. Plus important encore, ce défi n'est pas basé sur le temps, les scores sont plutôt basés sur l'efficacité de vos labyrinthes et de vos labyrinthes.
Je m'excuse pour les nombreuses modifications apportées à ce défi alors que nous itérons vers un format simple et équitable ..
Partie I: Format du labyrinthe
Tous les labyrinthes sont carrés. Une cellule du labyrinthe est représentée comme un tuple indexé zéro row column
.
Les murs sont représentés par deux chaînes binaires: une pour les murs horizontaux (qui bloquent le mouvement entre les rangées) et les murs verticaux (vice versa). Sur un NxN
labyrinthe, il existe Nx(N-1)
des murs possibles de chaque type. Prenons un exemple 3x3 où les cellules sont étiquetées:
A B | C
---
D | E F
---
G H | I
toutes les parois verticales possibles sont les suivantes : AB BC DE EF GH HI
. Traduits en chaîne, les murs indiqués sont 011001
des murs verticaux et 010010
des murs horizontaux. En outre, par "chaîne binaire", je veux dire "les caractères" 0 "et" 1 "".
Le format du labyrinthe complet est une chaîne qui contient, dans cet ordre:
- largeur
- démarrer le tuple de cellule
- tuple de cellule d'extrémité
- murs horizontaux
- murs verticaux
Par exemple, ce labyrinthe:
0 1 2 3 4
_________
0 | | E| _|
1 | _|_|_ |
2 |_ _ _ | |
3 | _ _ | |
4 |____S|___|
start:(4,2)
end:(0,2)
est formaté comme suit:
5
4 2
0 2
00001011101110001100
10100110000100010010
Partie II: L'architecte
Le programme Architect crée le labyrinthe. Il doit respecter les règles et fournir un labyrinthe valide (celui où une solution existe et où la fin n'est pas au-dessus du début).
Entrée: deux entiers positifs:
size [random seed]
Où size
sera [15, 50]
. Nous vous encourageons à utiliser la graine aléatoire afin que les matchs puissent être rejoués, bien que cela ne soit pas obligatoire.
Sortie: un labyrinthe de taille x taille (carré) valide utilisant le format décrit dans la partie I. «valide» signifie qu'une solution existe et que la cellule de début n'est pas égale à la cellule de fin.
Le score d'un architecte sur un labyrinthe donné est
# steps taken to solve
–––––––––––––––––––––––––––––
max(dist(start,end),(# walls))
Les architectes sont donc récompensés pour des labyrinthes complexes, mais pénalisés pour chaque mur construit (ceci remplace la restriction de temps d'Ariane). La dist()
fonction garantit qu'un labyrinthe sans murs n'obtient pas un score infini. Les bordures extérieures du labyrinthe ne contribuent pas au dénombrement des murs.
Partie III: Le solveur
Le Solveur tente de résoudre des labyrinthes générés par les architectes des autres. Il y a une sorte de brouillard de guerre: seuls les murs adjacents aux cellules visitées sont inclus (tous les autres sont remplacés par «?»)
entrée: le même format de labyrinthe, mais avec '?' où les murs sont inconnus, une ligne supplémentaire pour l'emplacement actuel et une liste de choix valides séparés par des virgules à partir de cet emplacement. (Il s'agit d'un gros montage qui vise à simplifier l'écriture d'une fonction d'analyse de labyrinthe)
exemple (identique au labyrinthe 5x5 ci-dessus après avoir fait un pas à gauche)
5
4 2
0 2
???????????????011??
????????????????001?
4 1
4 0,4 2
Ce qui correspond à quelque chose comme ça, où ?
est le brouillard:
0 1 2 3 4
_________
0 |????E????|
1 |?????????|
2 |?????????|
3 | ?_?_????|
4 |__C_S|_?_|
sortie: l' un des tuples de la liste des choix valides
Le score de chaque solveur est l'inverse du score de l'architecte.
Partie IV: Roi de la colline
Les architectes et les solveurs reçoivent des scores séparés, il pourrait donc y avoir potentiellement deux gagnants.
Chaque paire d'architectes et de solveurs aura de nombreuses chances de se surpasser. Les scores seront calculés en moyenne sur tous les tests et adversaires. Contrairement aux conventions de golf de code, le score moyen le plus élevé gagne!
J'ai l'intention que cela se poursuive, mais je ne peux pas garantir la poursuite des tests pour toujours! Disons pour l'instant qu'un gagnant sera déclaré dans une semaine.
Partie V: Soumission
- Je conserve un droit de veto sur toutes les soumissions - l'intelligence est encouragée, mais pas si cela brise la concurrence ou mon ordinateur! (Si je ne peux pas dire ce que fait votre code, je vais probablement y opposer mon veto)
- Trouvez un nom pour votre paire Architecte / Solveur. Publiez votre code avec des instructions sur la façon de l'exécuter.
Prochainement: un kit de test python mis à jour pour le nouveau format. De grands changements se sont produits pour permettre toutes les soumissions linguistiques.
la source
Réponses:
BuildFun et SolveFun
Eh bien, cela a pris un certain temps et je ne suis pas tout à fait sûr de savoir si le solveur triche ou non. Bien qu'il ait accès à tout le labyrinthe tout le temps, il ne regarde que la cellule dans laquelle il se trouve, les murs qui l'entourent et, s'il n'y a pas de mur entre eux, les cellules adjacentes. Si cela est contraire aux règles, veuillez me le faire savoir et j'essaierai de le changer.
Quoi qu'il en soit, voici le code:
Je me rends compte que c'est ridiculement long et pas particulièrement facile à lire, mais je suis paresseux alors c'est comme ça que ça reste.
BuildFun
L'architecte, BuildFun, est un programme de génération de labyrinthe assez simple qui créera toujours un labyrinthe «parfait» (un sans boucles et où deux points auront toujours exactement un chemin entre eux). Il fonde sa logique sur l'entrée de graine, ce qui signifie que les labyrinthes générés sont pseudo-aléatoires avec ce qui semble souvent être des motifs répétitifs et, avec la même graine et la même taille, le même labyrinthe sera créé.
Une fois le labyrinthe généré, le programme tentera de maximiser le score du labyrinthe en recherchant le point de départ et le point final qui se traduisent par le chemin le plus long entre eux. Pour ce faire, il parcourt chaque point de départ, répartit les traceurs pour trouver le point final le plus éloigné et sélectionne la combinaison avec le chemin le plus long.
Après cela, il dessine le labyrinthe, compte les murs et sort les informations du labyrinthe. Il s'agit du point de départ, du point d'arrivée, de la distance entre eux, du nombre de murs et du score. Il formate également ces informations dans le style décrit ci-dessus pour la taille, le début et la fin, les murs horizontaux et les murs verticaux et les enregistre dans un fichier texte appelé Maze.txt pour une utilisation ultérieure.
SolveFun
Le solveur, SolveFun, utilise le fichier texte Maze.txt comme entrée et fonctionne de manière très similaire à l'architecte. Pour chaque mouvement, il choisira une direction qu'il veut suivre en fonction de sa position relative jusqu'à la fin, puis il regardera les murs qui l'entourent. Si un mur n'est pas là, il vérifiera s'il a été dans la cellule adjacente et, sinon, il sera ajouté comme option possible. Il se déplacera ensuite dans la direction la plus proche de sa direction préférée à condition qu'il ait des options. S'il n'a pas d'options, il reviendra en arrière jusqu'à ce qu'il le fasse. Cela continue jusqu'à la fin.
En se déplaçant, il enregistre le chemin qu'il prend dans le chemin variable qui est utilisé à la fin pour afficher le nombre total d'étapes. Il enregistre également le nombre de fois qu'il a dû revenir en arrière pour calculer les étapes perdues à la fin. Quand il atteint la fin, il sortira le labyrinthe avec le chemin le plus court du début à la fin marqué avec
*
s.Comment courir
En raison de la méthode de sortie du labyrinthe (qui comprend le soulignement de certains caractères), cela doit être exécuté à partir d'une ligne de commande sous la forme
python -c 'import filename;filename.BuildFun(Size, Seed)'
et
python -c 'import filename;filename.SolveFun()'
où Size est un entier compris entre 15 et 50 (inclus) et Seed est un entier compris entre 4 et Size (inclus).
la source