To drugie z dwóch wyzwań dotyczących „napinania funkcji ciągnięcia”. Oto nieco prostsze Część I .
Let jazdy m gwoździ w płycie w pozycji (X 1 , Y 1 ) do (x m y m ) . Przywiąż gumkę do pierwszego i ostatniego z nich i rozciągnij wokół innych gwoździ, tak aby pasek przecinał wszystkie gwoździe w kolejności. Zauważ, że gumka opisuje teraz częściowo sparametryzowaną liniową funkcję (x (t), y (t)) w przestrzeni 2D.
Teraz wbij kolejne n gwoździ do tablicy, w pozycjach (x 1 , y 1 ) do (x n , y n ) . Jeśli teraz usuniemy wszystkie oryginalne gwoździe m, z wyjątkiem pierwszego i ostatniego (do którego są przywiązane końce gumy), gumka skróci się, dopóki nie będzie napięta wokół nowych gwoździ, dając kolejną funkcję liniową.
Jako przykład weź m = 12 początkowych gwoździ w pozycjach (0, 0), (2, -1), (3/2, 4/3), (7/2, 1/3), (11/2, 16/3), (1, 16/3), (0, 1), (7, -2), (3, 4), (8, 1), (3, -1), (11, 0) i n = 10 kolejnych gwoździ w pozycjach (1, 1), (3, 1), (4, 4), (1, 3), (2, 2), (5, -1), (5, 0) ), (6, 2), (7, 1), (6, 0) . Poniższe trzy wykresy pokazują proces opisany powyżej:
W przypadku większej wersji: kliknij prawym przyciskiem myszy -> Otwórz w nowej karcie
A oto animacja zaciśnięcia gumki, jeśli masz trudności z jej wizualizacją:
Wyzwanie
Biorąc pod uwagę dwie listy „gwoździ”, narysuj napięty gumowy pasek wokół drugiej listy, jeśli zaczyna się od kształtu przechodzącego przez wszystkie gwoździe na pierwszej liście.
Możesz napisać program lub funkcję i przyjąć dane wejściowe za pomocą argumentu STDIN, ARGV lub funkcji. Możesz wyświetlić wynik na ekranie lub zapisać obraz w pliku.
Jeśli wynik jest zrasteryzowany, musi on mieć co najmniej 300 pikseli z każdej strony. Końcowa gumka i gwoździe muszą pokrywać co najmniej 75% poziomego i pionowego zasięgu obrazu. Waga długości z X i Y mają być takie same. Musisz pokazać paznokcie w drugim zestawie (używając co najmniej 3x3 pikseli) i sznurku (co najmniej 1 piksel szerokości). Możesz włączyć lub nie osie.
Kolory są twoim wyborem, ale potrzebujesz co najmniej dwóch wyróżniających się kolorów: jednego dla tła i jednego dla paznokci i sznurka (te mogą mieć różne kolory).
Możesz założyć, że wszystkie gwoździe na drugiej liście znajdują się w odległości co najmniej 10 -5 jednostek od początkowego kształtu gumki (abyś nie musiał się martwić niedokładnością zmiennoprzecinkową).
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Więcej przykładów
Oto dwa kolejne przykłady:
{{1, 1}, {3, 3}, {2, 4}, {1, 3}, {4, 0}, {3, -1}, {2, 0}, {4, 2}}
{{2, 1}, {3, 2}, {1, 2}, {4, 1}}
{{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 5}, {3, 5}, {-1, 3}, {-1, 0}, {3, 4}, {5, 1}, {5, -1}, {7, -1}, {3, 7}, {7, 5}}
{{0, 0}, {0, 2}, {0, 4}, {0, 6}, {2, 0}, {2, 2}, {2, 4}, {2, 6}, {4, 0}, {4, 2}, {4, 4}, {4, 6}, {6, 0}, {6, 2}, {6, 4}, {6, 6}}
A oto jeden przykład, który pokazuje znaczenie dwóch pozostałych gwoździ początkowych. Wynik powinien być b i nie :
{{0, 0}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 0}}
{{-0.5, 0.5}}
Dzięki Ellowi za ten przykład.
źródło
Odpowiedzi:
Python + matplotlib, 688
Czyta dwie listy punktów ze STDIN.
Przykład
Jak to działa
Kluczem do rozwiązania jest praca w małych, przyrostowych krokach. Zamiast próbować dowiedzieć się, co się dzieje, gdy usuwamy wszystkie paznokcie naraz, koncentrujemy się na bezpośrednich efektach usunięcia tylko jednego paznokcia. Następnie możemy usuwać gwoździe jeden po drugim w dowolnej kolejności.
Praca przyrostowa oznacza, że musimy śledzić stan pośredni gumki. Oto trudna część: samo śledzenie gwoździ, przez które przebiega zespół, nie wystarczy. Podczas usuwania paznokci opaska może się zranić, a następnie rozwinąć wokół paznokcia. Dlatego gdy zespół wchodzi w interakcję z gwoździem, musimy śledzić, ile razy i w jakim kierunku owija się wokół niego. Robimy to, przypisując wartość do każdego gwoździa wzdłuż zespołu w następujący sposób:
Uwaga:
Zaczynamy liczyć, gdy tylko opaska przylegnie do gwoździa, mimo że gwóźdź nie wpływa ściśle na jego kształt. Przypomnij sobie, że w przeciwieństwie do ilustracji nasze paznokcie są bezwymiarowe. Dlatego jeśli opaska staje się styczna do gwoździa, nie jesteśmy w stanie stwierdzić, po której stronie gwoździa znajduje się sam po swojej pozycji --- musimy śledzić, gdzie kiedyś był względem opaski.
Trzymamy gwoździe o wartości zerowej, to znaczy gwoździe, które kiedyś miały, ale nie trzymają już opaski, zamiast natychmiast je usuwać. Gdybyśmy to zrobili, mogłoby to wywołać niepożądaną reakcję łańcuchową, podczas gdy staramy się utrzymać efekty każdego kroku zlokalizowane. Zamiast tego paznokcie o wartości zero są uważane za kwalifikujące się do usunięcia w ramach większego procesu.
Teraz możemy opisać, co dzieje się na każdym kroku:
Wybieramy gwóźdź do usunięcia z bieżącej ścieżki zespołu. Gwóźdź kwalifikuje się do usunięcia, jeśli jest częścią pierwszego zestawu gwoździ (z wyjątkiem punktów końcowych) lub jeśli jego wartość wynosi zero.
Udając, że dwa sąsiednie gwoździe są nieruchome, ustalamy, które gwoździe z drugiego zestawu lub pary punktów końcowych będzie przebiegać przez zespół po usunięciu wybranego gwoździa (nie zawracamy sobie głowy resztą gwoździ z pierwszy set, ponieważ wszystko będzie ostatecznie zostać usunięte). Robimy to w sposób podobny do roztworu do części I . Wszystkie te gwoździe znajdują się po tej samej stronie opaski, dlatego przypisujemy im wartość 1 lub -1 , w zależności od strony.
Aktualizujemy wartość dwóch sąsiednich gwoździ, aby odzwierciedlić zmiany na ścieżce zespołu (łatwo najtrudniejsza część!)
Ten proces powtarza się, aż nie będzie już więcej paznokci do usunięcia:
A oto bardziej skomplikowany przykład ilustrujący zespół owijający się wielokrotnie wokół gwoździa:
źródło
Java - 1262 bajtów
Wiem, że to prawdopodobnie nie gra w golfa tak bardzo jak mogłoby być.
Wydaje się jednak, że nikt inny nie podchodzi do talerza i nie odpowiada na to pytanie, więc zrobię to.
Po pierwsze, klasa „T” - która jest klasą punktową - 57 bajtów
I główna klasa - 1205 bajtów
Przykład:
Aby uruchomić, wywołaj funkcję „d” z listą punktów i zestawem gwoździ (tak, wiem, dziwne). Co to robi:
Nie jestem pewien, czy osie w pikselach są w porządku. Zawsze zajmie więcej niż 75% miejsca, może być naprawdę bardzo małe.
Oto ładna animacja pokazująca, co tu robię:
W końcu staje się tym, w którym punkty ledwo się poruszają. Właśnie wtedy widzę, jakich paznokci dotyka:
Oto niepoddany golfowi kod animacji:
źródło