Napisz program lub funkcję, która wypisze ciąg wejściowy wokół dyskretnego koła o minimalnym możliwym promieniu. Na przykład w przypadku danych wejściowych This is an example
program powinien wypisać:
a si
n s
i
e h
x T
a
m
p
le
Generowanie kręgu
Do obliczenia współrzędnych każdego punktu dyskretnego okręgu należy użyć algorytmu okręgu punktu środkowego. Przykłady implementacji tego algorytmu można znaleźć na tej stronie Wikipedii .
Oto pseudo kod algorytmu (na podstawie przykładu C Wikipedii):
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
Możesz użyć innego algorytmu tylko wtedy, gdy tworzy on dokładnie te same koła, które wytwarza algorytm okręgu Środka, dla wszystkich promieni .
Okrąg musi mieć możliwie najmniejszy promień, który umożliwia zapisanie wszystkich liter wejścia.
Jeśli koło kończy się z większą liczbą punktów niż liczba znaków w ciągu, wówczas ostatnimi wypełniającymi znakami będą spacje .
Pierwszy znak wejścia musi być wydrukowany w punkcie o współrzędnych (Radius,0)
. Kolejne znaki są drukowane w kierunku przeciwnym do ruchu wskazówek zegara.
Wejścia
Dane wejściowe to ciąg dowolnych znaków ASCII między spacją (32) a tyldą
~
(126).
Możesz założyć, że dane wejściowe będą zawsze prawidłowe, krótsze niż 256 znaków i co najmniej 5 znaków długości.
Dane wejściowe mogą być pobierane ze STDIN, jako parametr funkcji lub coś podobnego.
Wyjścia
Możesz przekazać wynik do STDOUT lub zwrócić go jako ciąg znaków z funkcji.
Możesz mieć końcowe spacje, pod warunkiem, że nie spowoduje to, że linia przekroczy dłuższą linię (środkową) (jako taka, środkowa linia nie może mieć końcowych spacji).
Końcowa nowa linia jest dozwolona.
Przypadki testowe
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
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
void
5 bajtów i zadeklarować niektóre liczby całkowite w zasięgu globalnym dla kolejnych bajtów, ponieważ zmienne w zasięgu globalnym bez typu są przyjmowaneint
i są automatycznie inicjowane0
.C, 494 bajtów
Ten wykorzystuje rzeczywisty algorytm okręgu punktu środkowego:
Kod bez golfa:
źródło