Zainspirowany przez Taken z pytania w Stack Overflow .
Wyzwanie
Biorąc pod uwagę liczbę całkowitą n>1
, wypisz wszystkie tablice, które można uzyskać, zamieniając dokładnie dwa wpisy w tablicy [1, 2, ..., n]
.
Tablice mogą być produkowane w dowolnej kolejności.
Możesz konsekwentnie używać [0, 1, ..., n-1]
(w oparciu o 0) zamiast [1, 2, ..., n]
(w oparciu o 1).
Dodatkowe zasady
Wejścia i wyjścia są elastyczne jak zwykle .
Programy lub funkcje są dozwolone w dowolnym języku programowania . Standardowe luki są zabronione.
Najkrótszy kod w bajtach wygrywa.
Przypadki testowe
Wejście 2
daje wynik (zakładany na podstawie 1)
2 1
Dane wejściowe 3
dają dane wyjściowe (zauważ, że trzy tablice mogą być w dowolnej kolejności)
1 3 2
2 1 3
3 2 1
Wejście 4
daje wyjście
1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1
Wejście 7
daje wyjście
1 2 3 4 5 7 6
1 2 3 4 6 5 7
1 2 3 4 7 6 5
1 2 3 5 4 6 7
1 2 3 6 5 4 7
1 2 3 7 5 6 4
1 2 4 3 5 6 7
1 2 5 4 3 6 7
1 2 6 4 5 3 7
1 2 7 4 5 6 3
1 3 2 4 5 6 7
1 4 3 2 5 6 7
1 5 3 4 2 6 7
1 6 3 4 5 2 7
1 7 3 4 5 6 2
2 1 3 4 5 6 7
3 2 1 4 5 6 7
4 2 3 1 5 6 7
5 2 3 4 1 6 7
6 2 3 4 5 1 7
7 2 3 4 5 6 1
code-golf
number
combinatorics
integer
Luis Mendo
źródło
źródło
[0 ... n-1]
vs[1 ... n]
! Zawsze czuję się trochę zirytowany, gdy muszę się przyczepić z1+
powodu indeksów zerowych J.Odpowiedzi:
Galaretka ,
118 bajtówWypróbuj online!
Jak to działa
źródło
y
? To zawsze było dla mnie trochę tajemnicą.[1,2],[4,3]y1,2,3
zastępuje każdy 1 w [1, 2, 3] do 4 , a każdy z 2 z 3 .R , 54 bajty
Wypróbuj online!
Zwraca macierz, w której każda kolumna jest permutacją.
combn(n,k)
generuje wszystkie kombinacje wielkościk
z listyn
lub z,1:n
jeślin
jest pojedynczą liczbą całkowitą. Opcjonalnie przyjmuje również funkcję,FUN
która ma być zastosowana do powstałych kombinacji. Piszemy więc funkcję, która wykonuje zamianę i zwraca listę zamienionych. Wyniki są następnie sumowane w postaciarray
, która w tym przypadku jest dwuwymiarowa, a zatem macierzy.źródło
Python 2 , 71 bajtów
Wypróbuj online!
Wykorzystuje tę wskazówkę .
źródło
Haskell , 62 bajty
Wypróbuj online!
Po prostu generuję permutację, biorąc pod uwagę
x
iy
do zamiany, dla każdegox,y
źródło
Python 2 , 72 bajty
Wypróbuj online!
źródło
Wolfram Language (Mathematica) , 43 bajty
Wypróbuj online!
Objaśnienie:
Subsets[Range@#,{2}]
generuje wszystkie podzbiory o{1,2,...,n}
rozmiarze 2, a następnie dla każdego podzbioru/.
zamienia te dwie rzeczy na liście{1,2,...,n}
.To podejście jest rozczarowująco podobne do wielu innych zgłoszeń, ale oto jedno, które jest bardziej unikalne dla Mathematica, dla 3 dodatkowych bajtów:
Wypróbuj online!
źródło
ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&
. Podoba mi się, jak to jest proste (lub jak bezpośrednio koduje problem), ale niestety składnia dopasowywania wzorców jest tak pełna, że kończy się to na 57 bajtach.Haskell, 62 bajty
Wypróbuj online!
źródło
Haskell , 71 bajtów
Wypróbuj online!
To dodaje bieżącą liczbę na końcu wszystkich permutacji ostatniego, a następnie oblicza wszystkie swapy, które zawierają nowy numer.
źródło
MATL , 12 bajtów
Wypróbuj online!
źródło
:tY@wy=~!s2=Y)
. Wydaje mi się, że to samo podejście, co odpowiedź Octave rahnema1C, 93 bajty
Wypróbuj online!
źródło
Oktawa, 38 bajtów
Wypróbuj online!
Generuje wszystkie permutacje 1: n i wybiera z nich te, które mają dwa elementy różne od 1: n.
źródło
JavaScript (ES6), 81 bajtów
Drukuje tablice 0-indeksowane.
Próbny
alert()
został zastąpiony przezconsole.log()
w tym fragmencie dla wygody użytkownika.Pokaż fragment kodu
źródło
Python 2 , 75 bajtów
Wypróbuj online!
źródło
Czysty ,
9082 bajtówMożna to zrobić w 80 bajtach, ale zamienia się w bezpośrednie tłumaczenie odpowiedzi Haskella.
Wypróbuj online!
źródło
05AB1E ,
159 bajtówWypróbuj online!
Wyjaśnienie
źródło
Łuska , 9 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Rubinowy ,
5553 bajtówWypróbuj online!
Rozwiązanie oparte na 0
Sztuczka polega na tym, że wewnętrzna pętla zawsze „pomija” iterację: za pierwszym razem wcale nie jest wykonywana, a potem tylko raz przy drugim przejściu i tak dalej.
Byłem zadowolony z 55 bajtów, dopóki nie zobaczyłem, że R można zagrać w golfa do 54, więc musiałem uzyskać 53.
źródło
Python 2 , 90 bajtów
Wypróbuj online!
źródło
Pyth, 9 bajtów
Demonstracja
Najłatwiejszym sposobem zamiany dwóch wartości jest użycie
.r
, która jest funkcją tłumaczenia obrotowego Pytha..r<list>[A, B]
będzie zamienić wszystkie wystąpieniaA
iB
wlist
.Dlatego poprzez zastosowanie funkcji tłumaczenia do
UQ
listy od0
don-1
z każdą listą dwóch elementów o różnych liczbach na liście wygenerujemy pożądany wynik.Q
jest wejściemn
iU
funkcją zakresu.Najłatwiejszym sposobem na to byłoby:
.cUQ2
generuje wszystkie 2 kombinacje elementów odrębnych elementów w zakresie i.rLUQ
mapuje.r
funkcję nad nimi i listąUQ
.Będzie to jednak 10 bajtów.
Zamiast tworzyć
.cUQ2
odrębne uporządkowane pary, możemy wykonać wszystkie pary*=U
. Jest to domyślnie równoważne z*=UQQ
. Zaczyna się od nadpisania zaQ
pomocąUQ
, a następnie wzięcia iloczynu kartezjańskiego zUQ
iUQ
. Daje to wszystkie pary liczb z zakresu, niekoniecznie uporządkowane lub odrębne..rLQ
zamienia za pomocą każdej listy. Przypomnijmy, żeQ
jest teraz równa liście od0
don-1
, a nien
.Ponieważ pary nie zostały zamówione, istnieją duplikaty.
{
usuwa duplikaty. Ponieważ pary nie były różne, obecna jest lista bez zmian. Ta lista zawsze będzie pierwsza po deduplikacji, ponieważ{
zachowuje kolejność pierwszego pojawienia się, a niezmieniona lista jest tworzona przez obracanie przez[0,0]
.t
usuwa pierwszy element, dając pożądaną listę zamian.źródło
Pyth, 11 bajtów
Wypróbuj online
Nie tak krótki, jak podejście Isaacga, ale wystarczająco inny, aby opublikować.
Wyjaśnienie
źródło
Java 8,
109105 bajtówJestem zardzewiały ... Nie grałem w golfa od miesięcy ... Skończyło się na portowaniu @Steadybox 'C odpowiedź .. Prawdopodobnie można jeszcze grać w golfa.
Wypróbuj tutaj.
źródło
Rubin , 66 bajtów
Wypróbuj online!
źródło
Rubinowy , 80 bajtów
-12 bajtów dzięki Unihedron.
Wypróbuj online!
Miałem na myśli podejście, które najlepiej tłumaczy się na Ruby z jakiegoś powodu, więc ... nawet tak naprawdę nie znam Ruby ...
źródło
1..n
zmienną jednoznakową i użyć jej ponownie (osobne instrukcje z znakiem nowej linii lub średnikami), 2. nie używaj nawiasów w instrukcjach termicznych:i==x ?y:i==y ?x:i
(zwróć uwagę, że mam spacje, aby oddzielić potencjalny shebang ) i 3.uniq[1,n]
zamiastuniq[1..-1]
.