Tugas Anda adalah menulis program komputer sehingga ketika dipotong menjadi garis-garis (terpecah pada karakter baris baru) setiap pengaturan garis akan menghasilkan angka yang berbeda antara 1 dan n! (di mana n adalah jumlah total baris). Tidak ada angka yang harus dikeluarkan oleh dua pengaturan yang berbeda dan setiap pengaturan harus menampilkan angka pada kisaran ini. Karena ada n! cara untuk mengatur garis-garis program ini berarti setiap angka harus dihasilkan oleh satu pengaturan ulang.
Misalnya program python
print 1;"""
print 2;"""
Memiliki dua pengaturan
print 1;"""
print 2;"""
dan
print 2;"""
print 1;"""
Output pertama 1
dan output kedua 2
.
Anda dapat menggunakan format output apa pun yang standar dalam bahasa yang Anda gunakan. Anda tidak boleh menggunakan boilerplate apa pun. Saya pikir tantangan ini lebih menarik jika Anda harus mengerjakan format apa pun yang ditekankan oleh bahasa.
Mencetak gol
Skor Anda akan menjadi jumlah baris dalam program Anda dengan skor yang lebih tinggi menjadi lebih baik. Anda dapat memilih untuk menampilkan angka dari 0 hingga n! -1 jika Anda mau.
sumber
n
? Apakah mereka semua terikat pada skor ∞?Jawaban:
CJam , skor: ∞
Setiap baris berbentuk
di mana
x
nomor dari0
ken-1
. Hasilnya dalam kisaran0
hinggan!-1
.Cobalah online! (Untuk
n=3
.)Kredit ke jimmy23013 untuk kode yang menghitung indeks permutasi aktual. Saya hanya mengganti bit yang membaca input
];Lx+:L
yang membuang hasil dari baris sebelumnya dan kemudian menambahkan indeks dari baris saat ini ke variabelL
(yang awalnya merupakan array kosong).sumber
0+:+
) Saya pikir Anda bisa menggunakan versi yang jauh lebih pendek,m!#
.Perl: ∞
Perpanjang hingga panjang yang Anda suka
Akan cepat kehabisan memori karena penggunaan memori seperti O (n ^ n). Namun akan lebih mudah untuk mengganti pengindeks permutasi dengan kode O (n), lebih lama. Saya hanya menggambarkan cara yang dapat Anda gunakan
END{}
untuk tugas ini di perl. SemuaEND{}
blok berjalan pada waktu keluar, tetapi hanya yang pertama yang dipanggil (yang terakhir dalam kode) yang akan menghasilkan apa saja karena/A/
pengujian yang hanya berlaku sekaliPerhatikan bahwa
$m
penghitung harus dihitung sebagai string karena sebagai angka itu akan meluap (lebih lambat dari akhir jagat raya tetapi prinsip yang diperhitungkan). Untuk alasan yang sama saya "menghitung" jumlah baris dengan membangun stringA
s alih-alih menggunakan penghitung nyata meskipun ini melimpah akan terjadi bahkan kemudian.Cara lain untuk melakukan ini di perl:
Ini menggunakan fakta bahwa in
foo = bar
bar
dijalankan setelahfoo
. Versi ini omong-omong tidak gila waktu dan ruang tetapi itu membuat kode lebih lamaNamun ide lain adalah menggunakan
DESTROY
yang memiliki keuntungan bahwa hanya satu dari mereka yang akan dieksekusi. Saya tidak akan mengulangi kode pengindeksan permutasi yang sudah saya berikan dua contoh.Atau menggunakan
BEGIN
:sumber
Jelly , ∞
(Contoh dengan
n=3
.)Cobalah online!
231311 byte per baris.Untuk program dengan
n
garis, garis akan memiliki format;
<i>
ÇQŒ¿$⁼Q$?
di mana
<i>
mewakili angka literali
dan setiap baris memiliki nilai berbeda untuki
mulai dari1
hinggan
. (Nilai untuki
tidak benar-benar harus angka-angka spesifik ini, mereka hanya harus memiliki nilai positif yang unik.) Program ini tidak lagi digunakann
dalam struktur garis.Bagaimana?
0
.;1
menambahkan1
ke0
atau daftar aktif.⁼Q$
adalah kondisional monad untuk pernyataan if (?
) yang memeriksa apakah elemen daftar itu unik. Jika ya, tautan di atas disebut (Ç
) dan nomor lain ditambahkan ke daftar. Jika tidak unik, itu berarti kami telah membuka tautan pertama. Elemen yang diulang dihapus dari daftar (Q
) dan indeks permutasi ditemukan (Œ¿
). Perhatikan bahwa ada0
di awal daftar kapanŒ¿
diambil tetapi tidak mempengaruhi output karena nilai untuki
semuanya positif.Fitur Jelly baru
Dengan
Ƒ
quick yang baru ditambahkan , kita bisa menguranginya⁼Q$
menjadiQƑ
, menghemat satu byte.10 byte / baris (untuk satu digit)
Cobalah online!
sumber
Brain-Flak , 3
Cobalah online!
Saya memposting ini dalam obrolan sebelumnya, tetapi mudah-mudahan dengan mempostingnya di sini orang dapat membuatnya.
Penjelasan
Kami mulai dengan program dasar
Ini skor 2 sendiri. Untuk naik ke level berikutnya saya ingin menambahkan baris baru. Dugaan awal saya adalah
Ini mengatur TOS ke
2
jika itu nol dan tidak melakukan apa pun sebaliknya. Ini sebenarnya awal yang baik. Dengan dua baris lainnya kita bisa mendapatkan semua angka dari1
ke6
kecuali4
, karena ada2
cara untuk menghasilkan2
:dan
Untuk memperbaiki ini, kami membuat jalur kami juga ditetapkan
2
menjadi4
. Ini bisa dilakukan denganUntuk kejelasan ini pada dasarnya mengimplementasikan fungsi Haskell
Ini memperbaiki masalah kami karena salah satu program yang sebelumnya menghasilkan
2
sekarang menghasilkan4
tanpa perubahan program lain.sumber
Java 7, skor: ∞
Cobalah online!
Ini dapat mencetak 0 hingga n! -1 . Baris tambahan adalah format berikut (di mana INDEX adalah angka dari 1 hingga n! -1 ):
Metode ini bekerja dengan membaca sumbernya sendiri untuk menentukan urutan kelas yang tercantum di dalamnya. Sayangnya tidak ada metode yang lebih keren yang bisa saya temukan dengan mem-parsing file yang dikompilasi atau membuat ClassLoader kustom berkat bagaimana java melakukan kompilasi JIT. Saya kira saya bisa meminta setiap kelas tambahan hanya mencetak angka yang ditentukan secara statis tetapi ini tampak lebih menyenangkan. Itu juga akan membuatnya sehingga saya bisa menghapus
B
antarmuka tetapi penilaian tidak didasarkan pada byte jadi saya akan membiarkan itu untuk bersenang-senang.Cara kerjanya (tingkat tinggi):
Membaca kode sumbernya sendiri baris demi baris. Karena setiap baris mendeklarasikan kelas baru, kami menggunakan refleksi untuk membuat turunan dari kelas baru dan memanggil
a
metode yang harus dimiliki karena mengimplementasikanB
antarmuka.sumber
Ruby , skor: ∞
Cobalah online!
Program ini memiliki 61 byte per baris (untuk n <10). Ini memiliki format dasar yang sama dengan solusi dylnan ; angka pertama di setiap baris akan menjadi nilai yang berbeda antara
1
dann
, dan angka kedua di setiap baris akan menjadin
.Saya berharap menemukan cara untuk menghindari termasuk
n
dalam program, tetapi saya tidak dapat menemukannya.sumber
Brain-Flak , 2 (dengan
-d
)Cobalah online!
sumber
2
Anda dapat menggunakan({}())
dan(({}){})
.05AB1E , skor: 1.114.112
Cobalah online! Diindeks 0. ˆ pada awal setiap baris mendorong karakter yang berbeda ke array global. Sisa kode dieksekusi sia-sia kecuali pada baris terakhir, di mana ia menggabungkan nilai-nilai ke dalam string, kemudian menemukan indeks permutasi. 1.114.112 adalah jumlah karakter Unicode yang mungkin pada saat penulisan (poin kode 48-57 adalah yang paling mudah ditunjukkan dengan tentu saja).
sumber