Codegolf Rainbow : 정수 배열 재미


12

소개:

여기에 이미지 설명을 입력하십시오(출처 : Wikipedia )
무지개를 보면 항상 위에서 아래로
색이 나타납니다. 주황색; 노랑; 초록; 푸른; 남빛; 제비꽃

이 개별 고리를 보면 빨간색 고리는 물론 보라색 고리보다 큽니다.
또한, 동시에 2 개 또는 3 개의 무지개를 가질 수도 있습니다.

이 모든 도전 과제는이 도전에 사용됩니다 :

도전:

정확히 크기 7의 정수 목록이 주어지면 각 값은 무지개를 형성하는 데 사용할 수있는 색상 입자를 나타냅니다 (가장 큰 지수는 빨간색을 나타내고 가장 작은 지수는 보라색을 나타냄). 형성 할 수있는 무지개의 양을 출력합니다.

단일 정수-무지개는 적어도 3x 바이올렛, 4x 인디고, 5x 블루, 6x 그린, 7x 옐로우, 8x 오렌지, 9x 레드를 가져야합니다. 그 위의 두 번째 무지개는 첫 번째 무지개의 빨간색 고리보다 큽니다 (그들 사이의 공간을 포함하여), 적어도 11x 바이올렛, 12x 남빛, 13x 파랑, 14x 녹색, 15x 노랑, 16x 주황색이 필요합니다 , 첫 번째 무지개가 사용하는 것 외에 17x 빨간색. 세 번째 무지개는 19 배 바이올렛에서 다시 시작됩니다.

예:

입력 목록 : [15,20,18,33,24,29,41]
출력 :2

왜? 우리는 15 배의 보라색을 가지고 있으며, 두 무지개에 대해 적어도 3 + 11 = 14가 필요합니다. 우리는 20 개의 인디고를 가지고 있으며 두 개의 무지개에 대해 적어도 4 + 12 = 16이 필요합니다. 우리는 두 개의 무지개에 대해 충분한 색상을 가지고 있지만 세 개의 무지개를 형성하기에는 충분하지 않으므로 출력은 2입니다.

도전 규칙 :

  • 입력 배열의 정수는 음이 아닌 것으로 보장됩니다 ( >= 0).
  • 입력 목록의 크기는 정확히 7이어야합니다.
  • 무지개가 형성되지 않으면 출력 0합니다.
  • 입력 및 출력 형식이 유연합니다. STDIN에서 가져올 수있는 소수의 정수 목록 또는 배열 일 수 있습니다. 출력은 합리적인 출력 유형의 함수에서 리턴되거나 STDOUT으로 직접 인쇄 될 수 있습니다.

n무지개 양에 필요한 최소 색상 양 :

Amount of Rainbows    Minimum amount per color
0                     [0,0,0,0,0,0,0]
1                     [3,4,5,6,7,8,9]
2                     [14,16,18,20,22,24,26]
3                     [33,36,39,42,45,48,51]
4                     [60,64,68,72,76,80,84]
5                     [95,100,105,110,115,120,125]
etc...

일반 규칙:

  • 이것은 이므로 바이트 단위의 최단 답변이 이깁니다.
    코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. '모든'프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오.
  • 표준 규칙이 답변에 적용 되므로 STDIN / STDOUT, 적절한 매개 변수 및 반환 유형의 전체 프로그램과 함께 함수 / 방법을 사용할 수 있습니다. 당신의 전화.
  • 기본 허점 은 금지되어 있습니다.
  • 가능하면 코드 테스트 링크를 추가하십시오.
  • 또한 답변에 대한 설명을 추가하는 것이 좋습니다.

테스트 사례 :

Input:  [15,20,18,33,24,29,41]
Output: 2

Input:  [3,4,5,6,7,8,9]
Output: 1

Input:  [9,8,7,6,5,4,3]
Output: 0

Input:  [100,100,100,100,100,100,100]
Output: 4

Input:  [53,58,90,42,111,57,66]
Output: 3

Input:  [0,0,0,0,0,0,0]
Output: 0

Input:  [95,100,105,110,115,120,125]
Output: 5

Input:  [39525,41278,39333,44444,39502,39599,39699]
Output: 98

0,0,0,0,0,0,0가장자리의 경우 비록 :( (가 1 갭 논리에 맞지 않는)
조나단 앨런

답변:


8

Pyth , 14 바이트

thS.ef<b*+tkyy

테스트 스위트!

어떻게?

알고리즘 티움

C(n,i)ninthnL(n,i)=i+3+8(n1)L(k,i)k

C(n,i)=(i+3)1st layer+(i+3+8)2nd layer++[i+3+8(n1)]nth layer
C(n,i)=(i+3)n+8(0+1++n1)
C(n,i)=(i+3)n+8(n1)n2=(i+3)n+4n(n1)
C(n,i)=n(i+3+4n4)C(n,i)=n(4n+i1)

kC(k,i)IiIiith

이행

C.ekbTb<C(T,i)C(T,i)b 오프셋 1을 보충하기 위해 1을 빼십시오.


3

파이썬 2 , 64 61 바이트

lambda l:min(((16*v+i*i)**.5-i)//8for i,v in enumerate(l,-1))

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


무지개의 각 색상은 (3+i)+n*8레이어 n와 색상에 사용됩니다 i(0 = 바이올렛 등).

따라서 x 레이어의 총계는 다음과 같습니다 (3*i)*x + 8*x*(x+1).

우리는 단순히 n을 풀고 최소값을 취합니다.


저장 됨 :

  • ovs 덕분에 -3 바이트

2
아, 이제 나는 그 응답을 얻는다 ...
Jonathan Frech


@ovs, 감사합니다 :)
TFeld

3

05AB1E , 18 17 16 바이트

Magic Octopus Urn 덕분에 -1 바이트

[ND4*6Ý<+*¹›1å#N

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

n 무지개에 필요한 색의 양은 n (4n + [-1, 0, 1, 2, 3, 4, 5]) 입니다.


[ND4*6Ý<+*¹›1å#N작동하지만 이유를 모르겠습니다. 그래도 -1 바이트.
Magic Octopus Urn

트윗 담아 가기 카운터 변수 대신 루프 인덱스를 사용합니다.
Okx

내가 할 필요가없는 것은 이상해 보인다 N>. 왜냐하면 당신은 ¾>전에 있었기 때문이다 .
Magic Octopus Urn

@MagicOctopusUrn 카운터 변수를 증가시키는 명령은 카운터 변수를 푸시하지 않습니다.
Okx

2

자바 스크립트 (ES6), 49 바이트

f=(a,n)=>a.some((v,k)=>v<4*n*n-~-k*n)?~n:f(a,~-n)

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

어떻게?

P(n,k)nk

P(n,k)=n(4n+(k1))=4n2+(k1)n

nvkP(n,k)

그러나 골프 목적으로, 우리 n === undefinedn그 후에 음의 값으로 시작 하고 사용합니다 . 불평등의 우변이로 평가되므로 첫 번째 반복은 항상 성공합니다 NaN. 따라서 첫 번째 의미있는 테스트는와 두 번째 테스트입니다 n == -1.



1

Excel VBA, 78 바이트

[A1:G1]VBE 즉시 창 에서 입력 및 출력되는 익명 함수 .

[A2:G999]="=A1-(COLUMN()+8*ROW()-14)":[H:H]="=-(MIN(A1:G1)<0)":?998+[Sum(H:H)]

1

, 21 바이트

I⌊EA÷⁻X⁺X⊖κ²×¹⁶ι·⁵⊖κ⁸

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명 : 독립적으로 파생 된 공식 I을 사용하여 각 색상으로 가능한 무지개 수를 직접 계산하지만 @TField의 공식과 동일합니다.

   A                   Input array
  E                     Map over values
          κ             Current index
         ⊖              Decrement
        X  ²            Square
               ι        Current index
            ×¹⁶         Multiply by 16
       ⁺                Add
      X         ·⁵      Square root
                   κ    Current index
                  ⊖     Decrement
     ⁻                  Subtract
    ÷               ⁸   Integer divide by 8
 ⌊                      Take the maximum
I                       Cast to string
                        Implicitly print


1

젤리 , 14 바이트

힘들었다!

Ṃ+9s8Ṗ‘+\>ݧỊS

무지개의 수인 정수를 산출하는 7 개의 정수 목록을 받아들이는 모나드 링크.

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

어떻게?

불행히도 어떤 순진한 방법은 16 바이트를 취하는 것처럼 보이지만 그러한 방법 중 하나는 Ṃɓ_J×¥H÷‘H<¬Ȧð€S여기에 사용 된 방법이 훨씬 효율적이고 짧습니다.

이 방법은 자외선 밴드를 포함하여 입자 수로 충분한 레인보우 스택을 빌드 하고 가능한 각 스택마다 1을 더합니다.

그것이 가능한 테스트는 자외선 밴드 입자가 필요하지만 제로가 제공 되었기 때문에 불가능한 단일 밴드만이 있는지 확인하는 것입니다.

Ṃ+9s8Ṗ‘+\>ݧỊS - Link list of integers    e.g. [0,0,0,0,0,0,0]        or [17,20,18,33,24,29,41]
Ṃ              - minimum                       0                         17
 +9            - add nine                      9                         26
   s8          - split into eights             [[1,2,3,4,5,6,7,8],[9]]   [[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16],[17,18,19,20,21,22,23,24],[25,26]]
     Ṗ         - discard the rightmost         [[1,2,3,4,5,6,7,8]]       [[1,2,3,4,5,6,7,8],[9,10,11,12,13,14,15,16],[17,18,19,20,21,22,23,24]]
      ‘        - increment (vectorises)        [[2,3,4,5,6,7,8,9]]       [[2,3,4,5,6,7,8,9],[10,11,12,13,14,15,16,17],[18,19,20,21,22,23,24,25]]
               -   (single rainbow counts, including ultra-violet bands, ready to stack)
       +\      - cumulative addition           [[2,3,4,5,6,7,8,9]]       [[2,3,4,5,6,7,8,9],[12,14,16,18,20,22,24,26],[30,33,36,39,42,45,48,51]]
               -   (stacked rainbow counts, including ultra-violet bands)
          Ż    - zero concatenate              [0,0,0,0,0,0,0,0]         [0,17,20,18,33,24,29,41]
               -   (we got given zero ultra-violet band particles!)
         >     - greater than? (vectorises)    [[1,1,1,1,1,1,1,1]]       [[1,0,0,0,0,0,0,0],[1,0,0,0,0,0,0,0],[1,1,1,1,1,1,1,1]]
               -   (always a leading 1 - never enough particles for the ultra-violet band)
           §   - sum each                      [8]                       [1,1,8]
               -   (how many bands we failed to build for each sacked rainbow?)
            Ị  - insignificant? (abs(X)<=1?)   [0]                       [1,1,0]
               -   (1 if we only failed to build an ultra-violet band for each sacked rainbow, 0 otherwise)
             S - sum                           0                         2
               -   (the number of rainbows we can stack, given we don't see ultra-violet!)

나는 확실히 너무 열심히 나를 18 바이트 Okx의 알고리즘을 쥐어 짜기 위해이었다, 당신이 기분이 ...
에릭 Outgolfer

또한 §ỊS!
Outgolfer Erik

1

05AB1E , 14 바이트

žv*āÍn+tā-Ì8÷ß

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

n .

Pyth 알고리즘 ⟶ 05AB1E 알고리즘

05AB1E에서이 문제를 해결하기 위해 시도 할 수있는 방법 이 많이 있으므로 가지 방법을 시도했는데 이것이 가장 짧았습니다. 05AB1E가 1- 인덱싱을 사용했다는 것을 명심하면서 내 Pyth 답변에서 위에서 언급 한 공식을 적용하면 다음과 같이 함수를 구성 할 수 있습니다.

C(n,i)=n(i+2)+4n(n1)

Ii

4n2+n(i2)Ii=0

이 평등은 정확하지 않지만 (현재 공식적으로 더 공식적으로 표현하는 방법을 알지 못합니다)이 방정식에 대한 솔루션은 부동 소수점 숫자를 생성하지만 정확한 나누기보다는 바닥 나누기를 사용 하여이 문제를 해결합니다. 나중에. 어쨌든, 우리의 주장을 계속하려면 대부분의 사람들은 아마도 그러한 방정식 의 솔루션에 매우 익숙 할 것입니다.

n1,2=2i±(i2)2+16Ii8

Ii(i2)2+16Iii22ii+2=42ii22i2+i=4n

n=2+(i2)2+16Iii8

이 답변이 구현하는 관계는 정확히 무엇입니까?


1

C ++, 127125 바이트

Kevin Cruijssen 덕분에 2 바이트가 줄었습니다.

#include<cmath>
int f(int x[7]){size_t o=-1;for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c])-c+1)/8;return o;}

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

이 함수는 7 개의 정수로 구성된 C 스타일 배열을 가져 와서 정수를 반환합니다.

c0c6n(n1)yc(n)=(c+3)+8(n1)nYc(n)=k=1nyc(k)=n(c+3)+8n(n1)2xcYc(n)xcn:

n(c1)+(c1)2+16xc8

xc

설명:

#include <cmath> // for sqrt

int f (int x[7])
{
     // Note that o is unsigned so it will initially compare greater than any int
     size_t o = -1;
     // Iterate over the array
     for (int c = 0; c < 7; c++)
     {
         // calculate the bound
         int q = c - 1;
         q = (std::sqrt (q * q + 16 * x[c]) - q) / 8;

         // if it is less than previously found - store it
         o = o > q ? q : o;
     }
     return o;
 }

안녕하세요, PPCG에 오신 것을 환영합니다! 나는 너무 잘 ++ C 모르지만, 나는 확신 할 수 있습니다 골프이 부분 : for(int c=0;c<7;c++){int q=c-1;q=(std::sqrt(q*q+16*x[c])-q)/8;o=o>q?q:o;}이것 : for(int c=0,q;c<7;c++,o=o>q?q:o)q=(std::sqrt(--c*c-c+16*x[++c]))/8;. 또한 테스트 코드 로 TIO 링크 를 제공 할 수 있습니까?
Kevin Cruijssen

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