Marching Squares to algorytm z grafiki komputerowej, który służy do odzyskiwania izokonturów 2D z siatki próbek (patrz także jego starszy brat Marching Cubes dla ustawień 3D). Chodzi o to, aby przetwarzać każdą komórkę siatki niezależnie i określać kontury przechodzące przez tę komórkę na podstawie wartości w jej rogach.
Pierwszym krokiem w tym procesie jest określenie, które krawędzie są połączone konturami, w oparciu o to, czy rogi znajdują się powyżej czy poniżej wartości konturu. Dla uproszczenia weźmiemy pod uwagę tylko kontury wzdłuż wartości 0
, tak że interesuje nas, czy narożniki są dodatnie czy ujemne. Istnieją przypadki, aby odróżnić:24 = 16
Źródło obrazu: Wikipedia
Identyfikacja bieli i czerni tak naprawdę nie ma tutaj znaczenia, ale dla pewności powiedz, że biel jest dodatnia, a czerń ujemna. Zignorujemy przypadki, w których jeden z rogów jest dokładnie 0
.
Punkty siodełka (przypadki 5 i 10) stanowią dodatkową trudność: nie jest jasne, z których przekątnych należy korzystać, patrząc tylko na rogi. Można to rozwiązać, znajdując średnią z czterech rogów (tj. Przybliżenie wartości środkowej) i wybierając przekątne w taki sposób, że kontury oddzielają środek od narożników o przeciwnym znaku. Jeśli średnia jest dokładnie 0
, można wybrać dowolny przypadek.
Zazwyczaj te 16 przypadków jest po prostu przechowywane w tabeli odnośników. Jest to świetne pod względem wydajności, ale oczywiście wolelibyśmy, aby kod był tutaj krótki . Twoim zadaniem jest wykonanie tego kroku wyszukiwania i wydrukowanie reprezentacji sprawy w formacie ASCII przy możliwie najmniejszym kodzie.
Wyzwanie
Otrzymasz wartości czterech rogów (niezerowe liczby całkowite) w ustalonej kolejności. Następnie należy wygenerować prawidłowy układ konturów, poprawnie rozwiązując przypadki punktów siodłowych.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Dane wejściowe mogą być pobierane w dowolnym dogodnym formacie ciągu lub listy.
16 przypadków będzie reprezentowanych w sztuce ASCII przy użyciu jednego z następujących bloków 5x5:
o---o o---o o---o
| | | | | | |
| | |---| | | |
| | | | | | |
o---o o---o o---o
o---o o---o o---o o---o
|/ | | \| | | | |
| | | | | | | |
| | | | |\ | | /|
o---o o---o o---o o---o
o---o o---o
|/ | | \|
| | | |
| /| |\ |
o---o o---o
Nie wolno drukować żadnych początkowych ani końcowych białych znaków, ale można wydrukować jedną opcjonalną nową linię.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
Przypadki testowe zakładać, że wejście jest podana w kolejności od góry w lewo , prawym górnym , dolnym rogu , w prawym dolnym rogu . Przypadki testowe są przedstawione w 9 grupach, po jednej odpowiadającej każdemu z 9 przedstawionych powyżej przedstawień (w tej samej kolejności, zaczynając od pustej komórki, kończąc na dwóch punktach siodłowych).
[1, 2, 1, 3]
[-9, -2, -2, -7]
[4, 5, -1, -2]
[-1, -2, 3, 4]
[7, -7, 7, -7]
[-5, 5, -5, 5]
[1, -6, -4, -1]
[-2, 3, 3, 4]
[-1, 6, -4, -1]
[2, -3, 3, 4]
[-1, -6, 4, -1]
[2, 3, -3, 4]
[-1, -6, -4, 1]
[2, 3, 3, -4]
[3, -8, -9, 2]
[-3, 8, 9, -2]
[8, -3, -2, 9]
[-8, 3, 2, -9]
Ponadto następujące przypadki testowe mogą zwrócić jeden z punktów siodełka (do wyboru):
[1, -4, -2, 5]
[-1, 4, 2, -5]