Biorąc pod uwagę prostokątną matrycę elewacji, narysuj jej kontury.
Zadanie
Dwa elementy x
i y
są na tym samym poziomie konturu, jeśli floor(x/10) == floor(y/10)
. Na przykład, 52
i 58
są na tym samym poziomie konturu, ale 58
i 64
nie są.
Czynność rysowania konturów jest zdefiniowana w następujący sposób: Dla każdego elementu e
zamień go na ciąg dwóch znaków wybrany w następujący sposób:
- pierwszy znak ma miejsce,
" "
gdy element poniżeje
znajduje się na tym samym poziomie konturu coe
lub jeśli nie ma elementu elementu poniżeje
i"_"
inaczej - drugi znak występuje,
" "
gdy element po prawej stroniee
znajduje się na tym samym poziomie konturu, coe
nie, lub element nie jest po prawej stronie,e
a"|"
poza tym
Elementy w rzędach są łączone ze sobą, a następnie wiersze są łączone z nowymi liniami.
Przykład
Powiedzmy, że dane wejściowe są [[5,20],[3,6]]
wizualizowane jako
5 20
3 6
Najpierw patrzymy na 5
. Ponieważ 3
jest na tym samym poziomie konturu co 5
, pierwsza postać to " "
. Ponieważ 20
nie jest na tym samym poziomie konturu co 5
, druga postać to "|"
.
Teraz patrzymy na 20
. Ponieważ 6
nie jest na tym samym poziomie konturu co 20
, pierwsza postać to "_"
. Ponieważ po prawej stronie nie ma elementu 20
, drugą postacią jest " "
.
Teraz patrzymy na 3
. Ponieważ poniżej nie ma elementu 3
, pierwszą postacią jest " "
. Ponieważ 6
jest na tym samym poziomie konturu co 3
, druga postać to " "
.
Teraz patrzymy na 6
. Ponieważ poniżej nie ma elementu 6
, pierwszą postacią jest " "
. Ponieważ po prawej stronie nie ma elementu 6
, drugą postacią jest" "
.
W oparciu o te łańcuchy dwuznakowe dokonujemy zamiany, aby uzyskać [[" |","_ "],[" "," "]]
. Łącząc je razem, otrzymujemy wynik
|_
Zasady
- Matryca wejściowa zawsze będzie prostokątna i złożona z dodatnich liczb całkowitych.
- Końcowe spacje lub znaki nowej linii mogą być w dowolnej ilości (w tym 0) i nie muszą być w żaden sposób spójne.
- Nie musisz postępować zgodnie z tym samym algorytmem, o ile generujesz takie same wyniki.
- Twój program lub funkcja może wyświetlać ciąg rozdzielony znakiem nowej linii, listę ciągów lub równoważny.
- To jest golf golfowy , więc wygrywa najkrótszy kod w bajtach.
Przypadki testowe
input
output
[[1,5,8,9],[3,11,13,8],[7,14,10,9],[4,8,7,6]]
_ _
| |
|_ _|
[[0,10,20,30,40,50,60,70,80,90],[0,0,10,10,20,20,30,30,40,40],[0,0,0,10,10,10,20,20,20,30],[0,0,0,0,10,10,10,10,20,20],[0,0,0,0,0,10,10,10,10,10],[0,0,0,0,0,0,10,10,10,10],[0,0,0,0,0,0,0,10,10,10],[0,0,0,0,0,0,0,0,10,10],[0,0,0,0,0,0,0,0,0,10],[0,0,0,0,0,0,0,0,0,0]]
|_|_|_|_|_|_|_|_|_
|_ |_ _|_ _|_ _
|_ |_ _ |_
|_ |_ _
|_
|_
|_
|_
|_
[[5,5,5,5,5,5,5,5,5,5,5],[5,10,10,10,10,10,10,10,10,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,25,30,25,20,15,10,5],[5,10,15,20,25,25,25,20,15,10,5],[5,10,15,20,20,20,20,20,15,10,5],[5,10,15,15,15,15,15,15,15,10,5],[5,10,10,10,10,10,10,10,10,10,5],[5,5,5,5,5,5,5,5,5,5,5]]
_ _ _ _ _ _ _ _ _
| |
| _ _ _ _ _ |
| | | |
| | _ | |
| | |_| | |
| | | |
| |_ _ _ _ _| |
| |
|_ _ _ _ _ _ _ _ _|
[[35,32,29,26,25,25,25,26,29,32,35],[32,28,25,22,20,20,20,22,25,28,32],[29,25,21,18,15,15,15,18,21,25,29],[26,22,18,14,11,10,11,14,18,22,26],[25,20,15,11,7,5,7,11,15,20,25],[25,20,15,10,5,0,5,10,15,20,25],[25,20,15,11,7,5,7,11,15,20,25],[26,22,18,14,11,10,11,14,18,22,26],[29,25,21,18,15,15,15,18,21,25,29],[32,28,25,22,20,20,20,22,25,28,32],[35,32,29,26,25,25,25,26,29,32,35]]
_| |_
_| _ _ _ _ _ |_
_| |_
| _ _ _ |
| | | |
| | | |
| |_ _ _| |
|_ _|
_ |_ _ _ _ _| _
|_ _|
| |
Odpowiedzi:
Perl 6 , 135 bajtów (131 znaków)
Wypróbuj online!
Nieznacznie nie golfista:
Objaśnienie : Najpierw definiujemy zmienną
$n
(wiersz 2) i funkcjęw
(wiersz 3). Ta funkcja zwraca spację, jeśli jej dwa argumenty mają tę samą „rzędną”, a zawartość zmiennej w$n
przeciwnym razie. Zamiast dzielić przez 10 i podłogę, nadużywamy faktu, że ints sąCool
(mogą być traktowane jak łańcuchy) i używamychop
do usunięcia ostatniego znaku (= cyfra). Następnie spokojnie odejmujemy je, zmuszając ponownie do liczb :—).Następnie (wiersz 4) tworzymy funkcję,
q
która pobiera listę i zwraca tę listę z usuniętym pierwszym elementem i zduplikowanym ostatnim elementem.W następnych 3 wierszach utworzymy jeszcze 2 macierze z macierzy wejściowej: w pierwszym brakuje pierwszego wiersza, a ostatni wiersz jest zduplikowany (to po prostu
.&q
- używając.&
, możesz wywołać funkcję na czymkolwiek tak, jakby była metoda - rzecz przed kropką jest wtedy pierwszym argumentem), w drugiej brakuje pierwszej kolumny, a ostatnia kolumna jest zduplikowana (to jest.map(*.&q)
).Najpierw (wiersz 4) bierzemy oryginalną macierz
$_
, „nakładamy” ją na macierz „przesuniętych wierszy” i używamy funkcjiw
jako operatora binarnego (to jest to[&w]
) na pasujących elementach. Ten umieszcza_
wszędzie tam, gdzie pasujące elementy znajdują się na różnych wysokościach, iinaczej. Otrzymujemy ½ wyniku (tylko „pierwsze znaki”).
W linii 6 robimy to samo, ale najpierw zmieniamy
$n
na|
i teraz „nakładamy” oryginalną macierz na macierz ze przesuniętymi kolumnami. Wynik ma|
różne ite same wysokości. Są to „drugie znaki”.
Teraz po prostu je łączymy. Układamy tablice za pomocą zamka błyskawicznego z concat (tak ...), co powoduje powstanie matrycy o oryginalnym kształcie, której każdy element jest 2 dopasowanymi elementami połączonych „pół-rozwiązań”. Na koniec po prostu mapujemy tę macierz (która jest tak naprawdę listą list). Każda z tych list jest spłaszczona, a następnie
say
dodana (wydrukowana z nową linią). Ponieważsay
może przyjąć dowolną liczbę argumentów i drukuje je wszystkie bez separatorów, dzięki czemu nowy wiersz jest tylko na końcu, otrzymujemy pożądany obraz na standardowym wyjściu. (I blok zwraca listęTrue
s (każdysay
zwraca jedenTrue
), ale kogo to obchodzi.)źródło
but who cares
Galaretka ,
25 2322 bajtów-1 bajt dzięki mil (
I
vectorises)Pełny program drukujący wynik. Jako łącze monadyczne pobiera listę liczb, elewacji i zwraca listę list, jednak te „wiersze” składają się z list dwóch „par” znaków - jeśli jest w porządku, można usunąć 1 bajt przez usunięcie
Y
.Wypróbuj online!
W jaki sposób?
źródło
⁵
ratuje cię od razu ...:⁵I;€0ao⁶
zamiast w głównym łączuZç”_Zż"ç”|$Y
I
że nie byłoby tak wektoryzacji.I
wektoryzuje na głębokości 1, a obiea
io
wektoryzują na głębokości 0Python 2 ,
199186157155 bajtówWypróbuj online!
źródło
Galaretka , 24 bajty
Wypróbuj online!
Wyjaśnienie
-2 bajty dzięki Jonathanowi Allanowi
źródło
Y
- zwróci listę list znaków, które moim zdaniem są w porządku (podczas gdy moje mają pary wewnątrz „wierszy”).Python 2 , 226 bajtów
Wypróbuj online!
Uff, to było logiczne. Teraz widzę ninja Hyper Neutrino z krótszą odpowiedzią, ale poświęciłem temu zbyt wiele pracy, żeby tego nie opublikować. : P
Mogę też powiedzieć, że jest to niesamowity sposób na tworzenie ASCII-art. Przepraszam, gdy robię ich więcej.
źródło
enumerate
zamiast dwa razy używać pełnej nazwy.enumerate
(obs, musiałem usunąć niektóre dane wejściowe, aby móc je tutaj połączyć)J, 58 bajtów
Wypróbuj online!
Anonimowa funkcja, która pobiera macierz i generuje kontury.
Tutaj jest dużo miejsca na ulepszenia. Nie miałem czasu na wypróbowanie wszystkich przypadków testowych, więc daj mi znać, jeśli są jakieś problemy. Spróbuję golfa więcej i wyjaśnię później.
(Szybkie) Objaśnienie
Funkcja pomocnicza: indeksuje do łańcucha długości 2 na podstawie tego, czy pierwszy element tablicy o długości 2 jest równy drugiemu. Jeśli jest równy, indeksuje do elementu zerowego, jeśli jest nierówny, indeksuje do pierwszego. Tablica o długości 1 indeksuje zawsze do elementu zerowego ciągu.
Główna funkcja
1:+<.@%&10
podłogi każdy element podzielony przez 10 i dodaje 1 (więc nigdy nie otrzymamy 0 - jest to ważne dla funkcji pomocnika).2 2((' _'f{."1),' |'f{.);.3
tnie matrycę na 2 x 2 segmenty, jeśli to możliwe (w przeciwnym razie da 2 x 1, 1 x 2 lub 1 x 1 segment w pobliżu krawędzi) i zastosuje funkcję, która używaf
do porównania lewego górnego elementu do góry prawy i lewy górny element na lewym dolnym rogu.(,/"2)
spłaszcza wynik do pożądanego kształtu. Naprawdę czuję, że powinienem być w stanie uniknąć konieczności korzystania z tego (i wielu innych rzeczy, ale dygresuję).źródło
J ,
4645 bajtówWypróbuj online!
źródło
JavaScript (ES6),
120118 bajtówGdzie
\n
reprezentuje dosłowny znak nowej linii. Edycja: Zapisano 2 bajty dzięki @ Bálint.źródło
(a[i] || [])[j]
konstrukty na(a[i] || 0)[j]
join`\n`
można było usunąć\n
część i zastąpić ją nową liniąa=>a.map(b=>b.map(c=>c/10|0)).map((b,i,a)=>b.map((c,j)=>" _"[(a[i+1]||0)[j]-c&1]+" |"[b[j+1]-c&1]).join``).join`<new line here>`
\n
części; Testuję w REPL, aby dosłownie nowe znaki mogły przeszkodzić.Proton , 202 bajty
Wypróbuj online!
-2 bajty dzięki Jonathanowi Frechowi
-15 bajtów poprzez przejście na Proton zamiast Python 2
źródło
len
jeL
i definiującL=len;
.Java 8,
200170169 bajtówWyjaśnienie:
Wypróbuj tutaj.
Należy pamiętać, że podział liczb całkowitych w Javie automatycznie podłogi.
źródło
R, 159 bajtów
Z nowymi liniami i wcięciami:
Ma podział całkowitej matrycy, mierzy się różnice w rzędach i Kolumnowa, a gdy nie jest pusta zastąpić
|
i_
odpowiednio , a następnie wkleja zarówno (bezbolesne, dzięki wektoryzacji R), jak i wyniki.Przypadki testowe:
źródło
Perl 5 ,
130126 bajtów124 bajty kodu + 2 dla
-ap
flagWypróbuj online!
Format wejściowy to siatka 2-D liczb oddzielonych spacjami.
Wyjaśnienie
Wynika to z poprzedniej iteracji kodu.
źródło