Gambar di atas disebut hexa-glyph. Hexa-glyphs adalah beberapa pola keren yang saya buat saat mencoret-coret selama kelas DiffEq saya. Begini cara Anda membuatnya:
- Pertimbangkan kumpulan titik berikut, berbentuk seperti heksagram biasa. Heksagon bagian dalam adalah yang akan berisi mesin terbang terakhir, sedangkan 6 titik luar membentuk bintang dan di mana kita akan mulai menggambar garis kita.
- Dari enam poin terluar, pilih satu pasangan secara acak. Untuk efisiensi, harus ada setidaknya satu titik lain di antara dua titik yang dipilih (jika tidak, itu tidak akan berpengaruh pada angka akhir). Kemudian, dari masing-masing dari dua titik, melemparkan sinar ke arah yang lain. Sinar ini diblokir oleh garis sebelumnya.
- Ulangi proses ini sampai semua 9 tepi telah terbentuk, seperti yang ditunjukkan pada beberapa gambar berikutnya.
- Berikut adalah contoh sinar yang diblokir. Ujung-ujung segmen sinar masih terlihat, tetapi bagian tengah terhalang oleh dua segmen pertama yang kita gambar.
- Kedua sinar ini juga "diblokir," tetapi ini tidak menyebabkan perbedaan yang terlihat karena mereka diblokir oleh garis lain yang sama.
- Maju cepat sampai semua 9 garis ditarik. Jika Anda ingin penjelasan lebih rinci tentang langkah-langkah yang dilewati ini, saya bisa menguraikannya.
- Akhirnya, hapus titik-titik bintang. Agar terlihat lebih cantik, titik-titik tebal juga dihilangkan.
Tantangan
Tantangan Anda adalah menampilkan representasi visual dari heksa-mesin terbang acak. Ini adalah kode-golf, byte terkecil menang.
Semua kemungkinan hexa-glyphs akan muncul dengan beberapa probabilitas positif. Heksa-mesin terbang yang berbeda dihasilkan dengan mengubah urutan 9 tepi digambar.
Lebih lanjut, semua gambar yang dihasilkan oleh program Anda haruslah hexa-glyph yang valid Pola-pola tertentu (seperti garis besar lengkap segi enam dalam) tidak mungkin muncul sebagai hexa-glyph, jadi Anda memprogram tidak boleh menampilkan ini.
Outputnya harus berupa gambar grafis (dicetak ke layar atau file).
Segi enam harus teratur, tetapi dapat muncul dalam orientasi apa pun.
Refleksi / rotasi tidak dianggap unik. (Ini mungkin membuat persyaratan 1 lebih mudah diikuti).
sumber
I made up while doodling during my DiffEq class
. Cara semua penemuan hebat terjadi ...: P'01'
ruang disisipkan alih-alih' *'
.Jawaban:
Mathematica,
273268264242 byteThe
menjadikan sebagai superscriptT
di Mathematica dan adalah operator postfix transpose.Menyortir bug dalam ini butuh selamanya ... menjelang akhir saya meretas beberapa hal bersama untuk membuatnya bekerja, jadi ini pasti suboptimal. Saya juga bertanya-tanya apakah mungkin lebih baik secara keseluruhan untuk mengimplementasikan spesifikasi secara lebih harfiah melalui garis-garis di heksagon luar dan membiarkan fungsi geometri Mathematica menangani persimpangan.
Perhatikan bahwa ini adalah program lengkap dan jika Anda ingin menjalankan kode beberapa kali dalam satu sesi REPL, Anda harus mengawasinya
Clear[b]
.Berikut ini adalah hasil dari 20 run:
Penjelasan
Solusi ini tidak menggunakan titik bintang luar sama sekali. Sebaliknya ia bekerja secara langsung dengan titik-titik yang merupakan bagian dari hexaglyph dan garis-garis yang mencakup tiga dari mereka sekaligus.
Mari beri label poin:
1
dimulai pada sudut yang agak aneh tapi ini karena perilaku default (juga agak aneh) dariCirclePoints
. Memulai segi enam dari sana ternyata termurah.Sekarang kami ingin menemukan garis yang relevan melalui tiga titik yang sesuai dengan titik terhubung dari bintang luar. Yang di sekitar segi enam tentu saja hanya 3 titik yang berdekatan (modulo 12), mulai dari angka ganjil. Yang di tengah terdiri dari angka genap
n
,13
dann+6
.Representasi dari baris-baris ini (dalam bentuk daftar tiga poin dihasilkan oleh kode berikut):
The
Partition
menghasilkan garis-garis di sekitar segi enam danArray
garis melalui pusat. Untuk memproses kedua balok, kami memetakan fungsi ini di atas daftar baris:Sekarang kita mengacak ini dengan
RandomSample
untuk memprosesnya secara acak.Join @@
meratakan daftar pasangan sehingga kami memiliki daftar balok.Intermission singkat: untuk melacak titik mana yang sudah diblokir, kami menggunakan fungsi pencarian
b
, yang diinisialisasiTrue
untuk semua nilai olehb@_=k=1>0;
. Saat memproses balok, kami menyimpan semua titik hingga titik pertama yang memilikib[n] == False
( termasuk yang itu):Saya merasa seperti ini adalah bagian yang paling golf saat ini ... penggunaan dua variabel sementara untuk bermain Mastermind tampaknya sangat mahal. Bagaimanapun, hasil ini memberi kita poin dalam garis yang diizinkan untuk kita gambar. Sekarang fungsi ini dipetakan di atas masing-masing poin:
Bagian pertama menghasilkan daftar semua 13 poin menggunakan hasil dua panggilan untuk disisipkan
CirclePoints
(dengan jari-jari yang berbeda untuk pusat tepi dan sudut-sudut segi enam). Perhatikanb@#=!k
yang sekarang menetapkan nilai tabel pencarian untuk titik saat iniFalse
sehingga tidak ada balok lebih lanjut yang bisa melewatinya. Akhirnya, nilai tersebut digunakan sebagai indeks ke dalam daftar koordinat untuk mendapatkan titik 2D yang benar.Ini membuang semua daftar elemen tunggal, karena akan ditampilkan sebagai poin individual (dan terlihat). Akhirnya kami memberikan hasilnya:
sumber
b@_=1>0
=b=1>0&
Sepatu (Ruby) Rev C 184 byte
12 byte disimpan dengan mentransfer tanggung jawab untuk memeriksa apakah setengah garis tertentu harus diambil dari program utama ke metode menggambar. Program utama masih harus memeriksa apakah seluruh baris benar-benar diblokir.
Sepatu (Ruby)
205... Rev B 196 byteSepatu adalah alat berbasis ruby untuk membangun GUI dll. Ini pertama kalinya saya menggunakannya. mothereff.in/byte-counter menghitung kiriman saya sebagai 196 byte, tetapi untuk beberapa alasan Sepatu menghitungnya sebagai 202.
Selain itu, Ruby memungkinkan Anda melakukan hal-hal seperti
t[a=i.ord]
tetapi anehnya, tampaknya tidak berfungsi seperti yang diharapkan dengan Shoes.Penjelasan
Saya tidak mempertimbangkan bagian-bagian dari garis di luar segi enam. Saya hanya menggambar bagian yang perlu digambar. Yang penting adalah apakah garis melintasi persimpangan (Jika kita hanya menggambar bagian yang perlu digambar, ini berarti mereka mulai / berakhir di persimpangan.)
Aturan dasarnya adalah bahwa jika kedua titik akhir dari suatu garis telah dikunjungi, garis itu diblokir dan tidak boleh ditarik. Karena garis digambar dalam dua bagian, kita juga harus memeriksa apakah titik tengah telah dikunjungi untuk melihat apakah masing-masing bagian harus ditarik atau tidak.
Saya melacak titik mana yang telah dikunjungi dalam array
t[]
. Ini akhirnya berisi entri untuk setiap koordinat fisik pada kisi di bawah ini. Tidak ada array logis 13-elemen yang terpisah. Pada akhirnya,t[]
mungkin ada 87 elemen, meskipun hanya 13 yang akan berisi data yang berguna.Secara internal, koordinat titik akhir garis diberikan oleh angka tunggal z, di mana z% 6 adalah koordinat y dan z / 6 adalah koordinat x. Dalam sistem ini segi enam diratakan. Ketika garis diplot, skala x dikalikan dengan 8 dan skala y dikalikan dengan 14, yang merupakan pendekatan rasional yang sangat dekat dengan rasio yang benar: 14/8 = 1,75 vs sqrt (3) = 1,732.
Sistem koordinat internal ditunjukkan di bawah ini, dengan beberapa sampel keluaran.
Tidak disatukan
Lebih banyak sampel keluaran
Ini dilakukan dengan versi program yang lebih lama. Satu-satunya perbedaan adalah bahwa posisi hexaglyph di jendela sekarang sedikit berbeda.
sumber
mothereff.in/byte-counter counts my submission as 196 bytes, but for some reason Shoes counts it as 202.
Saya tidak 100% tahu apakah ini benar, tetapi saya pikir alasan mengapa Shoes menghitung kode Anda sebagai 202 byte, bukan 196 adalah karena baris baru Anda sebenarnya adalah urutan dua karakter "\ r \ n." Ini membuat setiap baris dihitung dua kali. Berikut ini adalah jawaban overflow tumpukan tentang \ r dan \ n.Python,
604591574561538531536534528493483452431420419415388385384 bytesSaya telah mengadaptasi gagasan Level River St untuk memeriksa apakah suatu garis akan diblokir dengan memeriksa apakah kedua titik akhir dari garis tersebut telah dikunjungi sebelumnya. Ini menghemat 27 byte. Saran bermain golf diterima.
Sunting: Memperbaiki bug dan bermain golf
g(p,q)
selama 3 byte. GolfL
untuk satu byte.Tidak melakukan pelanggaran:
Hexa-glyphs sendiri cukup kecil karena kami menggunakan hexagon 12-pixel sebagai basis (untuk alasan bermain golf). Berikut adalah beberapa contoh hexa-glyphs (permintaan maaf untuk tanam yang buruk):
sumber
R=range;G=goto