Ada teorema terkenal bahwa permutasi apa pun dapat diuraikan menjadi satu set siklus . Tugas Anda adalah menulis program sesingkat mungkin untuk melakukannya.
Memasukkan:
Dua baris. Yang pertama berisi angka N
, yang kedua berisi N
bilangan bulat yang berbeda dalam rentang yang [0,N-1]
dipisahkan oleh spasi. Bilangan bulat ini mewakili permutasi N
elemen.
Keluaran:
Satu baris untuk setiap siklus dalam permutasi. Setiap baris harus berupa daftar bilangan bulat yang dipisahkan spasi dalam urutan siklus.
Siklus dapat berupa output dalam urutan apa pun, dan setiap siklus dapat berupa output yang dimulai dari posisi mana pun.
Contoh 1:
8
2 3 4 5 6 7 0 1
Input ini mengkodekan permutasi 0-> 2, 1-> 3, 2-> 4, 3-> 5, 4-> 6, 5-> 7, 6-> 0, 7-> 1. Ini terurai menjadi siklus seperti ini:
0 2 4 6
1 3 5 7
Output yang sama validnya adalah
5 7 1 3
2 4 6 0
Contoh 2:
8
0 1 3 4 5 6 7 2
output yang valid:
0
1
4 5 6 7 2 3
sumber
>C.
Jawaban:
C
145134 Karakterhttp://www.ideone.com/BrWJT
sumber
int
?gets(&i)
ide untuk menyingkirkan baris pertama yang tidak berguna itu, namun ini jelas tidak akan bekerja pada sistem 16-bit jika lebih dari 10 elemen dilewatkan. Tetapi sekali lagi jika aturannya adalah "menemukan setidaknya sebuah program yang mengklaim sebagai kompiler C yang membuat executable di mana setidaknya dalam satu kasus tampaknya - setidaknya bagi saya - untuk memberikan respons yang valid" maka ini merupakan peningkatan: - )Python 131 karakter
baris akhir yang berakhir tidak diperlukan
sumber
Haskell, 131 karakter
>=
menjadi>
, menghilangkan duatail
panggilan melalui pencocokan pola & pra-aplikasia!!
.sumber
C (semacam), 139 karakter
Baris baru terakhir tidak termasuk.
Saya mengatakan "semacam" karena AFAIK misalnya
int
tidak dapat dihilangkan untuk deklarasi variabel (saya tidak menemukan di mana dikatakan itu dapat dihilangkan dan deklarasi tipe implisit hanya dijelaskan untuk fungsi. Spesifikasi tata bahasa pada standar pada dasarnya tidak berguna karena menerima lebih dari deklarasi C yang valid, misalnyadouble double void volatile x;
)tetapi kode di atas yang dikompilasi
gcc -ocycles cycles.c
ternyata bekerja dengan baik.sumber
scanf
tanpa#include <stdio.h>
bahkan jika parameternya benar dan tidak memerlukan konversi ):<<If the function is defined with a type that includes a prototype, and the types of the arguments after promotion are not compatible with the types of the parameters, or if the prototype ends with an ellipsis ( ", ..." ), the behavior is undefined.>>
J (antara 2 dan 32)
Saya tidak begitu jelas tentang format i / o, tapi saya pikir
C.
akan lakukan, jika output berikut akan diterima:(Terlihat lebih baik di terminal J.)
Jika perlu fungsi bernama yang sesuai dengan pemahaman terbaik saya tentang format i / o, itu akan menjadi 32 karakter, 30 di antaranya untuk konversi format output ...
Beraksi:
Penjelasan:
J dieksekusi dari kanan ke kiri (praktis).
@
adalah 'fungsi' (tidak secara teknis fungsi, tapi itu cukup dekat) untuk menggabungkan fungsi.i.&LF
- cari indeks pertamaLF
, variabel yang sudah ditentukan yang berisi nomor karakter ASCII 10, umpan baris.>:
- temukan yang pertamaLF
, dan tambahkan indeksnya satu per satu. Kami sebenarnya tidak ingin linefeed, kami ingin array yang mengikutinya.}.~
- Memilih bagian dari input yang kita inginkan.".
- Karena format input adalah J yang benar ( * \ õ / * ) kita hanya bisa menggunakaneval
kata kerja (saya tahu itu tidak benar-benar disebuteval
.) Untuk mengubahnya menjadi arrayC.
- Sihir murni. Saya benar-benar tidak tahu apa ini, tetapi tampaknya berhasil!":L:0
- Representasi. Mengubah output dariC.
menjadi urutan string kotak>
- Buka kotak. Output aktual sebenarnya adalah array string (ada spasi di belakang yang pertama ke nomor contoh).sumber
Clojure, 145
Agak tidak terubah, dan pecah menjadi fungsi (input harus berupa vektor, yaitu apa (vec (berulang kali (baca) baca)) dari hasil di atas):
(Wow, baru perhatikan tantangan ini sudah lebih dari 3 tahun. Oh well, bersenang-senang melakukannya!)
sumber