Eğlence , rekabetçi olmayan
GÜNCELLEŞTİRME! Büyük performans iyileştirme! n = 7 şimdi 10 dakikadan kısa sürede tamamlanıyor! Dipteki açıklamaya bakınız!
Bu yazmak çok eğlenceliydi. Bu, Funciton'da yazılmış bu problem için kaba kuvvet çözücüdür. Bazı factoids:
- STDIN'de bir tamsayı kabul eder. Herhangi bir yabancı boşluk, tamsayıdan sonraki yeni satır da dahil olmak üzere onu kırar.
- 0 - n - 1 (1 - n değil ) sayılarını kullanır .
- Izgarayı “geriye doğru” doldurur, böylece en üst satırın okumak
3 2 1 0
yerine en alt satırın okuduğu bir çözüm elde edersiniz 0 1 2 3
.
- N = 1
0
için doğru çıktı (tek çözüm) .
- N = 2 ve n = 3 için boş çıktı .
- Bir exe'ye derlendiğinde, n = 7 için yaklaşık 8 takes dakika sürer (performans geliştirmeden yaklaşık bir saat önceydi). Derleme olmadan (tercüman kullanarak) yaklaşık 1,5 kat daha uzun sürer, bu nedenle derleyiciyi kullanmak buna değer.
- Kişisel bir dönüm noktası olarak, ilk kez bir sözde kod dilinde yazmadan önce bütün bir Funciton programını yazdım. İlk önce gerçek C # ile yazdım.
- (Ancak, bu ilk kez Funciton'daki bir şeyin performansını toplu olarak iyileştirmek için bir değişiklik yapmamı değildi. Bunu ilk kez faktoring fonksiyonunda yaptım. Çarpma işlemlerinin sırasını değiştirmek büyük bir fark yarattı. Çarpma algoritması nasıl çalışır ? Sadece merak ediyorsanız diye.)
Daha fazla uzatmadan:
┌────────────────────────────────────┐ ┌─────────────────┐
│ ┌─┴─╖ ╓───╖ ┌─┴─╖ ┌──────┐ │
│ ┌─────────────┤ · ╟─╢ Ӂ ╟─┤ · ╟───┤ │ │
│ │ ╘═╤═╝ ╙─┬─╜ ╘═╤═╝ ┌─┴─╖ │ │
│ │ └─────┴─────┘ │ ♯ ║ │ │
│ ┌─┴─╖ ╘═╤═╝ │ │
│ ┌────────────┤ · ╟───────────────────────────────┴───┐ │ │
┌─┴─╖ ┌─┴─╖ ┌────╖ ╘═╤═╝ ┌──────────┐ ┌────────┐ ┌─┴─╖│ │
│ ♭ ║ │ × ╟───┤ >> ╟───┴───┘ ┌─┴─╖ │ ┌────╖ └─┤ · ╟┴┐ │
╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌─────┤ · ╟───────┴─┤ << ╟─┐ ╘═╤═╝ │ │
┌───────┴─────┘ ┌────╖ │ │ ╘═╤═╝ ╘══╤═╝ │ │ │ │
│ ┌─────────┤ >> ╟─┘ │ └───────┐ │ │ │ │ │
│ │ ╘══╤═╝ ┌─┴─╖ ╔═══╗ ┌─┴─╖ ┌┐ │ │ ┌─┴─╖ │ │
│ │ ┌┴┐ ┌───────┤ ♫ ║ ┌─╢ 0 ║ ┌─┤ · ╟─┤├─┤ ├─┤ Ӝ ║ │ │
│ │ ╔═══╗ └┬┘ │ ╘═╤═╝ │ ╚═╤═╝ │ ╘═╤═╝ └┘ │ │ ╘═╤═╝ │ │
│ │ ║ 1 ╟───┬┘ ┌─┴─╖ └───┘ ┌─┴─╖ │ │ │ │ │ ┌─┴─╖ │
│ │ ╚═══╝ ┌─┴─╖ │ ɓ ╟─────────────┤ ? ╟─┘ │ ┌─┴─╖ │ ├─┤ · ╟─┴─┐
│ ├─────────┤ · ╟─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴────┤ + ╟─┘ │ ╘═╤═╝ │
┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═╧═╕ ╔═══╗ ┌───╖ ┌─┴─╖ ┌─┴─╖ ╘═══╝ │ │ │
┌─┤ · ╟─┤ · ╟───┐ └┐ └─╢ ├─╢ 0 ╟─┤ ⌑ ╟─┤ ? ╟─┤ · ╟──────────────┘ │ │
│ ╘═╤═╝ ╘═╤═╝ └───┐ ┌┴┐ ╚═╤═╛ ╚═╤═╝ ╘═══╝ ╘═╤═╝ ╘═╤═╝ │ │
│ │ ┌─┴─╖ ┌───╖ │ └┬┘ ┌─┴─╖ ┌─┘ │ │ │ │
│ ┌─┴───┤ · ╟─┤ Җ ╟─┘ └────┤ ? ╟─┴─┐ ┌─────────────┘ │ │
│ │ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │ │╔════╗╔════╗ │ │
│ │ │ ┌──┴─╖ ┌┐ ┌┐ ┌─┴─╖ ┌─┴─╖ │║ 10 ║║ 32 ║ ┌─────────────────┘ │
│ │ │ │ << ╟─┤├─┬─┤├─┤ · ╟─┤ · ╟─┘╚══╤═╝╚╤═══╝ ┌──┴──┐ │
│ │ │ ╘══╤═╝ └┘ │ └┘ ╘═╤═╝ ╘═╤═╝ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ │
│ │ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ┌─┴─╖ ╔═╧═╕ └─┤ ? ╟─┤ · ╟─┤ % ║ │
│ └─────┤ · ╟─┤ · ╟──┤ Ӂ ╟──┤ ɱ ╟─╢ ├───┐ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ │
│ ╘═╤═╝ ╘═╤═╝ ╘═╤═╝ ╘═══╝ ╚═╤═╛ ┌─┴─╖ ┌─┴─╖ │ └────────────────────┘
│ └─────┤ │ └───┤ ‼ ╟─┤ ‼ ║ │ ┌──────┐
│ │ │ ╘═══╝ ╘═╤═╝ │ │ ┌────┴────╖
│ │ │ ┌─┴─╖ │ │ │ str→int ║
│ │ └──────────────────────┤ · ╟───┴─┐ │ ╘════╤════╝
│ │ ┌─────────╖ ╘═╤═╝ │ ╔═╧═╗ ┌──┴──┐
│ └──────────┤ int→str ╟──────────┘ │ ║ ║ │ ┌───┴───┐
│ ╘═════════╝ │ ╚═══╝ │ │ ┌───╖ │
└───────────────────────────────────────────────────────┘ │ └─┤ × ╟─┘
┌──────────────┐ ╔═══╗ │ ╘═╤═╝
╔════╗ │ ╓───╖ ┌───╖ │ ┌───╢ 0 ║ │ ┌─┴─╖ ╔═══╗
║ −1 ║ └─╢ Ӝ ╟─┤ × ╟──┴──────┐ │ ╚═╤═╝ └───┤ Ӂ ╟─╢ 0 ║
╚═╤══╝ ╙───╜ ╘═╤═╝ │ │ ┌─┴─╖ ╘═╤═╝ ╚═══╝
┌─┴──╖ ┌┐ ┌───╖ ┌┐ ┌─┴──╖ ╔════╗ │ │ ┌─┤ ╟───────┴───────┐
│ << ╟─┤├─┤ ÷ ╟─┤├─┤ << ║ ║ −1 ║ │ │ │ └─┬─╜ ┌─┐ ┌─────┐ │
╘═╤══╝ └┘ ╘═╤═╝ └┘ ╘═╤══╝ ╚═╤══╝ │ │ │ └───┴─┘ │ ┌─┴─╖ │
│ └─┘ └──────┘ │ │ └───────────┘ ┌─┤ ? ╟─┘
└──────────────────────────────┘ ╓───╖ └───────────────┘ ╘═╤═╝
┌───────────╢ Җ ╟────────────┐ │
┌────────────────────────┴───┐ ╙───╜ │
│ ┌─┴────────────────────┐ ┌─┴─╖
┌─┴─╖ ┌─┴─╖ ┌─┴─┤ · ╟──────────────────┐
│ ♯ ║ ┌────────────────────┤ · ╟───────┐ │ ╘═╤═╝ │
╘═╤═╝ │ ╘═╤═╝ │ │ │ ┌───╖ │
┌─────┴───┘ ┌─────────────────┴─┐ ┌───┴───┐ ┌─┴─╖ ┌─┴─╖ ┌─┤ × ╟─┴─┐
│ │ ┌─┴─╖ │ ┌───┴────┤ · ╟─┤ · ╟──────────┤ ╘═╤═╝ │
│ │ ┌───╖ ┌───╖ ┌──┤ · ╟─┘ ┌─┴─┐ ╘═╤═╝ ╘═╤═╝ ┌─┴─╖ │ │
│ ┌────┴─┤ ♭ ╟─┤ × ╟──┘ ╘═╤═╝ │ ┌─┴─╖ ┌───╖└┐ ┌──┴─╖ ┌─┤ · ╟─┘ │
│ │ ╘═══╝ ╘═╤═╝ ┌───╖ │ │ │ × ╟─┤ Ӝ ╟─┴─┤ ÷% ╟─┐ │ ╘═╤═╝ ┌───╖ │
│ ┌─────┴───┐ ┌────┴───┤ Ӝ ╟─┴─┐ │ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ │ │ └───┤ Ӝ ╟─┘
│ ┌─┴─╖ ┌───╖ │ │ ┌────╖ ╘═╤═╝ │ └───┘ ┌─┴─╖ │ │ └────┐ ╘═╤═╝
│ │ × ╟─┤ Ӝ ╟─┘ └─┤ << ╟───┘ ┌─┴─╖ ┌───────┤ · ╟───┐ │ ┌─┴─╖ ┌───╖ │ │
│ ╘═╤═╝ ╘═╤═╝ ╘══╤═╝ ┌───┤ + ║ │ ╘═╤═╝ ├──┴─┤ · ╟─┤ × ╟─┘ │
└───┤ └────┐ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ │ ╔═══╗ ┌─┴─╖ ┌─┴─╖ ╘═╤═╝ ╘═╤═╝ │
┌─┴─╖ ┌────╖ │ ║ 0 ╟─┤ ? ╟─┤ = ║ ┌┴┐ │ ║ 0 ╟─┤ ? ╟─┤ = ║ │ │ ┌────╖ │
│ × ╟─┤ << ╟─┘ ╚═══╝ ╘═╤═╝ ╘═╤═╝ └┬┘ │ ╚═══╝ ╘═╤═╝ ╘═╤═╝ │ └─┤ << ╟─┘
╘═╤═╝ ╘═╤══╝ ┌┐ ┌┐ │ │ └───┘ ┌─┴─╖ ├──────┘ ╘═╤══╝
│ └────┤├──┬──┤├─┘ ├─────────────────┤ · ╟───┘ │
│ └┘┌─┴─╖└┘ │ ┌┐ ┌┐ ╘═╤═╝ ┌┐ ┌┐ │
└────────────┤ · ╟─────────┘ ┌─┤├─┬─┤├─┐ └───┤├─┬─┤├────────────┘
╘═╤═╝ │ └┘ │ └┘ │ └┘ │ └┘
└───────────────┘ │ └────────────┘
İlk versiyonun açıklaması
İlk sürüm n = 7'yi çözmek için yaklaşık bir saat sürdü . En altta 10 dakikanın altında bir değişiklik yapmak için ne gibi değişiklikler yaptığımı açıklayacağım.
Bitlere bir gezi
Bu programın bitlere ihtiyacı var. Çok fazla bit gerektiriyor ve doğru yerlere ihtiyaç duyuyor. Tecrübeli Funciton programcıları zaten n bit ihtiyacınız olursa , bu formülü kullanabileceğinizi biliyorlar.
hangi Funciton olarak ifade edilebilir
Performans optimizasyonumu yaparken, bu formülü kullanarak aynı değeri daha hızlı hesaplayabildiğimi farkettim:
Umarım bu yazıdaki tüm denklem grafiklerini buna göre güncellemediğim için beni affedersiniz.
Şimdi, bitişik bir bit bloğu istemediğinizi varsayalım; Aslında, her k- bit bitinde düzenli aralıklarla n bit istersiniz , bunun gibi:
LSB
↓
00000010000001000000100000010000001
└──┬──┘
k
Bunun formülü, bildikten sonra oldukça açık:
Kodda, işlev n ve kӜ
değerlerini alır ve bu formülü hesaplar.
Kullanılan sayıları takip etmek
Vardır , n nihai ızgara ² numaraları, ve her sayı herhangi biri olabilir , n olası değerler. Her hücrede hangi sayılara izin verildiğini takip etmek için , belirli bir değerin alındığını göstermek üzere bir bitin ayarlandığı n ³ bitlerden oluşan bir sayı tutarız. Başlangıçta, bu sayı kesinlikle 0'dır.
Algoritma sağ alt köşede başlar. "Tahmin" işleminden sonra ilk sayı 0'dır, aynı satır, sütun ve köşegen boyunca hiçbir hücrede 0'a artık izin verilmediğini izlememiz gerekir:
LSB (example n=5)
↓
10000 00000 00000 00000 10000
00000 10000 00000 00000 10000
00000 00000 10000 00000 10000
00000 00000 00000 10000 10000
10000 10000 10000 10000 10000
↑
MSB
Bu amaçla, aşağıdaki dört değeri hesaplıyoruz:
Şu anki satır: Her n. Bit'de (hücre başına bir tane) n bite ihtiyacımız var ve ardından her sıranın n ² bit içerdiğini hatırlatarak geçerli sıra r'ye kaydırmalıyız :
Geçerli sütun: Her n ²-bit biti (satır başına bir) n bite ihtiyacımız var ve sonra her sütunun n bit içerdiğini hatırlatarak geçerli sütuna c kaydırın :
İleri diyagonal: Her bir bit için n bit gerekir ... (dikkat ettiniz mi? Çabuk, anlayın!) ... n ( n + 1) -th bit (iyi iş!) ileri çapraz:
Geri çapraz: Burada iki şey var. İlk önce, geriye doğru diyagonal olup olmadığımızı nasıl bilebiliriz? Matematiksel olarak, koşul c = ( n - 1) - r'dir , bu da c = n + (- r - 1) ile aynıdır . Hey, bu sana bir şey hatırlatıyor mu? Bu doğru, ikisinin tamamlayıcısıdır, bu yüzden düşüş yerine bitsel olumsuzlamayı (Funciton'da çok verimli) kullanabiliriz. İkincisi, yukarıdaki formül en az anlamlı bitin ayarlanmasını istediğimizi varsayıyor, ancak geriye doğru diyagonalde bunu yapmıyoruz, bu yüzden onu yukarı kaydırmamız gerekiyor ... biliyor musunuz? ... Bu doğru, n ( n - 1).
Bu, n = 1 ise potansiyel olarak 0'a bölündüğümüz tek yer bu . Ancak, Funciton umrunda değil. 0 ÷ 0 sadece 0'dır, bilmiyor musunuz?
Kodda, fonksiyon Җ
(en alttaki) n'yi ve bir dizini alır (ondan r ve c'yi bölme ve geri kalanı ile hesaplar), bu dört değeri hesaplar ve or
bunları birlikte s.
Kaba kuvvet algoritması
Kaba kuvvet algoritması Ӂ
(üstteki işlev) tarafından uygulanır . O alır n (ızgara boyutu), endeksi (ızgara şu anda bir numara yerleştiriyoruz) ve alınan (ile sayı n bize hangi numaralar anlatan ³ bit biz her hücrede hâlâ yer).
Bu işlev bir dizi dizge döndürür. Her dize ızgaraya tam bir çözümdür. Bu tam bir çözücüdür; izin verirseniz tüm çözümleri iade eder, ancak tembel olarak değerlendirilmiş bir dizi olarak döndürür.
Eğer endeks 0 ulaşmıştır biz boş bir dize içeren bir diziyi (tek çözüm olduğunu hücrelerin kapakları hiçbiri) dönmek böylece başarıyla, tüm ızgara doldurdum. Boş dize 0
ve bunu ⌑
tek elemanlı bir sıraya dönüştürmek için kütüphane işlevini kullanıyoruz .
Aşağıda performans iyileştirmesi altında açıklanan kontrol burada gerçekleşir.
Eğer endeks henüz 0 ulaşmadı biz şimdi bir numara yerleştirmek gerekir hangi indeksi (çağrı olsun 1 ile olarak azaltmak ix ).
♫
0 - n - 1 arasındaki değerleri içeren tembel bir sekans oluşturmak için kullanıyoruz .
Daha sonra ɓ
sırayla aşağıdakileri yapan lambda ile (monadik bağlama) kullanıyoruz :
- İlgili biraz bakmak Önce alınan numara burada ya da değil geçerli olup olmadığına karar vermek. Biz bir numara yerleştirebilirsiniz i ancak ve ancak alınan & (1 << ( n × ix ) << i ) zaten ayarlı değil. Ayarlandıysa, geri dönün
0
(boş sıralama).
Җ
Geçerli satır, sütun ve köşegen (ler) e karşılık gelen bitleri hesaplamak için kullanın . Bunu Shift i ve daha sonra or
da üzerine alınan .
- Ardından
Ӂ
kalan hücrelere ait tüm çözümleri geri almak için çağrısı yapın, yeni alınan ve azalan ix . Bu tamamlanmamış dizgelerin bir sırasını döndürür; Her dize, ix karakterlerine sahiptir ( ix dizinine kadar doldurulmuş ızgara ).
- Kullanım
ɱ
(harita) thusly bulunan çözümlerin geçmesi ve kullanımı ‼
bitiştirmek için i her sonuna. Eğer bir yeni satır ekleme endeksi bir katıdır n aksi bir alan.
Sonuç üretiliyor
Ana program n'yi çağırır Ӂ
(kaba kırıcı) n , index = n ² (ızgarayı geriye doğru doldurduğumuzu unutmayın) ve alınmış = 0 (başlangıçta hiçbir şey alınmaz). Bunun sonucu boş bir sekanssa (çözüm bulunamadı), boş dizgeyi çıkartın. Aksi halde, dizideki ilk dizgiyi çıkar. Bunun, dizinin yalnızca ilk öğesini değerlendireceği anlamına geldiğine dikkat edin, bu nedenle çözücü tüm çözümleri bulana kadar devam etmiyor.
Performans iyileştirme
(Açıklamanın eski sürümünü zaten okuyanlar için: program artık çıktı için ayrı olarak bir dizgeye dönüştürülmesi gereken bir dizi dizisi oluşturmaz; sadece doğrudan bir dizi dizisi oluşturur. Açıklamayı buna göre düzenledim. (Ama bu ana gelişme değildi. İşte geliyor.)
Makinemde, ilk sürümün derlenmiş exe'si n = 7'yi çözmek için tam olarak 1 saat sürdü . Bu 10 dakikalık verilen süre içinde değildi, bu yüzden dinlenmedim. (Aslında, dinlenmeme sebebim, bunu nasıl büyük ölçüde hızlandıracağım konusunda fikrim vardı.)
Yukarıda tarif edilen algoritma, araştırmasını durdurur ve alınan numaradaki tüm bitlerin ayarlandığı bir hücreyle her karşılaştığında , bu hücreye hiçbir şey koyamayacağına işaret eder.
Bununla birlikte, algoritma, ızgarayı , tüm bu bitlerin ayarlandığı hücreye kadar doldurmaya devam edecektir . Doldurulmuş olan herhangi bir hücrede, en son doldurulmuş hücrelerin tümü zaten ayarlanmış en kısa sürede durursa , bu, hangi numaraları koyduğumuz önemli değildir, şebekenin geri kalanını asla çözemeyeceğimizi gösterir. o. Ancak, herhangi bir hücrenin n bitlerinin hepsine bakmadan ayarlanmış olup olmadığını nasıl etkili bir şekilde kontrol edersiniz ?
Hile alınan numaraya hücre başına tek bir bit ekleyerek başlar . Yukarıda gösterilenler yerine, şimdi şuna benziyor:
LSB (example n=5)
↓
10000 0 00000 0 00000 0 00000 0 10000 0
00000 0 10000 0 00000 0 00000 0 10000 0
00000 0 00000 0 10000 0 00000 0 10000 0
00000 0 00000 0 00000 0 10000 0 10000 0
10000 0 10000 0 10000 0 10000 0 10000 0
↑
MSB
N ³ yerine, şimdi bu sayıda n ² ( n + 1) bit var. Geçerli satırı / sütunu / köşegeni dolduran işlev buna göre değiştirildi (aslında, dürüst olmak gerekirse tamamen yeniden yazıldı). Bu işlev yine de hücre başına yalnızca n bit doldurur , bu nedenle eklediğimiz ekstra bit her zaman olacaktır 0
.
Şimdi, hesaplamanın yarısında olduğumuzu 1
, orta hücreye yeni yerleştirdiğimizi ve alınan sayının şöyle göründüğünü varsayalım:
current
LSB column (example n=5)
↓ ↓
11111 0 10010 0 01101 0 11100 0 11101 0
00011 0 11110 0 01101 0 11101 0 11100 0
11111 0 11110 0[11101 0]11100 0 11100 0 ← current row
11111 0 11111 0 11111 0 11111 0 11111 0
11111 0 11111 0 11111 0 11111 0 11111 0
↑
MSB
Gördüğünüz gibi, üst sol hücre (dizin 0) ve orta sol hücre (dizin 10) şimdi imkansız. Bunu en verimli şekilde nasıl belirleriz?
Her hücrenin 0'ıncı bitinin ayarlandığı, ancak yalnızca geçerli dizine kadar olan bir sayı düşünün. Böyle bir sayının, bilinen formülü kullanarak hesaplanması kolaydır:
Bu iki sayıyı birlikte eklesek ne alırız?
LSB LSB
↓ ↓
11111 0 10010 0 01101 0 11100 0 11101 0 10000 0 10000 0 10000 0 10000 0 10000 0 ╓───╖
00011 0 11110 0 01101 0 11101 0 11100 0 ║ 10000 0 10000 0 10000 0 10000 0 10000 0 ║
11111 0 11110 0 11101 0 11100 0 11100 0 ═══╬═══ 10000 0 10000 0 00000 0 00000 0 00000 0 ═════ ╓─╜
11111 0 11111 0 11111 0 11111 0 11111 0 ║ 00000 0 00000 0 00000 0 00000 0 00000 0 ═════ ╨
11111 0 11111 0 11111 0 11111 0 11111 0 00000 0 00000 0 00000 0 00000 0 00000 0 o
↑ ↑
MSB MSB
Sonuç:
OMG
↓
00000[1]01010 0 11101 0 00010 0 00011 0
10011 0 00001 0 11101 0 00011 0 00010 0
═════ 00000[1]00001 0 00011 0 11100 0 11100 0
═════ 11111 0 11111 0 11111 0 11111 0 11111 0
11111 0 11111 0 11111 0 11111 0 11111 0
Gördüğünüz gibi, ekleme eklediğimiz ekstra bitin üzerine taşar, ancak bu hücrenin tüm bitleri ayarlanmışsa! Bu nedenle, yapılacak tek şey bu bitleri gizlemek (yukarıdakiyle aynı formül, ancak << n ) ve sonucun 0 olup olmadığını kontrol etmektir.
00000[1]01010 0 11101 0 00010 0 00011 0 ╓╖ 00000 1 00000 1 00000 1 00000 1 00000 1 ╓─╖ ╓───╖
10011 0 00001 0 11101 0 00011 0 00010 0 ╓╜╙╖ 00000 1 00000 1 00000 1 00000 1 00000 1 ╓╜ ╙╖ ║
00000[1]00001 0 00011 0 11100 0 11100 0 ╙╥╥╜ 00000 1 00000 1 00000 0 00000 0 00000 0 ═════ ║ ║ ╓─╜
11111 0 11111 0 11111 0 11111 0 11111 0 ╓╜╙╥╜ 00000 0 00000 0 00000 0 00000 0 00000 0 ═════ ╙╖ ╓╜ ╨
11111 0 11111 0 11111 0 11111 0 11111 0 ╙──╨─ 00000 0 00000 0 00000 0 00000 0 00000 0 ╙─╜ o
Sıfır değilse, ızgara imkansız ve durabiliriz.