CJam, 33 32 20 19 17 bayt
@ Sp3000 ve @ MartinBüttner'den büyük destekle revize edilmiş versiyon:
qN/_z]{:e`z,3<}/|
Çevrimiçi deneyin
Katılımlar
- @ Sp3000, orijinal algoritmam için kritik bir basitleştirme önerdi.
- @ MartinBüttner, çılgın golf becerilerini revize edilmiş yaklaşıma uyguladı; bu da sadeleştirmeyi düşündükten sonra bile elde edebileceğimden daha kısa bir kodla sonuçlandı.
Algoritma ve Kanıt
Aşağıda, yatayda kaymakta olan bulmacanın kriterleri açıklanmaktadır. Dikey durum, satırlar yerine sütunlara bakılarak veya karakter matrisinin çevrilerek ve satırlara tekrar bakılarak belirlenebilir.
Aynı harfin azami bir sırası için "stretch" terimini kullanacağım. Örneğin, aşağıdaki satırlar sırasıyla 1, 2 ve 3 uzatmaya sahiptir:
AAAAAAAA
BBBAAAAA
AABBBAAA
Ayrılamayacak bir satır / bulmaca için "kilitli" terimini de kullanacağım.
Kilit gözlem, bulmacanın yalnızca tüm satırların en fazla 2 uzaması durumunda kayar olmasıdır . Veya tersi çevrilmişse, sadece 2'den fazla uzanan bir satır varsa ve eğer varsa kilitlenir .
Aşağıdakiler katı bir matematik kanıtı olarak nitelenmeyebilir, ancak bunun neden böyle olması gerektiğine dair ikna edici bir açıklama getirdiğine inanıyorum.
2'den fazla esneme sırasına sahipse, bulmacanın kilitlendiğini görmek kolaydır. 3 uzatma ile üst üste bakmak:
BBBAAB
A
streç streçler arasında kilitli olduğu için yapbozun kaymasını önlediği açıktır B
. Bu, sıranın kilitli olduğu anlamına gelir, bu da sırayla bütün bulmacayı birbirine kilitler.
İspatın zıt yönü tam olarak belli değil. Tüm satırların yalnızca 1 veya 2 uzanma olduğu kilitli bir bulmaca olmadığını göstermemiz gerekir. Birkaç gözlemle başlayarak:
- Yalnızca 1 uzatmalı satırlar, her iki yönde de çarpışma olmadan kayabilecekleri için bir yapbozun birbirine kilitlenmesine katkıda bulunmaz.
- 2 menziller tüm satırları aynı sırada varsa
A
ve B
, bulmaca açıkça kenetlenmiş değildir. Bu durumda, tüm A
hücreler tüm B
hücrelerin dışında kalır veya tam tersidir ve iki parçayı birbirinden kaydırırken çarpışma olmaz.
Tek zor durum, 2 farklı düzene sahip sıralara sahip olduğumuz bulmacalardır. Bu tür bulmacaların verilen şartnamelerde bulunmadığını göstereceğim . Bunu göstermek için .
, joker karakterler olan , bu yapılandırmaya sahip kısmi bir bilmeceye bakalım :
.......
AAABBBB
.......
BBAAAAA
.......
Şimdi, şartname hem söylüyor A
ve B
hücreler sadece tüm geçerli bulmaca bağlanır. A
Yukarıdaki kısmi bulmacaya bağlı hücreleri yapmak için iki seçeneğimiz var:
B
Örneğin , uzantılarından birinin etrafında dönüyoruz :
..AAAAAA
AAABBBBA
.......A
BBAAAAAA
........
Bunu yapmak için, kaçınılmaz bir şekilde satırlardan birini 3 uzatmak için genişletiyoruz, bu nedenle bu bize asla tüm satırların en fazla 2 uzatmaya sahip olduğu geçerli bir bilmece sunmayacak.
Onları doğrudan bir yola bağlarız:
.......
AAABBBB
..A....
BBAAAAA
.......
A
Hücreler artık sadece bağlanır ve 2'den fazla menziller ile hiçbir satır hala vardır. Bununla birlikte, B
hücrelerin de basit bir şekilde bağlanması gerekir. Doğrudan yol şimdi bağlı A
hücreler tarafından engellenir ve B
hücreleri bağlamanın tek yolu, hücre uzantılarından birinin etrafında dolaşmaktır A
. Bu, 3 genişletme satırları oluşturmadan bunu yapamayacağımız vaka 1'e geri döner.
Uzamaları saymak için uygulama CJam RLE operatörünü kullanır.
Kod açıklaması
qN/ Get input and split at newlines.
_z Make a transposed copy.
] Wrap the original and transposed puzzle in an array so that we can
loop over the two.
{ Start of loop over original and transposed puzzle.
:e` Apply RLE to all rows.
z, Transpose the matrix with the RLE rows, and take the element count of the
result. Or in other words, take the column count. This will be the length
of the longest row after RLE.
3< Check the length for less than 3.
}/ End of loop over original and transposed puzzle.
| Or the results of the two.