Bu kod meydan okuması fikri basittir: bir tamsayılar matrisi verildiğinde, Rubik tarzı hareketleri uygulayarak sıralayalım. Bu, tek bir satır veya sütun seçebileceğiniz ve öğelerini herhangi bir yönde döndürebileceğiniz anlamına gelir:
[1, 3, 2, 4] => [3, 2, 4, 1] (rotate left for rows/up for columns)
[1, 3, 2, 4] => [4, 1, 3, 2] (rotate right for rows/down for columns)
Bu nedenle, herhangi bir boyutta tamsayılar matrisi verildiğinde, öğelerini yalnızca bu Rubik tarzı dönüşümleri uygulayarak sıralayın. Bir matris
öğeleri aşağıdaki kısıtlamaya uyduğu takdirde sıralanmış olarak kabul edilecektir:
I / O
- Girdi, tekrarlanan değerleri olmayan pozitif tamsayıların bir matrisi olacaktır.
- Çıktı, onu sıralamak için gereken hareketler olacaktır. Bu bir kod golf meydan okuması olmadığından ve uzunluğu hakkında endişelenmenize gerek olmadığından, her hareket için önerilen format , taşınacak satır veya sütunun sayısının (0 dizinli) olduğu ve
#[UDLR]
buradaki tek bir karakter olduğu hareketin Yukarı / Aşağı (sütunlar için) veya Sol / Sağ (satırlar için) olup olmadığını belirten aralık. Bu , "1. sütunu yukarı taşı" anlamına gelir, ancak "1. satırı sağa taşı" anlamına gelir. Bir çözelti, bu gibi ifade edilebilir böylece hareketleri virgülle ayrılmış olacaktır: .#
[UDLR]
1U
1R
1R,1U,0L,2D
puanlama
Bir matrisi bu şekilde sıralamaya çalışmak, birçok olası hareket kombinasyonu olduğu için pahalı olabilir ve bunu sıralayabilen birçok olası hareket listesi de vardır, bu nedenle amaç N * 'yi sıralayan bir kod yazmaktır. Aşağıdaki N matrisleri. Skor, hatasız makul bir süre 1'de çözebileceğiniz en büyük N boyutu olacaktır (matrisin boyutu ne kadar büyük olursa, o kadar iyidir). Beraberlik durumunda, kravat kırıcı bulunan yolunuzdaki hareketlerin sayısı olacaktır (yol ne kadar kısa olursa o kadar iyidir).
Örnek: A kullanıcısı N = 5 için bir çözüm bulursa ve B N = 6 için bir çözüm bulursa, B her iki yolun uzunluğuna bakılmaksızın kazanır. Her ikisi de N = 6 için çözüm bulursa, ancak A'nın bulduğu çözeltinin 50 adımı ve B'nin çözeltisinin 60 adımı varsa, A kazanır.
Kodunuzun nasıl çalıştığına ilişkin açıklamalar büyük bir teşviktir ve lütfen bunları test edebilmemiz için bulunan çözümleri gönderin . Çözümler çok büyükse Pastebin veya benzeri araçları kullanabilirsiniz . Ayrıca, çözümlerinizi bulmak için kodunuz tarafından harcanan sürenin tahmini takdir edilecektir.
Test senaryoları
Aşağıdaki matrisler ( daha kopyalanabilir bir versiyon için Pastebin bağlantısı ), zaten sıralanmış matrislerden 10K rastgele, Rubik tarzı hareketlerle karıştırılarak oluşturulmuştur:
Düz Metin Test Durumları:
[[8, 5, 6], [11, 10, 1], [3, 15, 13]]
[[21, 10, 12, 16], [17, 6, 22, 14], [8, 5, 19, 26], [13, 24, 3, 1]]
[[1, 13, 8, 16, 5], [9, 40, 21, 26, 22], [11, 24, 14, 39, 28], [32, 19, 37, 3, 10], [30, 17, 36, 7, 34]]
[[34, 21, 40, 22, 35, 41], [18, 33, 31, 30, 12, 43], [19, 11, 39, 24, 28, 23], [44, 1, 36, 5, 38, 45], [14, 17, 9, 16, 13, 26], [8, 3, 47, 6, 25, 4]]
[[20, 36, 17, 1, 15, 50, 18], [72, 67, 34, 10, 32, 3, 55], [42, 43, 9, 6, 30, 61, 39], [28, 41, 54, 27, 23, 5, 70], [48, 13, 25, 12, 46, 58, 63], [52, 37, 8, 45, 33, 14, 68], [59, 65, 56, 73, 60, 64, 22]]
[[85, 56, 52, 75, 89, 44, 41, 68], [27, 15, 87, 91, 32, 37, 39, 73], [6, 7, 64, 19, 99, 78, 46, 16], [42, 21, 63, 100, 4, 1, 72, 13], [11, 97, 30, 93, 28, 40, 3, 36], [50, 70, 25, 80, 58, 9, 60, 84], [54, 96, 17, 29, 43, 34, 23, 35], [77, 61, 82, 48, 2, 94, 38, 66]]
[[56, 79, 90, 61, 71, 122, 110, 31, 55], [11, 44, 28, 4, 85, 1, 30, 6, 18], [84, 43, 38, 66, 113, 24, 96, 20, 102], [75, 68, 5, 88, 80, 98, 35, 100, 77], [13, 21, 64, 108, 10, 60, 114, 40, 23], [47, 2, 73, 106, 82, 32, 120, 26, 36], [53, 93, 69, 104, 54, 19, 111, 117, 62], [17, 27, 8, 87, 33, 49, 15, 58, 116], [95, 112, 57, 118, 91, 51, 42, 65, 45]]
Hepsini çözerseniz lütfen daha fazlasını isteyin. :-) Ve kum havuzundayken bu zorluğu düzeltmeme yardımcı olan insanlara çok teşekkürler .
1 Makul bir süre: çözümünüzü test ederken sabrımızı zedelemeyen herhangi bir süre. TIO'nun yalnızca 60 saniye kod çalıştırdığını unutmayın, bu sınırın üzerindeki herhangi bir süre kodu kodları makinelerimizde test etmemizi sağlayacaktır. Örnek: Oldukça verimsiz algoritmam, 3x3 ve 4x4 dereceli matrisleri çözmek için birkaç milisaniye sürer, ancak 5x5 matrisle test ettim ve çözmek 317 saniye sürdü (5 milyondan fazla hareketle, bunu düşünürsek çok komik) çözülecek matris sadece 10K kez karıştırıldı ). Hareket sayısını 10K'dan az azaltmaya çalıştım, ancak kodu yürüttükten 30 dakika sonra teslim oldum.
O(input size)
? 5x5'lik bir matris için O(25)
? Bu son derece hızlı görünüyor, bu yüzden algoritmanızı veya uygulamanızı görmek isterim. DÜZENLEME: 'Şifreli' matrisi girdiğimizi ve hareketleri çıkardığımızı anlıyorsunuz, değil mi? Tam tersi değil.