Escriba un programa o función que imprima una cadena de entrada alrededor del círculo discreto que tenga el radio mínimo posible. Por ejemplo, para la entrada This is an example
, su programa debería generar:
a si
n s
i
e h
x T
a
m
p
le
Generación circular
Deberá utilizar el algoritmo de círculo de punto medio para calcular las coordenadas de cada punto del círculo discreto. Puede encontrar ejemplos sobre cómo implementar este algoritmo en esta página de Wikipedia .
Aquí está el pseudocódigo del algoritmo (basado en el ejemplo 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
Puede usar un algoritmo diferente si y solo si produce exactamente los mismos círculos que produce el algoritmo de círculo de punto medio, para todos los radios .
El círculo debe tener el radio más pequeño posible que aún permita escribir todas las letras de la entrada.
Si el círculo termina con más puntos que el número de caracteres en la cadena, los últimos caracteres de relleno serán espacios .
El primer carácter de la entrada debe imprimirse en el punto con coordenadas (Radius,0)
. Los caracteres posteriores se imprimen en sentido antihorario.
Entradas
La entrada es una cadena de cualquier carácter ASCII entre el espacio (32) y la tilde
~
(126).
Puede suponer que la entrada siempre será válida, con menos de 256 caracteres y al menos 5 caracteres de longitud.
La entrada puede tomarse de STDIN, o como un parámetro de función, o algo similar.
Salidas
Puede enviar el resultado a STDOUT o devolverlo como una cadena desde una función.
Puede tener espacios finales, siempre que no haga que la línea exceda la línea más larga (la del medio) (como tal, la línea central no puede tener espacios finales).
Se permite una nueva línea final.
Casos de prueba
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
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta en bytes.
void
5 bytes y declarar algunos de los enteros en el alcance global para algunos bytes más, ya que se asume que las variables en el alcance global sin un tipo seint
inicializan automáticamente0
.C, 494 bytes
Este usa el algoritmo real del círculo del punto medio:
Código de golf:
fuente