Berikan permutasi tanpa dua bilangan bulat berturut-turut di sebelah satu sama lain


18

Tantangan

Diberikan bilangan bulat n ≥ 4 , menghasilkan permutasi bilangan bulat [0, n-1] dengan properti yang tidak memiliki dua bilangan bulat berturut-turut (bilangan bulat dengan selisih mutlak 1) berada di samping satu sama lain.

Contohnya

  • 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]

Anda dapat menggunakan pengindeksan 1 sebagai gantinya (menggunakan bilangan bulat [1, n] alih-alih [0, n-1] ).

Kode Anda harus dijalankan dalam waktu polinomial dalam n , sehingga Anda tidak dapat mencoba semua permutasi dan menguji masing-masing.


Ketika Anda mengatakan "menghasilkan permutasi", maksud Anda sebagai daftar? Atau bisakah kita menghasilkan fungsi yang mengimplementasikan pemetaan permutasi itu sendiri?
xnor

@ xnor Ini harus dikeluarkan dalam beberapa bentuk yang dapat dibaca manusia. Saya tidak peduli bagaimana tepatnya.
Anush

Apakah [[1,3],[0,2]]format output yang dapat diterima?
Shaggy

@ Shaggy Tidak bagus. Apakah ini berarti 1,3,0,2?
Anush

Jawaban:


31

Jelly , 3 2 byte

ḂÞ

Mengurutkan bilangan bulat dalam [1, ..., n] oleh LSB mereka.

Cobalah online!


Wow! Itu mengagumkan.
Anush

2
"Sortir menurut LSB" berarti setiap orang bergerak ke permulaan, tetapi apakah definisi Jelly mensyaratkan bahwa angka di setiap setengahnya tetap dalam urutan aslinya? Jika tidak, 100 (4) bisa di sebelah 101 (5) dan masih "diurutkan berdasarkan LSB". Tidak salah kode Anda, tapi mungkin komentar yang menjelaskan tidak lengkap?
WGroleau

1
@WGroleau Ya, Þsemacam stabil, karena itu diterapkan menggunakan sortedfungsi Python , yang dijamin akan stabil .
user202729

3
Algoritma lebih mengesankan bagi saya daripada ukuran kecil, dalam kepintarannya. Anda juga bisa, membalikkan urutan bit, mengurutkan, dan membalikkannya kembali.
WGroleau

4
Hanya ada 65536 program Jelly dua byte yang berbeda. Sungguh menakjubkan begitu banyak dari mereka yang ternyata menjadi jawaban untuk tantangan ppcg.
Anush




6

Haskell, 22 byte

f adalah fungsi dari n yang mengembalikan daftar yang dipesan dengan tepat. Saya menggunakan opsi pengindeksan 1.

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

6

Oktaf , 17 byte

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

Cobalah online!

Ini menggunakan pendekatan yang sama seperti yang lainnya. Menggabungkan dua vektor, satu dengan semua angka genap dalam rentang inklusif 2 ... x , dan semua angka ganjil dalam rentang inklusif 1 ... x . Sintaksnya harus cukup jelas, jadi saya tidak akan menjelaskannya.


1
Bukankah 3dan di 2samping satu sama lain f(4)?
pajonk

Ups ... sudah diperbaiki. Jumlah byte yang sama. :-)
Stewie Griffin

5

JavaScript (ES6), 40 byte

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>

Sunting: Disimpan 1 byte berkat @Arnauld.


5

Gaia , 2 byte

r∫

Cobalah online!

Ini hanya (stabil) Orts bilangan bulat dalam rentang [1, masukan] oleh mereka pa r ity.


Komentar yang sama seperti pada Jelly: apakah algoritme atau definisi bahasa menjamin bahwa kedua bagian masing-masing tetap dalam urutan aslinya?
WGroleau

@WGroleau Ya, di Gaia, operator meta jenis stabil.
Tn. Xcoder



4

Japt, 4 byte

Anda juga bisa mengganti udengan vuntuk mendapatkan pesanan yang berbeda.

õ ñu

Cobalah

Atau, jika kita dapat menggunakan array 2 array:

õ ó

Cobalah


Secara teknis yang kedua menampilkan daftar angka yang dipisahkan dengan koma ;-) Keduanya gagal 4, sayangnya; Anda dapat memperbaiki yang pertama dengan mengubah uke vatau oke õ.
ETHproduk

3

Mathematica, 50 -> 47 -> 42 byte

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

Cobalah online!

Terima kasih kepada pengguna202729 untuk menunjukkan potensi pengoptimalan dua kali lipat Bergabung [] dipasang pada Flatten [] dan menggunakan fungsi murni.

Saya ingin menambahkan dua komentar.

1) Cukup mudah untuk membangun permutasi spesifik tanpa penurunan atau peningkatan suksesi untuk n> = 4 seperti yang diminta pada OP.

Ini terdiri dari dua daftar berturut-turut.

Untuk genap n ini adalah:
list1 = (2,4, ..., n / 2)
list2 = (1,3, ..., n / 2-1)

Untuk ganjil dan n kita memiliki:
list1 = (2,4, ..., Lantai [n / 2])
list2 = (1,3, ..., Lantai [n / 2])

Untuk "algoritma" ini, hanya satu keputusan yang harus dibuat (n genap atau ganjil), sisanya hanya menuliskan n angka.

Kemungkinan solusi Mathematica disediakan di bagian atas.

2) Pertanyaan terkait adalah berapa banyak izin seperti itu ada sebagai fungsi dari n.

Mathematica, 124 Bytes

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]

Cobalah online!

Contoh:

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

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

Untuk menghitung jumlah permutasi tersebut merupakan masalah standar.

Untuk n = 4 ada 2: {{2,4,1,3}, {3,1,4,2}}

Untuk n = 5 ada 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}}

Jumlah a (n) dari permutasi ini naik dengan cepat: 2, 14, 90, 646, 5242, 47622, ​​479306, 5296790, 63779034, ...

Untuk n besar rasio a (n) / n! tampaknya mendekati batas 1 / e ^ 2 = 0,135335 ... Saya tidak punya bukti ketat tetapi itu hanya dugaan dari bukti numerik. Anda dapat menguji ini dengan mencoba menjalankan program secara online.

Program di atas (berdasarkan referensi yang diberikan di bawah) menghitung angka-angka ini.

Anda dapat menemukan informasi lebih lanjut dalam urutan yang relevan di OEIS: A002464 . Masalah Hertzsprung: cara untuk mengatur dan tidak menyerang raja di papan xx, dengan 1 di setiap baris dan kolom. Juga jumlah permutasi panjang n tanpa naik atau turunnya suksesi.


@ Stewie Griffin Karena saya baru di sini, tolong jelaskan secara lebih rinci apa yang Anda maksud. Dalam komentar pertama saya, saya telah menyediakan algoritma dan kode yang memecahkan masalah dalam waktu polinomial. Oleh karena itu harus dianggap sebagai solusi untuk tantangan tersebut. Bagian kedua memperluas masalah yang menarik. Karena itu harus dianggap sebagai komentar.
Dr. Wolfgang Hintze

Saya mengambil sedikit kebebasan memodifikasi kiriman Anda sehingga kode Mathematica Anda ada di atas. Dengan tantangan kode-golf wajib memberikan kode aktual (sesingkat mungkin). Cara saya memformatnya menjadi jawaban Mathematica seperti yang mungkin Anda inginkan, dan masih memiliki penjelasan asli di bawahnya. Jika Anda merasa ada sesuatu yang hilang atau saya salah mengedit jawaban awal Anda, silakan mengeditnya lagi. Selamat datang di PPCG! :)
Kevin Cruijssen

@ Kevin Cruijssen Terima kasih banyak atas sambutan hangat dan penyuntingan pengajuan naif saya. Saya sekarang telah menambahkan program Mathematica untuk komentar kedua. Yang paling mungkin bukan artis lege. Yang terpenting, saya tidak tahu cara membuat tautan "coba online" yang bagus.
Dr. Wolfgang Hintze

Tautan apa pun dapat dibuat menggunakan [some text](the_link). Adapun tautan "Coba online" khususnya, situs web https://tio.run/ yang dihosting oleh @Dennis kami sendiri berisi tautan ke semua jenis bahasa pemrograman. Bahasa Wolfram (Mathematica) adalah salah satunya. Di bagian atas Anda kemudian dapat mengklik tombol putar untuk menjalankan kode, atau tombol hyperlink untuk menyalin "Coba online." (markup-) tautan. Dan Anda dapat membagi kode Anda menjadi "Kode" yang sebenarnya (kiriman Anda), dengan header / footer opsional untuk (cukup-) mencetak satu atau beberapa testcases.
Kevin Cruijssen

Permintaan maaf atas komentar saya yang agak tumpul, dan kurangnya balasan sesudahnya! Jawabannya muncul di antrian peninjauan, dan saya tidak melihat kode karena pemformatan. Bukan hal yang aneh bahwa pengguna baru memposting "pengamatan menarik" untuk tantangan, tanpa memberikan jawaban yang sebenarnya. Meskipun dilakukan dengan itikad baik, ini bukan tentang situs tersebut. Saya pikir ini adalah jawaban seperti itu. Saya seharusnya menanggapi komentar Anda, tetapi saya sedang terburu-buru dan tidak bisa menulis komentar baru, jadi alih-alih saya hanya menghapus yang lama. Permintaan maaf! Dan selamat datang di situs ini! Saya harap Anda akan bertahan! :)
Stewie Griffin



2

Spasi , 161 byte

Inilah pengajuan resmi dan tidak diomentari: Coba 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



Cobalah online!

Saya mengorbankan beberapa byte sehingga program akan berjalan tanpa kesalahan, saya percaya bahwa saya bisa kehilangan sekitar 7-8 byte, dan masih akan menampilkan dengan benar, tetapi juga akan menghasilkan pesan kesalahan, dan tidak ada yang menginginkan itu.

Penjelasan Byte Lengkap:

[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

Beberapa hal untuk golf: push_0, read_STDIN_as_int, push_0, retrievebisa push_0, duplicate_0, read_STDIN_as_int, retrieveuntuk menyimpan byte. Dan label pertama bisa menjadi kosong dengan NSSNbukan NSSSN(dan kemudian label kedua bisa NSSSN; ketiga NSSTN; dan keempat NSSSSN). Ini harus menyimpan 8 byte juga. Anda juga dapat menghapus yang pertama Jump_to_third_labelkarena Anda sudah memiliki Set_third_labelhak di bawahnya. Total: 140 byte ; (atau dengan komentar: Cobalah online .) -3 byte jika Anda menghapus NNNkeluar.
Kevin Cruijssen


1

Gol> <> , 14 byte

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

Cobalah online!

Contoh program lengkap & Cara kerjanya

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

J , 10 byte

i./:2|1+i.

Cobalah online!

Penjelasan:

  /:          sort
i.            the numbers in the range 0..n-1 
    2|        according the remainder mod 2 of 
      1+i.    the numbers in the range 1..n   

1

Java 8, 56 byte

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

Pelabuhan @ Neil JavaScript (ES6) jawaban 's .

Cobalah online.


Jawaban 66 byte lama:

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

Cobalah online.

Penjelasan:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.