Czasami, gdy rysuję, rysuję prostokąt, zaczynam od przekątnej z jednego z rogów, a następnie po prostu wykreślam linię, „odbijając” ją, gdy uderzę w bok prostokąta. Kontynuuję to, dopóki nie trafię w kolejny narożnik prostokąta (i mam nadzieję, że proporcje mojego prostokąta nie były irracjonalne;)). To jest jak wytyczenie ścieżki lasera świecącego do pudełka. Wytworzysz to dzięki sztuce ASCII.
Jako przykład rozważmy pole szerokości 5
i wysokości 3
. Zawsze zaczniemy od lewego górnego rogu. Te #
znaki graniczne z pudełka. Pamiętaj, że szerokość i wysokość odnoszą się do wymiarów wewnętrznych.
####### ####### ####### ####### ####### ####### #######
#\ # #\ # #\ \# #\ /\# #\ /\# #\/ /\# #\/\/\#
# \ # # \ /# # \ /# # \/ /# # \/ /# #/\/ /# #/\/\/#
# \ # # \/ # # \/ # # /\/ # #\/\/ # #\/\/ # #\/\/\#
####### ####### ####### ####### ####### ####### #######
Wyzwanie
Biorąc pod uwagę (dodatnią) szerokość i wysokość pudełka, powinieneś uzyskać końcowy wynik śledzenia lasera. Możesz napisać program lub funkcję, przyjmując dane wejściowe za pośrednictwem STDIN (lub najbliższej alternatywy), argument wiersza poleceń, argument funkcji i wypisz wynik za pomocą STDOUT (lub najbliższej alternatywy) lub za pomocą zwracanych wartości lub argumentów funkcji.
Do wprowadzenia możesz użyć dowolnego wygodnego formatu listy, łańcucha lub liczby. Wynik musi być pojedynczym ciągiem znaków (chyba że wydrukujesz go do STDOUT, co oczywiście możesz zrobić stopniowo). Oznacza to również, że możesz wziąć najpierw wysokość, a szerokość drugą - po prostu określ dokładny format wejściowy w swojej odpowiedzi.
W żadnym wierszu wyniku nie może być ani początkowych ani końcowych białych znaków. Opcjonalnie możesz wypisać jeden końcowy znak nowej linii.
Musisz wykorzystać przestrzeń, /
, \
a #
i rozmnażać przypadków testowych dokładnie tak, jak pokazano na rysunku.
Przypadki testowe
2 2
####
#\ #
# \#
####
3 2
#####
#\/\#
#/\/#
#####
6 3
########
#\ /#
# \ / #
# \/ #
########
7 1
#########
#\/\/\/\#
#########
1 3
###
#\#
#/#
#\#
###
7 5
#########
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#/\/\/\/#
#\/\/\/\#
#########
22 6
########################
#\ /\ /\ /\ /\ /\ #
# \/ \/ \/ \/ \/ \#
# /\ /\ /\ /\ /\ /#
#/ \/ \/ \/ \/ \/ #
#\ /\ /\ /\ /\ /\ #
# \/ \/ \/ \/ \/ \#
########################
X
byłyby konieczne do przejazdów. Może następnym razem. ;)Odpowiedzi:
Pyth,
434139 bajtówWypróbuj online: Pyth Compiler / Executor . Wprowadź liczby w następującej kolejności: wysokość pierwszej linii, szerokość drugiej linii.
Dzięki isaacg, który pomógł zaoszczędzić dwa bajty.
Wyjaśnienie:
Moje rozwiązanie nie śledzi lasera, używa prostego wzoru zawierającego gcd. Jeśli
m, n
są wymiary pudełka, niechd = gcd(m, n)
. Rozmiar wzoru jest dokładnie2*d x 2*d
.Np. Powtarzający się wzór dla
7 5
jest
(
gcd(7, 5) = 1
rozmiar wzoru to2 x 2
)I powtarzający się wzór dla
22 6
jest
(
gcd(22, 6) = 2
rozmiar wzoru to4 x 4
)Moje rozwiązanie wykonuje następujące czynności dla każdej linii: po prostu generuje jedną linię wzoru, powtarza ją kilka razy i wycina na końcu, aby pasowała do pudełka.
źródło
X
wsporniki „przypisania” do strun, można zmienićm\
, aby*d
i usunąćs
.*\
zamiastm\
krótko, ale odrzuć go, ponieważ ma ten sam rozmiar. Nie myślałem o zmiennejd
i niepotrzebnychs
.C, 256 bajtów
Prawdopodobnie mogę dostać to pod 200, a dodam wyjaśnienia później, ale może mieć dokument ze względu na kilka godzin powinienem robić zamiast tego.
źródło
J, 85 bajtów
Let
g = gcd(w,h)
. Funkcja wypełnia elementy aw/g by h/g
osnowy zg by g
płytek, o/
„S\
” S w ich ukośne i anty-przekątnej. Powstała tablica 4D jest zapadnięta w 2D (wewnątrz pudełka), a następnie otoczona przez#
's. (Liczby0 1 2 3
są używane zamiast,[space] / \ #
a liczby są zamieniane na znaki na końcu.)Bezpośrednie obliczenie współrzędnych wewnętrznych oparte na położeniu może być może nieco krótszym rozwiązaniem.
Stosowanie:
Wypróbuj online tutaj.
źródło
Kalkulator Desmos - nie konkuruje, aby pomóc w dalszej wiedzy
Wypróbuj online!
Wejścia:
Produkty pośrednie:
Formula, w skrócie:
Wyjścia:
Jak to działa:
Program nie spełnia ostatecznego kryterium - generowania grafiki ASCII pola i linii, więc przesyłam jako niekonkurencyjne informacje, aby pomóc innym w ukończeniu wyzwania. Zauważ, że aby Desmos działał, gdy c = 0 lub c = b, wprowadzono mały współczynnik przesunięcia 0,01, ponieważ Desmos wydaje się mieć granice Mod (A, B) z (0, B) zamiast [0, B )
źródło