Wymień odstępstwa

17

Biorąc pod uwagę pewną dodatnią liczbę całkowitą n wygeneruj wszystkie odstępstwa n obiektów.

Detale

  • Wykolejenie to permutacja bez stałego punktu. (Oznacza to, że w każdym numerze wykreślenia nie może znajdować się w wpisie).ii
  • Dane wyjściowe powinny składać się z odchyleń liczb (lub alternatywnie ).(1,2,,n)(0,1,2,,n1)
  • Alternatywnie zawsze możesz wydrukować odchylenia odpowiednio (lub ), ale musisz to określić.(n,n1,,1)(n1,n2,,1,0)
  • Dane wyjściowe muszą być deterministyczne, to znaczy za każdym razem, gdy program jest wywoływany z pewnymi danymi jako danymi wejściowymi, dane wyjściowe powinny być takie same (co oznacza, że ​​kolejność odstępstw musi pozostać taka sama), a pełne dane wyjściowe muszą być wykonane w ciągu skończony czas za każdym razem (nie jest to wystarczające z prawdopodobieństwem 1).n
  • Możesz założyć, żen2
  • Dla niektórych podanych możesz albo wygenerować wszystkie derangencje, albo alternatywnie możesz wziąć inną liczbę całkowitą która służy jako indeks i wydrukować -te derangement (w wybranej przez ciebie kolejności).nkk

Przykłady

Pamiętaj, że kolejność odstępstw nie musi być taka sama, jak wymieniono tutaj:

n=2: (2,1)
n=3: (2,3,1),(3,1,2)
n=4: (2,1,4,3),(2,3,4,1),(2,4,1,3), (3,1,4,2),(3,4,1,2),(3,4,2,1), (4,1,2,3),(4,3,1,2),(4,3,2,1)

OEIS A000166 liczy liczbę wykroczeń .

wada
źródło
Czy możemy przesłać generator?
Fatalize
@Fatalize Tak Myślę, że byłoby to wystarczająco podobne do dwóch pozostałych wymienionych metod (czy uważasz, że istnieje silny argument przeciwko temu?).
flawr
1
@Fatalize Właściwie domyślnie powrót generatora zamiast listy jest możliwy .
flawr

Odpowiedzi:

7

Galaretka , 6 bajtów

Œ!=ÐṂR

Monadyczny link akceptujący dodatnią liczbę całkowitą, która daje listę list liczb całkowitych.

Wypróbuj online!

W jaki sposób?

Œ!=ÐṂR - Link: integer, n
Œ!     - all permutations of (implicit range of [1..n])
     R - range of [1..n]
   ÐṂ  - filter keep those which are minimal by:
  =    -   equals? (vectorises)
       -   ... i.e. keep only those permutations that evaluate as [0,0,0,...,0]
Jonathan Allan
źródło
5

Brachylog , 9 bajtów

⟦kpiᶠ≠ᵐhᵐ

Wypróbuj online!

Jest to generator, który wyprowadza jedno odstępstwo [0, …, n-1]danego n.

Jeśli ᶠ - findallzawińmy go w metapredykat, generator wygeneruje wszystkie możliwe generacje odstępstw.

Wyjaśnienie

⟦           The range [0, …, Input]
 k          Remove the last element
  p         Take a permutation of the range [0, …, Input - 1]
   iᶠ       Take all pair of Element-index: [[Elem0, 0],…,[ElemN-1, N-1]]
     ≠ᵐ     Each pair must contain different values
       hᵐ   The output is the head of each pair
Fatalizować
źródło
5

JavaScript (V8) , 85 bajtów

Funkcja rekurencyjna drukująca wszystkie odchylenia od 0.

f=(n,p=[],i,k=n)=>k--?f(n,p,i,k,k^i&&!p.includes(k)&&f(n,[...p,k],-~i)):i^n||print(p)

Wypróbuj online!

Skomentował

f = (                   // f is a recursive function taking:
  n,                    //   n   = input
  p = [],               //   p[] = current permutation
  i,                    //   i   = current position in the permutation
  k = n                 //   k   = next value to try
) =>                    //         (a decrementing counter initialized to n)
  k-- ?                 // decrement k; if it was not equal to 0:
    f(                  //   do a recursive call:
      n, p, i, k,       //     leave all parameters unchanged
      k ^ i &&          //     if k is not equal to the position
      !p.includes(k) && //     and k does not yet appear in p[]:
        f(              //       do another recursive call:
          n,            //         leave n unchanged
          [...p, k],    //         append k to p
          -~i           //         increment i
                        //         implicitly restart with k = n
        )               //       end of inner recursive call
    )                   //   end of outer recursive call
  :                     // else:
    i ^ n ||            //   if the derangement is complete:
      print(p)          //     print it
Arnauld
źródło
4

Rubinowy , 55 bajtów

->n{[*0...n].permutation.select{|x|x.all?{|i|i!=x[i]}}}

Wypróbuj online!

Generuje wszystkie odchylenia na podstawie 0

Kirill L.
źródło
2

05AB1E , 9 bajtów

Lœʒāø€Ë_P

Wypróbuj online!

Wyjaśnienie

L           # push [1 ... input]
 œ          # get all permutations of that list
  ʒ         # filter, keep only lists that satisfy
   āø       # elements zipped with their 1-based index
     €Ë_P   # are all not equal
Emigna
źródło
2

Japt , 8 bajtów

W oparciu o 0

o á fÈe¦

Wypróbuj (Stopka zwiększa wszystkie elementy w celu łatwiejszego porównania z przypadkami testowymi)

o á fÈe¦     :Implicit input of integer
o            :Range [0,input)
  á          :Permutations
    f        :Filter
     È       :By passing each through this function
      e      :  Every element of the permutation
       ¦     :  Does not equal its 0-based index
Kudłaty
źródło
2

Python 2 , 102 bajty

lambda n:[p for p in permutations(range(n))if all(i-j for i,j in enumerate(p))]
from itertools import*

Wypróbuj online!

Indeksowanie 0, lista krotek.

Nie- itertools-na rozwiązanie:

Python 2 , 107 bajtów

n=input()
for i in range(n**n):
 t=[];c=1
 for j in range(n):c*=j!=i%n not in t;t+=[i%n];i/=n
 if c:print t

Wypróbuj online!

Indeksowanie 0, wiersze list, pełny program.

Uwaga: To rozwiązanie, mimo że nie importuje itertoolsbiblioteki, nie jest dużo dłuższe niż inne, które ją importuje, ponieważ większość tego miejsca buduje permutacje. Kontrola derangementu to tak naprawdę około 7 dodatkowych bajtów! Powodem jest to, że kontrola odbywa się w locie jako część budowy każdej permutacji. Nie dotyczy to drugiego rozwiązania, w którym należy sprawdzić, czy każda permutacja zwrócona przez itertools.permutationsfunkcję jest w rzeczywistości wykroczeniem, i oczywiście samo mapowanie zajmuje dużo bajtów.

Erik the Outgolfer
źródło
2

MATL , 11 bajtów

:tY@tb-!AY)

Generuje to wszystkie odstępstwa w porządku leksykograficznym.

Wypróbuj online!

Objaśnienie z przykładem

Rozważ wejście 3.

:     % Implicit input n. Range [1 2 ... n]
      % STACK: [1 2 3]
t     % Duplicate
      % STACK: [1 2 3], [1 2 3]
Y@    % All permutations, in lexicographical order, as rows of a matrix
      % STACK: [1 2 3], [1 2 3; 1 3 2; ··· ; 3 2 1]
t     % Duplicate
      % STACK: [1 2 3], [1 2 3; 1 3 2; ··· ; 3 2 1], [1 2 3; 1 3 2; ··· ; 3 2 1]
b     % Bubble up: moves third-topmost element in stack to the top
      % STACK: [1 2 3; 1 3 2; ··· ; 3 2 1], [1 2 3; 1 3 2; ··· ; 3 1 2; 3 2 1], [1 2 3]
-     % Subtract, element-wise with broadcast
      % STACK: [1 2 3; 1 3 2; ··· ; 3 2 1], [0 0 0; 0 1 -1; ··· ; 2 -1 -1; 2 0 -2]
!A    % True for rows containining only nonzero elements
      % STACK: [1 2 3; 1 3 2; ··· ; 3 1 2; 3 2 1], [false false ··· true false]
Y)    % Use logical mask as a row index. Implicit display
      % STACK: [2 3 1; 3 1 2]
Luis Mendo
źródło
2

Perl 5 -MList::Util=none -n , 100 89 bajtów

$"=',';@b=1..$_;map{%k=$q=0;say if none{++$q==$_||$k{$_}++}/\d+/g}glob join$",("{@b}")x@b

Wypróbuj online!

Xcali
źródło
1

Gaia , 10 bajtów

┅f⟨:ċ=†ỵ⟩⁇

Wypróbuj online!

┅		| push [1 2 ... n]
 f		| push permutations
  ⟨	⟩⁇	| filter where result of following is truthy
   :ċ		| dup, push [1 2 ... n]
     =†ỵ	| there is no fixed point
Giuseppe
źródło
1

J , 26 bajtów

i.(]#~0~:*/@(-|:))i.@!A.i.

Wypróbuj online!

i. (] #~ 0 ~: */@(- |:)) i.@! A. i.
i. (                   )            NB. 0..input
   (                   ) i.@! A. i. NB. x A. y returns the
                                    NB. x-th perm of y
                                    NB. i.@! returns 
                                    NB. 0..input!. Combined
                                    NB. it produces all perms
                                    NB. of y
    ] #~ 0 ~: */@(- |:)             NB. those 2 are passed as
                                    NB. left and right args
                                    NB. to this
    ] #~                            NB. filter the right arg ]
                                    NB. (all perms) by:
         0 ~:                       NB. where 0 is not equal to...
              */@                   NB. the product of the 
                                    NB. rows of...
                 (- |:)             NB. the left arg minus
                                    NB. the transpose of
                                    NB. the right arg, which
                                    NB. will only contain 0
                                    NB. for perms that have
                                    NB. a fixed point
Jonasz
źródło
1

R , 81 80 bajtów

function(n)unique(Filter(function(x)all(1:n%in%x&1:n-x),combn(rep(1:n,n),n,,F)))

Wypróbuj online!

Zwraca wartość listzawierającą wszystkie odstępstwa. Wysoce nieefektywny, ponieważ generuje(n2)n)Możliwe wartości jak size- nkombinacji [1..n]wielokrotnych nrazy, a następnie filtruje dla permutacji 1:n%in%xi zaburzeniami, 1:n-x.

R + gtools , 62 bajty

function(n,y=gtools::permutations(n,n))y[!colSums(t(y)==1:n),]

Wypróbuj online!

Znacznie bardziej wydajne, zwraca miejsce, w matrixktórym każdy wiersz jest wykroczeniem.

Giuseppe
źródło
1

C ++ (gcc) , 207 196 bajtów

-5 bajtów według pułapu cat -6 bajtów Roman Odaisky

#include<regex>
#define v std::vector
auto p(int n){v<v<int>>r;v<int>m(n);int i=n;for(;m[i]=--i;);w:for(;std::next_permutation(&m[0],&m[n]);r.push_back(m))for(i=n;i--;)if(m[i]==i)goto w;return r;}

Wypróbuj online!

movatica
źródło
Możesz zrobić znacznie lepiej, jeśli użyjesz parametru wyjściowego, szczególnie jeśli jest to tablica std ::, więc ma rozmiar wstępny - 145 bajtów
Roman Odaisky
@RomanOdaisky: fajny pomysł, ale jak rozumiem zasady kodu golfa, będziesz musiał wziąć kod prealokacji do swojej liczby bajtów.
movatica
@movatica Szary obszar, myślę, że kod jest bardziej prawidłowy niż nieprawidłowy. Z przyjemnością zapisze gdzieś poprawne wyniki i to na dzwoniącym spoczywa obowiązek odczytania wyniku. Zauważ, że algorytmy STL, takie jak std::copyrównież, powierzają dzwoniącemu zapewnienie odpowiedniej przestrzeni dla danych wyjściowych.
Roman Odaisky
@RomanOdaisky: Zachowanie STL jest rzeczywiście poprawnym argumentem.
movatica
0

C ++ (gcc) , 133 bajty

Myślę, że to różni się wystarczająco od innych wniosków, aby zasługiwać na osobną odpowiedź. Wreszcie zastosowanie index[array]wewnętrznej składni!

#include<regex>
[](int n,auto&r){int i=n;for(;i[*r]=--i;);for(;std::next_permutation(*r,*r+n);)for(i=n;i--?(r[1][i]=i[*r])-i:!++r;);}

Wypróbuj online!

Roman Odaisky
źródło
0

Haskell, 76 bajtów

n&x=[x++[i]|i<-[1..n],notElem i x,i/=length x+1]
d n=iterate(>>=(n&))[[]]!!n
Michael Klein
źródło
0

Python 2 , 82 bajty

f=lambda n,i=0:i/n*[[]]or[[x]+l for l in f(n,i+1)for x in range(n)if~-(x in[i]+l)]

Wypróbuj online!

88 bajtów jako program:

M=[],
r=range(input())
for i in r:M=[l+[x]for l in M for x in r if~-(x in[i]+l)]
print M

Wypróbuj online!

93 bajty za pomocą itertools:

from itertools import*
r=range(input())
print[p for p in permutations(r)if all(map(cmp,p,r))]

Wypróbuj online!

xnor
źródło
0

Perl 6 , 49 37 bajtów

Edycja: Po kilku krokach z Philem H zmniejszyliśmy go do zaledwie 37 bajtów:

(^*).permutations.grep:{all @_ Z-^@_}

Wypróbuj online!

Używając Whateverna początku, możemy uniknąć nawiasów klamrowych (zapisujemy 2 znaki). Następnie użyj Zmetaoperatora, za pomocą -którego bierze każdy element permutacji (np. 2,3,1) i odejmuje 0,1,2 w kolejności. Jeśli którakolwiek z nich ma wartość 0 (fałsz), wówczas połączenie nie powiedzie się.


Oryginalne rozwiązanie to ( Wypróbuj online! )

{permutations($_).grep:{none (for $_ {$++==$_})}}
użytkownik0721090601
źródło
1
Dobry początek, możesz skrócić filtr przy włączonym Z! = Dla -7 bajtów: tio.run
Phil H
@ PhilH Wiedziałem, że musi istnieć sposób na zintegrowanie operatora zip, ale nie mogłem tego pojąć. Nicea
0721090601
PhilH wykorzystując tę ​​strategię, wciąż może powalić kolejne 3, zabijając nawiasy: tio.run/##K0gtyjH7n1upoJamYKvwv7ogtSi3tCSxJDM/…
user0721090601
PhilH ten ostatni nie działa. Dla wszystkich oprócz n = 2 więcej niż jeden element zostanie odrzucony
0721090601
Oczywiście zapomniałem o wymaganiu ... usunięte
Phil H
0

Węgiel drzewny , 44 28 bajtów

przekreślone 44 jest nadal regularne 44

NθIΦEXθθEθ﹪÷ιXθλθ⬤ι‹⁼μλ⁼¹№ιλ

Wypróbuj online! Link jest do pełnej wersji kodu. Luźno oparty na nieetertowej odpowiedzi @ EricTheOutgolfer. Wyjaśnienie:

Nθ                              Input `n`
     Xθθ                        `n` raised to power `n`
    E                           Mapped over implicit range
         θ                      `n`
        E                       Mapped over implicit range
            ι                   Outer loop index
           ÷                    Integer divided by
             Xθ                 `n` raised to power
               λ                Inner loop index
          ﹪     θ               Modulo `n`
   Φ                            Filtered where
                  ι             Current base conversion result
                 ⬤              All digits satisfy
                         №ιλ    Count of that digit
                       ⁼¹       Equals literal 1
                   ‹            And not
                    ⁼μλ         Digit equals its position
  I                             Cast to string
                                Implicitly print
Neil
źródło
0

C (gcc) , 187 180 bajtów

*D,E;r(a,n,g,e){e=g=0;if(!a--){for(;e|=D[g]==g,g<E;g++)for(n=g;n--;)e|=D[n]==D[g];for(g*=e;g<E;)printf("%d ",D[g++]);e||puts("");}for(;g<E;r(a))D[a]=g++;}y(_){int M[E=_];D=M;r(_);}

Wypróbuj online!

Jonathan Frech
źródło
@ceilingcat Dziękuję.
Jonathan Frech,
0

Pyth , 12 bajtów

f*F.e-bkT.PU

Wypróbuj online!

           UQ # [implicit Q=input] range(0,Q)
         .P  Q# [implicit Q=input] all permutations of length Q
f             # filter that on lambda T:
   .e   T     #   enumerated map over T: lambda b (=element), k (=index):
     -bk      #     b-k
 *F           # multiply all together

Filtr działa w ten sposób: jeśli jakikolwiek element jest w swoim pierwotnym miejscu, (indeks elementu) będzie wynosił 0, a cały produkt będzie wynosił 0, a zatem falsey.

ar4093
źródło