Ini adalah tantangan kedua dari dua "menarik fungsi tegang". Inilah Bagian I yang sedikit lebih sederhana .
Mari kita pindahkan kuku ke papan pada posisi (x 1 , y 1 ) ke (x m , y m ) . Ikatkan karet gelang ke yang pertama dan terakhir, dan regangkan di sekitar kuku lainnya, sehingga pita tersebut melintasi semua kuku secara berurutan. Perhatikan bahwa karet gelang sekarang menggambarkan fungsi parameterised linear piecewise (x (t), y (t)) dalam ruang 2D.
Sekarang drive n kuku lainnya ke papan, pada posisi (x 1 , y 1 ) ke (x n , y n ) . Jika sekarang kita menghapus semua asli m kuku kecuali yang pertama dan terakhir satu (yang ujung karet terikat), karet gelang akan mempersingkat sampai berbohong kencang di sekitar kuku baru, menghasilkan piecewise lain linear fungsi.
Sebagai contoh, ambil m = 12 paku awal pada posisi (0, 0), (2, -1), (3/2, 4/3), (7/2, 1/3), (11/2, 16/3), (1, 16/3), (0, 1), (7, -2), (3, 4), (8, 1), (3, -1), (11, 0) , dan n = 10 paku lebih lanjut pada posisi (1, 1), (3, 1), (4, 4), (1, 3), (2, 2), (5, -1), (5, 0) ), (6, 2), (7, 1), (6, 0) . Tiga plot berikut menunjukkan proses yang dijelaskan di atas:
Untuk versi yang lebih besar: Klik kanan -> Buka di tab baru
Dan inilah animasi pengetatan karet gelang jika Anda mengalami kesulitan memvisualisasikannya:
Tantangan
Diberi dua daftar "paku", plot karet gelang kencang di sekitar daftar kedua jika dimulai dari bentuk melintasi semua paku di daftar pertama.
Anda dapat menulis program atau fungsi dan mengambil input melalui STDIN, ARGV atau argumen fungsi. Anda dapat menampilkan hasilnya di layar atau menyimpan gambar ke file.
Jika hasilnya dirasterisasi, setidaknya perlu 300 piksel di setiap sisi. Karet gelang dan paku terakhir harus menutupi setidaknya 75% dari batas gambar horisontal dan vertikal. Skala panjang x dan y harus sama. Anda harus menunjukkan paku di set kedua (menggunakan setidaknya 3x3 piksel) dan string (setidaknya 1 piksel lebar). Anda mungkin atau mungkin tidak termasuk sumbu.
Warna adalah pilihan Anda, tetapi Anda membutuhkan setidaknya dua warna yang dapat dibedakan: satu untuk latar belakang dan satu untuk kuku dan tali (meskipun mungkin memiliki warna yang berbeda).
Anda dapat mengasumsikan bahwa semua paku pada daftar kedua setidaknya 10 -5 unit jauhnya dari bentuk awal karet gelang (sehingga Anda tidak perlu khawatir tentang ketidaktepatan titik mengambang).
Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
Lebih banyak contoh
Berikut adalah dua contoh lagi:
{{1, 1}, {3, 3}, {2, 4}, {1, 3}, {4, 0}, {3, -1}, {2, 0}, {4, 2}}
{{2, 1}, {3, 2}, {1, 2}, {4, 1}}
{{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 5}, {3, 5}, {-1, 3}, {-1, 0}, {3, 4}, {5, 1}, {5, -1}, {7, -1}, {3, 7}, {7, 5}}
{{0, 0}, {0, 2}, {0, 4}, {0, 6}, {2, 0}, {2, 2}, {2, 4}, {2, 6}, {4, 0}, {4, 2}, {4, 4}, {4, 6}, {6, 0}, {6, 2}, {6, 4}, {6, 6}}
Dan di sini adalah salah satu contoh yang menunjukkan pentingnya dua kuku awal yang tersisa. Hasilnya harus b dan tidak a :
{{0, 0}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 0}}
{{-0.5, 0.5}}
Terima kasih kepada Ell karena memberikan contoh ini.
sumber
Jawaban:
Python + matplotlib, 688
Membaca dua daftar poin dari STDIN.
Contoh
Bagaimana itu bekerja
Kunci dari solusinya adalah bekerja dalam langkah-langkah kecil dan bertahap. Alih-alih mencoba mencari tahu apa yang terjadi ketika kita menghapus semua kuku sekaligus, kita berkonsentrasi pada efek langsung dari menghilangkan hanya satu kuku. Kami kemudian dapat menghapus kuku satu per satu dalam urutan acak.
Bekerja secara bertahap berarti bahwa kita harus melacak keadaan antara karet gelang. Inilah bagian yang sulit: hanya melacak kuku mana yang dilalui band tidak cukup. Selama proses menghilangkan kuku, pita dapat mengalami luka dan kemudian terlepas di sekitar kuku. Oleh karena itu, ketika pita berinteraksi dengan paku, kita harus melacak berapa kali dan ke arah mana pita itu membungkusnya. Kami melakukannya dengan memberikan nilai pada setiap paku di sepanjang pita seperti berikut:
Perhatikan bahwa:
Kami mulai menghitung segera setelah pita bersinggungan dengan kuku, meskipun kuku tidak benar-benar memengaruhi bentuknya. Ingatlah bahwa, tidak seperti ilustrasi itu, kuku kita tidak berdimensi. Karena itu, jika pita menjadi bersinggungan dengan paku, kami tidak dapat menentukan sisi pita mana yang digunakan oleh paku itu sendiri --- kami harus melacak di mana dulu relatif terhadap pita.
Kami menjaga kuku dengan nilai nol, yaitu kuku yang dulu, tetapi tidak lagi memegang pita, bukannya melepasnya segera. Jika kami melakukannya, itu dapat memicu reaksi berantai yang tidak disukai, sementara kami mencoba untuk menjaga efek dari setiap langkah terlokalisasi. Sebaliknya, paku dengan nilai nol dianggap memenuhi syarat untuk dihilangkan sebagai bagian dari proses yang lebih besar.
Sekarang kita dapat menggambarkan apa yang terjadi pada setiap langkah:
Kami memilih kuku untuk dihapus dari jalur band saat ini. Paku memenuhi syarat untuk dihapus jika paku itu merupakan bagian dari set kuku pertama (simpan untuk titik akhir) atau jika nilainya nol.
Berpura-pura bahwa dua kuku tetangga sudah diperbaiki, kami mencari tahu kuku mana dari set kedua atau sepasang titik akhir yang akan dilewati band setelah kuku yang dipilih dilepas (kami tidak repot-repot dengan sisa kuku dari kuku). set pertama, karena mereka akan akhirnya semua dihapus.) Kami melakukannya dengan cara yang sama dengan solusi untuk Bagian I . Semua paku ini berada di sisi yang sama dari pita, oleh karena itu kami menugaskan mereka semua nilai 1 atau -1 , tergantung pada sisi.
Kami memperbarui nilai kedua paku tetangga untuk mencerminkan perubahan pada jalur band (mudahnya bagian paling sulit!)
Proses ini diulangi sampai tidak ada lagi kuku yang perlu dihilangkan:
Dan inilah contoh yang lebih rumit menggambarkan band yang membungkus paku beberapa kali:
sumber
Java - 1262 byte
Saya tahu ini mungkin tidak golf sebanyak itu.
Namun, sepertinya tidak ada orang lain yang melangkah ke piring dan menjawab pertanyaan ini, jadi saya akan melakukannya.
Pertama, kelas "T" - yang merupakan kelas titik - 57 byte
Dan kelas utama - 1205 byte
Contoh:
Untuk menjalankannya, panggil fungsi "d" dengan Daftar poin dan deretan paku (ya, saya tahu, aneh). Apa fungsinya:
Saya tidak yakin apakah sumbu dalam piksel ok. Itu akan selalu mengambil lebih dari 75% dari ruang, mungkin hanya sangat, sangat kecil.
Berikut ini adalah animasi yang bagus untuk menunjukkan apa yang saya lakukan di sini:
Akhirnya, ini menjadi ini, di mana poin hampir tidak bergerak. Inilah saat saya melihat kuku yang disentuhnya:
Berikut adalah kode animasi yang tidak disatukan:
sumber