Objektif
Saya punya gambar bagus yang ingin saya gantung di dinding saya. Dan saya ingin menggantung di sana dengan cara yang spektakuler, jadi saya memilih untuk menggantungnya di n
paku di mana n
ada bilangan bulat positif.
Tapi saya juga ragu-ragu, jadi jika saya berubah pikiran, saya tidak ingin banyak kesulitan mengambil gambar. Karena itu, melepas salah satu n
kuku harus membuat gambar jatuh. Apakah saya menyebutkan bahwa tidak ada gesekan di rumah saya?
Bisakah kamu membantuku?
Aturan
- Program Anda harus membaca nomor
n
dari stdin dan mencetak ke stdout (atau padanan bahasa Anda). - Keluaran harus menjadi solusi sesuai dengan spesifikasi keluaran tanpa karakter tambahan atau karakter utama lainnya. Namun, spasi spasi putih dan / atau baris baru dapat diterima.
- Anda harus menggunakan kuku dengan tepat
n
. - Dengan asumsi dunia tanpa gesekan, solusi Anda harus memenuhi ketentuan berikut:
- Menggantung gambar seperti yang dijelaskan oleh solusi Anda, gambar tidak boleh jatuh.
- Jika salah satu paku dilepas, gambar harus jatuh.
- Celah standar berlaku. Secara khusus, Anda mungkin tidak membuat permintaan untuk, misalnya, program verifikasi untuk solusi kekerasan.
Perhatikan bahwa 4.2 sudah menyiratkan bahwa semua n
kuku harus terlibat.
Spesifikasi Output
- Semua kuku diberi nama dari kiri ke kanan dengan posisi mereka, mulai dari
1
. - Ada dua cara mendasar untuk meletakkan tali di sekitar paku: searah jarum jam dan berlawanan arah jarum jam. Kami menunjukkan langkah searah jarum jam dengan
>
dan langkah berlawanan arah jarum jam dengan<
. - Setiap kali tali diletakkan di sekitar paku, ia keluar di atas kuku, sehingga melewatkan kuku berarti tali akan melewati bagian atas kuku perantara.
- Setiap solusi harus dimulai pada kuku
1
dan berakhir pada kukun
. - Keluaran harus terdiri dari urutan langkah-langkah di mana langkah adalah kombinasi untuk nama kuku dan arah untuk meletakkan tali di sekitarnya.
Contoh Output
Berikut adalah contoh output untuk n=5
dan n=3
:
1>4<3<2>4>5< # n=5, incorrect solution
1>2<1<2>3<2<1>2>1<3> # n=3, correct solution
Dan di sini adalah representasi visual dari solusi yang salah untuk n=5
(awsumz gimp skillz)
Solusi yang tepat n=1
adalah sederhana 1>
atau 1<
. Untuk banyak kuku, bisa ada solusi yang berbeda. Anda hanya harus mengeluarkan satu karena ini adalah bagian dari skor Anda.
Verifikasi
Anda dapat memverifikasi apakah solusinya benar di sini: www.airblader.de/verify.php .
Ini menggunakan permintaan GET, sehingga Anda dapat memanggilnya langsung jika Anda mau. Misalnya, jika foo
file berisi solusi di setiap baris, Anda dapat menggunakan
cat foo | while read line; do echo `wget -qO- "www.airblader.de/verify.php?solution=$line" | grep "Passed" | wc -l`; done
Jika Anda yakin solusinya benar tetapi verifikator menandainya salah, harap beri tahu saya!
Sunting: Dan jika output Anda begitu lama sehingga permintaan GET tidak akan memotongnya, beri tahu saya dan saya akan membuat versi permintaan POST. :)
Mencetak gol
Ini adalah kode-golf. Skornya adalah jumlah byte kode sumber Anda dalam pengkodean UTF-8, misalnya, gunakan alat ini . Namun, ada bonus potensial untuk setiap pengiriman:
Jalankan program Anda untuk semua n
dalam kisaran [1..20]
dan tambahkan panjang semua output hingga untuk menentukan skor output Anda . Kurangi skor output Anda dari 6291370
untuk mendapatkan jumlah poin bonus yang dapat Anda kurangi dari jumlah byte Anda untuk mendapatkan skor keseluruhan Anda . Tidak ada penalti jika skor output Anda lebih tinggi dari angka ini.
Pengajuan dengan skor keseluruhan terendah akan menang. Dalam kasus yang tidak mungkin dari dasi, pemutus dasi berada dalam urutan ini: poin bonus lebih tinggi, jumlah byte lebih rendah, tanggal pengiriman sebelumnya.
Silakan posting bagian individual (jumlah byte, poin bonus) dari skor dan skor akhir, misalnya, " LOLCODE (44 - 5 = 39)
".
1>
digambar dalam gambar). Dan tidak ada din
mana tidak ada solusi yang mungkin. Solusi yang valid untukn=2
adalah1>2<1<2>
.Jawaban:
GolfScript (
5167 bytes + (73107150 - 6.291.370) = -6.284.153)Ini didasarkan pada konstruksi komutator rekursif Chris Lusby Taylor * , yang lebih baik dijelaskan dalam Picture-Hanging Puzzles , Demaine et al., Teori Sistem Komputasi 54 (4): 531-550 (2014).
Output untuk 20 input pertama:
NB Saya pikir jawaban yang lebih panjang akan gagal dalam ujian online karena menggunakan
GET
alih-alihPOST
dan URL tidak dijamin ditangani dengan benar jika lebih panjang dari 255 karakter.Ada dua penyesuaian pada konstruksi standar:
[x_1, x_2^-1]
bukan[x_1, x_2]
.* Tidak ada hubungan, sejauh yang saya ketahui.
** Nah, dalam pendekatan komutator rekursif yang sama. Saya tidak mengklaim telah memecahkan masalah terbuka untuk membuktikannya optimal.
sumber
Python 2 (208 byte + (7230 - 6.291.370) = -6.283.932)
Fungsi ini
f
secara rekursif membuat jawaban dengan menggabungkan setengah solusi sebagai A ^ {- 1} * B ^ {- 1} * A * B, mewakili invers dengan negasi.f(a,b)
adalah solusi untuk angka-angka dalam interval setengah terbuka[a,b)
.Sunting: Untuk mematuhi persyaratan untuk memulai
1
dan mengakhirin
, saya membalik urutan untuk selalu diakhiri dengann
menggunakan interval terbalik, dan cukup menambahkan"1<1>"
ke awal.Sunting : Disimpan 136 simbol dalam output dengan membulatkan cara lain dalam memilih interval, menyebabkan interval dengan angka lebih besar (dan lebih mungkin untuk memiliki dua digit) menjadi lebih pendek.
Sunting : Menyimpan 100 simbol dengan memisahkan interval secara tidak rata sehingga simbol dengan angka lebih besar lebih pendek. Ini tidak memperpanjang jumlah operasi yang digunakan selama panjangnya tidak pernah melewati kekuatan 2.
Sunting : Diperkenalkan kembali pembulatan yang menguntungkan, -50 simbol, karakter 2+ kode.
Output untuk 1 hingga 20:
sumber
n>n<
itu.n=1
solusi Anda sekarang.C - (199 byte - 0) = 199
Dengan jeda baris:
Mungkin algoritma yang cukup naif mengingat saya tidak tahu banyak tentang teori simpul. Pada dasarnya hanya menambahkan angka yang lebih tinggi berikutnya, lalu membalikkan seluruh set instruksi untuk melepasnya. Ini kemungkinan akan jauh lebih ringkas dalam bahasa yang menangani set lebih baik ...
Total panjang output untuk
n
dalam kisaran[1..20]
adalah 6.291.370 byte output (3.145.685 instruksi). Ini cukup besar bahwa saya hanya diposting output sampel untukn
dalam kisaran[1..10]
.sumber
6,291,370
persis angka yang benar yang ingin saya kirim. Saya tidak sengaja hanya memposting nomornyan=20
, bukan jumlah semuanya. Saya harus memasangnya[1..10]
.199 + 0 = 199
.