Biorąc pod uwagę wiele zestawów, na przykład s1={2,3,7}
, s2={1,2,4,7,8}
i s3={4,7}
, A Venna wizualizuje każdego zestawu przez krzywą zamkniętą i zestaw elementów, które wewnątrz lub na zewnątrz obwodu krzywej, w zależności od tego, czy są one element zbioru lub nie. Ponieważ wszystkie elementy zestawu pojawiają się tylko raz w digramie Venna, krzywe reprezentujące każdy zestaw muszą się nakładać, jeśli element występuje w więcej niż jednym zestawie. Nazywamy każdą taką nakładającą się komórkę diagramu Venna.
To wyjaśnienie może być nieco mylące, więc spójrzmy na przykład.
Przykład
Diagram Venna dla zestawów s1
, s2
a s3
może wyglądać następująco:
Komórki tego diagramu Venna są (czytaj od góry do dołu, od lewej do prawej) {1,8}
, {2}
, {7}
, {4}
, {3}
, {}
i {}
.
W praktyce często spotyka się tylko diagramy Venna dwóch lub trzech zestawów, ponieważ reprezentacja diagramów Venna czterech lub więcej zestawów nie jest bardzo wyraźna. Jednak istnieją, np. Dla sześciu zestawów:
CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=1472309
Zadanie
Biorąc pod uwagę niepusty zbiór dodatnich liczb całkowitych w dowolnej rozsądnej reprezentacji, zwróć zestaw komórek ze schematu Venna zbiorów wejściowych. W szczególności nie jest wymagana reprezentacja graficzna.
- Możesz napisać pełny program lub funkcję.
- Możesz zwrócić tyle pustych zestawów, ile jest pustych komórek (tj. Listę wszystkich komórek) zamiast tylko jednego pustego zestawu (tj. Zestawu komórek).
- Niektóre rozsądne sposoby wejścia do powyższego przykładu, obejmują, ale nie są ograniczone do
{{2,3,7},{1,2,4,7,8},{4,7}}
,[[2,3,7],[1,2,4,7,8],[4,7]]
,"2,3,7;1,2,4,7,8;4,7"
lub"2 3 7\n1 2 4 7 8\n4 7"
. W razie wątpliwości, czy wybrany format wejściowy jest akceptowalny, prosimy o komentarz. - Jeśli to możliwe, format wyjściowy powinien odpowiadać formatowi wejściowemu. Pamiętaj, że ta reguła wymaga, aby Twój format mógł jednoznacznie wyświetlać puste zestawy.
- To jest golf golfowy , więc spróbuj użyć jak najmniej bajtów w wybranym języku. Aby zachęcić do rywalizacji między językami zamiast między językami, nie przyjmuję odpowiedzi.
Przypadki testowe
Oto niektóre dane wejściowe wraz z możliwymi danymi wyjściowymi:
input -> output
{{2,3,7},{1,2,4,7,8},{4,7}} -> {{1,8},{2},{7},{4},{3},{}} (or {{1,8},{2},{7},{4},{3},{},{}})
{{1,2,3},{4,5,6},{7,8,9}} -> {{1,2,3},{4,5,6},{7,8,9},{}}
{{}} -> {{}}
{{1,2,3},{1,2}} -> {{1,2},{3},{}}
{{4,3,8},{1,2,9,3},{14,7,8,5},{6,11,3,8},{10},{9,4,3,7,10}} -> {{6,11},{10},{4},{3},{8},{5,14},{1,2},{9},{7},{}}
{{2,3,4,7},{},{1,3,7,5,6},{2,3,7,5},{7,2,4,3,6},{1,4,5}} -> {{},{4},{2},{7,3},{1},{6},{5}}
{{1,2,3,4},{1,2,5,6},{1,3,5,7}} -> {{4},{3},{2},{1},{6},{5},{7}}
źródło
{{1,2,3},{4,5,6},{7,8,9},{},{},{},{}}
?Odpowiedzi:
Haskell , 71 bajtów
Anonimowa funkcja pobierająca listę liczb całkowitych i zwracająca podobną listę.
Użyj jako
(foldr(\x r->(x\\(id=<<r)):([intersect x,(\\x)]<*>r))[])[[1,2,3],[1,2]]
.Wypróbuj online!
Jak to działa
\\
(różnica) iintersect
odData.List
.[]
.x
to bieżący zestaw, który ma zostać dodany do diagramu, ir
jest to lista komórek, które zostały już zbudowane.x\\(id=<<r)
jest podzbiorem elementówx
, których nie ma w żadnej z już zbudowanych komórek.[intersect x,(\\x)]<*>r
dzieli każdą komórkęr
według tego, czy jej elementy są wx
środku, czy nie.źródło
Galaretka ,
1417 bajtówWypróbuj online!
Przesyłanie funkcji (ponieważ format Jelly domyślnie wypisuje listy w obie strony - nie może odczytać własnego formatu wyjściowego - ale dane wejściowe i wyjściowe funkcji w tym samym formacie). Łącze TIO zawiera stopkę, która uruchamia funkcję i drukuje dane wyjściowe w tym samym formacie, w którym analizowane jest wejście.
Wyjaśnienie
Wymaganie, abyśmy wypisali co najmniej jeden pusty zestaw, jeśli nie wszystkie sekcje diagramu Venna są wykorzystane, zajmuje tutaj ponad połowę programu (odpowiada za to
’
, że upewniamy się, że mamy co najmniej jedną grupę dla niepasujących elementów, co pozwala nam aby śledzić, ile oryginalnie zestawów zawierało plus dziewięć ostatnich bajtów kodu źródłowego z wyjątkiemĠ
). Podstawowym sposobem, w którym jego realizacji ma zapewnić, że wszystkie 2 ^ n Venna podzbiory ma co najmniej jedną pozycję dodając wpis manekin, który wypełni sekcji „w nie określa” i (później) wpisu obojętne każdemu inna sekcja, następnieĠ
wyświetli grupę dla każdego podzbioru, którą możemy usunąć za pomocąṖṖ€
.źródło
Perl 5, 79 bajtów
Pobiera dane wejściowe jako listę anonimowych tablic, takich jak ([2,3,7], [1,2,4,7,8], [4,7]). Wysyła skrót, w którym klucze są etykietami, a wartości są anonimowymi tablicami odpowiadającymi zestawom wyjściowym.
W ramach pełnego programu:
Wyjaśnienie:
Daje każdy zestaw liczbę całkowitą jako etykiety
$.
. Tworzy skrót, który przechowuje liczbę całkowitą dla każdego unikalnego elementu$_
. Dodaje2**$.
dla każdego zestawu, który się$_
pojawia, skutecznie tworząc mapę binarną pokazującą, w których zestawach pojawia się każdy element. Na koniec tworzy anonimową tablicę dla każdej komórki diagramu Venna i wypycha elementy pojawiające się w odpowiednich zestawach do tablicy. Zatem każdy element każdej tablicy istnieje w tych samych zestawach, a zatem w tej samej komórce diagramu Venna.źródło
Pyth , 11 bajtów
Zestaw testowy.
Jak to działa
Każdy region diagramu Venna reprezentuje elementy, które są w [pewnych kombinacjach zestawów], ale nie w [innych zestawach].
Tak więc generujemy wszystkie możliwe kombinacje (i usuwamy puste kombinacje) poprzez znalezienie zestawu mocy wejścia.
Dla każdej wygenerowanej kombinacji znajdujemy przecięcie zbiorów w kombinacji i odfiltrowujemy elementy znajdujące się w innych zestawach.
źródło
JavaScript (ES6), 123 bajty
źródło