Arka fon
Her biri tamsayı uzunluğuna sahip (kapalı) bir çubuk zinciri düşünün. Belirli bir zincirle kaç farklı deliksiz poliomino oluşturabilirsiniz? Veya başka bir deyişle, belirli bir zincirle eksenle hizalanmış kenarları olan, birbiriyle kesişen kaç farklı çokgen oluşturabilirsiniz?
Bir örneğe bakalım. Olarak temsil edebileceğimiz, uzunluk 1 ve 2'nin 8 çubuğundan oluşan belirli bir zinciri düşünün [1, 1, 2, 2, 1, 1, 2, 2]
. Rotasyonlara ve çevirilere kadar, sadece 8 olası poliomino vardır (farklı yansımaları sayıyoruz):
Bu ilk çubuk koyu mavi ve daha sonra çokgeni saat yönünün tersine hareket ettiriyoruz.
Dönme hissi yukarıdaki örnekteki sonucu etkilemez. Ancak [3, 1, 1, 1, 2, 1, 1]
, aşağıdaki 3 polominoyu veren başka bir zinciri düşünelim :
Biz anlamına Bildirimi değil o saat yönünde geçişi gerektirecektir, çünkü son Polyomino bir yansıması sayılabilir.
Aynı uzunlukta daha esnek bir zincirimiz [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
olsaydı, aslında toplam 9 olan diğer bazı polyoninolar arasında her iki yansımayı da oluşturabilirdik:
Meydan okuma
Bir zincirin, bir dizi veya benzeri olarak bir açıklaması verildiğinde , çevreyi saat yönünün tersine hareket ederken çubukları sırayla kullanarak oluşturabileceğiniz (dönüşlere ve çevirilere kadar) farklı poliomino sayısını belirleyin .
Lütfen tam bir program yazın ve derlemek (varsa) ve komut satırından kodunuzu çalıştırmak için komutlar ekleyin. Lütfen kendi diliniz için ücretsiz bir derleyici / tercüman bağlantısı da ekleyin.
Programınız STDIN girişini okumalıdır. İlk satır bir tamsayı M içerecektir . Bir sonraki M çizgileri, her biri boşlukla ayrılmış bir çubuk uzunluğu listesi olacak test senaryoları olacaktır. Programınız , her biri tek bir tam sayıdan oluşabilecek STDOUT'a M satırları yazdırmalıdır - oluşturulabilen farklı poliomino sayısı.
Sadece tek bir iplik kullanmalısınız.
Programınız hiçbir zaman 1 GB'den fazla bellek kullanmamalıdır. (Bu tamamen katı bir sınır değildir, ancak yürütülebilir dosyalarınızın bellek kullanımını izleyeceğim ve sürekli olarak 1 GB'den fazla kullanan veya önemli ölçüde üzerinde artış olan herhangi bir işlemi öldüreceğim.)
Aşırı miktarda ön hesaplama yapılmasını önlemek için kodunuz 20.000 bayttan uzun olmamalı ve herhangi bir dosya okumamalısınız.
Ayrıca seçilen belirli test senaryolarına göre optimize etmemelisiniz (örneğin, sonuçlarını kodlayarak). Yaptığınızdan şüpheleniyorsam, yeni kıyaslama setleri oluşturma hakkını saklı tutarım. Test setleri rasgele olduğundan, programınızın bunlardaki performansı, rasgele girdi performansı için temsilci olmalıdır. Yapmanıza izin verilen tek varsayım, çubuk uzunluklarının toplamının eşit olmasıdır.
puanlama
N = 10, 11, ..., 20 çubuklu zincirler için karşılaştırma setleri sağladım. Her test seti, uzunlukları 1 ile 4 arasında olan 50 rastgele zincir içerir.
Birincil puanınız, programınızın tüm test setini 5 dakika içinde tamamladığı en büyük N'dir (makinemde, Windows 8 altında). Bağlantı kesici, programınız tarafından bu test setinde geçen gerçek zaman olacaktır.
Birisi en büyük test setini geçerse, daha büyük olanları eklemeye devam edeceğim.
Test Durumları
Uygulamanızın doğruluğunu kontrol etmek için aşağıdaki test senaryolarını kullanabilirsiniz.
Input Output
1 1 0
1 1 1 1 1
1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 3
1 1 1 1 1 1 1 1 1 1 9
1 1 1 1 1 1 1 1 1 1 1 1 36
1 1 1 1 1 1 1 1 1 1 1 1 1 1 157
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 758
1 1 2 2 1 1 2 2 8
1 1 2 2 1 1 2 2 1 1 23
1 1 2 2 1 1 2 2 1 1 2 2 69
1 2 1 2 1 2 1 2 3
1 2 1 2 1 2 1 2 1 2 1 2 37
1 2 3 2 1 2 3 2 5
1 2 3 2 1 2 3 2 1 2 3 2 23
3 1 1 1 2 1 1 3
1 2 3 4 5 6 7 1
1 2 3 4 5 6 7 8 3
1 2 3 4 5 6 7 8 9 10 11 5
2 1 5 3 3 2 3 3 4
4 1 6 5 6 3 1 4 2
3 5 3 5 1 4 1 1 3 5
1 4 3 2 2 5 5 4 6 4
4 1 3 2 1 2 3 3 1 4 18
1 1 1 1 1 2 3 3 2 1 24
3 1 4 1 2 2 1 1 2 4 1 2 107
2 4 2 4 2 2 3 4 2 4 2 3 114
Burada bunlarla birlikte bir girdi dosyası bulabilirsiniz .
Liderler Sıralaması
User Language Max N Time taken (MM:SS:mmm)
1. feersum C++ 11 19 3:07:430
2. Sp3000 Python 3 18 2:30:181