En iyi 2 arkadaşınla birlikte yaşayan genç bir programlama inekisin. Her hafta, biriniz evin tüm işlerini yapmak zorundasınız ve bir sopa seçerek kimin sırası olduğuna karar veriyorsunuz. En kısa çubuğu seçen kişi kaybeder ve tüm işleri yapar.
Hepiniz programcı ve bulmaca oluşturmayı sevdiğiniz için, "En kısa çubuğu seç" i bir bilgisayar bulmacasına dönüştürdünüz.
İşte bulmacanın kuralları.
- Size, her sütunun bir çubuğu temsil ettiği bir 2D matris verilecektir.
- Her sütunda, 1 çubuğun bir bölümünü temsil eder ve 0 boş bir boşluktur
- Her sütunda yukarıdan aşağıya doğru giderken, başlangıçta
0
'sunuz ve1
a'ya basar basmaz, çubuk başladı ve sütunun geri kalanı1
sadece - Bir sütun seçmek için programınızı yazabilirsiniz. Bu sütundaki çubuğun boyutu kazananı / kaybedeni belirler. Çubuk boyutu == bu sütundaki 1'lerin sayısı.
- Ancak, bu program yalnızca doğrusal bir en kötü durum zaman karmaşıklığına sahip olabilir.
Hepiniz programcı olduğunuzdan, bir başkasının programının zaman karmaşıklığı sınırını aşıp atmadığını bileceksiniz.
İşiniz:
- Girişi 2B biçiminde veya dize dizisinde kabul eden bir program veya işlev yazın.
- Giriş STDIN / komut istemi / konsoldan veya bir işlev bağımsız değişkeninden alınabilir.
- Eğer girişi STDIN / isteminden okuyorsanız, giriş okumasının ve bir diziye dönüştürülmesinin 0 zaman aldığını varsayabilirsiniz (bunu yapmak için kod cevabınızda olmalı)
- İçinde en uzun çubuk olan sütunu belirleyin.
- Çıktı, işlevin dönüş değeri veya STDOUT / console / alert için olabilir.
- Program / fonksiyon kötü durum zaman karmaşıklığı, doğrusal olmalıdır satır sayısı ve bir sütun sayısı.
O(m+n)
m
n
Giriş, aşağıdaki biçimlerden biri olabilir:
2D dizi:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Dizi Dizisi:
[ "0000", "1000", "1101", "1111" ]
Girdi aşağıdaki özelliklere sahip olacaktır:
- Dizinin boyutu bilinmiyor, herhangi bir boyutta bir dikdörtgen olduğunu varsayalım
- Herhangi bir sütunda, yukarıdan aşağıya gelir, 1 görürseniz, aşağıdaki her şey bir olacaktır
- Boş-sütunlar (örneğin 0-uzunluk) çubukları vardır izin verdi.
Bu bir kod golf çok kısa kod kazanır ! *
Lütfen kodunuzu açıklayın veya ungolfed sürümünü (zaman karmaşıklığını doğrulamak için) beklediğiniz iki giriş biçiminden hangisiyle birlikte verin.
GÜNCELLEME Buradaki doğrusal zaman karmaşıklığı, n'nin sütun boyutu ve m, satır boyutu olduğu O (n + m) anlamına gelir. (Belirsiz olanlar için)
GÜNCELLEME 2 Bu kesinlikle olabilir doğrusal zamanda yapılabilir. Ve eğer bir cevap gönderiyorsanız, mantık / algoritmayı adil bir mücadele için birkaç gün göndermeyi geciktirmekten çekinmeyin :)
GÜNCELLEME Zaman karmaşıklığını ve programı doğrulamak için birkaç saat içinde tüm cevapları gözden geçireceğim :)
1
, girişteki tek son hücre girdinin tamamını okumak gerekir. Bir dilin standart kütüphanesi stdin'e rasgele erişim sansa bile, sahnelerin altında onu arabelleğe alır ve böylece geçen zaman Omega (n * m) olur.