Напишіть програму або функцію, яка друкує вхідний рядок навколо дискретного кола, що має мінімально можливий радіус. Наприклад, для введення This is an example
програма повинна виводити:
a si
n s
i
e h
x T
a
m
p
le
Генерація кола
Для обчислення координат кожної точки дискретного кола слід використовувати алгоритм кола середньої точки. Ви можете знайти приклади, як реалізувати цей алгоритм, на цій сторінці Вікіпедії .
Ось псевдо-код алгоритму (заснований на прикладі С на Вікіпедії):
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
Ви можете використовувати інший алгоритм, якщо і лише тоді, коли він створює такі самі кола, які створює алгоритм кола Midpoint, для всіх радіусів .
Коло повинно мати найменший можливий радіус, який ще дозволяє записати всі букви вводу.
Якщо коло закінчується більшою кількістю очок, ніж кількість символів у рядку, то останні символи заповнення будуть пробілами .
Перший символ введення повинен бути надрукований на точці з координатами (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
.