Écrivez un programme ou une fonction qui imprime une chaîne d'entrée autour du cercle discret qui a le rayon minimum possible. Par exemple, pour l'entrée This is an example
, votre programme devrait sortir:
a si
n s
i
e h
x T
a
m
p
le
Génération de cercle
Vous devez utiliser l' algorithme du cercle médian pour calculer les coordonnées de chaque point du cercle discret. Vous pouvez trouver des exemples sur la façon de mettre en œuvre cet algorithme sur cette page Wikipedia .
Voici le pseudo code de l'algorithme (basé sur l'exemple C de Wikipedia):
integer x = radius
integer y = 0
int decisionCriterion = 1 - x
while y <= x
point at coordinates (x,y) belongs to the circle // Octant 1
point at coordinates (y,x) belongs to the circle // Octant 2
point at coordinates (-x,y) belongs to the circle // Octant 4
point at coordinates (-y,x) belongs to the circle // Octant 3
point at coordinates (-x,-y) belongs to the circle // Octant 5
point at coordinates (-y,-x) belongs to the circle // Octant 6
point at coordinates (x,-y) belongs to the circle // Octant 7
point at coordinates (y,-x) belongs to the circle // Octant 8
y++
if decisionCriterion <= 0
decisionCriterion += 2 * y + 1
else
x--
decisionCriterion += 2 * (y - x) + 1
end while
Vous pouvez utiliser un algorithme différent si et seulement s'il produit exactement les mêmes cercles que l'algorithme de cercle Midpoint produit, pour tous les rayons .
Le cercle doit avoir le plus petit rayon possible qui permet encore d'écrire toutes les lettres de l'entrée.
Si le cercle se termine avec plus de points que le nombre de caractères de la chaîne, les derniers caractères de remplissage seront des espaces .
Le premier caractère de l'entrée doit être imprimé sur le point avec les coordonnées (Radius,0)
. Les caractères suivants sont imprimés dans le sens inverse des aiguilles d'une montre.
Contributions
L'entrée est une chaîne de tous les caractères ASCII entre l'espace (32) et le tilde
~
(126).
Vous pouvez supposer que l'entrée sera toujours valide, inférieure à 256 caractères et longue d'au moins 5 caractères.
L'entrée peut être prise à partir de STDIN, ou comme paramètre de fonction, ou quelque chose de similaire.
Les sorties
Vous pouvez sortir le résultat sur STDOUT ou le renvoyer sous forme de chaîne à partir d'une fonction.
Vous pouvez avoir des espaces de fin, à condition que cela ne fasse pas dépasser la ligne la plus longue (la ligne du milieu) (en tant que telle, la ligne du milieu ne peut pas avoir d'espaces de fin).
Une nouvelle ligne de fin est autorisée.
Cas de test
Input: Hello, World!
Output:
,ol
l
W e
o H
r
l
d!
Input: 4 8 15 16 23 42
Output:
51
8
1
6 4
2 2
3 4
Input: Programming Puzzles & Code golf
Output:
gnim
uP ma
z r
z g
l o
e r
s P
&
C
od f
e Gol
Input: Ash nazg durbatuluk, ash nazg gimbatul, ash nazg thrakatuluk agh burzum-ishi krimpatul.
Output:
zan hsa ,
g ku
ig lu
bm ta
a b
t r
u u
l d
,
g
a z
s a
h n
n h
a s
z A
g
t
h
r
a .
k l
a u
t t
u a
l p
u m
k ri
ag k
h hi
burzum-is
Notation
Il s'agit de code-golf , donc la réponse la plus courte en octets l'emporte.
void
pour 5 octets et déclarer certains des entiers dans la portée globale pour quelques octets supplémentaires, car les variables dans la portée globale sans type sont supposéesint
et sont automatiquement initialisées à0
.C, 494 octets
Celui-ci utilise l'algorithme de cercle Midpoint réel:
Code dé-golfé:
la source