introduction
Celui-ci est assez simple. Nous allons dessiner un serpent en ascii. Cela a été inspiré par ce vieux jeu de serpent où vous devez récolter les fruits et vous grandissez en permanence.
Définition
Étant donné un entier positif N qui représente la longueur du serpent, dessinez un serpent de sorte qu'il ait un corps de n plus une tête et une queue.
Les pièces:
- tête:
<, >, ^, v
- queue:
@
- verticale:
|
- horizonal:
-
Tous les coins doivent être satisfaits par un \
ou /
respectivement. À moins que la tête ne se termine dans un coin, auquel cas la tête <, >, ^, v
est prioritaire dans la direction où le serpent est enroulé. c'est-à-dire pour l'exemple de longueur 1, il est tourné dans le sens inverse des aiguilles d'une montre et la tête est ainsi tournée de cette façon. Pour une solution dans le sens horaire, ce serait vers la droite >
.
Le serpent doit commencer au milieu avec sa queue mais il peut aller vers l'extérieur dans n'importe quelle direction que vous choisissez dans le sens horaire ou antihoraire. Il doit également s'enrouler étroitement autour de lui car il se développe vers l'extérieur de manière circulaire.
Exemple
/--\
|/\|
||@|
|\-/
\--->
Où le @
est la queue et la position de départ. Comme vu ci-dessus, la queue commence au milieu, monte vers la gauche dans un sens antihoraire vers l'extérieur.
Ici, la longueur est 19
plus une queue et une tête.
Comme autre exemple, voici la longueur 1
:
<\
@
Gagnant
Il s'agit de code-golf, donc la réponse soumise avec le plus petit nombre d'octets l'emporte, avec du temps pour être utilisée comme briseur d'égalité.
S'amuser!
@---->
. Vous avez probablement l'intention de conditions plus strictes sur la forme du serpent.@
est le milieu (ajoutez éventuellement des espaces pour le rendre ainsi), déclarez "à droite" pour être la direction et faites juste la tête pointée vers le bas et déclarez cela dans le sens des aiguilles d'une montre. Vos termes peuvent vous sembler clairs, mais ils sont en fait ambigus. Je me rends compte que vous voulez probablement dire un serpent enroulé aussi étroitement que possible, mais vous devriez le dire clairementRéponses:
MATL ,
8583 octetsEt je pensais qu'avoir un
spiral
builtin ferait du code court ...Essayez-le en ligne!
Explication
Soit N la valeur de l'entrée. Nous allons créer un vecteur de longueur
ceil(sqrt(N+2))^2
, c'est-à-dire le plus petit carré parfait égal ou supérieur à N +2. Ce vecteur sera rempli de valeurs numériques, roulé en spirale (c'est pourquoi sa longueur doit être un carré parfait), puis les valeurs numériques seront remplacées par des caractères.Soit n chaque étape à partir de 1 au centre de la spirale. Les étapes où le serpent tourne sont données par n 2 +1 (c'est-à-dire: 2, 5, 10, ...) pour les
\
symboles et n 2 + n +1 (c'est-à-dire: 3, 7, 13, ...) pour/
. Les étapes entre a\
et a/
devraient être-
, et celles entre a/
et a\
devraient l'être|
.Le vecteur est créé de telle sorte qu'il contient
1
aux points de virage (2,3,5,7,10,13 ...) et0
au repos. La parité de la somme cumulée indique si chaque entrée doit être a-
ou a|
. En ajoutant 1 à ce résultat, nous obtenons un vecteur contenant1
(pour|
) ou2
(pour-
). Mais cela fait que les tournants eux-mêmes deviennent1
ou2
aussi. Les points de virage, dont nous connaissons les positions, sont donc écrasés: les positions n 2 +1 sont remplies3
et les positions n 2 + n +1 sont remplies4
. La queue et la tête sont également des cas particuliers: le premier élément du vecteur (queue) est défini sur5
, et l'élément d'indice N+2 (tête) est réglé sur6
. Enfin, les éléments dont les indices dépassent N +2 sont définis sur0
.En prenant l'exemple N = 19, nous avons maintenant un vecteur de longueur 25:
Nous devons rouler ce vecteur en spirale. Pour cela, nous utilisons une fonction intégrée qui génère une matrice en spirale, suivie d'une réflexion et d'une transposition pour produire:
L'indexation du vecteur avec la matrice donne
où
0
correspond à l'espace,1
correspond à|
,2
à-
,3
à\
,4
à/
,5
à@
et6
à la tête.Pour savoir lequel des quatre personnages
^
,<
,v
ou>
la tête doit avoir, nous utilisons la somme cumulée des points de virage que nous avons précédemment calculé. Plus précisément, l'avant-dernière valeur de cette somme cumulée (c'est-à-dire le N + 1-ème valeur) modulo 4 nous indique quel caractère doit être utilisé pour la tête. Nous prenons la deuxième dernière valeur de la somme cumulée, pas la dernière, en raison de l'exigence « si les extrémités de la tête sur un coin de la tête<
,>
,^
,v
est prioritaire dans la direction du serpent est enroulé ». Pour l' exemple N = 19, la tête est>
.Maintenant , nous pouvons construire une chaîne contenant tous les caractères de serpent, y compris le caractère approprié pour la tête à la sixième position:
'|-\/@> '
. Nous indexons ensuite cette chaîne avec la matrice ci-dessus (l'indexation est basée sur 1 et modulaire, donc l'espace va en dernier), ce qui donnela source
Python 2,
250233191 octetsrepl.it
Dessinez le serpent en tournant le serpent entier de 90 ° dans le sens des aiguilles d'une montre et en ajoutant le segment inférieur, de cette façon le serpent sera toujours dans le sens inverse des aiguilles d'une montre.
Le nouveau segment commencera toujours par
\
et aura-
comme corps pour les côtés pairs et/
-
pour les côtés impairs. Les segments de tailles (sans coins) sont0
,1
,1
,2
,2
,3
... ce qui estfloor(side/2)
.Si le segment est le dernier, il supprime les caractères en excès, ajoute la tête et complète avec des espaces.
la source
'\/'[m]
,'-|'[m]
et'>v'[m]
print
et''.join
JavaScript (ES6), 193
201 203 215 220 224Edit sauvegardé 4 octets thx @Arnauld
Edit2 a changé de logique, ne stockant pas les incréments actuels pour x et y, il suffit de les récupérer dans la direction courante
Edit3 ayant enregistré quelques octets, j'ai décidé de les utiliser pour une meilleure gestion de l'espace vide
Edit4 8 octets enregistrés ne suivant pas exactement les exemples sur la direction de la tête - comme les autres réponses
La version actuelle fonctionne avec Chrome, Firefox et MS Edge
Cette réponse donne un espace de fin et de début (et des lignes vides).Un peu moins golfé
la source
(' ')
par` `
et('@')
par`@`
[ Array[1], Array[1] ]
, whileArray(2).fill(' ')
==>[' ',' ']
JavaScript (ES7), 200 octets
Version ES6 pour faciliter les tests:
la source
Perl,
111110 octetsInclut +1 pour
-p
Donnez la taille sur STDIN
snake.pl
:la source
Lot, 563 octets
Explication: Cas particuliers 1 car le reste du code nécessite une largeur de serpent d'au moins deux. Ensuite, calcule le plus grand quart de carré (soit un carré exact soit un rectangle 1 plus large que haut) dont l'aire est inférieure à la longueur du serpent. Le serpent sera enroulé dans ce rectangle à partir du coin inférieur gauche et se terminant par la queue au milieu, et la longueur restante passera sous le bas du rectangle. Le rectangle est en fait généré à partir de simples remplacements de chaînes; la plupart du temps, chaque ligne est générée à partir de la ligne précédente en déplaçant les diagonales d'un pas, mais évidemment la queue doit également être traitée, et il y a de légères différences selon que la hauteur du rectangle est paire ou impaire.
la source
Python 2.7, A WHOPPING 1230 octets
Je suis nouveau au python et au golf de code mais j'ai senti que je devais répondre à ma propre question et bouder de honte après le fait. Beaucoup de plaisir à y travailler!
https://repl.it/Dpoy
la source