Twoim celem jest obliczenie ustawionego przecięcia dwóch list liczb całkowitych. Przecięcie jest zdefiniowane jako unikalna nieporządkowana grupa liczb całkowitych znaleziona co najmniej raz na obu listach wejściowych.
Wejście
Dane wejściowe mogą być w dowolnym pożądanym formacie (parametr funkcji, stdio itp.) I składają się z dwóch list liczb całkowitych. Wielu nie zakłada niczego na temat każdej listy poza tym, że mogą zawierać nieujemną liczbę liczb całkowitych (tzn. Są nieposortowane, prawdopodobnie mogą zawierać duplikaty, mogą mieć różne długości, a nawet mogą być puste). Zakłada się, że każda liczba całkowita będzie pasować do natywnego typu liczb całkowitych w twoim języku, może być dłuższa niż 1 cyfra dziesiętna i są podpisane.
Przykładowe dane wejściowe:
1 4 3 9 8 8 3 7 0
10 1 4 4 8 -1
Wynik
Dane wyjściowe są dowolnymi listowymi liczbami całkowitymi reprezentującymi ustawione przecięcie dwóch list do dowolnego pożądanego formatu (zwracana wartość, stdio itp.). Nie ma wymogu sortowania danych wyjściowych, ale można podać implementację, która zawsze jest sortowana. Dane wyjściowe muszą stanowić prawidłowy niez uporządkowany zestaw (np. Nie może zawierać żadnych zduplikowanych wartości).
Przykładowe przypadki testowe (zauważ, że kolejność danych wyjściowych nie jest ważna):
Pierwsze dwa wiersze to listy wejściowe, trzeci wiersz to wynik. (empty)
oznacza pustą listę.
(empty)
(empty)
(empty)
1000
(empty)
(empty)
3 1 2 4 3 1 1 1 1 3
3 1 -1 0 8 3 3 1
1 3
1 2 1
3 3 4
(empty)
Punktacja
To jest kod golfowy; najkrótsza odpowiedź w bajtach wygrywa.
Standardowe otwory na pętle są zabronione. Możesz używać dowolnych wbudowanych funkcji nieprzeznaczonych do operacji podobnych do zestawu.
Zabronione wbudowane funkcje:
- ustaw tworzenie / usuwanie duplikatów
- ustaw różnicę / przecięcie / połączenie
- Uogólnione testowanie członkostwa (np. Cokolwiek podobnego do
in
słowa kluczowego w Pythonie,indexOf
funkcje podobne do itp.). Zauważ, że użycie konstrukcji „foreach item in list” jest dozwolone (zakładając, że nie naruszają one żadnych innych ograniczeń), pomimo faktu, że Python ponownie używain
słowa kluczowego do stworzenia tego konstruktu. - Te zabronione wbudowane elementy są „wirusowe”, tzn. Jeśli istnieje większa wbudowana zawierająca którąkolwiek z tych podfunkcji, jest to podobnie zabronione (np. Filtrowanie według członkostwa na liście).
Dozwolone są wszystkie wbudowania niewymienione na powyższej liście (np. Sortowanie, testowanie równości w liczbach całkowitych, dodawanie / usuwanie listy według indeksu, filtrowanie itp.).
Na przykład weźmy następujące dwa przykładowe fragmenty (kod podobny do języka Python):
# prohibited: filters by testing if each value in tmpList is a member of listA
result = tmpList.filter(listA)
# ok: filtering by a lambda which manually iterates over listA and checks for equality
def my_in_func(val, slist):
for a in slist:
if(val == a):
return True
return False
result = filter(lambda v: my_in_func(val, listA), tmpList)
Możesz sam zaimplementować dowolne z tych zestawów funkcji, które będą się liczyć do twojego wyniku.
Twoje rozwiązanie powinno zakończyć się w rozsądnym czasie (powiedzmy, mniej niż minutę na dowolnym sprzęcie dla dwóch list ~ długość 1000 każda).
źródło
Odpowiedzi:
Haskell,
4542 bajtówWypróbuj online!
Edycja: -2 bajty dzięki @ Ørjan Johansen, -1 bajtów dzięki @dfeuer.
źródło
MATL , 18 bajtów
Wypróbuj online!
Działa to w dwóch etapach. Najpierw obliczane jest skrzyżowanie, prawdopodobnie z duplikatami. Polega to na porównaniu wszystkich elementów jednej tablicy ze wszystkimi elementami drugiego i zachowaniu elementów pierwszego, które są obecne w drugim.
Następnie duplikaty są usuwane. W tym celu tablica z poprzedniego kroku jest sortowana, a wpisy są zachowywane, jeśli różnią się od poprzednich.
-inf
Wartość jest poprzedzany tak, że pierwszy (czyli najniższy) wartość nie jest stracone.źródło
Galaretka, 13 bajtów
Wypróbuj online!
Jak to działa
źródło
golflua , 68 znaków
który nazywa się jako
W zwykłym Lua byłoby to
Więc w zasadzie iteruję każdy element dwóch tabel i przechowuję tylko równoważne wartości. Używając wartości jako key (
k[w]=w
), eliminuję wszystkie duplikaty. Następnie generujemy nową tabelę, iterując indeks i wartośćpairs
źródło
JavaScript (ES6), 66 bajtów
Bez użycia
indexOf
, ponieważ nie jestem przekonany, że jest to dozwolone.źródło
Pyth,
1211 bajtówDemonstracja
Wyjaśnienie:
źródło
bash + GNU coreutils, 184 bajtów
Wezwanie:
Wynik:
Brak danych wyjściowych, jeśli skrzyżowanie jest puste. Ten skrypt nie sortuje i sprawdza, czy pierwszy zestaw jest pusty. Wyjaśnienie:
Bonus wiedzieć: Możesz zmienić,
grep -o .
aby zrobić to z losowymi ciągami zamiast liczb.źródło
Perl 6,
2637 bajtówstosowanie
Bezczelna niekonkurencyjna odpowiedź
lub jeśli ci się podoba w nudnej
f
funkcji ol 'źródło
invert
jeśli zamiast tego weźmiesz wartości. 24 bajtySiatkówka , 63 bajty
Ostatnie dwa wiersze usuwają duplikaty. Dane wejściowe to dwie rozdzielane spacjami listy oddzielone przecinkiem. Dane wyjściowe są rozdzielane białymi znakami.
Wypróbuj online
Jeśli duplikaty danych wyjściowych są dozwolone, mój program będzie miał 42 bajty.
źródło
Jq 1,5 , 99 bajtów
Rozszerzony
Pozwala to uniknąć używania
{}
obiektów, a ponieważ jq nie ma operacji bitowych, emuluje je za pomocą tablicy.Wypróbuj online!
źródło
Aksjomat, 411 bajtów
golf i test
źródło
Aksjomat, 257 bajtów
To bez użycia binsearch ... Ale nie znam wielkiego O ... Unglofed i wyników:
Nie wykonałem wielu testów, więc mógł zostać uszkodzony ...
źródło
Galaretka , 12 bajtów
Wypróbuj online!
źródło
[3]
zamiast3
[]
i element dla list singletonowych. Możesz przejść do strony wiki (atomy) i dołączyć wbudowane narzędzie Python Stringify, ale to sprawia, że moja odpowiedź jest dłuższa, a ścisłeŁuska , 9 bajtów
Wypróbuj online!
Patrząc w kodzie źródłowym
k
Huska na GitHub, („keyon”) jest zaimplementowany jako skład sortowania listy i grupowania sąsiednich wartości, więc chociaż nie mogę znaleźć implementacji „groupOn”, prawdopodobnie bezpiecznie jest założyć, że tak nie jest t rób cokolwiek, ponieważ Haskell jest językiem funkcjonalnym, a grupowanie sąsiednich równych wartości jest dość prostą operacją zmniejszania nad połączoną listą. (I można znaleźć realizacjęk
„s inny rodzaj podpisu«keyby», które mógłbym wykorzystać tutaj, zmieniającI
się=
, ale nie wiem, Haskell, więc nie mogę powiedzieć, jak dokładnie to działa).Również miła, mała odpowiedź Brachyloga, którą wymyśliłam, zanim zdałam sobie sprawę, że wszystkie operacje na zestawach zostały odrzucone:
⟨∋∈⟩ᵘ
źródło
R,
14183 bajtyUlepszony przez Giuseppe
Wypróbuj online
tutajtutajźródło
a
ib
są one wstępnie zdefiniowane, należy je zaakceptować, przyjmując je jako argumenty funkcji lub ze STDIN.Python3, 51 bajtów
Jeśli listy wejściowe mogą zawierać duplikaty:
Python3, 67 bajtów
źródło
PHP ,
78, 77 bajtówWypróbuj online!
Bez fanaberii, ale zgodne z regułami (myślę).
Wynik
źródło