Le but de ce défi est de représenter graphiquement une marche sur le plan, où la direction de chaque étape est déterminée par la primalité de et la parité de son développement binaire. Plus précisément,
- La direction initiale est fixe, disons le nord.
- Toutes les étapes ont la même longueur .
- La direction de l’étape peut être Nord, Ouest, Sud ou Est, et est déterminée comme suit:
- Si n'est pas premier, la direction ne change pas.
- Si est premier et que l'expansion binaire de a un nombre pair, tournez à droite.
- Si est premier et que l'expansion binaire de a un nombre impair de 1, tournez à gauche.
En tant qu'exemple travaillé , supposons que la direction initiale est le nord. Les premières étapes sont:
- n'est pas premier. Nous faisons donc un pas dans la direction actuelle, qui est le nord.
- est premier et son développement binaire
10
, a et un nombre impair de uns. Alors on tourne à gauche et on fait maintenant face à l'ouest. Nous faisons un pas dans cette direction. - est premier et son développement binaire
11
, a et même nombre d'unités. Nous tournons donc à droite et faisons maintenant face au nord. Nous faisons un pas dans cette direction. - n'est pas premier. Nous faisons donc un pas dans la direction actuelle, qui est le nord.
Le défi
Entrée : nombre entier positif .
Sortie : tracé de la marche en étapes telle que définie ci-dessus.
Règles supplémentaires
- La direction initiale peut être choisie librement (pas nécessairement du Nord), mais devrait être le même pour tous .
- La règle de retournement peut être l'inverse de celle décrite ci-dessus, c'est-à-dire tourner à droite pour une parité impair et à gauche pour un niveau pair; mais il doit être le même pour tous .
- La sortie doit être une représentation graphique de la promenade. Par exemple:
- La promenade peut être dessinée avec des segments de ligne.
- Les points visités peuvent être affichés avec un marqueur, tel qu'un point; avec ou sans connexion de segments de ligne.
- Une image matricielle à deux couleurs peut être fournie, une couleur correspondant aux points visités et une autre aux non visités.
- Les échelles des axes horizontal et vertical ne doivent pas nécessairement être identiques. Les étiquettes d'axe et les éléments similaires sont également facultatifs. Tant que la promenade est clairement visible, l'intrigue est valable.
- Notez que certains points sont visités plus d'une fois. L'intrigue n'est pas sensible à cela. Par exemple, si des segments de ligne sont affichés dans le tracé, chaque segment d'unité est affiché de la même manière quel que soit le nombre de passages parcourus.
- Le code devrait fonctionner pour toutes les
N
ressources illimitées. Il est acceptable que, dans la pratique, il échoue pour de grandesN
raison de contraintes de temps, de mémoire ou de types de données. - L'entrée et la sortie sont flexibles comme d'habitude. En particulier, l’un quelconque des moyens standard de sortie d'images peut être utilisé.
- Le code le plus court en octets gagne.
Cas de test
Les placettes suivantes utilisent le nord comme direction initiale; même la parité tourne à droite; et la promenade est représentée avec des segments de ligne.
N = 7
:
N = 3000
:
N = 20000
:
N = 159000
:
N = 1200000
:
N = 11000000
:
code-golf
graphical-output
integer
primes
Luis Mendo
la source
la source
[graphical-output]
est autorisée? Une raison en particulier de rejeter la sortie ASCII, comme ma réponse Charcoal maintenant supprimée?Réponses:
Sledgehammer 0.4 ,
2220 octetsDécompresse dans cette fonction Wolfram Language:
Ungolfed
Nous définissons d’abord une fonction qui renvoie l’angle de rotation à chaque étape:
ThueMorse
est la parité de la somme des chiffres binaires. Nous utilisons-1^(...)
plutôt que2*...-1
pour une raison un peu compliquée: Wolfram Language convertit automatiquement les expressions arithmétiques de la source en une forme canonique; les expressions comme celles-ci2/x
sont donc stockées sousTimes[2, Power[x, -1]]
. Cela rend la fréquencePower
très élevée, et donc la compression très bon marché.(La multiplication par
Boole@PrimeQ@
est légèrement plus longue et laBoole
conversion implicite des booléens n'avait pas encore été implémentée au moment du challenge.)À partir de là, Mathematica
AnglePath
etListPlot
faisons exactement ce dont nous avons besoin:Dans l'application interactive, la sortie est un objet graphique vectoriel redimensionnable.
la source
MATL ,
252421 octetsEssayez-le sur MATL en ligne
Merci @LuisMendo pour une belle session de golf en chat qui a finalement conduit à cette version de 21 octets, en suggérant
Eq*^
Explication
la source
C (gcc) , 179 octets
Essayez-le en ligne!
0
1
C (gcc) , 219 octets
Essayez-le en ligne!
Production recadrée pour 20000:
Les deux versions commencent par l'ouest et tournent à droite sur impair, gauche sur pair.
J'ai essayé les tests plus grands sans aucun d'entre eux, car la sortie avec 20000 était d'environ 1,5 Go, et 150000 aurait été d'environ 90 Go. Tout cela est stocké en mémoire pendant l'exécution du programme.
Explication de la supérieure:
la source
0
ou comme pointeur nul dans le cas de C).Wolfram Language (Mathematica) ,
989691777663 octets-14 octets: Merci à @lirtosiast de m'avoir montré comment utiliser
AnglePath
...-13 octets: ... et
ThueMorse
!exemple d'utilisation:
Explication pas à pas:
If[PrimeQ@#, 2 ThueMorse@# - 1, 0] &
est une fonction qui prend l'index de pas et renvoie 0 pour les nombres non premiers, -1 pour les nombres pairs-binaires et +1 pour les nombres premiers impairs-binaires.ThueMorse@#
remplace la solution précédenteTotal[#~IntegerDigits~2]
(qui est la même, modulo 2).Array[Pi/2*%,#]
dresse une liste de cette fonction avec l'index allant de 1 à l'argument de la fonction (20000 dans l'exemple), et multiplie chaque élément par π / 2 pour en faire un angle de changement de direction (radians). Nous avons maintenant 0 pour les nombres non premiers, -π / 2 pour les nombres premiers pairs, et + π / 2 pour les nombres premiers impairs.AnglePath[%]
convertit cette liste d'angles de changement de direction en une trajectoire. Cette instruction remplace la double utilisation de la solution précédenteAccumulate
.ListPlot[%]
convertit la liste des positions en un tracé de points XY. Si vous préférez une ligne, utilisezListLinePlot
plutôt. Ces fonctions de tracé offrent de nombreuses options pour améliorer l'apparence des parcelles.la source
MATL,
31302826 octets3 octets sauvés grâce à @LuisMendo
2 octets sauvés grâce à @Sanchises
Essayez-le sur MATL Online
Explication
Cette solution utilise des nombres complexes pour représenter les composantes X et Y du plan 2D.
À ce stade, nous avons quatre points (
(0, 1), (-1, 0), (0, -1), (1, 0)
) dans un tableau représenté par des nombres complexes. Ce sont les quatre directions cardinales. Maintenant, nous voulons utiliser ceux-ci pour "marcher".La façon dont cela fonctionne est que nous commençons par aller dans la zéroième direction (le 0ème élément du tableau qui est
(-1, 0)
). Pour chaque étape, nous devons déterminer le changement dans cette rubrique. Nous allons utiliser des entiers pour suivre ce changement. Si nous voulons tourner "à droite", nous incrémentons cet entier de 1 (référençant l' élément suivant dans le tableau à 4 points) et si nous voulons "gauche", nous décrémentons cet entier de 1 (référençant l' élément précédent dans la Tableau à 4 points). Si nous voulons continuer sur notre chemin, nous gardons la valeur entière constante (référençant le même élément dans le tableau à 4 points).Cette partie du code crée un tableau de tous ceux
0
,-1
et les1
valeurs.Nous avons maintenant un tableau des différences entre les entiers successifs afin que nous puissions calculer la somme cumulative de ceux-ci pour obtenir les indices que nous pouvons ensuite utiliser pour rechercher la direction à chaque étape dans le tableau à 4 éléments d'origine.
De manière pratique, MATL a une indexation en
5
boucle qui permet d’indexer au début d’un tableau à 4 éléments. Nous pouvons utiliser ceci à notre avantage pour pouvoir incrémenter et décrémenter cet entier sans nous soucier du fait que le tableau de direction de référence ne comporte que 4 éléments.Nous avons maintenant un tableau de directions des étapes à suivre, nous pouvons donc calculer la somme cumulée de ces directions pour tracer le chemin qui a été emprunté.
la source
Perl 6 ,
213182 octets{mon @p = [\ +] [\ *] ({{. is-prime ??. base (2) .comb (~ 1)% 2 ?? i !! - i !! 1 + 0i} (+ + $)} ... *) [^ $ _]; {"<svg viewBox = '{. min xx 2, .elems xx 2}' >>. & {" L {.re} {.im} " }} 'fill =' none 'stroke =' black '/> "} (minmax | @p» .reals)}Essayez-le en ligne!
(Vraiment réussi à réduire celui-ci!)
Cette fonction est générée au format SVG.
{ -{ .is-prime * .base(2).comb(~1) R** -1 || i }(++$)i } ... *
est une suite infinie de changements de direction pour chaque étape, sous la forme de nombres complexes, où1
signifie «continue dans la même direction»,i
signifie «tourne à gauche» et-i
signifie «tourne à droite».[^$_]
limite cette séquence au nombre d'étapes fourni comme argument de la fonction.[\*]
analyse cette séquence avec une multiplication (complexe) en transformant la liste des changements de direction relatifs en une liste de directions absolues.[\+]
scanne cette séquence avec addition (complexe), produisant une liste des coordonnées visitées.».reals
convertit cette liste de nombres complexes en listes à deux éléments de ses parties réelle et imaginaire.L'image SVG n'est qu'un
path
élément.Sortie (convertie en PNG) pour N = 20000:
la source
C, 321 octets
Essayez-le en ligne!
J'ai commencé à travailler dessus avant que l'autre réponse C ne soit publiée, mais je me suis dit que je pourrais aussi bien poster la mienne de toute façon. Celui-ci est beaucoup plus long, mais il recadre automatiquement l'image de sortie aux dimensions du résultat.
La fonction est appelée en tant que
f(n)
et la sortie est stdout au format netpbm.Exemple de sortie pour n = 1000:
Le test principal est essentiellement celui utilisé dans la réponse de Lynn à un défi différent , qui repose sur le théorème de Wilson .
Le test de parité utilise une adaptation de la méthode de comptage de bits de Kernighan .
Étant donné que le test principal est très lent et que l'algorithme ré-exécute la fonction de génération de chemin d'accès complète pour chaque pixel dessiné, toute entrée est supérieure à 1 000 fois sur TIO.
la source
LOGO,
177171 octetsPour utiliser, faire quelque chose comme ça :
Désolé, je n'ai pas pu capturer un exemple de sortie. Explication:
Il s'agit d'une procédure récursive qui fait pivoter de 180 ° pour chaque bit défini dans son paramètre, ce qui calcule efficacement la parité de son développement binaire.
C'est un test de primalité très basique. Après la casse spéciale 1, la procédure est rétablie si un facteur est trouvé. Si, toutefois, la valeur actuelle est jugée supérieure, il tourne à droite et utilise ensuite la procédure ci-dessus pour la changer en virage à gauche, selon le cas.
Il ne s’agit que d’une simple boucle permettant de tester tous les nombres jusqu’à la
n
primalité et de déplacer deux pixels après chacun.la source
Gelée , 41 octets
Essayez-le en ligne!
la source
JavaScript -
675668660632556534 octetsPremière fois ici sur CodeGolf, a commencé avec ~ 1500 octets de code. Il a golfé à
moins de la moitié,presqueplus du tiers. N'hésitez pas à continuer à jouer au golf. Octets comptés avec: cet outilPrincipe:
Dessine un canevas de taille fixe avec N et une longueur de trait variable en entrée.
Modifications:
-07 octets - suppression des manquants si
-08 octets - remplace le commutateur par if / else
-28 octets - remplace par tenary si / else
-76 octets - test principal plus court (runtime / 3)
-22 octets - utilise cette fonction principale (runtime * 4)
Code de golf:
Code non golfé avec des espaces blancs:
Exemples:
la source
Rouge ,
515480471 octets-1 octet grâce à Kevin Cruijssen!
Une partie importante du code (~ 160 octets) traite de la normalisation des coordonnées de sorte que les graphiques s’intègrent entièrement dans la grille, quelle que soit la taille de l’entrée.
Direction initiale: sud.
Voici le résultat pour
n = 3000
n = 20000
la source
if j%(k + 1)
etif j% 2 = 1
, mais il y a des espaces nécessaires à la plupart des autres opérateurs (+
,/
, etc.). Peut-on également supprimer l’espace au modulo depick[-90 90]s% 2
? En fait, pourquoi n’y at-il pas d’espace requisas-pair k/1 - t * c k/2 - v * c
pour le/
?s% 2
, merci! Je ne sais pas pourquoi, mais modulo%
est le seul opérateur pour lequel l'espace qui le précède peut être supprimé, s'il est précédé d'un mot (variable). Dansas-pair k/1 - t * c k/2 - v * c
les barres obliques/
servent un but complètement différent - ils sontpath
s.k
est unpair
etk/1
est le premier élément (il peut être sélectionné aussi park/x
, oupick k 1
). Les espaces sont nécessaires presque partout, à l'exception des exceptions()[]{}
, car il n'y a pas d'ambiguïté.word
noms (Red
n'a pasvariables
, tout est soit uneword
valeur, soit un bloc de syntaxe tel que[...]
ou(...)
). Ainsi:a*4: 45
-> un mota*4
reçoit une valeur 45.%
est utilisé comme marqueur dufile!
type de données et c'est peut-être pourquoi il ne peut pas être utilisé dans lesword
noms mais peut enfreindre les règles pour les autres opérateurs arithmétiques/
aient un but différent et que les symboles puissent être utilisés sans espaces dans les variables (ouwords
alors qu’ils sont apparemment appelés Red). Merci pour l'explication. :) Et content que je puisse (la plupart du temps accidentellement) enregistrer un octet pour les% 2
. :)Traitement, plus de 140 octets
Pourrait ne pas remplir clairement vu
la source