Escreva um programa ou função que imprima uma sequência de entrada em torno do círculo discreto que tenha o raio mínimo possível. Por exemplo, para entrada This is an example
, seu programa deve gerar:
a si
n s
i
e h
x T
a
m
p
le
Geração de círculo
Você deve usar o algoritmo do círculo do ponto médio para calcular as coordenadas de cada ponto do círculo discreto. Você pode encontrar exemplos de como implementar esse algoritmo nesta página da Wikipedia .
Aqui está o pseudo-código do algoritmo (com base no exemplo C da 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
Você pode usar um algoritmo diferente se, e somente se, produzir exatamente os mesmos círculos que o algoritmo do círculo do ponto médio produz, para todos os raios .
O círculo deve ter o menor raio possível que ainda permita escrever todas as letras da entrada.
Se o círculo terminar com mais pontos que o número de caracteres na sequência, os últimos caracteres de preenchimento serão espaços .
O primeiro caractere da entrada deve ser impresso no ponto com coordenadas (Radius,0)
. Os caracteres subsequentes são impressos no sentido anti-horário.
Entradas
A entrada é uma sequência de caracteres ASCII entre o espaço (32) e o til
~
(126).
Você pode assumir que a entrada sempre será válida, menor que 256 caracteres e pelo menos 5 caracteres.
A entrada pode ser obtida no STDIN, ou como um parâmetro de função, ou qualquer coisa semelhante.
Saídas
Você pode enviar o resultado para STDOUT ou retorná-lo como string de uma função.
Você pode ter espaços à direita, desde que ela não exceda a linha mais longa (a do meio) (como tal, a linha do meio não pode ter espaços à direita).
Uma nova linha à direita é permitida.
Casos de teste
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
Pontuação
Isso é código-golfe , então a resposta mais curta em bytes vence.
void
5 bytes e declarar alguns dos números inteiros no escopo global por mais alguns bytes, pois as variáveis no escopo global sem um tipo são assumidasint
e inicializadas automaticamente0
.C, 494 bytes
Este usa o algoritmo real do círculo do ponto médio:
Código De-Golfed:
fonte