Hancurkan Waktu!
Ini adalah angsuran # 5 dari seri Random Golf of the Day dan ASCII Art of the Day dari Pengoptimal . Kiriman Anda dalam tantangan ini akan diperhitungkan di kedua papan peringkat (yang dapat Anda temukan di kiriman yang tertaut). Tentu saja, Anda dapat memperlakukan ini seperti tantangan golf kode lainnya, dan menjawabnya tanpa khawatir tentang kedua seri sama sekali.
Lubang 5: Diamond Tilings
Hexagon biasa selalu dapat dilapisi dengan berlian seperti:
Kami akan menggunakan representasi seni ASCII dari tilings ini. Untuk segi enam sisi-panjang 2, ada 20 sudut seperti:
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/\_\_\ /\_\_\ /\_\_\ /\_\_\ /_/\_\ /_/\_\ /\_\_\ /_/\_\ /_/\_\ /_/\_\
/\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
\/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
\/_/_/ \/_/_/ \/_/_/ \_\/_/ \/_/_/ \/_/_/ \_\/_/ \_\/_/ \_\/_/ \_\/_/
____ ____ ____ ____ ____ ____ ____ ____ ____ ____
/_/_/\ /\_\_\ /_/\_\ /_/_/\ /_/\_\ /_/\_\ /_/_/\ /_/_/\ /_/_/\ /_/_/\
/\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
\/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
\/_/_/ \_\_\/ \_\/_/ \_\/_/ \_\_\/ \_\_\/ \_\/_/ \_\_\/ \_\_\/ \_\_\/
Dengan panjang sisi yang sama N
, Anda harus membuat ubin seperti segi enam dengan panjang sisi N
secara acak. Distribusi yang tepat tidak masalah, tetapi setiap ubin harus dikembalikan dengan probabilitas tidak nol.
Sebab N ≤ 4
, kiriman Anda harus menghasilkan ubin dalam waktu 1 menit setidaknya 80% dari waktu dan setidaknya 80% dari ubin harus berpotensi dihasilkan dalam 1 menit. Sebagian besar pendekatan tidak perlu khawatir tentang aturan ini (ini sangat lunak) - ini hanya untuk mengesampingkan algoritma berbasis penolakan yang sangat naif yang menghasilkan string arbitrer sampai satu terjadi ubin.
Anda mungkin ingin tahu bahwa jumlah total kemiringan yang mungkin untuk N yang diberikan dapat ditemukan di OEIS A008793 .
Anda dapat menulis program atau fungsi lengkap dan mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan menghasilkan output melalui STDOUT (atau alternatif terdekat), mengembalikan nilai fungsi atau parameter fungsi (keluar).
Anda tidak boleh mengeluarkan lebih banyak spasi utama dari yang diperlukan untuk menyelaraskan segi enam (yaitu sudut kiri segi enam seharusnya tidak memiliki spasi di depannya). Setiap baris dapat berisi hingga N
spasi tambahan (tidak harus konsisten, sehingga Anda bisa misalnya memiliki keluaran persegi panjang, mencetak kotak pembatas hexagon).
Ini adalah kode golf, jadi pengiriman terpendek (dalam byte) menang. Dan tentu saja, pengiriman terpendek per pengguna juga akan masuk ke papan peringkat keseluruhan seri.
Papan peringkat
Pos pertama dari setiap seri menghasilkan papan peringkat.
Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Bahasa saat ini tidak ditampilkan, tetapi cuplikan memang membutuhkan dan menguraikannya, dan saya dapat menambahkan leaderboard berdasarkan bahasa di masa mendatang.)
For N ≤ 4, your submission must produce a tiling within 1 minute at least 80% of the time.
terlalu mudah: 80% dari waktu ubin yang sama, dasar, kalau tidak saya menemukan ubin lain di waktu apa pun yang saya inginkanJawaban:
CJam, 105 byte
Baris baru ditambahkan untuk menghindari pengguliran. Cobalah online
Penjelasan:
Solusi ini memulai setiap baris sebagai zigzag, kemudian menempatkan N menggarisbawahi di atasnya, berdasarkan posisi mereka pada baris sebelumnya dan beberapa aturan. Saya mendapatkan ini dari serangkaian pengamatan sambil melihat output sebagai matriks 2D karakter sederhana:
/\
di bagian atas,\/
di bagian bawah)/_/
hanya bisa berubah -1 atau 0, dan\_\
hanya bisa berubah 0 atau 1"_ "
pola atau" _"
pola, keduanya baik-baik sajaJadi saya memutuskan untuk mengimplementasikannya dengan mempertahankan posisi garis bawah sebelumnya, memodifikasinya dengan faktor acak (2 pilihan untuk setiap garis bawah) dan mengulangi sampai aturan terpenuhi. Dalam proses pengoptimalan, saya beralih ke posisi garis bawah relatif ke sisi kiri segi enam (tidak termasuk spasi).
Versi "3D" lama, 189 byte:
Cobalah online
sumber
Python 2,
337335324318311300296 byteIdenya adalah untuk pertama-tama membuat berlian segi enam, seperti ini:
Dan kemudian mengisinya dengan jalan bawah garis bawah, seperti ini:
Hasil akhir dengan semua jalur yang ditambahkan akan terlihat seperti ini:
Cukup banyak kode untuk memastikan jalur ini tidak keluar dari batas atau saling silang.
Kode yang tidak dipisahkan:
sumber
randint(0,1)*(p<n*3+i*2-j)
untukrandint(0,p<n*3+i*2-j)
.Perl,
174 168 166161Coba saya .
sumber
JavaScript ( ES6 ), 376
416 494Hanya untuk berada di sana ...
Ini membangun semua tilings, lalu pilih yang acak. Waktu untuk tilings 232848 untuk N = 4 adalah ~ 45 detik di laptop saya. Saya tidak mencoba N = 5.
Menjadi EcmaScript 6 hanya berjalan di Firefox.
sumber
dom.max_script_run_time
. Ini adalah preferensi global dalam tentang: config, milikku disetel ke 30.SmileBASIC, 241 byte
Sangat didasarkan pada jawaban Matty
sumber