Regardez la chaîne suivante. Vous remarquez un motif?
ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL SPERME BAZYXWV N EO DP CQ BAZYXWVUTSR
Comme certains l'ont peut-être remarqué, il s'agit essentiellement d'une spirale de l'alphabet, où les distances entre les lignes / colonnes augmentent progressivement de 1 espace / nouvelle ligne.
Définition rigoureuse
- Ayons un compteur c , qui est initialement 0.
- Nous écrivons le premier c + 1 lettres de l'alphabet de gauche à droite:
A
. Puis, de haut en bas suivant (c + 1) (c + 2) / 2 lettres (add
B
):AB
.De gauche à droite, le suivant (c + 1) (c + 2) / 2 (ajouter
C
):AB C
Et de bas en haut, les c + 1 lettres suivantes (ajouter
D
):AB DC
Atteint la fin du cycle. Par conséquent, incrémentons c (qui devient 1). Puis, il commence à revenir de la première étape, la seule différence étant qu'au lieu d'utiliser le premier c + 1 lettres de l'alphabet, nous utilisons le suivant c + 1 lettres, à partir du dernier élément de ce cycle (
D
dans ce cas, nous continuons donc avecEFG...
). Une foisZ
atteint, il revient deA
.
Tâche
Étant donné un entier N (qui est positif pour l'indexation 1 ou non négatif pour l'indexation 0), sortez les N premiers cycles de la spirale.
Règles
Vous pouvez utiliser l'alphabet en minuscules ou en majuscules, mais votre choix doit être cohérent (utilisez uniquement l'un d'eux, le mélange n'est pas autorisé).
Vous pouvez prendre des entrées et fournir des sorties via l'une des méthodes standard , dans n'importe quel langage de programmation , tout en notant que ces failles sont interdites par défaut.
Formats de sortie acceptables: chaîne multiligne, une liste de chaînes représentant des lignes, une liste contenant plusieurs listes de caractères, chacune représentant une ligne, ou tout autre élément que vous jugez approprié. Dans le cas où vous ne choisissez pas le premier format, ce serait bien d'inclure une jolie version imprimée de votre code.
C'est le code-golf , donc le code le plus court en octets (dans chaque langue) qui remplit les conditions gagne!
Cas de test
L'entier en entrée sera séparé par sa sortie correspondante via une nouvelle ligne, et les tests seront séparés en utilisant des tirets. Notez que ceux-ci sont indexés 1.
1 UN B DC -------- 2 ABEF DC G MH LKJI -------- 3 ABEFNOP DC GQ MHR LKJI S DT CU BAZYXWV ------- 4 ABEFNOPEFGH DC GQI MHRJ LKJI SK DTL SPERME BAZYXWV N EO DP CQ BAZYXWVUTSR ------- 5 ABEFNOPEFGHFGHIJ DC GQIK MHRJL LKJI SKM DTLN CUMO BAZYXWV NP EOQ DPR CQS BAZYXWVUTSR T RU QV PW BŒUF NMLKJIHGFEDCBAZY ------ 6 ABEFNOPEFGHFGHIJSTUVWX DC GQIKY MHRJLZ LKJI SKMA DTLNB CUMOC BAZYXWV NPD EOQE DPRF CQSG BAZYXWVUTSR TH RUI QVJ PWK OXL NMLKJIHGFEDCBAZY M SN RO QP PQ OU NMLKJIHGFEDCBAZYXWVUTS
Réponses:
Fusain , 31 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Remarque: Le déverbosificateur génère un séparateur de fin pour une raison quelconque. Explication:
Dessinez des boîtes dans l'ordre inverse de la taille (du plus grand au plus petit).
Calculez la taille de la boîte.
Dessinez la bordure de la boîte à l'aide d'un alphabet pivoté.
Calculez la lettre qui apparaîtrait en haut à gauche de la boîte (index 0).
la source
Python 2 , 176 octets
Essayez-le en ligne!
Explication
Nous construisons un tableau vide d'espaces de la bonne taille, puis nous le déplaçons comme ceci, en commençant dans le coin supérieur gauche:
1 étape →, 1 étape ↓, 1 étape ←, 1 étape ↑
3 étapes →, 3 étapes ↓, 3 étapes ←, 3 étapes ↑
6 étapes →, 6 étapes ↓, 6 étapes ←, 6 étapes ↑
10 étapes →, 10 étapes ↓, 10 étapes ←, 10 étapes ↑
…
Chaque fois que nous trouvons une cellule vide, nous y mettons une lettre et passons à la lettre suivante de l'alphabet.
Dans le code,
s%4
est la direction (→ ↓ ← ↑), et nous faisons ce pas plusieurs fois:Possibilités de golf
Est - il un moyen plus court à la carte
s%4
à1,0,-1,0
queabs(2-s%4)-1
?Est - il un moyen plus court à la carte
s%4
à0,1,0,-1
ques%2-s%4/3*2
?Crédits
la source
21/(s%4+3)%3-1
:s%2-2*(s%4>2)
( 179 octets ). Il pourrait encore être jouable au golfC,
305281 octetsMerci à @Mr. Xcoder pour économiser quatre octets!
Essayez-le en ligne!
la source
#define
forfor(
(qui économise en fait des octets). +1 de moi. :)Python 2 ,
262260254245 octetsEssayez-le en ligne!
Nouvelle méthode avec plus de maths!
Renvoie une liste de listes de caractères.
Ancienne version:
Python 2 ,
322321308298 octetsEssayez-le en ligne!
la source
.49
suffisant dans ce cas ou échoue-t-il pour de très grandes entrées?i<j
, puisque vous l'utilisez quatre fois?+1==1+
partir de ma méthode précédentePerl 5, 177 +2 (-nl) = 179 octets
2 octets économisés grâce à Xcali
Essayez-le en ligne
la source
-1
au lieu de$#O
. Utiliser également$,
au lieu de$n
vous permettra de supprimer l'espace avantfor
d'$_.=$"x$n for@O
s/ (?=\S)/n/e
ens/.*\K /n/e
APL (Dyalog Classic) , 47 octets
Essayez-le en ligne!
la source