编写一个程序或函数,在具有最小可能半径的离散圆周围打印输入字符串。例如,对于input This is an example
,您的程序应输出:
a si
n s
i
e h
x T
a
m
p
le
圈子产生
您应使用中点圆算法计算离散圆的每个点的坐标。您可以在Wikipedia页面上找到有关如何实现此算法的示例。
这是算法的伪代码(基于Wikipedia的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)
。后续字符以逆时针方式打印。
输入项
输入是空格(32)和波浪号
~
(126)之间的任何ASCII字符的字符串。
您可以假定输入将始终有效,少于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
。