Je regarde par la fenêtre de mon grenier dans la cour de mon voisin. Ils ont un chien enchaîné à un poteau au centre de la cour. Le chien court autour de la cour mais est toujours au bout de sa chaîne, donc il finit par laisser une trace dans la terre. Normalement, cette piste serait parfaitement circulaire, mais mes voisins ont d'autres poteaux dans leur cour sur lesquels la chaîne du chien est accrochée. Chaque fois que la chaîne du chien frappe un poteau, le chien commence à tourner autour du nouveau poteau avec la longueur de chaîne qui reste comme rayon. Puisque les pôles, le chien et la chaîne ont tous une largeur nulle (mes voisins sont des mathématiciens), la chaîne peut s'enrouler indéfiniment autour d'un pôle sans raccourcir le rayon du cercle. Le chien peut également passer à travers la chaîne (mais pas son collier) si la chaîne se trouve sur son chemin. Après avoir observé cette bizarrerie pendant un certain temps, je décide que j'écrirai du code pour simuler le chien de mon voisin. Le code prendra les emplacements d'un poteau central, auquel le chien est enchaîné, les emplacements des autres poteaux dans la cour de mes voisins, la longueur de la chaîne et l'emplacement de départ du chien, et affichera un diagramme indiquant la chemin où le chien a épuisé l'herbe. Vous pouvez supposer que toute combinaison des éléments suivants est constante (et ne les prenez donc pas en entrée):
Emplacement du poteau auquel le chien est enchaîné
Longueur de la chaîne
Lieu de départ du chien
Le soleil se lève, donc l'espace au sol de mon grenier éclairé par la fenêtre se rétrécit, me laissant de moins en moins d'espace pour écrire mon code. Veuillez essayer de minimiser le nombre d'octets de votre code afin que j'aie de l'espace pour le rédiger sur mon grenier.
Cas de test
Ici, je suppose que le chien commence 3 unités au sud du pôle auquel il est enchaîné (le point rouge), situé à 0,0
. J'ai indiqué où les pôles sont avec des points pour plus de clarté, vous n'avez pas besoin de les inclure dans votre sortie.
Poles at 1,2 -1,2
Poles at 0,.5
Poles at 0,1 1,1 -2,1 -1,-.5
Poles at 0,1 1,1
la source
{0,-.5}
?{0,.5}
retourné verticalement sans le plus grand cercle. Le chien commence essentiellement attrapé sur le deuxième poteau.Réponses:
Python 3 utilisant matplotlib, 457 octets
Parce que vos voisins sont des mathématiciens, j'ai supposé que le jardin de votre voisin occupe le domaine complexe et toutes les coordonnées des objets dans le jardin sont donc des nombres complexes. Pour utiliser cette fonction, vous devez donc lui passer une liste de nombres complexes indiquant l'emplacement des pôles dans le jardin de votre voisin. La représentation par défaut du système de coordonnées a été choisie, où à droite sont des nombres réels positifs et vers le haut sont des nombres imaginaires positifs. Cela signifie que les exemples deviennent:
En outre, le programme suppose les éléments suivants: la laisse est liée au point 0, la laisse fait 3 unités de long et la zone de tracé est de 10 sur 10 centrée autour de 0. Pour ces paramètres, les résultats correspondent exactement aux exemples, et voici à quoi ressemble le résultat (pour l'exemple final):
L'algorithme est assez simple, ne nécessitant qu'un conditionnel pour différencier la recherche dans le sens horaire et antihoraire. L'état de l'algorithme est défini par le point de rotation actuel et l'orientation / la longueur restante de la laisse lorsqu'elle atteint le point de rotation actuel. Cela fonctionne comme suit:
Cet algorithme est ensuite exécuté d'abord dans le sens horaire, après quoi l'état est réinitialisé et il est exécuté dans le sens antihoraire. La simplicité de l'algorithme signifie qu'environ la moitié du nombre de sous-programmes est consacré aux fonctions de dessin. Si les routines de dessin étaient supprimées, cela supprimerait 218 octets de la taille du programme.
Ce qui suit est une version non golfée qui contient également du code de débogage, qui affiche également les points et les collisions en laisse:
La sortie qu'il produit ressemble à ceci:
la source
Traitement 3, 815
833835876879octetsEnregistrement de deux octets grâce à @ZacharyT en supprimant les parenthèses inutiles
Exécutez ce programme comme ceci:
(la fonction
s
prend en afloat[][]
). Il s'agit essentiellement du testcase n ° 3, mais multiplié par 100 pour s'adapter à la fenêtre.Plusieurs choses à noter:
pushMatrix()
et lespopMatrix()
opérations ne peuvent contenir que 32 matrices.Exemple de sortie pour le testcase ci-dessus.
Si vous voulez voir la sortie prettifiée, ajoutez cette ligne juste après la
translate(w,w);
fonction ins
.Et cela nous donne ce résultat:
Non golfé
f()
et explication(contient également du code de débogage)
Pour le dire brièvement, le programme envoie deux "demandeurs", l'un va dans le sens anti-horaire et l'autre dans le sens horaire. Chacun de ces chercheurs trouve le pôle le plus proche et lui dessine un arc si la chaîne est suffisamment longue, sinon il dessine un cercle. Une fois qu'il dessine un arc, il envoie un autre chercheur à ce pôle et le processus se poursuit.
f()
contient le processus de chaque chercheur. Une explication plus détaillée viendra dès que je jouerai au golf.la source
L-d
?LOGO,
305298297293 octetsEssayez le code sur FMSLogo.
Définissez une fonction
draw
(jouée en tant qued
) qui, donnée en entrée sous la forme d'une liste de coordonnées de pôle (par exempledraw [[0 100] [100 100] [-200 100] [-100 -50][0 0]]
, dessinera à l'écran le résultat.Exigences:
[0 0]
doit être inclus dans la liste des pôles. Si le code de débogage (pôles de dessin) est activé, il[0 0]
doit s'agir du dernier élément.x=0, y=-300
(comme dans la description du problème)Optimisations possibles:
>=
par>
Code de golf:
Code non golfé (
;
démarre un commentaire en ligne (utilisé pour l'explication) et:
démarre un nom de variable):la source
Python 2 + PIL, 310 octets
Le script lit la liste des points de stdin comme une liste de nombres complexes.
la source