나는 골프 배열입니까?


18

정의와 규칙

golfy 어레이 의 각 요소는 정수 배열이며, 동일하거나보다 높은 이전의 모든 요소의 산술 평균. 당신의 임무는 입력으로 주어진 양의 정수의 배열이 골프인지 아닌지를 결정하는 것입니다.

테스트 사례 및 예

예를 들어 다음 배열은

[1, 4, 3, 8, 6]

각 항이 이전 항의 산술 평균보다 높기 때문에 골치 배열입니다. 단계별로 해결해 봅시다.

숫자-> 선행 요소-> 평균-> 규칙을 준수합니까?

1-> []-> 0.0-> 1 ≥ 0.0 (참)
4-> [1]-> 1.0-> 4 ≥ 1.0 (참)
3-> [1, 4]-> 2.5-> 3 ≥ 2.5 (참)
8-> [1, 4, 3]-> 2. (6)-> 8 ≥ 2. (6) (참)
6-> [1, 4, 3, 8]-> 4.0-> 6 ≥ 4.0 (참)

모든 요소는 조건을 존중하므로 골프 배열입니다. 이 과제의 목적을 위해 빈 목록의 평균이 ( []) 이라고 가정합니다 0.

더 많은 테스트 사례 :

입력-> 출력

[3]-> 참
[2, 12]-> 참
[1, 4, 3, 8, 6]-> 참
[1, 2, 3, 4, 5]-> 참
[6, 6, 6, 6, 6]-> 참
[3, 2]-> 거짓
[4, 5, 6, 4]-> 거짓
[4, 2, 1, 5, 7]-> 거짓
[45, 45, 46, 43]-> 거짓
[32, 9, 15, 19, 10]-> 거짓

이 것을 참고 퍼즐 1 에서 CodeGolf - 해커 톤 도에 게시 무정부 골프 - (하나가 파괴되는 것을) 재 게시 에 의해 histocrat ,하지만 난 두 사이트의 원래 저자, 따라서 여기를 다시 게시 할 수있었습니다.


입력은 항상 양의 정수 목록입니까?
Kelly Lowder

@KellyLowder 예.
Mr. Xcoder

재미있는 문제입니다. 테스트 케이스가 더 많은 Anarchy Golf에 다시 게시하려고 생각했지만 그 작업을하고 있다고 생각했습니다.
histocrat

@histocrat 계속 진행하여 Anarchy Golf에 다시 게시하십시오. 먼저 악용 될 수있는 사항에 대해 생각 했어야합니다. 나는 그것이 당신이 흥미로워 서 기쁘다 (Btw 여기에 핑하고 다시 게시하면 링크를 제공하십시오).
Mr. Xcoder

3
@streetster 그것들은 동일합니다. Sum / i> x는 Sum> xi와 같습니다. Sum + x와 같습니다.> x (i + 1)은 (Sum + x) / (i + 1)> x와 같습니다.
histocrat

답변:


13

파이썬 2 , 37 바이트

def g(a):sum(a)>len(a)*a.pop()or g(a)

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

종료 코드를 통한 출력 : 골치 어레이의 경우 충돌 (종료 코드 1), 골피가 아닌 어레이의 경우 종료 코드 0으로 종료됩니다. ovs와 Jonathan Frech는 3 바이트를 절약했습니다.

파이썬 2 , 44 바이트

f=lambda a:a and sum(a)<=len(a)*a.pop()*f(a)

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

True골치 아픈 배열 을 반환하는 더 전통적인 변형 False. Jonathan Frech는 2 바이트를 절약했습니다.


1
나는 a==[]or될 수 있다고 생각 한다 a and.
Jonathan Frech

2
실제로는 영리 sum(a)<=len(a)*a.pop()*[]합니다. 기본 사례에서는 항상 그렇습니다 int < list!
Lynn

3
정확한 입력을 위해 충돌하는 함수로서 39 바이트 .
ovs

1
명령 함수를 사용하는 @ovs 37 바이트 .
Jonathan Frech

11

젤리 , 6 5 바이트

<ÆmƤE

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

작동 원리

<ÆmƤE  Main link. Argument: A (integer array)

 ÆmƤ   Compute the arithmetic means (Æm) of all prefixes (Ƥ) of A.
<      Perform element-wise comparison. Note that the leftmost comparison always
       yields 0, as n is equal to the arithmetic mean of [n].
    E  Test if all elements of the resulting array are equal, which is true if and
       only if all comparisons yielded 0.

cairdcoinheringaahing의 6 개월 (대체) :ÆmƤµ⁼Ṣ
Mr. Xcoder

@ Mr.Xcoder Golfed!
Dennis

와우
정말

5

자바 스크립트 (ES6), 33 32 바이트

a=>a.some(e=>e*++i<(s+=e),s=i=0)

코드는와 같은 음수 값에서도 작동합니다 [-3, -2]. 다른 배열의 false경우 골프 배열을 반환 true합니다. 편집 : @JustinMariner 덕분에 1 바이트가 절약되었습니다.


1
당신은 삭제할 수 있습니다 !사양은 두 개의 서로 다른 값을 요구하기 때문에 그렇게 반환, false그것은 golfy 배열이 잘되는 때.
저스틴 마리너


4

MATL , 9 8 바이트

tYstf/<a

그렇지 않으면 0골프 배열에 대한 출력 1.

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

설명

입력을 고려하십시오 [1, 4, 3, 8, 6].

t    % Implicit input. Duplicate
     % STACK: [1, 4, 3, 8, 6], [1, 4, 3, 8, 6]
Ys   % Cumulative sum
     % STACK: [1, 4, 3, 8, 6], [1, 5, 8, 16, 22]
t    % Duplicate
     % STACK: [1, 4, 3, 8, 6], [1, 5, 8, 16, 22], [1, 5, 8, 16, 22]
f    % Find: indices of nonzeros. Gives [1, 2, ..., n], where n is input size
     % STACK: [1, 4, 3, 8, 6], [1, 5, 8, 16, 22], [1, 2, 3, 4, 5]
/    % Divide, element-wise
     % STACK: [1, 4, 3, 8, 6], [1, 2.5, 2.6667, 4, 4.4]
<    % Less than?, element-wise
     % STACK: [0, 0, 0, 0, 0]
a    % Any: true if and only there is some nonzero. Implicit display
     % STACK: 0

4

하스켈 , 53 50 48 바이트

and.(z(<=).scanl1(+)<*>z(*)[1..].tail)
z=zipWith

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

편집 : Zgarb 덕분에 -3 바이트!

설명

위의 포인트 프리 버전은 다음 프로그램과 같습니다.

f s = and $ zipWith(<=) (scanl1(+)s) (zipWith(*)[1..](tail s))

입력 주어지면 s=[1,4,3,8,6], scanl1(+)s접두어 합을 계산 [1,5,8,16,22]하고 zipWith(*)[1..](tail s)상기 제 소자 승산들은 인덱스 다른 모든 요소를 삭제 : [4,6,24,24]. 접두사 합계가 요소 시간 인덱스보다 작거나 같은 경우 목록은 이제 골프입니다. 두 목록을 모두 압축 (<=)하고 모든 결과가 True와 함께 있는지 확인하여 확인할 수 있습니다 and.


1
이와 같은 유형 오류를 피할 수 있습니다 .
Zgarb

@Zgarb 가늠자에 이것은 명백한 해결책입니다. 지적 해 주셔서 감사합니다!
Laikoni

3

C # (Visual C # 컴파일러) , 71 + 18 = 89 바이트

x=>x.Select((n,i)=>new{n,i}).Skip(1).All(y=>x.Take(y.i).Average()<=y.n)

추가 18 바이트 using System.Linq;

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


2
사이트에 오신 것을 환영합니다! :)
DJMcMayhem

일반적으로, 수입 명세서는 코드 골프에서 무료로 간주되지 않습니다. 이것은 문장이 필요하기 때문에 using System.Linq;실제로는 89 바이트가되며 때로는 "71 + 18 = 89"로 표현되어 18 바이트가 필요하지만 제목의 마지막 숫자가 마지막 수인 동안 솔루션의 일부는 아님을 보여줍니다 ( 자동 파서에 도움이됩니다).
Kamil Drakari

3

APL (Dyalog) , 10 바이트

이것은 익명의 암묵적 접두사 함수입니다 (APL 용어에서는 모나 딕 열차라고 함).

∧/⊢≥+⍳∘≢

TIO에서 모든 테스트 사례를 시도하십시오!

그렇습니까

∧/ 그 사실

 요소들

 크거나 같다

+\ 누적 합계

÷ 로 나눈

   정수 1부터

   그만큼

   요소 수

?


APL에는 "the"에 대한 기호가 있습니까 ??
user2390246

1
@ user2390246 은 "the cats"에서 "the"가 같은 방식으로 바인딩됩니다. 실제로 Compose 라고 합니다.
Adám


3

05AB1E , 5 바이트

ηÅA÷W

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

Dennis와 Adnan의 광범위한 도움이이 축소 버전에 도달했습니다. 또한이를 가능하게하는 버그가 수정되었습니다. 다시 감사합니다. 나는이 답변에 대해 거의 신용하지 않습니다.


05AB1E , 10 바이트

ηεÅA}ü.S_P

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


DgsO/05AB1E의 "mean"에 해당 하므로 오래 걸립니다.

분명히 ÅA산술 평균입니다.


평균을 계산하기 위해 +\÷JJelly에서 (누적 합계를 인덱스로 나눔)을 사용합니다. 05AB1E에서 그렇게 쉽지 않습니까? 편집 : 신경 쓰지 마라.
Dennis

@Dennis ah, 05AB1E의 누적 합계는 배열 길이 를 얻는 것, 평균을 얻기 위해 푸시 및 나누기, 여전히 본질적으로 5 바이트 인 ü+것 이외의 인덱스에 의한 차이가 실제로 없다는 것 입니다. gL1,2,...,n
Magic Octopus Urn

.S_<=누군가 lmk 아이디어가 있다면 가야 할 길 입니다.
매직 문어 Urn

겠습니까 ÷W대신 일을 ü.S_P?
Dennis

1
오, @Adnan은의 벡터화를 수정 ÅA했으므로 ηÅA÷W이제 작동합니다.
Dennis


2

PowerShell , 60 바이트

param($a)$o=1;$a|%{$o*=$_-ge($a[0..$i++]-join'+'|iex)/$i};$o

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

에 입력을 리터럴 배열 (예 :)로 가져 @(1, 4, 3, 8, 6)옵니다 $a. $output 변수를로 설정 합니다 1. 그런 다음를 반복합니다 $a. 반복 할 때마다 (ab) 출력 *=에 대한 부울 비교 결과에 대해 PowerShell의 암시 적 캐스팅을 사용합니다 $o. 부울은 현재 값 $_이 함께 추가 된 이전 항 ( )을 이미 본 항 -g수로 나눈 값인지 여부 입니다. 따라서 길을 따라가는 단계가 거짓이면을 곱합니다 . 그렇지 않으면 계속 유지 됩니다.e$a[0..$i++]-join'+'|iex$i$o01

그런 다음 단순히 $o파이프 라인에 배치 하면 출력이 암시 적입니다. 1진실과 0거짓.




2

Cubix , 35 바이트

/I?/\+psu0^.\)*sqs;-\;;U;O1.....?@^

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

공간을 가장 효율적으로 사용하지 않음 (코드에서 6 개의 no-ops) 골피가 아닌 배열의 경우 골리 배열의 출력을 생성 1하지 않습니다.

다음 큐브로 확장합니다 :

      / I ?
      / \ +
      p s u
0 ^ . \ ) * s q s ; - \
; ; U ; O 1 . . . . . ?
@ ^ . . . . . . . . . .
      . . .
      . . .
      . . .

앞으로 설명하지만 기본적으로 Luis Mendo의 MATL 답변 또는 Dennis ' Julia 답변 과 같은 것을 포팅합니다 .

달려 봐!



2

SQL (MySQL), 68 바이트

select min(n>=(select ifnull(avg(n),1)from t s where s.i<t.i))from t

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

반환 1 golfy 배열하고, 0을 , 그렇지 않으면. A로부터 입력을 받아 라는 이름의 테이블 , t. 를 만들려면 다음 t을 실행하십시오.

CREATE TABLE t(i SERIAL,n INT)

그리고 값을로드하려면 :

truncate table t;insert into t(n)values(3),(2);


1

파이썬 2 , 52 바이트

lambda A:all(k*j>=sum(A[:j])for j,k in enumerate(A))

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

파이썬 2 , 50 48 44 42 바이트

  • 을 인라인하고 사용하여 2 바이트를 절약했습니다 and.
  • 체인 할당 으로 Mr. Xcoder 덕분에 2 바이트를 절약 했습니다 S=k=0.
  • or및 비교의 부울 값을 k의 증분 값 으로 사용하여 2 바이트를 저장했습니다 .
  • ovs 덕분에 2 바이트를 절약했습니다 . 상승 NameError(A)의 대신에 정의되지 않은 변수를 이용하여 ZeroDivisionError.
S=k=0
for j in input():k+=S<=j*k or J;S+=j

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


대체 버전의 경우 46 바이트
Mr. Xcoder

@ Mr.Xcoder 감사합니다.
Jonathan Frech


@ovs 감사합니다; 깔끔한 1 바이트 방식으로 예외를 제기하십시오.
Jonathan Frech

1

q / kdb + , 14 바이트

해결책:

min x>=avgs x:

예 :

q)min x>=avgs x:1 4 3 8 6
1b                           / truthy
q)min x>=avgs x:4 2 1 5 7
0b                           / falsey

설명:

avgs내장으로 상당히 간단합니다 .

min x>=avgs x: / solution
            x: / store input in variable x
       avgs    / calculate running averages
    x>=        / array comparison, x greater than running average
min            / take minimum of list of booleans


1

R , 38 34 바이트

function(x)any(cumsum(x)/seq(x)>x)

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


아주 좋아요 Dunno는 왜 전에 R 답변이 없었던 지 ...
Giuseppe

당신은 모두 나를 위해 쉬운 하나를 저장했다.
ngm

y함수 인수 를 정의하는 대신 cumsum(x)직접 사용 하는 것이 4 바이트 더 짧습니다. cummean기지 R 에는 부끄러운 일 이 아닙니다.
주세페

1

추가 ++ , 54 바이트

D,g,@@#,BFB
D,k,@,¦+AbL/
D,f,@,dbLR$€g€k0b]$+ABcB]£>ª!

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

원본이 아닌 버전, 30 바이트

D,f,@,¬+AbLRBcB/@0@B]ABcB]£>ª!

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

골프 배열의 경우 출력 1 , 그렇지 않은 경우 0

작동 방식

첫 번째 버전은 다른 솔루션을 확인하지 않고 직접 작성했습니다. 두 번째는 Dennis의 의견 에서 영감을 얻었 으므로 만족스럽지 않습니다.

첫 번째 버전

에프: =[1,...||]||dbLR$[,]

D,g,@@#,BFB

2#BF이자형엑스[...,이자형]...B이자형

케이gk2{...}IKUYZgkluw

엑스케이케이

D,k,@,¦+AbL/

¦+AbL/

00[0]0b]$+

ABcB]Bczip+

,+;<¬(),010ª!

두 번째 버전

24¬+[0,0+1,0+1+2,...,0+...+나는]J: =[1...||]||

BcB/0@0@B]+

+: =[0,0,0+12,0+1+2,...,0+...+나는나는+1]

+



0

자바 (OpenJDK 8) , 96 바이트

나는 그것이 좋은 골프 언어가 아니라는 것을 알고 있지만, 나는 아직도 그것을 갔다!

테스트 할 쉼표로 구분 된 정수의 첫 번째 인수로 입력 배열을 입력하십시오.

true는 1, false는 0을 반환합니다.

a->{int i=1,j,r=1,s=0;for(;i<a.length;i++,s=0){for(j=0;j<i;s+=a[j++]);r=s/i>a[i]?0:r;}return r;}

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


0

자바 7, 100 바이트

골프 :

int g(int[]a){int i=1,m=0,s=m,r=1;for(;i<a.length;){s+=a[i-1];m=s/i;r-=a[i++]<m&&r>0?1:0;}return r;}

언 골프 드 :

int golfy(int[]a)
{
    int i = 1, m = 0, s = m, r = 1;
    for (; i < a.length;)
    {
        s += a[i-1];
        m = s / i;
        r -= a[i++] < m && r>0? 1 : 0;
    }
    return r;
}

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

ungolfy의 경우 0을, golfy 배열의 경우 1을 반환합니다. Java 8 답변보다 약간 더 깁니다.



0

J, 19 바이트

[:*/[>:[:}:0,+/\%#\

+/\ % #\접두사의 평균 : #\1..n 생성

}:0, 처음에 0을 추가하고 마지막을 제거하십시오

[>: > = 요소 별 원래 목록 요소가 이동 된 평균 목록입니까?

*/있는 모든 즉, 요소보다 이전 목록은 모든입니다 1들?

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



0

Japt , 10 바이트

두 가지 10 바이트 솔루션으로 나왔지만 개선 할 수는 없습니다.

eȨU¯Y x÷Y

시도 해봐


설명

               :Implicit input of array U
eÈ             :Is every element, at 0-based index Y
  ¨            :Greater than or equal to
   U¯Y         :U sliced from index 0 to index Y
        ÷Y     :Divide each element by Y
       x       :Reduce by addition

대안

eÈ*°Y¨(T±X

시도 해봐

               :Implicit input of array U
eÈ             :Is every element X (at 0-based index Y)
  *°Y          :Multiplied by Y incremented by 1
     ¨         :Greater than or equal to
      (T±X     :T (initially 0) incremented by X
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.