可能な最小半径を持つ離散円の周りに入力文字列を印刷するプログラムまたは関数を作成します。たとえば、inputのThis is an example
場合、プログラムは次を出力する必要があります。
a si
n s
i
e h
x T
a
m
p
le
サークル生成
あなたは使用しなければならない中点円アルゴリズムを離散円の各点の座標を計算します。このウィキペディアのページで、このアルゴリズムを実装する方法の例を見つけることができます。
アルゴリズムの擬似コードは次のとおりです(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
得点
これはcode-golfであるため、バイト単位の最短回答が優先されます。
void
5バイトを削除し、グローバルスコープ内の整数の一部をさらにバイトで宣言できます。これは、タイプのないグローバルスコープ内の変数が想定されint
、自動的にに初期化されるため0
です。