Obliczanie liczby trójkątów na zdjęciu jest zadaniem często stosowanym w testach mózgu. Otrzymujesz zdjęcie, które zawiera kształty składające się z trójkątów. Następnie musisz znaleźć wszystkie możliwe trójkąty na obrazku.
Zadanie
Otrzymasz listę wierszy w wybranym formacie. Następnie musisz wygenerować listę znalezionych w nim trójkątów
Wejście
Otrzymujesz listę linii, każda podana przez cztery współrzędne całkowite (np. x1 y1 x2 y2
). Możesz wybrać format wejściowy, o ile jest on wyraźnie udokumentowany. Przykłady:
0 4 8 1
0 4 9 5
8 1 9 5
2 8 0 4
9 5 2 8
[[0, 4, 8, 1], [0, 4, 9, 5], [8, 1, 9, 5], [2, 8, 0, 4], [9, 5, 2, 8]]
Oto te same dane wejściowe co obraz:
Kolejny z przecięciami (tylko w jednym formacie, aby zaoszczędzić miejsce):
[[2, 1, 5, 0], [2, 1, 2, 7], [5, 0, 6, 6], [5, 0, 2, 7], [6, 6, 2, 1], [2, 7, 6, 6]]
Wynik
Musisz wydrukować listę wszystkich trójkątów, każdy podany przez sześć współrzędnych zmiennoprzecinkowych (np. x1 y1 x2 y2 x3 y3
), Na obrazie określonym przez dane wejściowe. Nie mogą to być liczby całkowite, ponieważ linie mogą się przecinać w dowolnym punkcie. Możesz wybrać format wyjściowy, o ile jest on wyraźnie udokumentowany. Przykładowe dane wyjściowe dla przykładowych danych wejściowych powyżej:
0 4 8 1 9 5
0 4 9 5 2 8
[[0, 4, 8, 3, 9, 5], [0, 4, 9, 5, 2, 8]]
[[2, 1, 5, 0, 2, 7], [2, 1, 5, 0, 6, 6], [5, 0, 6, 6, 2, 7], [2, 1, 6, 6, 2, 7], [2, 1, 5, 0, 3.674, 3.093], [5, 0, 6, 6, 3.674, 3.093], [6, 6, 2, 7, 3.674, 3.093], [2, 7, 2, 1, 3.674, 3.093]]
Możesz to założyć
nie ma przypadków krawędzi, w których linia przecina przecięcie, ale żadnych linii, takich jak
[[0, 9, 1, 8], [1, 8, 2, 9], [2, 9, 3, 8], [3, 8, 4, 9], [4, 9, 0, 9]]
nie ma kątów powyżej 179 stopni
[[0, 0, 0, 1], [0, 1, 0, 2], [0, 2, 0, 0]]
Zasady
- Możesz używać dowolnego języka.
- Nie wolno używać żadnych zasobów zewnętrznych.
- Obowiązują standardowe luki .
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach .
[0,9],[1,8],[2,9],[3,8],[4,9]
to tak naprawdę W z linią poprowadzoną na górze. Czy to nie trójkąty czy 2 trójkąty?[0,0],[1,0],[2,0],[1,2]
„Czworokąt” z jednym kątem 180 stopni. Brak trójkątów lub 1 trójkąt?Odpowiedzi:
PostGIS, 162
Myślę, że jest to zgodne z regułami. Jest to zapytanie do PostGIS, które jest rozszerzeniem PostgreSQL. Przyjmuje się, że dane wejściowe są tabelą współrzędnych dla każdej linii o nazwie L. Dane wyjściowe to zestaw wierszy z definicją wielokąta dla utworzonych trójkątów.
W użyciu wygląda to następująco
Dane wyjściowe są następujące
źródło
Mathematica
915 395 401405Aktualizacja
To wyzwanie programistyczne jest znacznie trudniejsze, niż się wydaje.
Obecne podejście działa z prostymi przypadkami, w których występuje tylko jedno przecięcie wzdłuż dowolnego odcinka linii. Przy wielu skrzyżowaniach wzdłuż jednego segmentu konieczne jest śledzenie wszystkich punktów przecięcia wzdłuż każdej linii i tworzenie nowych podsegmentów (stąd dodatkowe krawędzie wykresu) łączących nowe skrzyżowanie ze wszystkimi punktami przecięcia wzdłuż linii docelowej.
Mimo tego ograniczenia warto podzielić logikę leżącą u podstaw obecnego podejścia.
Segmenty linii wejściowej są traktowane jako regiony. Jeśli się przecinają, środek ciężkości będzie współrzędnymi przecięcia. Musimy wyeliminować te przecięcia, które występują na wierzchołkach segmentów linii. Linie, które się nie przecinają, będą miały nieokreślony środek ciężkości.
Dla każdego punktu przecięcia tworzone są cztery nowe krawędzie. Łączą punkt przecięcia z czterema wierzchołkami dwóch przecinających się linii.
Wykres taki jak ten po prawej stronie jest generowany przy użyciu zarówno starych, jak i nowych krawędzi.
Wierzchołki są współrzędnymi odpowiednich punktów. Cykle, tj. Zamknięte pętle trzech wierzchołków będą trójkątami, pod warunkiem że trzy wierzchołki nie są współliniowe.
Obecnie sprawdzamy, czy jakikolwiek „trójkąt” ma nieokreślony obszar. (Z jakiegoś powodu nie zwraca obszaru 0 dla trzech punktów współliniowych.)
Prosty przykład
Poniżej są (a) wysokość wykreślono w płaszczyźnie współrzędnych oraz (b) wykres pokazujący podane węzłów oraz węzeł przecięcia linii
{114/23, 314/69}
. W tym ostatnim wierzchołki nie znajdują się na odpowiednich współrzędnych kartezjańskich.Może się wydawać, że mają więcej krawędzi na prawej figurze niż na lewej. Pamiętaj jednak, że po lewej stronie zachodzą na siebie krawędzie wykresu. Każda przekątna faktycznie odpowiada 3 krawędziom wykresu!
Każdy rząd poniżej to trójkąt.
Bardziej złożony przykład
Oto wykres odpowiadający współrzędnym wejściowym . Wierzchołki mają swoje oczekiwane współrzędne kartezjańskie. (Jeśli uruchomisz kod do gry w golfa, wyświetli on wierzchołki gdzie indziej, jednocześnie przestrzegając etykiet i krawędzi wierzchołków. W celu zapewnienia czytelności przypisałem współrzędne wierzchołków za pomocą odrobiny dodatkowego kodu, który nie jest konieczny do rozwiązania.)
Oto wykres pochodny.
Obejmuje pochodny punkt przecięcia
(0,1/11)
, w którym krzyżują się niektóre linie wejściowe.Kod znalazł 19 trójkątów. Dziewięć z nich ma punkt,
(0,1/11)
jako jeden z wierzchołków.źródło
Java,
10511004(W pełni działający program)
Pomyślałem, że to fajne wyzwanie nie tylko do gry w golfa, ale przede wszystkim do ćwiczenia pisania funkcji matematycznych.
Aby narysować „linię bazową”, stworzyłem ją w Javie * Czeka, aż wszyscy zaczną się śmiać * .
Kod
Wejście
Liczby całkowite oddzielone spacją. W parach po 4 (x1, y1, x2, y2)
Wyjście (rzeczywista wydajność nie zaokrągla do 3 miejsc po przecinku)
Każda linia zawiera jeden trójkąt Każda linia składa się z rozdzielonych spacjami punktów zmiennoprzecinkowych w parach 2 (x1, y1, x2, y2, x3, y3). (Uwaga: kolejność 3 punktów tworzących trójkąt jest niezdefiniowana).
Wyjaśnienie
Zacząłem pisać metodę znajdowania przecięcia między dwiema nieskończonymi liniami. Powstała metoda jest bardzo krótka w stylu Java (246). Zamiast pozwolić, aby metoda zawierała 8 podwójnych lub dwóch Punktów (P), wybieram dowolny parametr, aby zabezpieczyć ogromne ilości znaków. Aby zminimalizować użycie operatora tablicy, każdy parametr użyty więcej niż 2 razy jest umieszczany we własnej zmiennej.
Więcej wyjaśnień do dodania ... (ta odpowiedź może być jeszcze bardziej golfa)
źródło
BBC BASIC
Emulator w http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
Spodziewam się, że będzie to grało w golfa w latach 400-tych.
Wejście wyjście
Za każdym razem, gdy użytkownik wchodzi w nową linię, program sprawdza, czy zostały utworzone jakieś nowe trójkąty, i wysyła je natychmiast, patrz poniżej.
Nowy trójkąt jest tworzony wszędzie tam, gdzie nowa linia przecina się z dwiema wcześniej istniejącymi liniami, które również przecinają się wzajemnie (z wyjątkiem sytuacji, gdy wszystkie trzy linie przecinają się w punkcie, co jest szczególnym przypadkiem, z którym należy sobie poradzić.)
Kod
Główny program jest tak prosty, jak to tylko możliwe. Na końcu jest funkcja, która wykonuje złożone zadanie wykrywania skrzyżowań, zgodnie ze wzorem w http://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
Funkcja zwraca zero, jeśli nie ma przecięcia, i niezerową liczbę zmiennoprzecinkową, jeśli istnieje. Ma również efekt uboczny: współrzędne skrzyżowania są dołączane do ciągu z $. Dodatkowo w BBC basic zmienne funkcji są widoczne dla programu głównego, pod warunkiem, że program główny nie ma zmiennej o tej samej nazwie (nawet po zakończeniu funkcji).
Dlatego główny program ma dostęp do zmiennych
x
iy
, i,m
in
, które przechowują współrzędne bieżącego i poprzednich skrzyżowań. Służy to do wykrycia, czy naprawdę znaleźliśmy trójkąt, a nie tylko trzy linie przecinające się w jednym punkcie.źródło