Rozważ następujące bloki 3x3, które algorytm marszowych kwadratów zidentyfikowałby dla każdej komórki (z identyfikatorem oznaczonym 0):
0:
...
...
...
1:
...
...
\..
2:
...
...
../
3:
...
---
...
4:
..\
...
...
5:
/..
...
../
6:
.|.
.|.
.|.
7:
/..
...
...
8:
/..
...
...
9:
.|.
.|.
.|.
10:
..\
...
\..
11:
..\
...
...
12:
...
---
...
13:
...
...
../
14:
...
...
\..
15:
...
...
...
Celem tego wyzwania jest macierz 2D identyfikatorów bloków, narysowanie pełnego wykresu konturowego przez połączenie tych mniejszych komórek razem. Zauważ, że są pewne powtarzające się przypadki (np .: 0 i 15 wizualnie są takie same)
Wejście
Twój program / funkcja powinna przyjmować jako dane wejściowe 2D prostokątną macierz liczb całkowitych z zakresu [0+a,15+a]
(gdzie a
jest dowolne przesunięcie liczb całkowitych według twojego wyboru; pozwala to na zastosowanie indeksowania zerowego lub indeksowania blokowego 1). Może to być dowolne źródło (standardowe, parametr funkcji itp.).
Wynik
Twój program / funkcja powinna wypisać pojedynczy ciąg reprezentujący pełny wykres konturu. Nie powinno być żadnych dodatkowych początkowych / końcowych białych znaków, ale dozwolona jest jedna nowa linia końcowa. Nie powinno być żadnego odstępu między sąsiadującymi blokami w pionie lub w poziomie.
Zauważ, że nie musisz wykonywać żadnego specjalnego traktowania bloków, które są mapowane na „siodło”; po prostu narysuj blok o podanym ID w stanie, w jakim się znajduje.
Dane wyjściowe mogą być do dowolnego pożądanego ujścia (standardowe wyjście, wartość zwracana itp.)
Przykłady
Wszystkie poniższe przykłady używają identyfikatorów bloków opartych na 0.
case 1:
2 1
4 8
......
......
../\..
..\/..
......
......
case 2:
15 13 12 14 15
13 8 0 4 14
11 1 0 2 7
15 11 3 7 15
...............
......---......
...../...\.....
.../.......\...
...............
../.........\..
..\........./..
...............
...\......./...
.....\.../.....
......---......
...............
case 3:
12 12 12 8 4
0 0 0 0 2
0 0 0 2 7
0 2 3 7 15
........./....\
---------......
...............
...............
...............
............../
............/..
...............
.........../...
........./.....
......---......
...../.........
case 4:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
............
.........---
...\..../...
..\/...|./..
.......|....
...../.|....
/...|...\..\
....|.......
....|.\.....
............
---.........
...../\.....
case 5:
0 0 0 0 6 15 15
0 0 0 0 6 15 15
0 0 0 0 6 15 15
0 0 0 2 7 15 15
0 0 2 5 14 15 15
0 2 5 8 4 12 14
0 4 8 0 0 0 6
0 0 0 0 0 0 4
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
.............|.......
............/........
.....................
.........../.........
........./...........
.....................
......../../\........
....../../....\......
...............---...
...../../.........\..
.....\/............|.
...................|.
...................|.
....................\
.....................
.....................
Punktacja
To jest kod golfowy; najkrótszy kod w bajtach wygrywa. Obowiązują standardowe luki.
Odpowiedzi:
Mathematica,
353326 bajtówWejście
źródło
JavaScript (ES6), 195 bajtów
Przypadki testowe
Pokaż fragment kodu
źródło
Mathematica, 173 bajty
Wypróbuj w piaskownicy Wolfram!
Znak „
\n
” należy zastąpić rzeczywistym znakiem nowej linii. Dane wejściowe są indeksowane 1 - na przykład staje się trzecim przypadkiem testowym{{13,13,13,9,5},{1,1,1,1,3},{1,1,1,3,8},{1,3,4,8,16}}
. Dane wyjściowe to ciąg.Pomysł jest w zasadzie taki sam jak odpowiedź Jenny_mathy - ułóż szesnaście kwadratów, biorąc siatkę 3x3
"."
s i zamieniając niektóre postacie, a następnie połącz kwadraty razem - ale używając nieco krótszych funkcji, aby to zrobić. (Podziękowania dla alephalpha za przypomnienie mi, żeArrayFlatten
istnieje!)Możliwe, że można to zrobić w mniejszej liczbie bajtów, tworząc sprytnie kwadraty zamiast w zasadzie na stałe je kodować, ale wymagałoby to znacznie więcej wysiłku…
źródło
{{16,14,13,15,16},{14,9,1,5,15},{12,2,1,3,8},{16,12,4,8,16}}
. Jeśli spróbowałeś tego i nadal nie działa, czy możesz mi powiedzieć, na czym polega problem?Siatkówka , 165 bajtów
Wypróbuj online! Link zawiera drugi przykład. Objaśnienie: Pierwsze dwa etapy konwertują z dziesiętnego na szesnastkowy, umożliwiając usunięcie spacji. Trzeci etap trzykrotnie powiela każdą linię, nadając każdej nowej linii osobny znacznik. Znaczniki te przechodzą następnie przez cyfry szesnastkowe, przekształcając je w wykres konturowy podczas ich podróży, aż osiągną koniec linii, w którym to punkcie są usuwane.
źródło
Python 2 , 247 bajtów
Wypróbuj online!
-1 bajt dzięki LeakyNun
źródło
SOGL V0.12 ,
10689 bajtówWypróbuj tutaj! (który ma dodatkowy bajt
→
dla ułatwienia wprowadzania danych. W przeciwnym razie można oczekiwać, że tablica jest już na stosie)źródło
Python 2,
196191181176 bajtówWypróbuj online!
Funkcja, która pobiera tablicę tablic liczb całkowitych i zwraca ciąg znaków:
EDYCJA: zapisano 5 bajtów, przypisując J, N; kolejne 10 bajtów, ponieważ zapomniałem, że dane wejściowe są już założone jako tablica tablic liczb całkowitych; a następnie kolejne 5 bajtów zaoszczędzonych przez inteligentniejsze krojenie ...
Połączony ciąg wszystkich 16 komórek 3x3 (144 bajty, z pominięciem podziałów linii) jest kodowany długością przebiegu do ciągu 41 bajtów:
o!j1cSe!f1g1aAbAbAa1h1iAbAbAc!c!d!iSk1f!k
gdzie każdy element RLE
(cellType, length)
jest zakodowany w znakuchr(32+16*cellType+length)
(przydatne jest, aby maksymalny przebiegord(' ')==32
wynosił 15; i można go podzielić przez 16). Podczas dekodowania bierzemy'\/|-.'[cellType]
za znak do wydrukowania.Po tym nie ma nic szczególnie sprytnego ...
źródło
05AB1E , 61 bajtów
Wypróbuj online!
Pierwszą połowę wzoru można skompresować jako:
Druga połowa musiałaby być:
Możemy po prostu odbić pionowo pierwszą połowę i wstawić
binary 110 (1101110)
do2111111125
.Następnie bierzemy ten wzór i dzielimy na piątki, a następnie wypełniamy je jednymi:
Teraz mamy nasze bloki konstrukcyjne, ostatnie części po prostu zastępują wpisy macierzy odpowiednimi blokami konstrukcyjnymi, spakowują rzędy i drukują użytkownikowi zastąpione symbole:
Dzięki, możesz opublikować oficjalne wyjaśnienie operacji.
źródło
Galaretka , 64 bajty
Wypróbuj online!
Wykorzystuje to naiwną kompresję i prawdopodobnie mógłby zaoszczędzić wiele bajtów z kodowaniem długości przebiegu.
Jak to działa
źródło