Étant donné un nombre entier d'entrée n
, dessiner un serpent de numéro, qui est une grille de mesure se n x n
composant des nombres à 1
travers n^2
qui sont enroulés autour de l'autre de la façon suivante:
Entrée n = 3
:
7 8 9
6 1 2
5 4 3
Entrée n = 4
:
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
Entrée n = 5
:
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
(Inspiré par ce problème de Project Euler.)
C'est code-golf , la réponse la plus courte en octets gagne!
4
:? Ou n'importe quel nombre pair.Réponses:
MATL , 3 octets
Essayez-le en ligne!
Explication
Intégré ... ¯ \ _ (ツ) _ / ¯
la source
C #,
203202196193178 octetsEnregistré un octet grâce à @StefanDelport.
Sauvegardé 22 octets grâce à @FelipeNardiBatista.
Cela fonctionne par l'observation suivante de la façon dont les carrés sont construits:
Comme vous pouvez le constater, chaque bit est ajouté au carré précédent. Pour les nombres égaux, nous allons à droite de l'endroit où nous étions, jusqu'à un niveau inférieur à celui de la place, puis à la fin. Les nombres impairs sont essentiellement l'opposé, nous allons à gauche, jusqu'à un au-dessus de la hauteur actuelle et ensuite jusqu'au bout.
Version complète / formatée:
la source
++i<=n;
peut devenirn>++i
, rien d’autre que je peux voir, +1.n%2<1?2:1
à2-x%2
? Je ne l'ai pas testé en C #, mais en C et Python, cela a fonctionné.for(int o=n-2+n%2>>1,i=r[o,o]=1,c=2,w=o,h=o,j;n>i++;){var b=i%2<1; ....
un peu au golfvar b=1-2*(i%2);r[h,w+=b]=c++;for(j=0;j<i-1;++j)r[h+=b,w]=c++;for(j=0;j<i-1;++j)r[h,w-=b]=c++;
Dyalog APL,
70564541 octetsEssayez-le en ligne!
Comment?
calcule les différences entre les indices;
1
et¯1
pour droite et gauche,¯⍵
et⍵
pour monter et descendre.1,⊢,¯1,-
vient comme1 ⍵ ¯1 ¯⍵
,+⍨⍴
étend ce tableau à la longueur de⍵×2
, de sorte que le final2/⍳
puisse répéter chacun d'eux, avec un nombre de répétitions augmentant chaque élément sur deux:puis,
préfixe l'élément en haut à gauche de la spirale,
limiter les ⍵ 2 premiers éléments de cette liste de distances,
effectue la somme cumulée,
gradue les indices (
⍵[i] = ⍵[⍵[i]]
), pour traduire la matrice d'origine avec les indices de chaque élément, et enfinformes comme une
⍵×⍵
matrice.la source
C,
321307295284283282 octetsMerci à @Zachary T et @Jonathan Frech pour le golf d'un octet!
Alloue un tableau bidimensionnel de zéros, puis commence à le remplir quelque part au milieu. Enfin, les valeurs supérieures à zéro mais inférieures ou égales au carré de l'entrée sont imprimées.
Essayez-le en ligne!
Formaté:
la source
i,j,k,a,b,m;f(n){n*=n;int**l=calloc(a=m=3*n,4);
pari,j,k,a,b,m,**l;f(n){n*=n;l=calloc(a=m=3*n,4);
pour sauvegarder un octet?k<=n;
parn>k;
pour sauvegarder un octet.PHP , 192 octets
Essayez-le en ligne!
De la même manière construire une chaîne au lieu d'un tableau
PHP , 217 octets
Essayez-le en ligne!
la source
[-1,1][$d&1]
->$d&1?:-1
for(;$k<$a;print join($o)."\n")ksort($o=&$e[+$k++]);
. Et l'autre:"%$l".d
. Et un de plus:$x*$l*$a+$y*$l
->($x*$a+$y)*$l
.$s
un trait de soulignement (ou une lettre ou un chiffre) renforcé; ce personnage sera écrasé..d
votre propre approche pour économiser 2 octetsPHP,
185 176174 octetsExécutez en tant que pipe
-nR
ou testez-le en ligne .panne
la source
APL (Dyalog Classic) ,
32 à29 octetsEssayez-le en ligne!
Utilisations
⎕io←1
. Commence avec une matrice 0 par 1 (⍪⍬
). 2N fois (⍣2⍣⍵
) ajoute la hauteur de la matrice (≢⍵
) à chacun de ses éléments, la met1 2...height
à sa droite (,⌸
) et effectue une rotation (⌽⍉
). Lorsque cela est terminé, corrige l'orientation du résultat (⊖∘⌽⍣⍵⌽
) et inverse les nombres en les soustrayant de N 2 +1 (1+×⍨-
).la source
Mathematica, 177 octets
la source
C ++,
245228 octetsEssayez-le en ligne!
La fonction calcule et affiche la valeur de chaque nombre de la matrice en fonction de sa position x, y en appliquant cette logique:
Version formatée :
la source
Python 3 ,
249247 octetsJ'initialise un tableau 2D et trouve le point de départ, qui est le centre de n impair ou d'offset (-1, -1) pour n pair, puis redimensionne le motif de remplissage / curseur avec le numéro actuel de l'anneau. Je sens qu'il me manque un truc pour interpréter les instructions, mais je n'ai rien trouvé de moins cher.
Essayez-le en ligne!
-2 grâce à Zachary T!
la source
\t
et en\n
tant que 1 octet et obtient toujours 249 octetslen("def f(n): M=[n*[0]for a in range(n)] x=y=n//2-(n%2<1) M[x][y]=i=s=1 while 1: t=s*2 for d in'R'+'D'*(t-1)+'L'*t+'U'*t+'R'*t: if i==n*n:print(*M,sep='\n');return v=[1,-1][d in'LU'] if d in'UD':x+=v else:y+=v M[x][y]=i=i+1 s+=1") 223
Wolfram Language (Mathematica) ,
(...)83 octetsOctet mesuré en UTF8,
\[LeftFloor]
(⌊
) et\[RightFloor]
(⌋
) coûtent 3 octets chacun. Mathematica n'a pas de jeu de caractères octet particulier.Essayez-le en ligne!
Utilise le formulaire fermé pour chacun des 4 cas, puis utilise soigneusement le maximum pour obtenir le résultat souhaité.
Retourne un tableau 2D d'entiers. Je ne sais pas si cela est autorisé, et bien que cela ait été demandé dans les commentaires , le PO n'a pas répondu.
la source
Clojure, 206 octets
Je suppose que c’est un bon début, construit le tableau en séquence en une carte de hachage puis le partitionne en
n x n
listes. Cettedefmacro
fini par être assez long, mais le code est toujours plus court avec lui que sans. Existe-t-il une syntaxe plus succincte pour la décrire?De nombreux octets calculent le point de départ et construisent la logique de recherche de la vitesse suivante
v
. Un nichévec
serait peut-être préférable, mais dans ce cas, vous avez deux index et deux vitesses à suivre.la source
J , 41 octets
Essayez-le en ligne!
Fait la même chose que la soumission APL de ngn mais commence par une matrice 1 par 1 et se répète 2 × N − 2 fois.
la source
Python 165 (ou 144)
Cela crée un tableau numpy, puis le fait pivoter et ajoute un côté jusqu'à atteindre la taille correcte. La question ne précisait pas si le même point de départ devait être utilisé pour les nombres pairs et les nombres impairs. Si ce n'est pas le cas, la ligne
if n%2==0:a=r(r(a))
peut être supprimée, ce qui permet d'économiser 21 octets.la source
J , 41 octets
mise en forme standard
Cette approche est basée sur At Play With J Volutes (l’APL d’Uriel utilise une technique similaire).
C'est assez inattendu et élégant pour justifier une 2e réponse, pensai-je.
Essentiellement, nous ne faisons rien de procédural ni même de géométrique. Au lieu de cela, nous créons de manière arithmétique une séquence simple qui, une fois numérisée et numérisée, donne le bon ordre du nombre en spirale de gauche à droite, de haut en bas. Nous formons ensuite cela dans une matrice et sommes faits.
J'ajouterai une explication plus détaillée si le temps le permet, mais l'article lié l'explique en profondeur.
Essayez-le en ligne!
la source
Python 3 (sans pile) ,
192188179150 octetsEssayez-le en ligne!
L'algorithme consiste ici à former un phaseur pour chaque coordonnée dans la grille, puis à le faire pivoter de 90 degrés dans le sens des aiguilles d'une montre jusqu'à ce que le phaseur soit situé entre les diagonales supérieures. Une formule simple peut être utilisée pour calculer la valeur en fonction des coordonnées et du nombre de rotations dans le sens des aiguilles d'une montre:( 2 y+ 1 )2- ( y- x ) - 2 yr
4 octets enregistrés car la rotation du phaseur à 90 degrés se fait facilement sans nombres complexes
la source
R , 183 octets
Essayez-le en ligne!
Le résultat est un serpent à matrice (ou une matrice de serpent, peu importe). Ce n'est probablement pas la méthode la plus efficace, et il pourrait probablement être joué au golf, mais j'ai pensé que ça valait la peine de le montrer. Je suis plutôt fier de ça en fait!
La méthode construit la matrice de l'intérieur vers l'extérieur en ajoutant toujours un nombre supplémentaire d'entiers égal au nombre de colonnes de la matrice avant l'ajout. Le modèle qui suit est soit une liaison par colonnes ou par lignes, tout en inversant certaines valeurs afin qu’elles soient ajoutées dans le bon ordre.
193 octets
Exactement comme ci-dessus, mais final
b
estEssayez-le en ligne!
ce qui donne une sortie légèrement plus propre, mais je n'ai pas vu de critères spéciaux pour la sortie, donc la première réponse devrait fonctionner si je ne me trompe pas.
la source