두 목록의 분류되지 않은 전공


13

정의

벡터 포함하는 N 요소라고 majorize 또는 지배 벡터 BN 의 모든 값에 대해 IFF에 소자 케이 되도록 1 ≤ KN 의 첫 번째 요소의 합 관통 k는 의 번째 요소 ↓가 크다 또는보다 내지 제의 합 K 요소 번째 B , V는 벡터 나타내고 V는 내림차순으로 정렬.

그건,

                          a_1 >= b_1
                    a_1 + a_2 >= b_1 + b_2
              a_1 + a_2 + a_3 >= b_1 + b_2 + b_3
                              ...
      a_1 + a_2 + ... + a_n-1 >= b_1 + b_2 + ... + b_n-1
a_1 + a_2 + ... + a_n-1 + a_n >= b_1 + b_2 + ... + b_n-1 + b_n

여기서 ab 는 내림차순으로 정렬됩니다.

이 도전의 목적을 위해, 우리는 약간의 주화 일반화를 사용할 것입니다 : 우리는 위의 모든 불평등이 ab 를 정렬하지 않고 참이라면 리스트가 다른 주화분류되지 않은 주화 라고 말할 것 입니다. (물론 이것은 수학적으로 쓸모가 없지만 도전을 더 흥미롭게 만듭니다.)

도전

두 가지리스트의 입력을 감안 및 B , 255 (포함) 내지의 범위는 0의 정수를 모두 길이리스트 N ≥ 1 출력은 제리스트 여부 제 (정렬되지 않은-majorizes > B ) unsorted- 번째 첫 번째 ( b > a )를 전공 하거나 또는 둘 다를 전공 하지 않습니다.

선택적으로 두 목록의 길이를 입력으로 제공해야 할 수도 있습니다. 출력은 항상 세 가지 값 중 하나 여야합니다,하지만 자신이 원하는 무엇이든 될 수있는 값 (값이 대표를 지정하십시오 > B , B를 > , 어느 쪽도 아니 당신의 대답에).

a > b에 대한 테스트 사례 :

[255] [254]
[3,2,1] [3,1,2]
[6,1,5,2,7] [2,5,4,3,7]

b > a에 대한 테스트 사례 :

[9,1] [10,0]
[6,5,4] [7,6,5]
[0,1,1,2,1,2] [0,1,2,1,2,1]

전공이없는 테스트 사례 :

[200,100] [150,250]
[3,1,4] [2,3,3]
[9,9,9,9,9,0] [8,8,8,8,8,9]

2 열 배열을 입력으로 사용할 수 있습니까?
Luis Mendo

1
@LuisMendo 예, 입력은 추가 정보를 인코딩하지 않는 모든 형식 일 수 있습니다.
손잡이

쌍의 배열이 허용됩니까?
데니스

답변:


6

젤리 , 10 8 6 바이트

@orlp 덕분에 2 바이트.

@Dennis 덕분에 2 바이트.

_+\ṠQS

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

1을 위해 a>b,을 -1위해 a<b, 주요 화를 0위해.

_+\ṠQS

_       Difference (vectorized)
 +\     Cumulative sum.
   Ṡ    Sign of every difference
    Q   Deduplicate
     S  Sum

둘 다 존재 1하고 -1존재하는 경우 (일부 누적 합계가 더 크고 일부는 더 작음) 마지막 단계에서을 생성 0합니다.


3

ngn / apl, 11 바이트

{+/∪×+\⍺-⍵}

@Leaky Nun 's answer 의 방법을 기반으로합니다 .

두 개의 목록 AB가 주어지면 각 값의 차이를 요소 단위로 찾거나 C = A-B로하십시오 . 그런 다음 C 의 누적 합계를 찾아 각각의 부호를 갖습니다. 고유 부호 값의 합계가 결과입니다. 경우 > B 이면 결과, 1 < B 결과가 -1 인, 더 다수가없는 경우 결과가 0이다.

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


3

줄리아, 30 바이트

a^b=sum(sign(cumsum(a-b))∪0)

@Dennis 덕분에 4 바이트가 절약되었습니다!


Julia의 어떤 버전에서 이것을 테스트 했습니까?
Dennis

죄송합니다 .PI가 작동해야한다고 생각합니다.
Mama Fun Roll 3

1
과연. a^b=sum(sign(cumsum(a-b))∪0)몇 바이트를 절약합니다.
Dennis

2

파이썬 3.5, 85 바이트 :

lambda*e:[all(sum(g[:k])>=sum(h[:k])for k in range(1,-~len(h)))for g,h in[e,e[::-1]]]

익명의 람다 함수. [True,False]if a>b, [False,True]if b>a또는 [False,False]둘 중 하나 라도 true를 리턴 합니다. 나는 이것이 괜찮기를 바랍니다.

온라인으로 사용해보십시오! (아이디어)


2

, 118 114 바이트

n->[n.map(i->i[0]-i[1]).map((j,k,l)->l.slice(0,k+1).sum).map(i->i>0?1:i<0?-1:0)].map(j->j has 1?j has-1?0:1:-1)[0]

기본적으로 내 젤리 답변 의 포트입니다 .

함수 내부의 범위가 깨져서 함수 내부의 변수를 정의 할 수 없다는 사실은 [xxx].map(i->yyy)[0]대신 대신 해야 할 것을 의미합니다 var a=xxx;yyy.

바뀐 배열을 입력으로 취합니다.

n->[n
.map(i->i[0]-i[1])                     Difference (vectorized)
.map((j,k,l)->l.slice(0,k+1).sum)      Cumulative sum.
.map(i->i>0?1:i<0?-1:0)]               Sign of every difference
.map(j->j has 1?j has-1?0:1:-1)[0]     Deduplicate and Sum

1

파이썬 2, 73 바이트

a,=b,=r={0}
for x,y in zip(*input()):a+=x;b+=y;r|={cmp(a,b)}
print sum(r)

Ideone에서 테스트하십시오 .



1

파이썬 2, 59 바이트

t=r=0
for x,y in zip(*input()):t+=x-y;r|=cmp(t,0)%3
print r

출력 :

  • 1 ...에 대한 a>b
  • 2 ...에 대한 b>a
  • 3 어느 쪽도

목록 전체를 반복하여 실행중인 t차이의 합계 를 추적합니다 . 숫자 s는 어떤 비트가 2 비트 숫자로 보 였는지 추적 r합니다. 오른쪽 비트의 양수, 왼쪽 비트의 음수. 이것은를 통해 발생 cmp(t,0)%3합니다.

  • t>0+1→ 1
  • t==00 → 0
  • t<0-1→ 2

복용 or이것의 현재의 값의 r업데이트가 2 개 비트를 or0 값은 아무런 영향을 갖지 않는와.


0

자바 스크립트 (외부 라이브러리 계산 가능) (123 바이트)

(a,b)=>(z=(c,d)=>_.Range(1,c.length).All(x=>_.From(c).Take(x).Sum()>=_.From(d).Take(x).Sum()))(a,b)==z(b,a)?0:(z(a,b)?1:-1)

lib에 링크 : https://github.com/mvegh1/Enumerable

코드 설명 : 벡터 a와 b를 전달하고 전역 함수 z를 만듭니다. z는 a.length의 개수에 대해 1부터 정수 배열을 만드는 것으로 시작합니다. .All은 a에 속한 모든 구성원에 대해 술어가 true인지 확인합니다. 이 술어는 a를 열거 가능한 것으로로드하고, 우리가 만든 해당 범위의 현재 반복 값과 동등한 열거 가능한 수를 계산하고 요약합니다. > = 배열 ​​"b"와 동일한 논리인지 확인하십시오. 따라서 우리는 (a, b)의 순서로 z를 호출하고 (b, a)의 순서와 비교합니다 ... 동일하면 메이저가 없음을 나타내는 0을 반환합니다. 그렇지 않으면 (a, b)가 true이면 1을 반환하고, 그렇지 않으면 -1을 반환합니다

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.