Tujuan dari tantangan ini adalah untuk menghasilkan animasi sistem rantai drive , yang terdiri dari satu set roda gigi sproket yang dihubungkan bersama oleh rantai .
Persyaratan Umum
Program Anda akan diberi daftar sprocket , ditentukan sebagai (x, y, radius)
kembar tiga. Sistem penggerak rantai yang dihasilkan terdiri dari sprocket ini, dihubungkan bersama oleh rantai tegang tertutup yang melewati masing-masing, secara berurutan . Tujuan Anda adalah untuk menghasilkan animasi looping tanpa batas , yang menunjukkan sistem bergerak. Misalnya diberi input
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
, hasilnya akan terlihat seperti
.
Sistem koordinat harus sedemikian rupa sehingga sumbu x mengarah ke kanan, dan sumbu y mengarah ke atas. Anda dapat mengasumsikan bahwa jari-jari bahkan bilangan lebih besar dari atau sama dengan 8 (kita akan melihat mengapa ini penting nanti.) Anda juga dapat berasumsi bahwa setidaknya ada dua sprocket , dan sprocket tidak saling berpotongan . The unitdari input tidak terlalu kritis. Semua contoh dan uji kasus dalam posting ini menggunakan piksel sebagai unit input (jadi, misalnya, jari-jari sproket tengah pada gambar sebelumnya adalah 24 piksel;) cobalah untuk tidak menyimpang terlalu banyak dari unit ini. Di sisa tantangan, kuantitas spasial dipahami diberikan dalam satuan yang sama dengan input — pastikan untuk menjaga proporsinya dengan benar! The dimensi output harus sedikit lebih besar dari kotak berlari dari semua sprockets, cukup besar sehingga seluruh sistem terlihat. Secara khusus, posisi absolut sprocket tidak boleh memengaruhi output; hanya posisi relatif mereka yang seharusnya (jadi, misalnya, jika kita menggeser semua sprocket pada contoh di atas dengan jumlah yang sama, hasilnya akan tetap sama.)
Rantai harus bersinggungan dengan sprocket yang dilewatinya di semua titik kontak, dan lurus ke tempat lain. Rantai harus melewati sprocket sehingga segmen rantai yang berdekatan (yaitu, bagian rantai antara dua sprocket, yang bertemu pada sproket yang sama) tidak saling berpotongan .
.
Misalnya, sementara sistem kiri di atas valid, yang di tengah tidak, karena dua segmen rantai yang berdekatan yang melewati sproket kiri bawah berpotongan. Namun, perhatikan bahwa sistem yang tepat adalah valid, karena dua segmen rantai yang bersilangan tidak berdekatan (sistem ini diproduksi oleh input yang berbeda dari dua lainnya, meskipun.)
Untuk menjaga hal-hal sederhana (r), Anda dapat mengasumsikan bahwa tidak ada sproket memotong lambung cembung dari dua sprocket tetangga, atau lambung cembung dari masing-masing tetangga dan tetangga lainnya. Dengan kata lain, sproket atas pada diagram di bawah ini mungkin tidak berpotongan dengan daerah yang diarsir.
Segmen rantai dapat memotong sprocket selain yang dilewati (seperti pada test case terakhir). Dalam hal ini, rantai harus selalu muncul di depan sprocket.
Persyaratan Visual
Rantai harus terdiri dari serangkaian tautan dengan lebar bergantian. Lebar tautan sempit harus sekitar 2, dan lebar tautan lebar harus sekitar 5. Panjang kedua jenis tautan harus kira-kira sama. The periodedari rantai, yaitu total panjang pasangan lebar / sempit dari tautan, harus merupakan bilangan terdekat dengan 4π yang cocok dengan bilangan bulat bilangan kali dalam panjang rantai. Misalnya, jika panjang rantai adalah 1.000, maka periode harus 12,5, yang merupakan angka terdekat dengan 4π (12.566 ...) yang sesuai dengan jumlah bilangan bulat (80) dalam 1.000. Penting bagi periode untuk memasukkan bilangan bulat berapa kali dalam panjang rantai, sehingga tidak ada artefak pada titik di mana rantai membungkus.
Sproket jari-jari R harus terdiri dari tiga bagian konsentris: poros tengah , yang harus berupa lingkaran jari-jari sekitar 3; tubuh sproket , di sekitar poros, yang seharusnya berupa lingkaran jari-jari sekitar R -4.5; dan pelek sproket , di sekitar tubuh, yang seharusnya menjadi lingkaran jari-jari sekitar
R - 1.5. Pelek juga harus mengandung gigi sproket , yang harus memiliki lebar sekitar 4; ukuran dan jarak gigi harus sesuai dengan ukuran mata rantai, sehingga ikatannya rapi.
Periode gigi sproket, yaitu jarak antara dua gigi berurutan di sepanjang sproket, harus sesuai dengan periode rantai. Karena periode sekitar 4π, dan karena jari-jari sproket dijamin genap, periode tersebut harus sesuai dengan keliling sproket dalam jumlah yang hampir bilangan bulat, sehingga tidak boleh ada artefak yang terlihat pada titik di mana gigi sproket membungkus.
Anda dapat menggunakan kombinasi warna apa saja untuk rantai, bagian sproket yang berbeda, dan latar belakang, selama mereka mudah dibedakan . Latar belakang mungkin transparan. Contoh-contoh dalam posting ini digunakan #202020
untuk rantai, #868481
untuk poros dan pelek #646361
sproket , dan untuk tubuh sproket.
Persyaratan Animasi
The sproket pertama dalam daftar masukan harus memutar searah jarum jam ; sisa sprocket harus berputar sesuai. Rantai harus bergerak dengan kecepatan sekitar 16π (sekitar 50) unit per detik; kecepatan bingkai terserah Anda, tetapi animasi harus terlihat cukup halus.
Animasi harus diulang mulus .
Kesesuaian
Beberapa atribut dan proporsi visual sengaja ditentukan hanya secara kasar — Anda tidak harus mencocokkannya dengan tepat . Output program Anda tidak harus berupa replika pixel-ke-pixel dari contoh-contoh yang diberikan di sini, tetapi harus terlihat serupa. Secara khusus, proporsi yang tepat dari rantai dan sprocket, dan bentuk yang tepat dari rantai dan gigi sproket, fleksibel.
Poin paling penting untuk diikuti adalah:
- Rantai harus melewati sprocket, dalam urutan input, dari arah yang benar.
- Rantai harus bersinggungan dengan sprocket di semua titik kontak.
- Tautan rantai dan gigi sprocket harus terpasang dengan rapi, setidaknya hingga memperbaiki jarak dan fase.
- Jarak antara mata rantai, dan gigi sprocket, harus sedemikian rupa sehingga tidak ada artefak yang terlihat pada titik di mana mereka membungkus.
- Sprocket harus berputar ke arah yang benar.
- Animasi harus diulang mulus.
Sebagai catatan terakhir, sementara, secara teknis, tujuan dari tantangan ini adalah menulis kode terpendek, jika Anda merasa ingin menjadi kreatif dan menghasilkan output yang lebih rumit, tentu saja, lakukanlah!
Tantangan
Tulis program atau fungsi , ambil daftar sprocket, dan buat animasi sistem drive rantai yang sesuai, seperti dijelaskan di atas.
Masukan dan keluaran
Anda dapat mengambil input melalui baris perintah , melalui STDIN , sebagai argumen fungsi , atau menggunakan metode yang setara . Anda dapat menggunakan format yang sesuai untuk input, tetapi pastikan untuk menentukannya di posting Anda.
Sebagai output , Anda dapat menampilkan animasi secara langsung , menghasilkan file animasi (misalnya, GIF animasi), atau menghasilkan urutan file bingkai (namun, ada penalti kecil dalam kasus ini; lihat di bawah.) Jika Anda menggunakan output file, pastikan jumlah frame masuk akal (contoh dalam posting ini menggunakan sangat sedikit frame;) jumlah frame tidak harus minimal, tetapi Anda tidak harus menghasilkan terlalu banyak frame berlebihan. Jika Anda menampilkan urutan bingkai, pastikan untuk menentukan kecepatan bingkai dalam posting Anda.
Skor
Ini adalah kode-golf . The jawaban terpendek , dalam byte, menang.
+ 10% Penalti Jika program Anda menghasilkan urutan frame sebagai output, alih-alih menampilkan animasi secara langsung atau menghasilkan file animasi tunggal, tambahkan 10% ke skor Anda.
Uji Kasus
Tes 1
(0, 0, 26), (120, 0, 26)
Tes 2
(100, 100, 60), (220, 100, 14)
Tes 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Tes 4
(0, 0, 60), (44, 140, 16), (-204, 140, 16), (-160, 0, 60), (-112, 188, 12),
(-190, 300, 30), (30, 300, 30), (-48, 188, 12)
Tes 5
(0, 128, 14), (46.17, 63.55, 10), (121.74, 39.55, 14), (74.71, -24.28, 10),
(75.24, -103.55, 14), (0, -78.56, 10), (-75.24, -103.55, 14), (-74.71, -24.28, 10),
(-121.74, 39.55, 14), (-46.17, 63.55, 10)
Tes 6
(367, 151, 12), (210, 75, 36), (57, 286, 38), (14, 181, 32), (91, 124, 18),
(298, 366, 38), (141, 3, 52), (80, 179, 26), (313, 32, 26), (146, 280, 10),
(126, 253, 8), (220, 184, 24), (135, 332, 8), (365, 296, 50), (248, 217, 8),
(218, 392, 30)