Zadanie
Napisz program lub funkcję, której wejściem jest lista / tablica X liczb całkowitych, a wyjściem jest lista zbiorów liczb całkowitych Y , takich, że dla każdego elementu e w każdym zestawie Y [ i ], X [ e ] = i , i tak, aby całkowita liczba elementów w zestawach w Y jest równa liczbie elementów X .
(Jest to w zasadzie ta sama operacja, co odwracanie tablicy hashującej / słownika, z tą różnicą, że stosuje się ją zamiast tablic).
Przykłady
W tych przykładach założono indeksowanie na podstawie 1, ale zamiast tego można użyć indeksowania na podstawie 0.
X Y
[4] [{},{},{},{1}]
[1,2,3] [{1},{2},{3}]
[2,2,2] [{},{1,2,3}]
[5,5,6,6] [{},{},{},{},{1,2},{3,4}]
[6,6,5,5] [{},{},{},{},{3,4},{1,2}]
Wyjaśnienia
- Możesz reprezentować zestaw jako listę, jeśli chcesz. Jeśli to zrobisz, kolejność jego elementów nie ma znaczenia, ale nie możesz powtarzać elementów.
- Możesz użyć dowolnego rozsądnego jednoznacznego formatu We / Wy; na przykład, możesz oddzielić elementy zestawu spacjami, a same zestawy nowymi liniami.
- Y powinno być skończone i co najmniej wystarczająco długie, aby mieć wszystkie elementy X jako indeksy tablic. Może jednak być dłuższy niż maksymalny element X (dodatkowymi elementami byłyby puste zestawy).
- Wszystkie elementy X będą poprawnymi indeksami tablicowymi, tj. Nieujemnymi liczbami całkowitymi, jeśli użyjesz indeksowania opartego na 0, lub dodatnimi liczbami całkowitymi, jeśli użyjesz indeksowania opartego na 1.
Warunek zwycięstwa
Jako wyzwanie dla golfa kodowanego krótszy jest lepszy.
[5,5,6,6]
i[6,6,5,5]
mogą być identyczne?[5,5,6,6]
i[6,6,5,5]
nie może mieć identycznego wyniku, ale wyjściem[5,5,6,6]
mogło być również np[{},{},{},{},{2,1},{4,3}]
.[{0},{0},{0},{0},{1,2},{3,4}]
prawidłowe wyjście[5,5,6,6]
?Odpowiedzi:
MATL , 8 bajtów
Dane wejściowe to wektor kolumny z
;
separatorem (na przykład[2;2;2]
). Dane wyjściowe to ciąg znaków reprezentujący tablicę komórkową wektorów wierszowych (na przykład{[]; [1 2 3]}
). Wektor wiersza pojedynczego elementu jest taki sam jak liczba (więc{1; 2; 3}
byłby wyprowadzany zamiast{[1]; [2]; [3]}
).Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Większość pracy jest wykonywana przez funkcję wyższego rzędu Matlaba
accumarray
, która grupuje elementy na drugim wejściu zgodnie z dopasowanymi wartościami na pierwszym i stosuje określoną funkcję do każdej grupy. W tym przypadku jest to funkcja@(x){sort(x).'}
, która wysyła posortowane elementy w każdej grupie i powoduje, że wyniki dla wszystkich grup są upakowane w tablicy komórkowej.źródło
Python, 69 bajtów
Korzysta z indeksowania opartego na 0.
źródło
Galaretka ,
75 bajtówWypróbuj online!
Jak to działa
źródło
Galaretki , 8 bajtów
Wypróbuj online!
Jak to działa
źródło
Mathematica, 36 bajtów
Wyjaśnienie
Dla każdego
n
in{1, 2, ..., Max@#}
, gdzieMax@#
jest największą liczbą całkowitą z listy wejściowego obliczaPosition
S, jeżelin
pojawi się na liście wejściowego#
. PonieważPosition[{6,6,5,5},5]
(na przykład) powraca{{3},{4}}
, przechodzimyApply
Join
do wszystkich elementów na poziomie{1}
wyniku.źródło
Haskell , 45 bajtów
s
pobiera listę liczb całkowitych i zwraca listę list. 1 indeksowany, aby zachować niezmodyfikowane dane wejściowe przypadku testowego (chociaż dane wyjściowe otrzymują dodatkowe puste listy).Wypróbuj online!
Są to bardzo proste zestawienia zagnieżdżonych list. Jedynym drobnym ulepszeniem jest skorzystanie z opcji tworzenia dłuższej listy za pomocą
sum
zamiastmaximum
.źródło
PHP, 55 bajtów
0-indeksowane.
źródło
R,
684947 bajtówZaskakujące, o wiele prostsze niż dłuższe rozwiązania. Pobiera wektor
x
ze STDIN, tworzy wektor od1
domax(x)
, domyślnie generuje listę długościmax(x)
i sprawdza, które indeksyx
odpowiadają tym z nowej listy. Domyślnie drukuje dane wyjściowe.Starsza wersja:
Nieco inne podejście do drugiej odpowiedzi R. Pobiera wektor do STDIN, tworzy listę o długości równej maksymalnej wartości na wejściu. Zapętla dane wejściowe i dodaje indeks we właściwe miejsce.
Wykorzystuje indeksowanie 1.
źródło
Python 2 ,
918685 bajtówProgramuję na telefonie, ale naprawdę podobało mi się to wyzwanie. Z całą pewnością mogę dalej grać w golfa.
Wypróbuj online!
źródło
Galaretka , 9 bajtów
1-indeksowane, puste zestawy reprezentowane jako
0
, zestawy jednego elementu reprezentowane jakoN
zestawy wielu elementów reprezentowanych jako[M,N,...]
Wypróbuj online!
W jaki sposób?
źródło
JavaScript (ES6),
6462 bajtówZaoszczędzono 2 bajty dzięki @SteveBennett
Pobiera dane z indeksem 0. Zwraca rozdzieloną przecinkami listę zestawów.
Przypadki testowe
Pokaż fragment kodu
Wersja alternatywna, 53 bajty
Jeśli uproszczone wyjście, takie jak
'||||3,2|1,0'
jest dopuszczalne, możemy po prostu:źródło
`{${o.join`},{`}}`
legalny ES2015."{" + o.join("},{") + "}"
, gdyby to uczyniło to bardziej zrozumiałym.join`
jest równoważnejoin('
. Nie miałem pojęcia, że możesz to zrobić.array.join` `
. Super mylące tutaj, ponieważ osadzasz to w ciągu szablonu, a jeszcze bardziej myląco, ciąg łączący jest},{
, który przypadkowo wyglądał jak część ciągu szablonu ... i jest po prostu dziwny i brzydki. :)Bash , 109 bajtów
Szkoda, że nie ma wbudowanej wartości maksymalnej dla tablicy.
Wypróbuj online!
źródło
Mathematica 62 bajty
Uruchomię to dla ciebie
Wypróbuj online (po prostu wklej kod za pomocą Ctrl-V i naciśnij Shift + Enter)
Nie zapomnij wkleić listy wprowadzania na końcu, jak w powyższym przykładzie
źródło
AppendTo
. Ponadto{j,1,Length[#1]}
może być po prostu{j,Length@#}
lub nawet krótszy{j,Tr[1^#]}
.Tr[1^#]
jest dość powszechną sztuczką, aby zaoszczędzić bajt przed użyciemLength
.Perl 6 ,
36 3229 bajtówSpróbuj
Spróbuj
Spróbuj
Rozszerzony:
Zwraca indeksy oparte na zerach, aby uzyskać 1 operator cross operator (
X
) w połączeniu z+
op . (33 bajty)Aby go zwrócić Zestaw s po prostu dodaj
set
tam (razem 37 bajtów)źródło
R
80 80bajtów1-indeksowany, pobiera
X
ze standardowego wejścia. Zwraca listę wektorów indeksów zNULL
pustym zbiorem.Wypróbuj online!
stara wersja:
Wypróbuj online!
źródło
Y=list();
działa równie dobrzefew
bajty w mojej odpowiedzi :) codegolf.stackexchange.com/a/120024/5953005AB1E , 10 bajtów
Wypróbuj online!
źródło
Röda , 51 bajtów
Jest to port odpowiedzi Pytona autorstwa Uriela .
Inna wersja (88 bajtów):
Wypróbuj online!
Zarówno indeksowane 1.
źródło
PowerShell, 81 bajtów
Wypróbuj online!
1-indeksowany.
źródło
Marka GNU ,
214213208204 bajtówI / O: tablica wejściowa za pomocą argumentów, wyjście na standardowe wyjście, po jednym w wierszu, oddzielone spacjami.
Wyjaśnienie
Kolejność indeksów w zestawach jest odwrócona, ponieważ
P
wywołuje się rekurencyjnie przed aktualizacjąA$2
(wywołanie wykonywane w ocenie po prawej stronie).źródło
make
ma jakiś sposób na samą arytmetykę? Wywoływanie do zewnętrznych programów wydaje się trochę oszustwem, ponieważ prawdopodobnie można by włożyć znacznie więcej algorytmu do tych programów i uzyskać krótszy program.bc
igrep
. Mógłbym również użyćtest
i$?
.dc
ma krótszą składnię, ale szczerze mówiąc, wszystkie z nich są takie same.Common Lisp, 91 bajtów
Indeksowanie 1, zwraca zestawy jako listy.
Wypróbuj online!
źródło
k , 13 bajtów
To jest indeksowane na 0.
Wypróbuj online!
źródło