Vous pouvez écrire un programme ou une fonction qui reçoit un entier positif impair, n
où n >= 3
, comme argument de fonction, arguments de ligne de commande, ou sur STDIN (ou équivalent pour votre système), et imprime sur STDOUT (ou équivalent de système) une spirale ASCII qui tourne vers l'intérieur dans le sens horaire où le bord supérieur est exactement n
long. Le premier bord droit doit être n+1
long, évidemment. Par exemple,
Contribution:
11
Production:
***********
*
********* *
* * *
* ***** * *
* * * * *
* * * * * *
* * *** * *
* * * *
* ******* *
* *
***********
Les captures:
- Votre programme ne doit utiliser que de la
O(log n)
mémoire . - Votre programme peut uniquement imprimer les caractères
*
(ASCII 42),(ASCII 32),
<CR>
(ASCII 13) et<LF>
(ASCII 10). - Votre programme doit imprimer la chaîne, pas la renvoyer de la fonction.
- La restriction Big-O est uniquement sur la mémoire , il n'y a aucune restriction sur l' exécution .
- Une nouvelle ligne de fin est facultative.
- Si votre langue ne prend pas en charge les grands types entiers, vous n'avez pas à prendre en charge plus haut que ce qu'elle prend en charge, mais vous ne pouvez pas utiliser cela comme une astuce pour dire "oh, eh bien, je n'ai pas à prendre en charge au-dessus de X, donc je peut simplement faire un énorme tableau de la taille maximale à chaque fois "
Les failles standard sont interdites, comme d'habitude.
n
dans la mémoire O (1).n
prend deslog n
bits. Den
plus en plus grand, il en va de l'espace nécessaire pour le stocker. Envisagez-vous peut-être de le faire avec un nombre limité de variables?n
?Réponses:
C,
125121 octetsVersion golfée Cela n'a pas de variable
k
. La variablek
est utilisée dans la version non golfée juste pour faciliter la lisibilité. Lesfor
conditions de boucle sont également réarrangées et un ensemble d'éléments inutiles{}
supprimés. Un autre ensemble de{}
peut être supprimé en migrantputs("")
à l'intérieur des crochets de laj
boucle dans la position d'initialisation, mais cela signifierait une nouvelle ligne au début de la sortie, donc je ne l'ai pas fait.Imprime une
n
large parn+1
haute spirale comme l'exemple.Explication
Fondamentalement , je réduire de moitié la valeur de
n
(arrondi vers le bas) et exécuter deux boucles: une extérieurei
de-n/2-1
lan/2+1
pour imprimer les lignes (i=0
est supprimée si nous obtenons desn+1
lignes) et un un intérieurj
de (-n/2
àn/2
Nous utilisons pour imprimer les caractères.)expression & 1
Pour imprimer des bandes , et la conditionj*j<i*i
pour décider d'imprimer des bandes verticales ou horizontales (verticales sur les côtés où la magnitude absolue dei
est plus grande, et horizontale en haut et en bas.) Un ajustement+n
est nécessaire pour aider à la terminaison correcte selon qu'iln/2
est impair ou même.k
est normalement 1, et fournit un ajustement pour le fait que les valeurs absolues de lai
plage de 1 àn/2+1
tandis que les valeurs absolues de laj
plage de 0 àn/2
. Sik
était toujours 1, nous obtiendrions des rectangles concentriques, mais il est inversé à 0 lorsque dei==j&i<=0
sorte qu'une rangée diagonale de cellules est inversée, produisant la spirale.non golfé dans le programme de test
Production
la source
C, 118 octets
Code avant le golf final:
L'observation clé est que le motif est presque une série de carrés concentriques. Avec quelques rides légères:
y = x + 1
diagonale doivent être inversés jusqu'au milieu de la forme.Pour le reste, le code fait simplement une boucle sur toutes les positions, calcule la distance de Tchebychev du centre pour chaque position et émet l'un des deux caractères selon que la distance est paire ou impaire. Et émettre une nouvelle ligne pour la dernière position de chaque ligne.
Puisqu'il n'y a que quelques variables scalaires et que les caractères sont émis un par un, l'utilisation de la mémoire est évidemment constante.
la source
p
je pense que vous vous trompez de meta.codegolf.stackexchange.com/q/4939/15599 . Je ne suis pas sûr non plus de déclarer des variables globales lors de la soumission d'une fonction. Évidemment, ma réponse serait de 4 octets plus courte si je le faisais. J'ai commencé un meta post meta.codegolf.stackexchange.com/q/5532/15599p
.C ++, 926 octets
Ce n'est pas élégant, mais cela ne prend pas beaucoup de mémoire pour les grands n. De plus, il y a (presque certainement) environ 20 personnages qui peuvent être joués plus loin, mais je ne supporte plus de le regarder.
Brève explication:
Cela divise les lignes dans les spirales en deux types: celles avec ****** au milieu et celles avec \ s \ s \ s \ s \ s au milieu. Ensuite, il est clair que chaque ligne est composée de plusieurs "*", le milieu et quelques "*". Déterminer exactement combien de chaque chose est simple si vous regardez le motif assez longtemps. La chose délicate était d'imprimer le centre de la spirale que j'ai codé en dur à l'aide d'un conditionnel. Cela a fini par être utile parce que les lignes *** et \ s \ s \ s sont impaires / paires.
Tests:
Entrée:
55
(je pense que les grands sont les plus cool)Production:
Contribution:
3
Production:
Remarque: Je ne suis pas un informaticien / étudiant CS, et je ne sais pas comment prouver que cela utilise la mémoire O (log n). Je ne peux que savoir quoi faire en fonction des liens dans la question. Je vous serais reconnaissant de bien vouloir confirmer / infirmer si cette réponse est valide. Ma logique pour la validité de cette réponse est qu'elle ne stocke jamais aucune variable de taille basée sur n, sauf l'entrée elle-même. Au lieu de cela, une boucle for qui s'exécute n fois calcule des valeurs entières basées sur n. Il y a le même nombre de ces valeurs quelle que soit l'entrée.
Note2: Cela ne fonctionne pas pour n = 1 en raison de ma méthode de traitement avec le milieu. Ce serait facile à corriger avec les conditions, donc si quelqu'un se trouve à quelques caractères de ma réponse, je le corrigerai;)
Jouez avec lui sur ideone.
la source
n
. Un exemple typique qui ne répond pas à l'exigence serait une sorte de chaîne / tampon / tableau qui contient une ligne de sortie complète.n=1
, car je ne considère pas une telle enveloppe spéciale intéressante.Haskell, 151 octets
Exemple d'utilisation:
Grâce à la paresse de Haskell, cela fonctionne dans la mémoire constante. Il utilise l'approche évidente, à savoir boucler
y
etx
et choisir entre*
et, selon
x
resp.y
est pair ou impairn/2
est pair ou impairla source
Lisp commun - 346
Solution itérative avec utilisation constante de la mémoire. Ce qui précède fait un usage intensif des variables
#n=
et des#n#
lecteurs. Même s'il existe des approches plus directes, j'ai commencé avec une fonction récursive et l'ai modifiée pour simuler la récursivité avec desgoto
instructions: c'est probablement illisible.Sortie pour toutes les valeurs d'entrée de 0 à 59 .
Version récursive originale, avec informations de débogage
(note:
terpri
signifienewline
)Par exemple:
Voir aussi cette pâte avec tous les résultats de 0 à 59 (pas le même que ci-dessus, celui-ci est plus verbeux).
Version itérative, avec informations de débogage
la source
n
et la pile d'appels croît en conséquence, mais dans ce cas, nous pouvons simuler la récursivité avec deux boucles: une avecn
décroissante etd
croissante (jusqu'à n <= 3 ), et un autre avec uned
diminution à zéro. Je n'ai pas beaucoup de temps pour y travailler en ce moment, mais je vais essayer de mettre à jour la réponse en conséquence. En fait, il existe des moyens plus directs d'imprimer la spirale, mais c'était amusant d'essayer de la définir récursivement.CJam, 72 octets
Il s'agit d'une conversion assez directe de ma solution C en CJam. Pas aussi court que ce que vous attendez normalement d'une solution CJam, mais celle-ci souffre vraiment de la restriction de mémoire. Les avantages courants de la création de résultats sur la pile qui est automatiquement vidée à la fin et de l'utilisation d'opérations de liste / chaîne fantaisie, disparaissent tous de la fenêtre. Cela génère et génère la solution un caractère à la fois. La pile ne contient que quelques entiers au moment de l'exécution et est vide à la fin.
Même si ce n'est pas un bon moyen d'utiliser un langage de golf, il est encore beaucoup plus court que le code C simplement parce que la notation est plus compacte.
Explication:
la source