시간에 비닝


12

이 과제의 과제는 배열 요소를 타임 빈에 넣는 것입니다. 입력은 이벤트 시간을 나타내는 양의 정수로 구성된 비감 소형 배열이며 각 빈의 크기를 나타내는 정수입니다. 예를 들어 보자. 입력 배열 A과 출력 배열을 호출합니다 O.

`A = [1,1,1,2,7,10]` and `bin_size = 2`.

`O = [4,0,0,1,1]`.

? A를 bin_size = 2, 우리는 다음과 같은 간격으로해야합니다 : (0,2], (2,4], (4,6], (6,8], (8,10]네 항목은 (1,1,1,2)첫 구간 내에을 (0,2], 두 번째와 세 번째 간격 없음, 하나의 7간격에서 (6,8], 하나의 10간격에서 (8,10].

코드는 길이의 모든 간격 고려해야 bin_size에서 시작을 0하고 얼마나 많은 숫자를 계산 A각이있다. 구간의 오른쪽 끝을 항상 빈에 포함시켜야합니다. 위의 예 2에서는의 개수에 포함됩니다 4. 코드는 입력 및 출력 길이의 합으로 선형 시간으로 실행되어야합니다.

더 많은 예 :

`A = [1,2,7,12,15]`  and `bin_size = 5`.

`O = [2, 1, 2]`.

`A = [1,2,7,12,15]`  and `bin_size = 3`.

`O = [2,0,1,1,1]`.

입력 및 출력을 편리한 형식으로 제공 할 수 있다고 가정 할 수 있습니다. 원하는 언어와 라이브러리를 사용할 수 있습니다.


후행이있는 출력이 0허용됩니까? 그래서 [2,0,1,1,1,0]대신에 [2,0,1,1,1]?
Kevin Cruijssen

후행 0은 없습니다.

2
max array value가 배수가 아닌 상황은 bin_size어떻습니까? 대부분의 답변이 그럴 것 같지만, 그렇다면 혼동을 막기 위해이 시나리오에 대한 테스트 사례를 추가하는 것이 좋습니다.
Kirill L.

@KirillL. 그렇습니다.

1
@GPS 0은 양의 정수가 아닙니다. 이것은 사고가 아닙니다 :)

답변:


9

R , 48 바이트

function(n,s)table(cut(n,0:ceiling(max(n)/s)*s))

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

다시 한번, table그리고 cutA와 팅은 factor비닝에 대한 트릭을 할. 출력라는 vector(가) 여기서, names예를 들면 간격 표기법의 간격은이다 (0,5].

편집 : s나누지 않을 때 작동하는 이전 버전으로 되돌립니다 n.


나는 실제로 R을하지 않지만 TIO에서는 이것이 부분 format you [most likely do not] find convenient없이 출력하는 것처럼 보입니다 table.
내 대명사는 monicareinstate

@ 누군가가 바로 거기에 있습니다. cut벡터를 구간에 의해 주어진 수준으로 요인으로 나누고 table입력에서 각 고유 값의 발생 횟수를 계산합니다.
Giuseppe

1
@ 누군가 아, 나는 당신의 의견을 오해했습니다. 아니요, 각 쓰레기통의 개수가 필요하므로 유효하지 않을 것이라고 생각합니다.
Giuseppe

1
완벽하게 테스트,하지만 난 당신이 reaplacing 바이트 커플을 절약 할 수 있다고 생각하지 않습니다 0:ceiling(max(n)/s)*s와 함께 seq(0,max(n)+s-1,s). 적어도 문제의 두 샘플에 대해 작동합니다.
Gregor Thomas

1
@Gregor Hmm 1:max(n/s+1)*s-s두 가지 기능이 동일하므로 다른 개선 사항이 있습니다.
Giuseppe



3

파이썬 2 , 62 바이트

I,s=input()
B=[0]*(~-I[-1]/s+1)
for i in I:B[~-i/s]+=1
print B

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


1
우선 : 좋은 대답은 이미 +1했습니다 (그리고 내가 가지고있는 것보다 약간 짧기 때문에 Java로 포트를 만들었습니다). 그러나 후행 0은 허용되지 않으므로 (방금 요청한 OP) 대신 대신 I[-1]/s+1해야합니다 ~-I[-1]/s+1.
Kevin Cruijssen

@KevinCruijssen 감사합니다!
Dead Possum

3

05AB1E , 18 바이트

θs/Å0¹vDyI/î<©è>®ǝ

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


05AB1E를 잘 모르지만 A.count max (A) 호출하는 것처럼 보이 므로 len (A) + len (O) 에서 런타임은 선형이 아닙니다 . 맞습니까? 아니면 뭔가 잘못 되었습니까?
Dennis

@Dennis count는 O(max(A)*max(A))... 그래서 A의 최대 값에 이차적입니다 ... OP는 그것이 무엇인지에 대해 선형이어야한다고 지정했습니다 ... 정확히 무엇입니까?
Magic Octopus Urn

2
@MagicOctopusUrn 최신 개정판에 따라 코드가 입력 및 출력 길이의 합으로 선형 시간으로 실행되어야합니다 .
Dennis

2
@Dennis는 다소 임의적 인 것으로 보입니다.
Magic Octopus Urn

2
@MagicOctopusUrn이 질문에 대한 선형 시간에 대한 합리적인 정의입니다.

2

APL + WIN, 23 바이트

bin의 화면 입력을 요청한 다음 정수 벡터를 프롬프트합니다.

+⌿<\v∘.≤b×⍳⌈⌈/(v←⎕)÷b←⎕    

설명:

⎕ Prompt for input

⌈⌈/(v←⎕)÷b←⎕ divide the integers by bin size, take maximum and round up for number of bins

b×⍳ take number of bins from previous step and create a vector of bin upper boundaries

v∘.≤ apply outer product to generate boolean matrix where elements of vector ≤ boundaries

<\ switch off all 1's after first 1 in each row to filter multiple bin allocations

+⌿ sum columns for the result


2

자바 8, 75 바이트

a->b->{var r=new int[~-a[a.length-1]/b+1];for(int i:a)r[~-i/b]++;return r;}

@DeadPossum의 Python 2 답변 포트 이므로 답변을 상향 조정 하십시오!

설명:

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

a->b->{          // Method with integer-array and integer parameters and no return-type
  var r=new int[~-a[a.length-1]/b+1];
                 //  Result integer-array of size `((last_item-1)/bin_length)+1`
  for(int i:a)   //  Loop over the input-array
    r[~-i/b]++;  //   Increase the value at index `(i+1)/bin_length` by 1
  return r;}     //  Return the result-array


2

자바 스크립트 (ES6), 60 바이트 / O (len (a) + max (a) / n)

@Neil 덕분에 5 바이트 절약

카레 구문으로 입력을 (a)(n)받습니다.

a=>n=>[...a.map(x=>o[x=~-x/n|0]=-~o[x],o=[])&&o].map(n=>~~n)

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

또는 빈 요소가 허용되면 43 바이트 / O (len (a)) 만 있습니다.


[...o].map(n=>n|0)적은 바이트로 두 번째 솔루션에서 첫 번째 출력을 가져옵니다.
Neil

@Neil 내가 왜 그렇게 복잡한 것을했는지 모르겠습니다. :-/
Arnauld


1

Pyth, 23 22 바이트

Jm/tdeQhQK*]ZheJhXRK1J

여기 사용해보십시오

Jm/tdeQhQK*]ZheJhXRK1J
Jm/tdeQhQ                 Find the bin for each time and save them as J.
         K*]ZheJ          Create empty bins.
                 XRK1J    Increment the bins for each time within them.
                h         Take the first (because mapping returned copies).

1

루비 , 53 50 바이트

편집 : iamnotmaynard에 의해 -3 바이트.

->a,b{(0..~-a.max/b).map{|i|a.count{|x|~-x/b==i}}}

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


이 값이 a.max배수가 아닌 경우 b(예 : f[[1,1,1,2,7,10],3]=> [4, 0, 1]이지만 제공해야 함 [4, 0, 2]) 작동하지 않습니다 . 나는 같은 접근법을 시도했다.
Monica Monica 복원 – notmaynard

(또는 오히려 [4, 0, 1, 1])
분석 재개 모니카 - notmaynard

플로트 최대 범위 값으로 전환하면 해결할 수 있지만 작업 설명에서 OP를 확인하도록 요청합니다.
Kirill L.


감사합니다.
Kirill L.

1

이 퍼즐은 본질적으로 카운트 정렬입니다. 우리는 입력을 먼저 거치지 않고 출력 길이를 모른다.

C (클랑) , 53 바이트

i,j;f(*A,l,b,*O){for(j=0;j<l;O[(A[j++]+b-1)/b-1]++);}

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

이 솔루션은 다음과 같은 매개 변수를 사용합니다.
A출력
l에 대한
bbin_size
O스토리지 의 입력 배열 길이 . 길이가 충분
하고 O로 출력을 리턴 해야합니다 .

이 솔루션에는 핸디캡이 있습니다. 출력 배열 O의 길이를 반환하지 않으므로 호출자는 인쇄 할 양을 모릅니다.

다음 버전은 그 장애를 극복합니다.

C (클랑) , 79 바이트

i,j,k;f(*A,l,b,*O,*m){for(k=j=0;j<l;O[i=(A[j++]+b-1)/b-1]++,k=k>i?k:i);*m=++k;}

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

추가 매개 변수를 사용 m하여 길이를 반환 O합니다. 26 바이트가 들었습니다.


1

C (gcc) , 102 90 89 86 바이트

#define P!printf("%d ",k)
i,j,k;f(s){for(i=s;~scanf("%d",&j);k++)for(;j>i;i+=s)k=P;P;}

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

12 바이트를 줄인 케빈 크루이 센 (Kevin Cruijssen)과 4 바이트를위한 실링 캣에 감사드립니다!


1
90 바이트 를 위해 - 루프 사용을 제거하여 int, 변화하는 ==1>0.
케빈 크루이 센

천만에요. Btw, 단지 참고로, 현재 유효하지 않습니다 (지금 삭제 된 Java 답변과 동일). O(n)시간 내에 실행 해야하므로 중첩 된 for-loops를 가질 수 없습니다. (C ++ 답변은 괜찮은 것 같습니다. 따라서 +1했습니다. :))
Kevin Cruijssen

여전히 O (n)입니다. 내부 루프는 항상 값을 인쇄하며 총 (최대 값 + 1) / binsize 값만 인쇄합니다.
G. Sliepen

흠,하지만 O(n)입력 항목을 반복하여 이미 외부 루프가 아닙니다 . 내부 루프가 2 번만 반복 되더라도 이미 위에 O(n)있습니다. 또는 나는 무언가를 오해하고 O
있는가

1
그러나 내부 루프는 모든 입력 요소를 반복하지 않고 최신 입력 요소에 해당하는 위치로 "잡기"위해 인쇄해야하는 많은 출력 값만 반복합니다. 입력 벡터가 빈 크기보다 작은 복제 또는 값으로 구성되는 경우 내부 루프는 반복을 전혀 수행하지 않습니다. 반면에 입력 벡터가 매우 드문 경우 내부 루프는 더 많은 반복을 수행하여 0을 인쇄합니다. 따라서 코드는 O ((입력 요소 수) + (마지막 요소 / 빈 크기)) 시간으로 실행됩니다. 이것은 여전히 ​​선형입니다.
G. Sliepen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.