Sementara mencoret-coret angka, saya menemukan permutasi menarik yang dapat Anda hasilkan dari daftar angka. Jika Anda mengulangi permutasi yang sama ini cukup sering, Anda akan selalu berakhir kembali di array asli. Mari kita gunakan daftar berikut ini:
[1, 2, 3, 4, 5]
sebagai contoh
Membalikkan array. Sekarang array kita adalah
[5, 4, 3, 2, 1]
Susun ulang (swap) setiap pasangan. Daftar kami memiliki 2 pasang:,
[5, 4]
dan[3, 2]
. Sayangnya, kami tidak dapat mengelompokkannya1
menjadi pasangan, jadi kami akan membiarkannya sendiri. Setelah bertukar setiap pasangan, array baru adalah:[4, 5, 2, 3, 1]
Ulangi langkah 1 dan 2 sampai kita kembali ke array asli. Berikut adalah 4 langkah selanjutnya:
Step 2: Start: [4, 5, 2, 3, 1] Reversed: [1, 3, 2, 5, 4] Pairs Swapped: [3, 1, 5, 2, 4] Step 3: Start: [3, 1, 5, 2, 4] Reversed: [4, 2, 5, 1, 3] Pairs Swapped: [2, 4, 1, 5, 3] Step 4: Start: [2, 4, 1, 5, 3] Reversed: [3, 5, 1, 4, 2] Pairs Swapped: [5, 3, 4, 1, 2] Step 5: Start: [5, 3, 4, 1, 2] Reversed: [2, 1, 4, 3, 5] Pairs Swapped: [1, 2, 3, 4, 5] # No more steps needed because we are back to the original array
Jika panjang daftar, n ganjil, ia akan selalu mengambil langkah n persis untuk kembali ke array asli. Jika n adalah genap, ia akan selalu mengambil 2 langkah untuk kembali ke array asli, kecuali n adalah 2, dalam hal ini akan mengambil 1 langkah (karena membalik dan bertukar adalah hal yang sama).
Tugas Anda untuk hari ini (jika Anda memilih untuk menerimanya) adalah memvisualisasikan serangkaian langkah ini untuk daftar panjang yang sewenang-wenang. Anda harus menulis sebuah program atau fungsi yang menggunakan satu bilangan bulat positif n sebagai input, dan melakukan serangkaian langkah untuk daftar ini [1, n]
. Anda harus menampilkan setiap langkah perantara di sepanjang jalan, apakah itu berarti mencetak setiap langkah, atau mengembalikan semuanya sebagai daftar langkah. Saya tidak terlalu pilih-pilih tentang format output, asalkan jelas bahwa Anda menghasilkan setiap langkah. Ini berarti (misalnya) salah satu dari ini:
Mengeluarkan setiap langkah sebagai daftar ke STDOUT
Mengembalikan daftar daftar
Mengembalikan daftar representasi string dari setiap langkah
Mengembalikan / mengeluarkan matriks
akan diterima.
Anda juga harus menampilkan array asli, apakah yang datang di akhir atau di awal terserah Anda. (secara teknis, keduanya benar)
Anda harus menangani kasing tepi 2 mengambil 1 langkah bukan 2 , jadi pastikan solusi Anda bekerja dengan input 2 (dan 1 adalah kasing tepi potensial lainnya).
Seperti biasa, ini adalah kode-golf , sehingga celah standar berlaku, dan mencoba membuat solusi Anda lebih pendek daripada yang lain dalam bahasa pilihan Anda (atau bahkan mencoba untuk mengalahkan bahasa lain yang biasanya lebih pendek dari bahasa Anda jika Anda merasa kesal untuk tantangan).
Tes IO
1:
[1]
2:
[1, 2]
3:
[2, 3, 1]
[3, 1, 2]
[1, 2, 3]
4:
[3, 4, 1, 2]
[1, 2, 3, 4]
5:
[4, 5, 2, 3, 1]
[3, 1, 5, 2, 4]
[2, 4, 1, 5, 3]
[5, 3, 4, 1, 2]
[1, 2, 3, 4, 5]
7:
[6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 6]
[4, 6, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 7, 5]
[7, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7]
9:
[8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 8]
[6, 8, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 9, 7]
[9, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Dan untuk ukuran yang baik, inilah satu test case raksasa:
27:
[26, 27, 24, 25, 22, 23, 20, 21, 18, 19, 16, 17, 14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 1]
[3, 1, 5, 2, 7, 4, 9, 6, 11, 8, 13, 10, 15, 12, 17, 14, 19, 16, 21, 18, 23, 20, 25, 22, 27, 24, 26]
[24, 26, 22, 27, 20, 25, 18, 23, 16, 21, 14, 19, 12, 17, 10, 15, 8, 13, 6, 11, 4, 9, 2, 7, 1, 5, 3]
[5, 3, 7, 1, 9, 2, 11, 4, 13, 6, 15, 8, 17, 10, 19, 12, 21, 14, 23, 16, 25, 18, 27, 20, 26, 22, 24]
[22, 24, 20, 26, 18, 27, 16, 25, 14, 23, 12, 21, 10, 19, 8, 17, 6, 15, 4, 13, 2, 11, 1, 9, 3, 7, 5]
[7, 5, 9, 3, 11, 1, 13, 2, 15, 4, 17, 6, 19, 8, 21, 10, 23, 12, 25, 14, 27, 16, 26, 18, 24, 20, 22]
[20, 22, 18, 24, 16, 26, 14, 27, 12, 25, 10, 23, 8, 21, 6, 19, 4, 17, 2, 15, 1, 13, 3, 11, 5, 9, 7]
[9, 7, 11, 5, 13, 3, 15, 1, 17, 2, 19, 4, 21, 6, 23, 8, 25, 10, 27, 12, 26, 14, 24, 16, 22, 18, 20]
[18, 20, 16, 22, 14, 24, 12, 26, 10, 27, 8, 25, 6, 23, 4, 21, 2, 19, 1, 17, 3, 15, 5, 13, 7, 11, 9]
[11, 9, 13, 7, 15, 5, 17, 3, 19, 1, 21, 2, 23, 4, 25, 6, 27, 8, 26, 10, 24, 12, 22, 14, 20, 16, 18]
[16, 18, 14, 20, 12, 22, 10, 24, 8, 26, 6, 27, 4, 25, 2, 23, 1, 21, 3, 19, 5, 17, 7, 15, 9, 13, 11]
[13, 11, 15, 9, 17, 7, 19, 5, 21, 3, 23, 1, 25, 2, 27, 4, 26, 6, 24, 8, 22, 10, 20, 12, 18, 14, 16]
[14, 16, 12, 18, 10, 20, 8, 22, 6, 24, 4, 26, 2, 27, 1, 25, 3, 23, 5, 21, 7, 19, 9, 17, 11, 15, 13]
[15, 13, 17, 11, 19, 9, 21, 7, 23, 5, 25, 3, 27, 1, 26, 2, 24, 4, 22, 6, 20, 8, 18, 10, 16, 12, 14]
[12, 14, 10, 16, 8, 18, 6, 20, 4, 22, 2, 24, 1, 26, 3, 27, 5, 25, 7, 23, 9, 21, 11, 19, 13, 17, 15]
[17, 15, 19, 13, 21, 11, 23, 9, 25, 7, 27, 5, 26, 3, 24, 1, 22, 2, 20, 4, 18, 6, 16, 8, 14, 10, 12]
[10, 12, 8, 14, 6, 16, 4, 18, 2, 20, 1, 22, 3, 24, 5, 26, 7, 27, 9, 25, 11, 23, 13, 21, 15, 19, 17]
[19, 17, 21, 15, 23, 13, 25, 11, 27, 9, 26, 7, 24, 5, 22, 3, 20, 1, 18, 2, 16, 4, 14, 6, 12, 8, 10]
[8, 10, 6, 12, 4, 14, 2, 16, 1, 18, 3, 20, 5, 22, 7, 24, 9, 26, 11, 27, 13, 25, 15, 23, 17, 21, 19]
[21, 19, 23, 17, 25, 15, 27, 13, 26, 11, 24, 9, 22, 7, 20, 5, 18, 3, 16, 1, 14, 2, 12, 4, 10, 6, 8]
[6, 8, 4, 10, 2, 12, 1, 14, 3, 16, 5, 18, 7, 20, 9, 22, 11, 24, 13, 26, 15, 27, 17, 25, 19, 23, 21]
[23, 21, 25, 19, 27, 17, 26, 15, 24, 13, 22, 11, 20, 9, 18, 7, 16, 5, 14, 3, 12, 1, 10, 2, 8, 4, 6]
[4, 6, 2, 8, 1, 10, 3, 12, 5, 14, 7, 16, 9, 18, 11, 20, 13, 22, 15, 24, 17, 26, 19, 27, 21, 25, 23]
[25, 23, 27, 21, 26, 19, 24, 17, 22, 15, 20, 13, 18, 11, 16, 9, 14, 7, 12, 5, 10, 3, 8, 1, 6, 2, 4]
[2, 4, 1, 6, 3, 8, 5, 10, 7, 12, 9, 14, 11, 16, 13, 18, 15, 20, 17, 22, 19, 24, 21, 26, 23, 27, 25]
[27, 25, 26, 23, 24, 21, 22, 19, 20, 17, 18, 15, 16, 13, 14, 11, 12, 9, 10, 7, 8, 5, 6, 3, 4, 1, 2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]
Bersenang-senang bermain golf!
1 2 3 4 5
tidak 1 2 4 3 5
.
array[0]
hanya akan ada 1 pada awal dan akhir proses hingga n = 999
. Dari melihat polanya, sepertinya untuk setiap n aneh , elemen pertama 1, n-1, 3, n - 3, 5, n - 5, 7...
naik hingga n - 2, 3, n, 1
, yang akan selalu mengambil n langkah. Saya tidak melihat alasan bahwa pola ini akan berubah dengan n yang lebih besar .
1, n, 2, n-2, 4, n-4, 6, n-6, 8, n-8, ...
dan mudah untuk menunjukkan dengan induksi bahwa suatu elemen pada posisi genap x bergerak ke nx setelah satu langkah , dan elemen pada posisi ganjil x pindah ke n-x + 2 . Jadi jika n = 2k + 1 , maka setelah langkah 2k -th 1 akan berada pada 2k , dan pada langkah berikutnya di n-2k = 1 .