Pilih tongkat terpanjang

13

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.

  1. Anda akan diberikan matriks 2D, di mana setiap kolom mewakili tongkat.
  2. Di setiap kolom, 1 mewakili sebagian dari tongkat dan 0 adalah ruang kosong
  3. Ketika pergi dari atas ke bawah di setiap kolom, awalnya Anda miliki 0dan segera setelah Anda menekan 1, tongkat sudah mulai dan sisa kolom akan diisi 1hanya dengan
  4. Anda dapat menulis program Anda untuk memilih satu kolom. Ukuran tongkat di kolom itu menentukan pemenang / pecundang. Ukuran tongkat == jumlah 1s di kolom itu.
  5. 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)mana madalah jumlah baris dan njumlah 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 :)

Pengoptimal
sumber
2
Saya berpendapat bahwa ini tidak dapat dilakukan dalam O (n + m), karena setiap sel dapat berisi nilai penting (yaitu "1" pertama dari tongkat / kolom terpanjang). Jadi, Anda perlu melihat setiap sel, yang membutuhkan O (n * m).
Falko
Mungkinkah ada kolom kosong?
Martin Ender
@Optimizer: Oh, begitu. Kamu benar. :)
Falko
11
Itu tidak bisa dilakukan dalam O (n + m). Setelah input diubah menjadi format yang memungkinkan akses acak maka pemrosesan yang tersisa bisa menjadi O (n + m), tetapi Anda perlu menulis sebuah program, dan dalam kasus terburuk bahwa satu-satunya 1dalam 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).
Peter Taylor
2
Jika Anda ingin mengizinkan orang " cukup membuat fungsi yang menerima array ", pertanyaannya seharusnya tidak menyatakan bahwa mereka harus menulis sebuah program. Dan jika Anda memerlukan solusi yang ada di O (N ^ 0,5) di mana N adalah ukuran input, Anda seharusnya tidak meminta solusi waktu linier. Solusi waktu linier dapat membaca seluruh input.
Peter Taylor

Jawaban:

4

GolfScript, 45 karakter

:^,:y;0:x{^y(=x=2%y*{y(:y;x\}{x):x}if^0=,<}do

Mengambil input sebagai larik string, mengembalikan indeks kolom tertinggi (berbasis 0). Ini berjalan dalam iterasi O ( baris + kolom ), dan setiap iterasi harus mengambil waktu yang pada dasarnya konstan (setidaknya dengan asumsi aritmatika waktu konstan). Satu-satunya operasi array / string yang dilakukan dalam loop adalah pencarian elemen ( =) dan mengambil panjang string (, ), yang keduanya membutuhkan waktu konstan dalam GolfScript.

Cobalah online.

Penjelasan:

Seperti kebanyakan solusi di sini, kode ini bekerja dengan mulai dari sudut kiri bawah matriks, berjalan ke atas atau ke kanan tergantung pada apakah elemen saat ini dari matriks adalah 1 atau 0, dan melacak kolom di mana terakhir dipindahkan ke atas .

Pada awal program, saya menetapkan array input ke variabel ^, panjangnya (yaitu jumlah baris) y, dan 0 untukx . Nilai 0 juga tersisa di tumpukan; selama loop berikutnya, itu akan digantikan oleh indeks kolom tertinggi.

Di dalam loop utama, ^y(=x=ekstrak xkarakter -th dari y-1baris -th di ^. Ini sebenarnya mengembalikan kode ASCII dari karakter, sehingga 2%diperlukan untuk menghapus semua kecuali bagian terakhir. Sebagai kasus khusus, jika ysama dengan 0 (yang dapat terjadi jika kolom tertinggi yang ditemukan sejauh ini mencapai semua jalan ke baris atas), bit yang dicari akan benar-benar datang dari baris terakhir dalam matriks (indeks -1), tetapi berikut ini y*memaksa ke nol, sehingga secara efektif membuat virtual all-zero row di bagian atas matriks.

Berikut ini ifakan menjalankan salah satu dari dua blok kode yang mendahuluinya, tergantung pada apakah bit yang dicari adalah non-nol (benar) atau nol (salah). Jika bukan nol, ydikurangi dengan satu, dan nilai saat ini xmenggantikan indeks kolom tertinggi pada tumpukan (dengan nilai lama dibiarkan sementara di atasnya). Jika nol, xditambahkan secara bertahap oleh satu (dan sementara dibiarkan di tumpukan, di atas indeks kolom tertinggi).

Akhirnya, ^0=ekstrak baris pertama dari matriks, ,kembalikan panjangnya, dan <bandingkan dengan indeks kolom yang ditinggalkan sementara di tumpukan (yang akan sama xjika hanya bertambah). Jika indeks kurang dari panjang baris, loop mengulangi.

Ps. Berdasarkan pengujian saya, seharusnya dimungkinkan untuk mempersingkat program ini dengan satu karakter dengan mengganti tes panjang string ,<pada akhir loop dengan >, yang memotong string pada indeks yang diberikan dan mengembalikan bagian akhir (yang akan kosong, dan jadi salah, di akhir loop). Namun, ketika memotong string seperti itu tampaknya diimplementasikan sebagai operasi waktu-konstan di GolfScript (atau, lebih tepatnya, di Ruby, yang mana GolfScript berjalan di atas), saya belum menemukan dokumentasi resmi yang mengatakan demikian. Agar aman, saya telah memilih untuk menampilkan versi yang sedikit lebih lama, tapi pasti O (1), di atas.

Ilmari Karonen
sumber
6

Ruby, 83 75 68 66 63 byte

f=->m{m[b=c=i=0].map{(c=i;b-=1)while(r=m[b-2])&&r[i]>0;i+=1};c}

Menentukan fungsi fyang mengambil bentuk array 2D sebagai input.

Saya mulai di kiri bawah, melacak panjang tongkat maksimum (sebenarnya, minus itu) dan kolom yang sesuai. Di setiap kolom, jika masih ada 1di atas panjang tongkat maksimum sebelumnya, saya naik tongkat ke ujung dan ingat panjang dan kolom maksimum baru. Itu berarti bahwa saya mengulangi sekali di sepanjang kolom dan paling banyak sekali sepanjang baris (khususnya saya mengulang sejauh maksimum panjang tongkat), yang tepatnya O(m+n).

Martin Ender
sumber
@Optimizer Saya tidak melihat hasil edit kedua Anda sampai setelah saya mempostingnya, jadi itu sudah dalam riwayat edit. Itu sebabnya saya memasukkannya ke spoiler untuk orang yang ingin mengetahuinya sendiri.
Martin Ender
4

Python 2 - 71, 69, 73, 75 81

j=i=-1
M=input()
for m in M[0]:
 j+=1
 while-i<len(M)and M[i][j]:i-=1;J=j
print J
Falko
sumber
Apakah ini dimaksudkan untuk berjalan di Python 2 atau 3? Seperti apa seharusnya input itu?
feersum
1
@feersum Python 2, array array.
Justin
@feersum: Quincunx benar. Input adalah array 2D int, seperti yang Anda sarankan.
Falko
Tidak iakan keluar batas jika tongkat memakan seluruh kolom?
xnor
1
Maaf, tetapi sepertinya mengubah juntuk menghitung dari 0memecah kondisi loop i*j.
xnor
2

C, 64 byte

Sunting: Saya mengetahui bahwa pertanyaannya menanyakan lokasi kolom terpanjang dan bukan panjangnya.

Baris pertama adalah kode golf dan sisanya adalah pemanggilan sampel.

g(int m,int n,int**a,int*r){for(*r=n;n*m;a[m][n]?m--,*r=n:--n);}

/* usage:
    m = number of rows
    n = number of columns
    a = 1-based 2D array such that a[i][j] gives the value at the ith row and jth column
    r = address of return value 
    Returns (to r) the 1-indexed location of a column with the longest length, or 0 if n=0
    */

int main()
{
    int flat[4*4] = {1, 0, 0, 0,
                     1, 0, 0, 1,
                     1, 1, 0, 1,
                     1, 1, 1, 1};
    int*twoD[4] = {flat-1,flat+3,flat+7,flat+11};
    int ret;
    g(4,4,twoD-1,&ret);
    printf("%d", ret);
    return 0;
}

// old function which determines longest length (65 bytes)
f(int m,int n,int**a,int*r){for(*r=m;n*m;a[m][n]?m--:--n);*r-=m;}
feersum
sumber
Impresif! Bisakah Anda membuang inttanda tangan dalam fungsi secara kebetulan atau tidak berhasil karena petunjuk di sana?
Martin Ender
1
Input seharusnya hanya berisi array. Anda tidak bisa memberi tahu program tentang ukuran array.
Pengoptimal
Tunggu, apakah itu benar-benar berfungsi? Ini tampaknya mengembalikan panjang tongkat terpanjang dan bukan posisinya: ideone.com/YEzqzl
Martin Ender
2
@Optimizer yang pada dasarnya tidak mungkin di C.
Martin Ender
Mungkin, tapi itu pertanyaannya :)
Pengoptimal
2

C #: 236 Chars

int p(int[,] a){int y=0,s=0,i=0,x;for(;++y<=a.GetUpperBound(0);)for(x=i;x<=a.GetUpperBound(1);){if(a[y,x++]==0)break;s=y;i++;}return s;}

ungolfed:

int p(int[,] a)
{
    int selectedRow=0;
    int maxLength=0;
    for(var y = 0; y<=a.GetUpperBound(0); y++)
        for(var x=maxLength; x<=a.GetUpperBound(1); x++)
        {
            if(a[y,x++]==0)
                break;
            selectedRow=y;
            maxLength++;
        }
    return selectedRow;
}
Stephan Schinkel
sumber
2

PHP 5.4 - 108 byte

(113 jika Anda memasukkan <?php)

Format input: Array akan dibaca sebagai string JSON.

php longest_stick.php "[[0, 0, 0, 0],[1, 0, 0, 0],[1, 1, 0, 1],[1, 1, 1, 1]]"

Spasi ditambahkan untuk keterbacaan - semua baris baru dan ruang utama dapat dihapus.

<?php
$t=count($s=json_decode($argv[1]))-1;
foreach($s[0] as $k=>$_)
    while($s[$t][$k]) {
        $t--;
        $l = $k;
    }
echo $l?:0;

Versi yang diperkecil:

<?php $t=count($s=json_decode($argv[1]))-1;foreach($s[0] as $k=>$_)while($s[$t][$k]){$t--;$l=$k;}echo $l?:0;

Semacam mencuri algoritme dari Martin di sini, tapi senang bermain-main dengan bahasa yang jarang terlihat di sini XD

Niet the Dark Absol
sumber
@ MartinBüttner Saya telah "mencuri" algoritma Anda, jadi seharusnya O (n + m) sekarang. Saya pikir itu benar XD
Niet the Dark Absol
Anda dapat mengganti $s=json_decode($argv[1]);$t=count($s)-1;dengan $t=count($s=json_decode($argv[1]))-1;(-3 byte).
Blackhole
@ Blackhole Memang Anda bisa. Terima kasih!
Niet the Dark Absol
@ Blackhole Saya pikir itu akan merusak fungsionalitas. Ini akan melakukan tugas bahkan jika kondisinya tidak terpenuhi.
Niet the Dark Absol
@ Lubang Bor masih mematahkannya, saya khawatir XD $t--hanya akan terjadi jika kondisi terpenuhi.
Niet the Dark Absol
2

Cobra - 98

def f(a)
    s,x,y=0,0,a.count-1
    while y+1and x<a[0].count
        while a[y][x],y,s=y-1,x
        x+=1
    print s
Suram
sumber
2

C ++ :: 78

Berbeda dengan solusi C lainnya, ini adalah keseluruhan program. (tidak perlu doa, tidak perlu memberi tahu fungsi ukuran array). Sayangnya ini berarti lebih lama daripada mainharus digunakan alih-alih nama fungsi karakter tunggal, saya harus menginterpretasikan input dan kemudian mengeluarkan jawabannya, di mana solusi lain menangani itu "di tempat lain". Juga golf kode pertama saya.
dikompilasi dengan g++ file.cpp -include iostream, dijalankan dengan ./a 000 010 110 111(misalnya) == array string (saya yakin ini diperbolehkan dalam spec pertanyaan)

int c;main(int r,char**v){for(r--;r*v[r][c];v[r][c]-48?std::cout<<c,r--:++c);}

Versi di atas menampilkan yang terbaik saat ini ditemukan sejauh ini pada setiap iterasi. Digit hasil akhir adalah jawabannya. Beralih dari pemrosesan dari kiri bawah, bukan kanan bawah dan 0pengindeksan mengurangi solusi ini dengan 10 (!) Karakter.
beralih ke c ++ menjatuhkan pengajuan oleh satu karakter lagi karena std::cout<<lebih pendek dari putchar(-48)dan itu juga harus secara eksplisit mendukung lebih dari 9 tongkat dengan output yang tepat (meskipun mungkin lebih sulit untuk membedakan setiap output)
Menghapus bidang jawaban dan mengeluarkannya langsung memotong 6 karakter lain. Sekarang hanya menampilkan yang terbaik saat ini ketika bergerak ke atas yang memotong setidaknya beberapa keluaran.
Seluruh file sekarang hanya berukuran 78 byte - mendekati solusi fungsi saja yang lainCpenggunaan pengiriman. (dengan banyak kode tambahan untuk mendukung fungsi tersebut).

Seperti uraian di bawah sudah kedaluwarsa:

cbersifat global sehingga diinisialisasi dengan 0
rjumlah input (baris) +1 (nama program)
vadalah larik string dengan v[0]menjadi tidak valid (nama program)
Karena 0 diindeks, di rluar batas, jadi pengurangan.
Sementara r!=0(menunjuk pada string yang valid) dan karakter cdalam string bukan terminator nol '\0'
jika karakter bukan '0'
naik baris ( r) dan menampilkan kolom ( c)
lain pergi ke kolom berikutnya ( c)

selesai

Bisakah saya bermain golf ini lebih jauh?

Kode tidak digabungkan (dengan output ekstra):

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])
{
  int rows = argc-1;
  int cols = strlen(argv[1]);
  int ans;

  printf("rows: %d, cols: %d\n",rows, cols);

  while((rows)&&cols)
  {
    if (argv[rows][cols-1]-'0')
    {
      printf("stick @%d,%d\n",cols,rows);
      ans = cols;
      rows--;
    }
    else
    {
      printf("no stick @%d,%d\n",cols,rows);
      cols--;
    }
  }
  printf("%d",ans);
}
Ia menggunakan panjang string untuk mencari tahu jumlah kolom dan argc untuk menemukan jumlah baris. Mulai dari sudut kanan bawah, ini mengikuti aturan-aturan sederhana ini: Jika sel adalah tongkat, lalu bergerak ke atas, atur jawaban ke kolom saat ini. Jika sel bukan tongkat, maka pindah ke kiri. O (n + m): karena hanya bergerak ke atas dan ke kiri, ia hanya dapat memiliki maksimum max + m. Itu keluar lebih awal jika jatuh dari atas atau kiri array.

Baldrickk
sumber
1

OCaml - 144 karakter

let s a=Array.(let rec f i j m=if i=0then m else if a.(i).(j)=0then if j=length a.(i)-1then m else f i(j+1)m else f(i-1)j j in f(length a-1)0 0)

Mengambil int array arrayinput sebagai, dan mulai dari kiri bawah, bergerak ke atas atau ke kanan jika melihat a 1atau a 0. Hitungan kolom dimulai pada 0.

Pemakaian

 s [| [| 0; 0; 0; 0 |]; [| 0; 0; 1; 0|]; [| 1; 0; 1; 0 |]; [| 1; 1; 1; 0 |]; [| 1; 1; 1; 1 |] |];;
 - : int = 2

Tidak disatukan

let s a = Array.(
  let rec f i j m = (* m is the longest stick seen so far *)
    if i=0 then m (* A column is full: this is the longest possible stick and j=m anyway *)
    else if a.(i).(j)=0 then (* current column is shorter than a previously seen stick *)
      if j=length a.(i)-1 then m (* we have examined all columns, just return m *)
      else f i(j+1) m (* start examining next column *)
    else f (i-1) j j (* current column is longer than all the ones previously seen. Check how long the stick is *)
  in
  f (length a-1) 0 0)
Virgile
sumber
0

T-SQL - 71 64

Mengambil tabel A sebagai input

SELECT IDENTITY(INT, 1, 1) R, A INTO A
FROM (VALUES
 ('0000')
,('1000')
,('1101')
,('1111')
) AS A(A)

Dan pertanyaannya adalah

SELECT TOP(1)CHARINDEX('1',A)FROM A WHERE A LIKE'%1%' ORDER BY R

SQLFiddle

Ini mengembalikan baris pertama dari tabel a diurutkan oleh r di mana ada 1 dalam string a.

TOP(1) membatasi hasil ke baris pertama yang dikembalikan.

CHARINDEX('1',A) mengembalikan posisi 1 pertama dalam string atau nol jika tidak ditemukan.

WHERE A LIKE'%1%' filter ke baris di mana A berisi 1

ORDER BY R memastikan tabel dibaca dari atas ke bawah

MickyT
sumber
Bisakah Anda jelaskan apa yang terjadi dalam kode itu? : D Tidak ada pengalaman dengan T-SQL
Pengoptimal
Saya mengerti, jadi bukankah pemfilteran di setiap baris merupakan operasi O (n * m)? yaitu kompleksitas waktu tidak linier.
Pengoptimal
Sulit dikatakan. Mesin SQL akan memeriksa semua baris untuk 1 di kolom. Itu hanya akan mengembalikan hanya baris pertama dari atas ke bawah yang memenuhi syarat. Jadi dalam situasi ini memindai seluruh tabel. Memfilter baris dengan kolom yang berisi 1. Mengurutkan hasil pada kolom identitas dan mengembalikan hasil pertama.
MickyT
Lihatlah seperti ini: Bagaimana jika baris Anda seperti "0000", "0000", "0000", "0001". Dalam hal ini, harus sampai baris terakhir dan sampai karakter terakhir baris untuk mengetahui keberadaan 1
Pengoptimal
1
Jadi ya, itu O (m * n) kalau begitu :)
Pengoptimal
0

Delphi 122 karakter

Huh ... itu bahasa yang sangat banyak.

Pembaruan: harus menambahkan 6 karakter dalam fungsi berubah jenis kembali dari I ke integer. Fungsi masih dikompilasi sebagai program uji memiliki "tipe I = integer;" pernyataan yang tersisa dari versi program sebelumnya.

function S(A:array of string):integer;var n,c:integer;begin n:=0; repeat c:=Pos('1',A[n]);inc(n) until c>0; result:=c;end;
Penguino
sumber
Apakah Anda melakukan panggilan Pos () pada setiap baris (dalam kasus Anda, string) dari Array?
Pengoptimal
@Optimiser Ya, program mencari setiap string dalam array (menggunakan 'inc (n)') hingga menemukan '1'. '1' pertama yang ditemukan akan menjadi yang tertinggi (atau sama dengan tertinggi) '1', sehingga posisinya dalam string (string adalah 1-ndexed dalam delphi) akan menjadi posisi kolom terpanjang. Rutin gagal jika tidak ada '1 dalam array, tetapi saya percaya bahwa ini akan menjadi input rusak karena kemudian tidak akan ada "tongkat terpanjang" yang dapat ditemukan.
Penguino
1
Jadi pertama-tama, ini adalah input yang valid "0000", "0010", "1111":, kedua, jawaban Anda tidak memenuhi persyaratan kompleksitas waktu linier
Pengoptimal
@ Opptizer Ya, itu akan menjadi input yang valid dan mengidentifikasi stik ke-3 dengan benar. Tapi saya menyadari setelah membuat posting bahwa saya telah mengubah program pesanan saya N valid yang menggunakan array, menjadi program pesanan N ^ 2 yang tidak valid yang menggunakan string (mengejar pengurangan dari ~ 160 karakter).
Penguino
0

skema - 236 karakter

Bahkan lebih lama daripada versi delphi ... mungkin ada cara untuk melakukan ini jauh lebih efisien dengan skema. Dan lebih buruk lagi - saya hanya memperhatikan bahwa ini adalah pesanan m * n.

(define (s l) (cond ((eq? (cdr l) '()) (car l)) (else (map + (car l) (s (cdr l)))))) (define (u l) (define (t n p q l) (cond ((eq? l '()) p) ((< n (car l)) (t (car l) q (+ 1 q) (cdr l))) (else (t n p (+ 1 q) (cdr l))))) (t 0 0 1 (s l)))

l adalah daftar formulir '((0 0 0 0) (1 0 0 0) (1 1 0 1) (1 1 1 1))). Saya pikir itu adalah representasi adil dari input array 2D untuk skema.

(sl) menjumlahkan elemen ke-n dari masing-masing sub-daftar dari daftar daftar orang-orang yang berselisih, jadi (s '((0 0 0 0) (1 0 0 0) (1 0 0 0) (1 1 0 1) (1 1 1 1))) akan kembali (3 2 1 2).

(ul) mengembalikan 'indeks' dari entri terbesar dari daftar angka (menggunakan fungsi pembantu t), jadi (u '(3 2 1 2)) akan mengembalikan 1 (sebagai elemen terbesar' 3 dalam daftar ' (3 2 1 2) ada di posisi 1).

Penguino
sumber
Penjumlahan semua sublists adalah operasi O (m * n).
Martin Ender
0

Racket 70

Golf:

(define(h m)(for/last([r m]#:final(memv 1 r))(length(takef r even?))))

Asumsikan input adalah array dua dimensi, yang dalam Racket akan menjadi daftar daftar:

(define m 
  '((0 0 0 0)
    (1 0 0 0)
    (1 1 0 1)
    (1 1 1 1)))

Tidak Disatukan:

(define (h m)
  ;; step through rows, stopping at the first that contains a 1
  (for/last ([r m] #:final (memv 1 r)) 
    (length (takef r even?)))) ; pop off the leading zeroes to get the column index

Mengembalikan indeks kolom dengan tongkat terpanjang.

Matthew Butterick
sumber
Jadi pada dasarnya Anda akan melalui setiap kolom dan menghitung jumlah 1?
Pengoptimal
Saya mengerti maksud Anda. Algoritma diperbarui.
Matthew Butterick
Ini masih memiliki kompleksitas kasus terburuk O (m * n) (untuk kasus di mana tidak ada 1dalam matriks, atau hanya di baris bawah).
Martin Ender
0

JavaScript, ES6, 76 karakter

W=a=>(j=>{for(k=i=a.length-1;~i&~j;)a[i][j]?(k=j,i--):j--})(a[0].length-1)|k

Mengambil input array array.

Pengoptimal
sumber
0

JavaScript ES6, 65 byte

Mengambil kedua format input

f=(a,t)=>a.reduceRight((p,c)=>t+1?t:(x=c.indexOf(1,p))+1?x:t=p,0)

Dijelaskan:

Iterasi dari bawah ke atas. Menggunakan String.prototype.indexOf()atau Array.prototype.indexOf()bergantung pada input pada setiap nilai. Menemukan indeks pertama dari setiap baris dengan 1 dari offset sebelumnya, jika tidak menemukan satu pun maka ia menetapkan tvariabel ke offset terakhir dan tidak melakukan indexOfpanggilan lagi .

George Reith
sumber
indexOfberfungsi dalam salah satu O(log n)atau O(n), sehingga algoritme keseluruhan tidak akan pernah adaO(m + n)
Pengoptimal
@Optimizer Yeah realised that was its O(m*n) wasn't thinking straight.
George Reith
@Optimizer Updated to be O(m+n)
George Reith