Anda adalah geek pemrograman muda yang tinggal bersama 2 teman terbaik Anda. Setiap minggu, salah satu dari Anda harus melakukan semua pekerjaan rumah dan Anda memutuskan giliran siapa dengan mengambil tongkat. Orang yang mengambil tongkat terpendek akan kalah dan mengerjakan semua tugas.
Karena Anda semua adalah programmer dan suka membuat puzzle, Anda telah memodifikasi "Pilih tongkat terpendek" menjadi puzzle komputer.
Inilah aturan teka-teki.
- Anda akan diberikan matriks 2D, di mana setiap kolom mewakili tongkat.
- Di setiap kolom, 1 mewakili sebagian dari tongkat dan 0 adalah ruang kosong
- Ketika pergi dari atas ke bawah di setiap kolom, awalnya Anda miliki
0
dan segera setelah Anda menekan1
, tongkat sudah mulai dan sisa kolom akan diisi1
hanya dengan - Anda dapat menulis program Anda untuk memilih satu kolom. Ukuran tongkat di kolom itu menentukan pemenang / pecundang. Ukuran tongkat == jumlah 1s di kolom itu.
- Namun, program itu hanya dapat memiliki kompleksitas waktu terburuk linier.
Karena Anda semua adalah pemrogram, Anda akan tahu jika program orang lain merekam batas kompleksitas waktu.
Tugas Anda adalah:
- Tulis program atau fungsi yang menerima input baik dalam format 2D atau array string.
- Input dapat diambil dari STDIN / prompt / console atau argumen fungsi.
- Jika Anda membaca input dari STDIN / prompt maka Anda dapat mengasumsikan bahwa membaca input dan mengubahnya menjadi array membutuhkan waktu 0 (walaupun kode untuk melakukannya harus ada di jawaban Anda)
- Tentukan kolom dengan tongkat terpanjang di dalamnya.
- Output dapat berupa nilai pengembalian fungsi atau ke STDOUT / konsol / peringatan.
- Program / fungsi harus memiliki kompleksitas linear waktu terburuk, di
O(m+n)
manam
adalah jumlah baris dann
jumlah kolom.
Input dapat berupa salah satu dari format berikut:
Array 2D:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Array of Strings:
[ "0000", "1000", "1101", "1111" ]
Input akan memiliki properti berikut:
- Ukuran array tidak diketahui, asumsikan persegi panjang dengan ukuran berapa pun
- Di kolom mana pun, datang dari atas ke bawah, jika Anda melihat angka 1, maka semua yang di bawah ini adalah satu
- Kosong-kolom (yaitu 0-panjang) tongkat yang diperbolehkan.
Ini adalah kode-golf sehingga kode terpendek menang ! *
Tolong jelaskan kode Anda, atau berikan versi yang tidak disatukan (untuk memverifikasi kompleksitas waktu) bersama dengan dua format input yang Anda harapkan.
UPDATE Kompleksitas waktu linear di sini berarti O (n + m) di mana n adalah ukuran kolom dan m adalah ukuran baris. (Bagi mereka yang tidak jelas)
UPDATE 2 Ini pasti bisa dilakukan dalam waktu linier. Dan jika Anda memposting jawaban, jangan ragu untuk menunda pengiriman logika / algoritma beberapa hari untuk pertarungan yang adil :)
UPDATE 3 Saya akan membahas semua jawaban dalam beberapa jam untuk memvalidasi kompleksitas waktu dan program :)
1
dalam input adalah sel terakhir lalu perlu membaca seluruh input. Bahkan jika perpustakaan standar bahasa memalsukan akses acak ke stdin, di bawah layar itu buffering dan jadi waktu yang diambil adalah Omega (n * m).