Öğrencilere ilk olarak matematiksel indüksiyonun kanıtlama tekniği hakkında bilgi verildiğinde , yaygın bir örnek, 2 N × 2 N ızgarasının L-şekilli trominolarla döşenmesi ve önceden belirlenmiş bir ızgara alanını boş bırakma problemidir . (N, negatif olmayan bir tamsayıdır.)
Henüz bilmiyorsanız, kanıtın üzerinden geçmek için size bırakacağım. Bunu tartışan birçok kaynak var.
Buradaki göreviniz, N için bir değer alan bir programın yanı sıra boş bırakılacak ızgara alanının koordinatlarını yazmak ve ortaya çıkan tromino döşenmiş ızgaranın ASCII temsilini yazdırmaktır.
Karakter O
boş alanı dolduracak ve trominomuzun 4 rotasyonu şöyle görünecek:
|
+-
|
-+
-+
|
+-
|
(Evet, +
hangisi -
ve |
belirli düzenlemeler için geçerli olan belirsiz olabilir , ama sorun değil.)
Programınız en az N = 8'e (256 × 256 ızgara için) kadar N = 0 (1 × 1 ızgara için) için çalışmalıdır. Aşağıdakiler için koordinat olan x ve y değerleri verilecektir O
:
- x yatay eksendir. x = 1 sol ızgara kenarı, x = 2 N sağ ızgara kenarı.
- y dikey eksendir. y = 1 üst ızgara kenarı, y = 2 N alt ızgara kenarıdır.
Hem x hem de y daima [1, 2 N ] aralığındadır .
Bu nedenle, belirli bir N, x ve y için programınız, bir L olacak x, y ızgara koordinatı hariç, tamamen L şeklinde trominolarla döşenmiş 2 N × 2 N ızgara yazdırmalıdır O
.
Örnekler
N = 0 ise, x ve y'nin her ikisi de 1 olmalıdır. Çıktı basitçe
O
N = 1, x = 1 ve y = 2 ise, çıkış
-+
O|
N = 2, x = 3, y = 2:
+--+
||O|
|+-|
+--+
N = 2, x = 4, y = 1:
+-|O
||+-
|+-|
+--+
N = 3, x = 3, y = 6 (örn. Bu sayfadaki resim ):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
||O|-+||
|+-||-+|
+--++--+
ayrıntılar
- Tüm bir programı yazmak yerine 3 tamsayıyı alan bir işlev yazabilirsiniz. Izgara dizesini yazdırmalı veya döndürmelidir.
- Stdin, komut satırından (veya işlevi yazıyorsanız işlev argümanlarından) girdi alın.
- Çıktı isteğe bağlı olarak tek bir eğitim satırsonu içerebilir.
- Sen değil gerekli kanıtı normalde gösteriyor ki fayans yöntemi kullanmak. Sadece ızgaranın L şeklindeki trominolarla dolu olması önemlidir
O
. (Trominolar kesilemez veya ızgara sınırlarından dışarı çıkmayabilir.)
Bayt cinsinden en kısa kod kazanır. Tiebreaker önceki gönderi. ( Kullanışlı bayt sayacı. )
if p!=i
; içerideki listeye.join()
gerek yok[]
;(1-i%2)
olarak yapılabilir~i%2
; aşağıdakit,l,a=[],...
gibi yazmak için tekrarlanabilir ambalajı kullanabilirsiniz*t,l,a=...
; negatif olamaz çünküif n==0
kontrol edilebilir ; final , muhtemelen her öğenin yazdırılmasıyla yapılabilir, çünkü genel kurallar geri dönüş yerine yazdırmaya izin verir; olabilir sıfırdan farklı değerler Truthy çünkü.if n<1
n
"\n".join
if p!=i
if p-i