Bu meydan okumanın amacı bir animasyonunu üretmektir zincir tahrik kümesi oluşan sistemin, zincir dişlisi dişli bir araya bağlanmış zincirin .
Genel Gereksinimler
Programınıza üçlü olarak belirtilen zincir dişlileri listesi verilecektir (x, y, radius)
. Elde edilen zincir tahrik sistemi, bir ile birbirine bağlanır, bu zincir dişlisi, oluşan kapalı gergin zinciri , her biri üzerinden geçen amacıyla . Amacınız sistemi hareket halinde gösteren, sonsuz döngülü bir animasyon üretmektir . Örneğin, giriş verilen
(0, 0, 16), (100, 0, 16), (100, 100, 12), (50, 50, 24), (0, 100, 12)
, çıktı gibi bir şey olmalı
.
Koordinat sistemi doğru x-ekseni noktaları ve y-ekseni yukarı işaret eden şekilde olması gerekmektedir. Yarıçapların 8'e eşit veya ondan daha büyük sayılar olduğunu varsayabilirsiniz (bunun neden daha sonra önemli olduğunu göreceğiz.) Ayrıca, en az iki dişlinin olduğunu ve dişlilerin birbiriyle kesişmediğini varsayabilirsiniz . birimlerGirişin çok kritik değil. Bu gönderideki tüm örnekler ve test senaryoları, giriş birimleri olarak pikselleri kullanır (bu nedenle, önceki şekildeki orta zincir dişlisinin yarıçapı 24 pikseldir;), bu birimlerden çok fazla sapma yapmamaya çalışın. Zorluğun geri kalanında, mekansal büyüklüklerin girdiyle aynı birimlerde verildiği anlaşılıyor - oranları doğru tutmaya dikkat edin! Çıkış boyutları tüm sistemin görünür olması için yeterince büyük, bütün dişlilerinin sınırlayıcı kutusundan biraz daha büyük olmalıdır. Özellikle, dişlilerin mutlak konumları çıkışı etkilememelidir; sadece onların göreceli konumları olmalıdır (bu nedenle, örneğin yukarıdaki örnekteki tüm dişlileri aynı miktarda kaydırırsak, çıktı aynı kalır.)
Zincir , tüm temas noktalarında geçtiği zincir dişlisine teğet olmalı ve her yerde düz olmalıdır . Zincir, bitişik zincir bölümlerinin (yani, iki zincir dişlisi arasındaki zincir dişlisinin aynı zincir dişlisi ile aynı olan kısımları) birbiriyle kesişmeyeceği şekilde zincir dişlilerinden geçmelidir .
.
Örneğin, yukarıdaki soldaki sistem geçerliyken, ortadaki değil, çünkü sol alt zincir dişlisinin üzerinden geçen iki bitişik zincir parçası kesişiyor. Bununla birlikte, doğru sistem dikkat olan iki kesişen zincir parçaları bitişik değildir, çünkü geçerli (bu sistem de, diğer iki daha farklı bir giriş tarafından üretilir.)
İşleri basitleştirmek için (r), hiçbir dişlinin , iki komşu dişlisinin dışbükey kabuğunu ya da her bir komşusunun ve diğer komşusunun dışbükey kabuğunu kesişmediğini varsayabilirsiniz . Başka bir deyişle, aşağıdaki diyagramdaki üst zincir dişlisi gölgeli bölgelerin hiçbiriyle kesişmeyebilir.
Zincir parçaları, geçtiklerinden başka zincir dişlileriyle kesişebilir (örneğin son test durumundaki gibi). Bu durumda, zincir her zaman dişlilerin önünde görünmelidir.
Görsel Gereksinimler
Zincir , değişken genişlikte bir dizi bağlantıdan oluşmalıdır . Dar bağlantının genişliği yaklaşık 2 olmalı ve geniş bağlantının genişliği yaklaşık 5 olmalıdır . Her iki bağlantı türünün uzunluğu yaklaşık olarak eşit olmalıdır. dönemyani, geniş / dar bir çift bağlantı halkasının toplam uzunluğu, zincirin uzunluğuna tam sayıya uyan 4π'ye en yakın sayı olmalıdır. Örneğin, zincirin uzunluğu 1.000 ise, periyodu 12.5 olmalıdır, bu da 1000'de tam sayı sayısına (80) uyan 4π (12.566 ...) en yakın sayıdır. Dönemin zincir uzunluğuna tam sayıya uyması önemlidir, böylece zincirin etrafına sarıldığı noktada herhangi bir eser kalmaz.
Bir yarıçap R dişlisi üç eş merkezli parçadan oluşmalıdır: merkezi bir aks , yaklaşık 3 yarıçapı bir daire olmalıdır; Sprocket'ın vücut yaklaşık yarıçaplı bir daire olmalıdır milinin etrafında R - 4.5; ve dişli çarkın gövdesi etrafında,
R - 1.5 civarında bir yarıçap dairesi olması gerekir . Jant ayrıca, dişlisinin yaklaşık 4 genişliğinde olmalıdır; Dişlerin ebatları ve aralıkları, zincir bağlantılarının ebatlarına uygun olmalıdır, böylece düzgün bir şekilde birleşirler.
Zincir dişlilerinin dişlerinin süresi, yani zincir dişlisinin çevresi boyunca iki ardışık diş arasındaki mesafe, zincir periyoduyla eşleşmelidir. Süre yaklaşık 4π olduğundan ve zincir dişlisinin yarıçapının eşit olması garanti edildiğinden, zincir dişlisinin çevresine neredeyse tam sayıdaki bir sayıya uyması gerekir; Zincir dişlilerinin dişleri etrafından dolanır.
Zincir, zincir dişlisinin farklı parçaları ve arka plan için kolayca ayırt edilebildikleri sürece herhangi bir renk kombinasyonunu kullanabilirsiniz . Arkaplan şeffaf olabilir. Bu gönderideki örnekler zincir, zincir dişlisi aksı ve kenarı için ve zincir dişlisi gövdesi için kullanılır. #202020
#868481
#646361
Animasyon Gereksinimleri
Birinci dişli dönmelidir giriş listesinde saat yönünde ; zincir dişlisinin geri kalanı buna göre dönmelidir. Zincir, saniyede yaklaşık 16π (yaklaşık 50) birim hızında hareket etmelidir ; kare hızı size kalmış, ancak animasyon yeterince yumuşak görünmelidir.
Animasyon sorunsuz döngü yapmalı .
Uygunluk
Bazı görsel nitelikler ve oranlar kasıtlı olarak yalnızca kabaca belirtilmiştir; bu özelliklerle tam olarak eşleşmeniz gerekmez . Programınızın çıktısı burada verilen örneklerin piksel piksel boyutunda bir kopyası olmak zorunda değildir, ancak benzer görünmesi gerekir. Özellikle, zincirin ve dişlilerin tam oranları ve zincir bağlantılarının ve dişlilerinin dişlerinin tam şekli esnektir.
İzlenecek en önemli noktalar şunlardır:
- Zincir dişlilerinin üzerinden, giriş sırasına göre doğru yönden geçmelidir.
- Zincir, tüm temas noktalarındaki dişlilere teğet olmalıdır.
- Zincirin bağlantıları ve dişlilerin dişleri, en azından doğru mesafeyi ve fazı düzeltmek için düzgünce bağlanmalıdır.
- Zincirin bağlantıları ve dişlilerin dişleri arasındaki boşluk, etraflarında dolandıkları noktada farkedilebilecek herhangi bir artefakt bulunmayacak şekilde olmalıdır.
- Zincir dişlileri doğru yönde dönmelidir.
- Animasyon sorunsuz döngü yapmalı.
Son bir not olarak, teknik olarak, bu zorluğun amacı, yaratıcı olmak ve daha ayrıntılı bir çıktı üretmek istiyorsanız, elbette, bunun için gitmeyi düşünüyorsanız, en kısa kodu yazmaktır!
Meydan okuma
Bir zincir listesi alarak ve yukarıda açıklandığı gibi ilgili zincir tahrik sistemi animasyonu üreten bir program veya fonksiyon yazın .
Giriş ve çıkış
Sen alabilir girişi yoluyla komut satırı aracılığıyla, STDIN olarak, fonksiyon argümanları veya kullanan eşdeğer bir yöntem . Girdi için uygun herhangi bir format kullanabilirsiniz , ancak gönderiminizde belirttiğinizden emin olun.
Gibi çıktı , belgeyi doğrudan animasyonu görüntülemek , bir üretirler animasyon dosyası (örneğin, animasyonlu GIF) veya üretmek çerçeve dosyalarının dizisini (ancak, bu durumda küçük bir ceza yoktur;. Aşağıya bakınız) dosya çıktısı kullanırsanız, kare sayısının makul olduğundan emin olun (bu gönderideki örnekler çok az kare kullanır;) kare sayısının minimum olması gerekmez, ancak çok fazla gereksiz kare üretmemelisiniz. Bir kare dizisi çıkarırsanız , gönderiminizde kare hızını belirttiğinizden emin olun .
Puan
Bu kod golfü . En kısa cevap bayt cinsinden kazanır.
+% 10 Ceza Programınız çıktı olarak bir dizi animasyon üretiyorsa, animasyonu doğrudan görüntülemek veya tek bir animasyon dosyası oluşturmak yerine puanınıza% 10 ekleyin.
Test Kılıfları
Test 1
(0, 0, 26), (120, 0, 26)
Test 2
(100, 100, 60), (220, 100, 14)
Test 3
(100, 100, 16), (100, 0, 24), (0, 100, 24), (0, 0, 16)
Test 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)
5. Test
(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)
Test 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)