Напишите программу или функцию, которая печатает входную строку вокруг дискретного круга с минимально возможным радиусом. Например, для ввода This is an example
ваша программа должна вывести:
a si
n s
i
e h
x T
a
m
p
le
Круг поколения
Вы должны использовать алгоритм круга средней точки, чтобы вычислить координаты каждой точки дискретного круга. Вы можете найти примеры того, как реализовать этот алгоритм на этой странице Википедии .
Вот псевдокод алгоритма (на примере C на Википедии):
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
Вы можете использовать другой алгоритм тогда и только тогда, когда он производит те же самые круги, что и алгоритм срединной окружности, для всех радиусов .
У круга должен быть наименьший возможный радиус, который все еще позволяет написать все буквы ввода.
Если круг заканчивается большим количеством точек, чем количество символов в строке, то последними символами заполнения будут пробелы .
Первый символ ввода должен быть напечатан в точке с координатами (Radius,0)
. Последующие символы печатаются против часовой стрелки.
входные
Входные данные представляют собой строку любых символов ASCII между пробелом (32) и тильдой
~
(126).
Вы можете предположить, что ввод всегда будет действительным, короче 256 символов и длиной не менее 5 символов.
Ввод может быть взят из STDIN, или в качестве параметра функции, или чего-либо подобного.
Выходы
Вы можете вывести результат либо в STDOUT, либо вернуть его в виде строки из функции.
У вас могут быть завершающие пробелы, при условии, что это не приведет к тому, что строка превысит самую длинную линию (среднюю) (как таковая, средняя линия не может иметь завершающие пробелы).
Трейлинг новой строки разрешен.
Контрольные примеры
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
счет
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
void
5 байт и объявить некоторые целые числа в глобальной области видимости для еще нескольких байтов, поскольку переменные в глобальной области видимости без типа предполагаютсяint
и автоматически инициализируются0
.