Terinspirasi oleh Diambil dari pertanyaan di Stack Overflow .
Tantangan
Diberikan bilangan bulat n>1
, output semua array yang dapat diperoleh dengan menukar tepat dua entri dalam array [1, 2, ..., n]
.
Array dapat diproduksi dalam urutan apa pun.
Anda dapat secara konsisten menggunakan [0, 1, ..., n-1]
(berbasis-0) alih-alih [1, 2, ..., n]
(berbasis-1).
Aturan tambahan
Input dan output fleksibel seperti biasa .
Program atau fungsi diizinkan, dalam bahasa pemrograman apa pun . Celah standar dilarang.
Kode terpendek dalam byte menang.
Uji kasus
Input 2
menghasilkan output (diasumsikan berbasis 1)
2 1
Input 3
menghasilkan output (perhatikan bahwa ketiga array bisa dalam urutan apa pun)
1 3 2
2 1 3
3 2 1
Input 4
memberi output
1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1
Input 7
memberi output
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
sumber
sumber
[0 ... n-1]
vs[1 ... n]
! Saya selalu merasa sedikit kesal ketika saya harus memperbaiki1+
karena indeks nol.Jawaban:
Jelly ,
118 byteCobalah online!
Bagaimana itu bekerja
sumber
y
dilakukan? Itu selalu menjadi sedikit misteri bagi saya.[1,2],[4,3]y1,2,3
ganti masing-masing 1 in [1, 2, 3] dengan 4 , dan masing-masing 2 dengan 3 .R , 54 byte
Cobalah online!
Mengembalikan matriks di mana setiap kolom adalah permutasi.
combn(n,k)
menghasilkan semua kombinasi ukurank
dari daftarn
, atau dari1:n
jikan
bilangan bulat tunggal. Secara opsional juga dibutuhkan fungsiFUN
untuk diterapkan pada kombinasi yang dihasilkan. Jadi kami menulis fungsi yang melakukan swap dan mengembalikan daftar yang ditukar. Hasilnya kemudian semua diakumulasikan menjadiarray
, yang dalam hal ini 2-dimensi dan karenanya sebuah matriks.sumber
Python 2 , 71 byte
Cobalah online!
Gunakan tip ini .
sumber
Haskell , 62 byte
Cobalah online!
Saya hanya menghasilkan permutasi, mengingat
x
dany
untuk swap, masing-masingx,y
sumber
Python 2 , 72 byte
Cobalah online!
sumber
Bahasa Wolfram (Mathematica) , 43 byte
Cobalah online!
Penjelasan:
Subsets[Range@#,{2}]
menghasilkan semua himpunan bagian{1,2,...,n}
ukuran 2, kemudian untuk setiap himpunan bagian,/.
menukar dua hal dalam daftar{1,2,...,n}
.Pendekatan itu sangat mirip dengan banyak kiriman lainnya, tapi inilah yang lebih unik dari Mathematica, untuk 3 byte tambahan:
Cobalah online!
sumber
ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&
. Saya suka betapa sederhananya (atau bagaimana langsung mengkodekan masalah), tetapi sayangnya sintaks pencocokan pola sangat verbose bahwa ini akhirnya menjadi 57 byte.Haskell, 62 byte
Cobalah online!
sumber
Haskell , 71 byte
Cobalah online!
Ini menambahkan nomor saat ini ke akhir semua permutasi terakhir dan kemudian menghitung semua swap yang menyertakan nomor baru.
sumber
MATL , 12 byte
Cobalah online!
sumber
:tY@wy=~!s2=Y)
. Pendekatan yang sama dengan jawaban oktaf rahnema1, saya pikirC, 93 byte
Cobalah online!
sumber
Oktaf, 38 byte
Cobalah online!
Hasilkan semua permutasi 1: n dan pilih dari mereka yang memiliki dua elemen berbeda dari 1: n.
sumber
JavaScript (ES6), 81 byte
Mencetak 0 array yang diindeks.
Demo
alert()
diganti denganconsole.log()
dalam cuplikan ini untuk ramah pengguna.Tampilkan cuplikan kode
sumber
Python 2 , 75 byte
Cobalah online!
sumber
Bersih ,
9082 byteItu dapat dilakukan dalam 80 byte, tetapi itu berubah menjadi terjemahan langsung dari jawaban Haskell.
Cobalah online!
sumber
05AB1E ,
159 byteCobalah online!
Penjelasan
sumber
Sekam , 9 byte
Cobalah online!
Penjelasan
sumber
Ruby ,
5553 byteCobalah online!
Solusi berbasis 0
Kuncinya di sini adalah bahwa loop dalam selalu "melompati" iterasi: pertama kali itu tidak dieksekusi sama sekali, maka hanya sekali pada lintasan kedua, dan seterusnya.
Saya senang dengan 55 byte sampai saya melihat bahwa R bisa di-golf menjadi 54, jadi saya harus mendapatkannya sampai 53.
sumber
Python 2 , 90 byte
Cobalah online!
sumber
Pyth, 9 byte
Demonstrasi
Cara termudah untuk menukar dua nilai adalah dengan menggunakan
.r
, yang merupakan fungsi terjemahan putar Pyth..r<list>[A, B]
akan menukar semua kemunculanA
danB
dalamlist
.Oleh karena itu, dengan menerapkan fungsi terjemahan ke
UQ
, daftar dari0
ken-1
dengan setiap dua elemen daftar angka yang berbeda dalam daftar, kami akan menghasilkan output yang diinginkan.Q
adalah input,n
,, danU
fungsi rentang.Cara mudah untuk melakukan ini adalah:
.cUQ2
menghasilkan semua 2 kombinasi elemen elemen yang berbeda dalam rentang, dan.rLUQ
memetakan.r
fungsi di atasnya dan daftarUQ
.Namun, itu akan menjadi 10 byte.
Alih-alih membuat
.cUQ2
, pasangan terurut berbeda, kita bisa membuat semua pasangan dengan*=U
. Ini secara implisit setara dengan*=UQQ
. Dimulai dengan TimpaQ
denganUQ
, kemudian mengambil produk CartesianUQ
danUQ
. Ini memberikan semua pasangan angka dalam kisaran, tidak harus dipesan atau berbeda..rLQ
swap menggunakan setiap daftar. Ingat bahwaQ
sekarang sama dengan daftar dari0
ken-1
, bukann
.Karena pasangan tidak dipesan, ada duplikat.
{
menghapus duplikat. Karena pasangan tidak berbeda, daftar tidak berubah hadir. Daftar ini akan selalu menjadi yang pertama setelah deduplikasi, karena{
mempertahankan urutan tampilan pertama dan daftar yang tidak berubah dihasilkan oleh rotasi oleh[0,0]
.t
menghapus elemen pertama, memberikan daftar swap yang diinginkan.sumber
Pyth, 11 byte
Cobalah secara online
Tidak sesingkat pendekatan isaacg, tetapi cukup berbeda untuk diposkan.
Penjelasan
sumber
Java 8,
109105 byteSaya berkarat .. Belum kode-golf dalam beberapa bulan .. Akhirnya porting @Steadybox 'C jawaban .. Mungkin bisa golf lagi.
Coba di sini.
sumber
Ruby , 66 byte
Cobalah online!
sumber
Ruby , 80 byte
-12 byte terima kasih kepada Unihedron.
Cobalah online!
Saya memiliki pendekatan dalam pikiran yang paling baik diterjemahkan ke Ruby untuk beberapa alasan, jadi ... Saya bahkan tidak benar-benar tahu Ruby ...
sumber
1..n
ke variabel satu-char dan menggunakannya kembali (pernyataan terpisah dengan baris baru atau titik koma), 2. lakukan tanpa tanda kurung dalam pernyataan termary:i==x ?y:i==y ?x:i
(perhatikan di mana saya memiliki ruang untuk memisahkan potensi shebang ) dan 3.uniq[1,n]
bukannyauniq[1..-1]
.