가장 긴 스틱을 선택


13

당신은 다른 두 명의 가장 친한 친구와 함께 사는 젊은 프로그래밍 괴짜입니다. 매주, 당신 중 한 명이 집안의 모든 집안일을해야하고 당신은 막대기를 골라서 자신의 차례를 결정합니다. 가장 짧은 스틱을 고르는 사람은 모든 집안일을 잃어 버립니다.

여러분 모두 프로그래머이며 퍼즐 만들기를 좋아하므로 "가장 짧은 스틱 선택"을 컴퓨터 퍼즐로 수정했습니다.

퍼즐의 규칙은 다음과 같습니다.

  1. 각 열은 스틱을 나타내는 2D 행렬이 제공됩니다.
  2. 각 열에서 1은 스틱의 일부를 나타내고 0은 빈 공간입니다.
  3. 각 열의 상단에서 하단으로 갈 때 처음에는의 열이 있고을 0누르 자마자 1스틱이 시작되고 열의 나머지 부분 1만 채워집니다.
  4. 하나의 열을 선택하도록 프로그램을 작성할 수 있습니다. 해당 열의 스틱 크기에 따라 승자 / 패자가 결정됩니다. 스틱의 크기 == 해당 열에있는 1의 수
  5. 그러나 해당 프로그램은 최악의 선형적인 시간 만 가질 수 있습니다.

여러분은 모두 프로그래머이므로 다른 사람의 프로그램이 시간 복잡도 제한을 맞추고 있는지 알 수 있습니다.

당신의 임무는 :

  • 2D 형식 또는 문자열 배열로 입력을받는 프로그램이나 함수를 작성하십시오.
  • STDIN / 프롬프트 / 콘솔 또는 함수 인수에서 입력을 가져올 수 있습니다.
  • STDIN / 프롬프트에서 입력을 읽는 경우 입력을 읽고 배열로 변환하는 데 0 시간이 걸리는 것으로 가정 할 수 있습니다 (그렇지만 코드가 응답에 있어야 함)
  • 가장 긴 스틱이있는 컬럼을 결정하십시오.
  • 출력은 함수의 반환 값 또는 STDOUT / 콘솔 / 경고 일 수 있습니다.
  • 프로그램 / 기능 최악 시간 복잡도 선형 있어야 행수이고 열의 수있다.O(m+n)mn

입력은 다음 형식 중 하나 일 수 있습니다.

2D 어레이 :

[ [0, 0, 0, 0],
  [1, 0, 0, 0],
  [1, 1, 0, 1],
  [1, 1, 1, 1] ]

문자열 배열 :

[ "0000", "1000", "1101", "1111" ]

입력에는 다음과 같은 속성이 있습니다.

  • 배열의 크기를 알 수 없음, 모든 크기의 사각형을 가정
  • 어떤 열에서든 아래로 내려 오면 1이 표시되면 아래의 모든 것이 1이됩니다
  • 빈 열 (0 길이) 스틱 허용됩니다.

이것은 코드 골프이므로 가장 짧은 코드가 승리합니다 ! *

코드를 설명하거나 예상치 못한 두 가지 입력 형식 중 어떤 것과 함께 골프화되지 않은 버전 (시간 복잡성을 확인하기 위해)을 제공하십시오.

업데이트 선형 시간 복잡도는 여기서 n은 열 크기이고 m은 행 크기 인 O (n + m)을 의미합니다. (불분명 한 사람들을 위해)

업데이트 2 이것은 확실히 선형 시간으로 수행 할 수 있습니다. 그리고 답변을 게시하는 경우 공정한 싸움을 위해 며칠 씩 논리 / 알고리즘 게시를 지연시킬 수 있습니다. :)

업데이트 3 시간 복잡성과 프로그램을 확인하기 위해 몇 시간 안에 모든 답변을 살펴 보겠습니다. :)


2
각 셀이 중요한 값을 포함 할 수 있기 때문에 O (n + m)에서이 작업을 수행 할 수 없다고 주장합니다 (즉, 가장 긴 막대 / 열의 첫 번째 "1"). 따라서 O (n * m)이 걸리는 각 셀을 살펴 봐야합니다.
Falko

빈 열이있을 수 있습니까?
Martin Ender

@Optimizer : 아, 알겠습니다. 네가 옳아. :)
Falko

11
이것은 (N + m) O에서 수행 될 수있다. 입력이 임의 액세스를 허용하는 형식으로 변환되면 나머지 처리는 O (n + m) 일 수 있지만 프로그램을 작성해야하며 최악의 경우 1입력 의 유일한 셀이 마지막 셀인 경우 전체 입력을 읽어야합니다. 언어의 표준 라이브러리가 stdin에 대한 임의 액세스를 위조하더라도 장면 아래에서 버퍼링하므로 시간은 Omega (n * m)입니다.
피터 테일러

2
사람들이 " 단순히 배열을 받아들이는 함수를 만들 도록" 하려면, 프로그램을 작성해야한다고 질문해서는 안됩니다. 그리고 N이 입력 크기 인 O (N ^ 0.5) 인 솔루션이 필요한 경우 선형 시간 솔루션을 요구하지 않아야합니다. 선형 시간 솔루션은 전체 입력을 읽을 수 있습니다.
피터 테일러

답변:


4

GolfScript, 45 자

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

입력을 문자열 배열로 취하여 가장 높은 열의 인덱스 (0부터 시작)를 반환합니다. 그것은 O ( rows + columns ) 반복으로 실행되며 각 반복은 본질적으로 일정한 시간을 가져야합니다 (적어도 일정한 시간 산술을 가정). 루프 내에서 수행되는 유일한 배열 / 문자열 연산은 요소 조회 ( =)와 문자열 길이 ( ,)를 가져 오는 것입니다. 둘 다 GolfScript에서 일정한 시간이 걸립니다.

온라인으로 사용해보십시오.

설명:

여기의 대부분의 솔루션과 마찬가지로이 코드는 행렬의 왼쪽 아래에서 시작하여 행렬의 현재 요소가 1 또는 0인지 여부에 따라 위 또는 오른쪽으로 걷고 마지막으로 이동 한 열을 추적하여 작동합니다 .

프로그램을 시작할 때 입력 배열을 변수에 ^, 길이 (예 : 행 수)에 y0을 할당합니다 x. 값 0도 스택에 남습니다. 다음 루프 동안 가장 높은 열의 인덱스로 대체됩니다.

메인 루프 내에서 에서- 번째 행 의 - 번째 문자를 ^y(=x=추출합니다 . 실제로 문자의 ASCII 코드를 반환하므로 마지막 비트를 제외한 모든 비트를 삭제해야합니다. 특별한 경우로, 0과 같으면 (지금까지 발견 된 가장 높은 열이 맨 위 행까지 도달 할 경우 발생할 수 있음), 조회 된 비트는 실제로 행렬 의 마지막 행에서 나옵니다 (색인 -1). 다음 은이 값을 0으로 설정하여 행렬의 맨 위에 사실상 모든 0의 행을 만듭니다.xy-1^2%yy*

그러면 다음 if은 조회 비트가 0이 아닌지 (true) 또는 0 (false)인지에 따라 이전에 나오는 두 코드 블록 중 하나를 실행합니다. 0이 아닌 경우 y1 씩 감소하고 현재 값은 x스택에서 가장 높은 열 인덱스를 대체합니다 (이전 값은 일시적으로 위에 남음). 0이면 x단순히 1 씩 증가합니다 (가장 큰 열 인덱스의 맨 위에 스택에 일시적으로 남음).

마지막으로 ^0=행렬의 첫 번째 행을 추출하여 ,길이를 반환하고 <스택에 임시로 남겨둔 열 인덱스 와 비교합니다 ( x단지 증가한 경우 동일 ) 인덱스가 행의 길이보다 작 으면 루프 반복합니다.

추신. 내 테스트 ,<에 따라 루프 끝의 문자열 길이 테스트 를 로 바꾸면이 프로그램을 한 문자 씩 줄일 수 있어야합니다 >. 이는 주어진 인덱스에서 문자열을 자르고 끝 부분을 반환합니다 (비어있을 것입니다. 따라서 루프 끝에서 거짓). 그러나 GolfScript (또는 GolfScript가 실행되는 Ruby)에서 상수 시간 작업으로 구현 되는 것처럼 문자열을 자르는 동안 공식 문서는 찾지 못했습니다. 안전을 위해 위의 버전보다 약간 더 길지만 확실히 O (1) 기능을 선택했습니다.


6

루비, 83 75 68 66 63 바이트

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

f2D 배열 형식을 입력으로 사용 하는 함수 를 정의합니다 .

왼쪽 하단에서 시작하여 최대 스틱 길이 (실제로는 빼기)와 해당 열을 추적합니다. 각 열에서 여전히 1이전 최대 스틱 길이보다 s가 높은 경우 스틱을 끝까지 걸어 가서 새 최대 길이와 열을 기억합니다. 즉, 열을 따라 한 번 반복하고 행을 따라 최대 한 번 반복합니다 (특히 최대 스틱 길이까지 반복합니다) O(m+n).


@Optimizer 게시 한 후에야 두 번째 편집 내용이 표시되지 않았으므로 편집 기록에있었습니다. 그래서 나는 그것을 스스로 알아 내고 싶어하는 사람들을 위해 스포일러에 넣었습니다.
Martin Ender

4

파이썬 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

이것은 Python 2 또는 3에서 실행하기위한 것입니까? 입력은 어떻게 생겼습니까?
feersum

1
@feersum 파이썬 2, 배열의 배열.
저스틴

@feersum : Quincunx가 맞습니다. 입력은 제안한대로 정수의 2D 배열입니다.
Falko

하지 않음 i막대기가 전체 열을 차지하면 경계의 외출?
xnor

1
죄송하지만 j카운트를 변경 0하면 루프 조건이 중단되는 것처럼 보입니다 i*j.
xnor

2

C, 64 바이트

편집 : 질문에 길이가 아닌 가장 긴 열의 위치를 ​​묻는다는 것을 알았습니다.

첫 번째 줄은 골프 코드이고 나머지는 샘플 호출입니다.

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;}

감동적인! int함수 시그니처에 s 를 버릴 수 있습니까 ? 아니면 포인터로 인해 작동하지 않습니까?
Martin Ender

1
입력은 배열 만 포함해야합니다. 프로그램에게 어레이의 크기를 알려줄 수 없습니다.
Optimizer

잠깐, 실제로 작동합니까? 이 위치를 가장 긴 스틱의 길이를 반환하지 것 같습니다 : ideone.com/YEzqzl
마틴 청산

2
C에서는 기본적으로 불가능한 @Optimizer
Martin Ender

아마도 그럴 수도 있지만 그것은 의문입니다 :)
Optimizer

2

C # : 236 문자

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;}

언 골프 :

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;
}

2

PHP 5.4-108 바이트

(포함하면 113 <?php)

입력 형식 : 배열은 JSON 문자열로 읽습니다.

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

가독성을 위해 공백이 추가되었습니다. 모든 줄 바꿈과 선행 공백을 제거 할 수 있습니다.

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

축소 버전 :

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

여기서 Martin의 알고리즘을 훔치지 만 XD에서 자주 보이지 않는 언어로 놀아 보는 것이 좋습니다.


@ MartinBüttner 알고리즘을 "도난당했습니다". 이제 O (n + m)이어야합니다. 나는 그것이 XD라고 생각한다
어두운 절대자 Niet

당신은 대체 할 수있는 $s=json_decode($argv[1]);$t=count($s)-1;$t=count($s=json_decode($argv[1]))-1;(-3 바이트).
Blackhole

@Blackhole 실제로 당신은 할 수 있습니다. 감사합니다!
어둠의 절대자 니트

@Blackhole 나는 그것이 기능을 깰 것이라고 생각합니다. 조건이 충족되지 않아도 할당을 수행합니다.
어둠의 절대자 니트

@Blackhole 아직도 그것을 깨뜨린 다, 나는 $t--조건이 충족되는 경우에만 XD 가 발생하는 것을 두려워 한다.
어둠의 절대자 니트

2

코브라-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

2

C ++ :: 78

다른 C 솔루션과 달리 이것은 전체 프로그램입니다. (호출이 필요하지 않고 함수에 배열의 크기를 알려줄 필요가 없습니다). 불행히도 이것은 main단일 문자 함수 이름 대신 사용해야 하는 시간이 길다는 것을 의미합니다 . 입력을 해석 한 다음 다른 솔루션이 "어딘가"를 처리하는 곳에서 답을 출력해야합니다. 또한 첫 번째 코드 골프.
로 컴파일하고 (예 :) == 문자열 배열로 g++ file.cpp -include iostream실행 ./a 000 010 110 111하십시오 (질문 스펙에서 허용된다고 생각합니다)

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

위의 버전은 각 반복에서 지금까지 찾은 최고의 결과를 출력합니다. 최종 출력 숫자가 답입니다. 오른쪽 아래가 아닌 왼쪽 아래에서 처리를 전환하고 0인덱싱하면이 솔루션이 10 (!) 자로 줄어 듭니다.
c ++로 전환하면 std::cout<<보다 짧은 문자로 하나 이상의 문자로 제출이 삭제 putchar(-48)되고 적절한 출력을 가진 9 개 이상의 스틱을 명시 적으로 지원해야합니다 (각 출력을 구별하기가 더 어려울 수 있음)
답변 필드를 제거하고 출력하면 다른 6 문자가 자르기 쉽습니다. 이제는 위로 움직일 때 전류를 가장 잘 출력하여 적어도 일부 출력을 차단합니다.
전체 파일의 크기는 이제 78 바이트에 불과합니다.C제출 사용. (상기 기능을 지원하기 위해 많은 추가 코드가 있음).

아래 설명이 오래되었습니다.

c글로벌이므로 0
r입력 수 (행) +1 (프로그램 이름)
vv[0]유효하지 않은 문자열 배열입니다 (프로그램 이름).
인덱스가 0 r이므로 범위를 벗어 났으므로 감소합니다.
동안 r!=0(유효한 문자열을 가리키는) 및 문자 c문자열이 널 (null) 종료되지 않습니다 '\0'
문자가없는 '0'인 경우
행 (최대 이동 r) 및 출력 컬럼 ( c)
다음 칼럼에 다른 이동 ( c)

수행을

이걸 더 골프해도 될까요?

ungolfed 코드 (추가 출력) :

#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);
}
문자열 길이를 사용하여 열 수를 찾고 argc를 사용하여 행 수를 찾습니다. 오른쪽 하단에서 시작하여 다음과 같은 간단한 규칙을 따릅니다. 셀이 스틱 인 경우 위로 이동하여 현재 열에 응답을 설정하십시오. 셀이 스틱이 아닌 경우 왼쪽으로 이동하십시오. O (n + m) : 상하로만 움직이므로 최대 n + m 판독 값 만 가질 수 있습니다. 어레이의 상단 또는 왼쪽에서 떨어지면 일찍 종료됩니다.


1

OCaml-144 자

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)

int array array를 입력으로 취하고 왼쪽 아래에서 시작하여 a 1또는 a 가 표시되면 위 또는 오른쪽으로 이동합니다 0. 열 개수는에서 시작합니다 0.

용법

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

언 골프

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)

0

T-SQL- 71 64

테이블 A를 입력으로 사용

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

그리고 쿼리는

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

SQLFiddle

이것은 문자열 a에 1이있는 r의 순서대로 테이블의 첫 번째 행을 리턴합니다.

TOP(1) 결과를 반환 된 첫 번째 행으로 제한합니다.

CHARINDEX('1',A) 문자열에서 첫 번째 1의 위치를 ​​반환하거나 찾지 못하면 0을 반환합니다.

WHERE A LIKE'%1%' A에 1이 포함 된 행으로 필터

ORDER BY R 테이블을 위에서 아래로 읽습니다.


그 코드에서 무슨 일이 일어나고 있는지 설명 할 수 있습니까? : D T-SQL에 대한 경험이 없음
Optimizer

각 행의 필터링이 O (n * m) 연산이 아닙니까? 즉 선형 시간 복잡성이 아닙니다.
Optimizer

말하기 어렵다. SQL 엔진은 열에서 1의 모든 행을 검사합니다. 자격을 갖춘 위에서 아래로 첫 번째 행만 리턴합니다. 따라서이 상황에서는 전체 테이블을 스캔합니다. 1을 포함하는 열로 행을 필터링합니다. 식별 열의 결과를 정렬하고 첫 번째 결과를 반환합니다.
MickyT

다음과 같이보십시오 : 행이 "0000", "0000", "0000", "0001"과 같은 경우 이 경우, 1 행의 존재를 파악하기 위해 마지막 행과 마지막 행까지
Optimizer

1
그렇습니다, 그것은 O (m * n)입니다. 그러면 :)
Optimizer

0

델파이 122 자

한숨 ... 그런 방대한 언어입니다.

업데이트 : 반환 유형을 I에서 정수로 변경하면 6 문자를 추가해야했습니다. 테스트 프로그램이 "type I = integer;"를 가짐에 따라 여전히 컴파일 된 함수 이전 버전의 프로그램에서 남은 문장.

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;

Array의 각 행 (귀하의 경우 string)에서 Pos () 호출을 수행하고 있습니까?
Optimizer

@Optimiser 예, 프로그램은 '1'을 찾을 때까지 배열에서 각 문자열을 검색합니다 ( 'inc (n)'사용). 발견 된 첫 번째 '1'은 가장 높은 (또는 동일한 가장 높은) '1'이므로 문자열에서의 위치 (문자열은 델파이에서 1-ndexed)는 가장 긴 열의 위치가됩니다. 배열에 '1'이 없으면 루틴이 실패하지만 "가장 긴 스틱"을 찾을 수 없으므로 입력이 손상 될 것이라고 생각합니다.
Penguino

1
우선, 이것은 유효한 입력입니다. "0000", "0010", "1111"둘째, 귀하의 답변이 선형 시간 복잡성 요구 사항을 충족하지 못합니다
Optimizer

@Optimizer 예. 입력이 올 바르고 세 번째 스틱을 올바르게 식별합니다. 그러나 게시물을 작성한 후 배열을 사용하는 유효한 순서 N 프로그램을 문자열을 사용하는 유효하지 않은 순서 N ^ 2 프로그램으로 변환했다는 것을 깨달았습니다 (160 자의 줄임).
Penguino

0

구성표-236 자

델파이 버전보다 훨씬 길다. 아마도 계획으로 훨씬 더 효율적으로 할 수있는 방법이있을 것이다. 그리고 더 나쁘다-방금 주문 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은 '((0 0 0) (100 0) (11 1) (11 11)) 형식의 목록입니다. 나는 그것이 체계에 대한 2D 배열 입력의 공정한 표현이라고 생각합니다.

(sl)은 숫자 목록의 목록에있는 각 하위 목록의 n 번째 요소를 합하므로 (s '((0 0 0) (100 0)) (11 1) (1 1 1 1)))은 (3 2 1 2)를 반환합니다.

(ul)은 (도움말 함수 t를 사용하여) 숫자 목록에서 가장 큰 항목의 '인덱스'를 반환하므로 (u '(3 2 1 2)) 1 (목록에서 가장 큰 요소'3 (3 2 1 2)는 위치 1에 있습니다.


모든 서브리스트를 합산하는 것은 O (m * n) 연산입니다.
Martin Ender

0

라켓 70

골프 :

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

입력이 2 차원 배열이라고 가정하고 Racket에서는 목록의 목록이됩니다.

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

언 골프 드 :

(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

스틱이 가장 긴 열 인덱스를 반환합니다.


따라서 기본적으로 각 열을 살펴보고의 수를 세고 1있습니까?
Optimizer

너의 의도를 알 겠어. 알고리즘이 업데이트되었습니다.
Matthew Butterick

이것은 여전히 ​​최악의 경우 복잡도 O (m * n)입니다 ( 1행렬이 없거나 맨 아래 행에만있는 경우).
Martin Ender

0

자바 스크립트, ES6, 76 자

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

배열 입력 배열을받습니다.


0

자바 스크립트 ES6, 65 바이트

두 가지 입력 형식을 모두 취함

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

설명 :

아래에서 위로 반복됩니다. 각 값의 입력을 사용 String.prototype.indexOf()하거나 사용 Array.prototype.indexOf()합니다. 이전 오프셋에서 1을 사용하여 각 행의 첫 번째 인덱스를 찾고, 아무것도 찾지 못하면 t변수를 마지막 오프셋으로 설정하고 더 이상 indexOf호출을 수행하지 않습니다 .


indexOfO(log n)또는 에서 작동 O(n)하므로 전체 알고리즘이 작동하지 않습니다.O(m + n)
Optimizer

@Optimizer 네, O (m * n)가 똑바로 생각되지 않았다는 것을 깨달았습니다.
George Reith

@Optimizer 업데이트되었습니다O(m+n)
George Reith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.