Daj permutację bez dwóch kolejnych liczb całkowitych obok siebie


18

Wyzwanie

Biorąc pod uwagę liczbę całkowitą n ≥ 4 , wyprowadzaj permutację liczb całkowitych [0, n-1] z tą właściwością, że nie ma dwóch kolejnych liczb całkowitych (liczb całkowitych z różnicą bezwzględną 1) obok siebie.

Przykłady

  • 4 → [1, 3, 0, 2]
  • 5 → [0, 2, 4, 1, 3]
  • 6 → [0, 2, 4, 1, 3, 5]
  • 7 → [0, 2, 4, 1, 5, 3, 6]

Zamiast tego możesz użyć indeksowania 1 (używając liczb całkowitych [1, n] zamiast [0, n-1] ).

Twój kod musi działać w czasie wielomianowym w n , więc nie możesz wypróbować wszystkich permutacji i przetestować każdego z nich.


Kiedy mówisz „wyprowadzaj permutację”, masz na myśli listę? Czy możemy stworzyć funkcję, która implementuje samo mapowanie permutacji?
— xnor

@xnor Powinien być wyprowadzany w postaci czytelnej dla człowieka. Nie obchodzi mnie dokładnie jak.
— Anush

Byłby [[1,3],[0,2]]akceptowalny format wyjściowy?
— Kudłaty

@Shaggy To nie jest świetne. Czy to oznacza 1,3,0,2?
— Anush

Odpowiedzi:


31

Galaretka , 3 2 bajty

ḂÞ

Sortuje liczby całkowite w [1, ..., n] według ich LSB.

Wypróbuj online!


Łał! To jest niesamowite.
— Anush

2
„Sortuj według LSB” oznacza, że ​​co drugi przesuwa się na początek, ale czy definicja galaretki wymaga, aby liczby w każdej połowie pozostawały w oryginalnej kolejności? Jeśli nie, 100 (4) może znajdować się obok 101 (5) i nadal być „sortowane według LSB”. Nie obwiniasz kodu, ale może komentarz opisujący nie jest kompletny?
— WGroleau

1
@WGroleau Tak, Þsortowanie stabilne, ponieważ jest realizowane za pomocą sortedfunkcji Python , która gwarantuje stabilność .
— user202729

3
Algorytm jest dla mnie bardziej imponujący niż jego niewielki rozmiar, jeśli chodzi o jego spryt. Przypuszczam, że można także odwrócić kolejność bitów, sortować i odwrócić.
— WGroleau,

4
Może istnieć tylko 65536 różnych dwubajtowych programów Jelly. To niesamowite , wiele z nich okazuje się być odpowiedzią na wyzwania ppcg.
— Anush




6

Haskell, 22 bajty

f jest funkcją n, która zwraca odpowiednio uporządkowaną listę. Korzystam z opcji indeksowania 1.

f n=[2,4..n]++[1,3..n]

6

Oktawa , 17 bajtów

@(x)[2:2:x,1:2:x]

Wypróbuj online!

Wykorzystuje to to samo podejście, co wiele innych. Połącz dwa wektory, jeden ze wszystkimi liczbami parzystymi w zakresie obejmującym 2 ... x i wszystkimi liczbami nieparzystymi w zakresie obejmującym 1 ... x . Składnia powinna być dość oczywista, więc nie wyjaśnię tego.


1
Nie są 3i 2obok siebie f(4)?
— pajonk

Ups ... naprawiono. Ta sama liczba bajtów. :-)
— Stewie Griffin

5

JavaScript (ES6), 40 bajtów

f=
n=>[...Array(i=n)].map(_=>(i+--i)%(n|1))
<input type=number min=4 oninput=o.textContent=f(+this.value).join`\n`><pre id=o>

Edycja: Zapisano 1 bajt dzięki @Arnauld.


5

Gaia , 2 bajty

r∫

Wypróbuj online!

Jest to prosto (stabilna) ∫ orts liczby całkowite w zakresie [1, wejściowych] ich pa r ści.


Ten sam komentarz co w przypadku Jelly: czy algorytm lub definicja języka gwarantuje, że obie połówki pozostaną w oryginalnej kolejności?
— WGroleau

@WGroleau Tak, w Gaia meta-operator sortowania jest stabilny.
— Pan Xcoder

5

R , 39 36 35 bajtów

function(x)c(seq(2,x,2),seq(1,x,2))

Wypróbuj online!


Końcowa NA dla liczb nieparzystych.
— JayCe


Wina żony. Musieliśmy jechać na rowerze, zanim mogłem to naprawić. Ale ogoliłeś też trochę bajtów.
— ngm

Tak, czułem się źle, prosząc cię o dodanie bajtów, więc musiałem znaleźć sposób na usunięcie niektórych ... to zadziałało dobrze.
— JayCe



4

Japt, 4 bajty

Można również wymienić usię vuzyskać inną kolejność.

õ ñu

Spróbuj

Lub, jeśli możemy wyprowadzić tablicę 2 tablic:

õ ó

Spróbuj


Technicznie drugi generuje listę liczb oddzielonych przecinkami ;-) Oba zawodzą 4, niestety; możesz naprawić pierwszy, zmieniając una vlub ona õ.
— ETHprodukcje

3

Mathematica, 50 -> 47 -> 42 bajty

p = Join[Range[2, #, 2], Range[1, #, 2]] &

Wypróbuj online!

Podziękowania dla user202729 za zwrócenie uwagi na podwójny potencjał optymalizacji Dołącz [] do Flatten [] i używania czystych funkcji.

Chciałbym dodać dwie uwagi.

1) Zbudowanie konkretnej permutacji bez spadającej lub rosnącej sukcesji jest dość proste dla n> = 4, zgodnie z żądaniem n PO.

Składa się z dwóch kolejnych list.

Dla parzystych n są to:
lista1 = (2,4, ..., n / 2)
lista2 = (1,3, ..., n / 2-1)

Dla nieparzystych n mamy:
list1 = (2,4, ..., Floor [n / 2])
list2 = (1,3, ..., Floor [n / 2])

Dla tego „algorytmu” musi zostać podjęta tylko jedna decyzja (n parzysta lub nieparzysta), reszta to po prostu zapisanie n liczb.

Możliwe rozwiązanie Mathematica znajduje się u góry.

2) Powiązanym pytaniem jest, ile takich permuacji istnieje w funkcji n.

Mathematica, 124 bajty

a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]

Wypróbuj online!

Przykład:

a[#] & /@ Range[4, 12]

{2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034}

Liczenie liczby takich permutacji jest standardowym problemem.

Dla n = 4 są 2: {{2,4,1,3}, {3,1,4,2}}

Dla n = 5 jest 14: {{1,3,5,2,4}, {1,4,2,5,3}, {2,4,1,3,5}, {2,4, 1,5,3}, {2,5,3,1,4}, {3,1,4,2,5}, {3,1,5,2,4}, {3,5,1, 4,2}, {3,5,2,4,1}, {4,1,3,5,2}, {4,2,5,1,3}, {4,2,5,3, 1}, {5,2,4,1,3}, {5,3,1,4,2}}

Liczba a (n) tych permutacji szybko rośnie: 2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034, ...

Dla dużego n stosunek a (n) / n! wydaje się zbliżać do granicy 1 / e ^ 2 = 0,135335 ... Nie mam ścisłego dowodu, ale jest to tylko przypuszczenie z dowodów numerycznych. Możesz to przetestować, próbując uruchomić program online.

Powyższy program (na podstawie podanego poniżej odniesienia) oblicza te liczby.

Więcej informacji można znaleźć w odpowiedniej sekwencji na OEIS: A002464 . Problem Hertzsprunga: sposoby ułożenia n nieatakujących królów na planszy n X n, z 1 w każdym rzędzie i kolumnie. Również liczba permutacji o długości n bez rosnących lub malejących sukcesji.


@ Stewie Griffin Ponieważ jestem tu nowy, wyjaśnij bardziej szczegółowo, co masz na myśli. W mojej pierwszej uwadze podałem algorytm i kod, który rozwiązuje problem w czasie wielomianowym. Dlatego należy uznać to rozwiązanie za wyzwanie. Druga część stanowi ciekawy problem. Dlatego należy to traktować jako komentarz.
— Dr Wolfgang Hintze

Pozwoliłem sobie nieco zmodyfikować twoje zgłoszenie, aby Twój kod Mathematica znalazł się na górze. W przypadku wyzwań związanych z golfem obowiązkowe jest podanie rzeczywistego kodu (możliwie najkrótszego). Sposób, w jaki go sformatowałem, staje się odpowiedzią Mathematica, tak jak zapewne zamierzałeś, i nadal masz pod nim twoje oryginalne wyjaśnienie. Jeśli uważasz, że czegoś brakuje lub nieprawidłowo zredagowałem twoją wstępną odpowiedź, możesz ją edytować samodzielnie. Witamy w PPCG! :)
— Kevin Cruijssen

@ Kevin Cruijssen Dziękuję bardzo za ciepłe przyjęcie i edycję mojego naiwnego zgłoszenia. Dodałem teraz program Mathematica do drugiej uwagi. Który najprawdopodobniej nie jest lege artis. Przede wszystkim nie wiem, jak stworzyć fajny link „spróbuj online”.
— Dr Wolfgang Hintze

Dowolny link można utworzyć za pomocą [some text](the_link). Jeśli chodzi w szczególności o link „Wypróbuj online”, witryna https://tio.run/, która jest hostowana przez nasz własny @Dennis, zawiera łącza do wszelkiego rodzaju języków programowania. Wolfram Language (Mathematica) jest jednym z nich. U góry możesz kliknąć przycisk odtwarzania, aby uruchomić kod, lub przycisk hiperłącza, aby skopiować „Wypróbuj online”. (znaczniki). I możesz podzielić swój kod na rzeczywisty „Kod” (twoje zgłoszenie), z opcjonalnym nagłówkiem / stopką do (ładnego) drukowania jednej lub wielu przypadków testowych.
— Kevin Cruijssen

Przepraszam za mój nieco tępy komentarz, a później brak odpowiedzi! Odpowiedź pojawiła się w kolejce recenzji i nie zauważyłem kodu z powodu formatowania. Często zdarza się, że nowi użytkownicy podają „interesujące uwagi” do wyzwań, nie podając rzeczywistej odpowiedzi. Chociaż odbywa się to w dobrej wierze, nie o to chodzi w witrynie. Myślałem, że to taka odpowiedź. Powinienem był odpowiedzieć na twój komentarz, ale spieszyłem się i nie mogłem napisać nowego komentarza, więc zamiast tego usunąłem stary. Przeprosiny! Witamy na stronie! Mam nadzieję, że zostaniesz! :)
— Stewie Griffin



2

Biała spacja , 161 bajtów

Oto oficjalne, nieskomentowane zgłoszenie: Wypróbuj online!

push_0   
read_n	
		push_0   
retreive_n			push_1  		
subtract	   dup_and_out[ 
 	
 	]label_s'
   
'push_2  		 
subtract	   dup[ 
 ]jump_next_if_neg:
		  
:dup_and_out[ 
 	
 	]else_jump_back:
 
 
:label_ss'
    
'push_0   
retreive_n			push_2  		 
subtract	   dup_and_out[ 
 	
 	]dup[ 
 ]jump_next:
 
    
:label_ssss'
      
'push_2  		 
subtract	   dup[ 
 ]jump_end_if_neg:
		   
:dup_and_out[ 
 	
 	]else_jump_back:
 
    
:label_sss'
     
'end



Wypróbuj online!

Poświęciłem kilka bajtów, aby program działał bezbłędnie. Wierzę, że mógłbym stracić około 7-8 bajtów i nadal by wyświetlał się poprawnie, ale wyświetlałby również komunikaty o błędach i nikt tego nie chce.

Pełne bajty Objaśnienie:

[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][N][Tab][Tab][Tab][Tab]          Read input value and store in heap
[Space][Space][Space][N]                   Push a 0 on the stack again
[Tab][Tab][Tab]                            Retrieve the value from the heap
[Space][Space][Tab][Tab][N]                Push a -1 on the stack
[Tab][Space][Space][Space]                 Add -1 to value
[Space][N][Space]                          Duplicate 
[Tab][N][Space][Tab]                       Output
[N][Space][Space][Space][N]                Set First Label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][N]             If negative, jump to second label
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][N]                    Jump back to first label
[N][Space][Space][Space][Space][N]         Set Second Label
[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][Tab]                            Retrieve input value from heap again
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 This time, Add a -2 to the value
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[Space][N][Space]                          Duplicate
[N][Space][N][Space][Tab][N]               Jump to third label
[N][Space][Space][Space][Tab][N]           Set third label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][Space][N]      Jump to end if negative
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][Tab][N]               Jump back to third label
[N][Space][Space][Space][Space][Space][N]  Set fourth label/end
[N][N][N]                                  Terminate

Niektóre rzeczy do golfa: push_0, read_STDIN_as_int, push_0, retrievemożna push_0, duplicate_0, read_STDIN_as_int, retrieveuratować bajt. I pierwsza etykieta może być pusta z NSSNzamiast NSSSN(a następnie druga etykieta może być NSSSN; trzecia NSSTN; czwarta NSSSSN). Powinno to również zaoszczędzić 8 bajtów. Możesz także usunąć pierwszy, Jump_to_third_labelponieważ masz już Set_third_labelprawo pod nim. Łącznie: 140 bajtów ; (lub z komentarzami: Wypróbuj online .) -3 bajty, jeśli usuniesz NNNwyjście.
— Kevin Cruijssen


1

Gol> <> , 14 bajtów

FL:2%Z}:3=?$|B

Wypróbuj online!

Przykład pełnego programu i jak to działa

1AGIE;GDlR~
FL:2%Z}:3=?$|B

1AG          Register row 1 as function G
   IE;       Take number input; halt on EOF
      GD     Call G and print the stack
        lR~  Empty the stack
             Repeat indefinitely

F           |   Repeat n times...
 L              Push loop counter (0..n-1)
  :2%Z}         If even, move to bottom of the stack
       :3=?$    If top == 3, swap top two
                  This is activated only once to make [2 0 3 1]
             B  Return


1

Java 8, 56 bajtów

n->{for(int i=n;i>0;)System.out.println((i+--i)%(n|1));}

Port odpowiedzi JavaScript (ES6) @Neil .

Wypróbuj online.


Stara 66 bajtów odpowiedź:

n->{String[]r={"",""};for(;n-->0;)r[n%2]+=n+" ";return r[0]+r[1];}

Wypróbuj online.

Wyjaśnienie:

n->{                  // Method with integer parameter and String return-type
  String[]r={"",""};  //  Result-Strings, both starting empty
  for(;n-->0;)        //  Loop in the range (n, 0]
    r[i%2]+=i+" ";    //   Append `i` and a space to one of the two result-Strings,
                      //   depending on if it is even (first) or odd (second)
  return r[0]+r[1];}  //  Return the two result-Strings appended to each other

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.