최종 수


15

도전

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

4 개의 정수 배열 ( 특정 알고리즘에 의해 생성 된 일련의 숫자를 나타냄) 을 취하고 다음에 오는 정수를 리턴 하는 프로그램을 작성하십시오 .

우리는 변이가 일정하지 않은 단순한 덧셈, 뺄셈, 곱셈 및 나눗셈 알고리즘 만 사용할 것입니다.

구분을 위해 우리가 사용하는 floor정수 값을 : 133/4 = 3333/4 = 8

항상 하나의 유효한 반환 값이 있다고 가정 할 수 있습니다

테스트 사례

[14,24,34,44] 54를 더해야합니다 (추가 알고리즘)

[105,45,-15,-75] -135 (빼기 알고리즘)를 반환해야합니다.

[5,25,125,625] 3125 (곱하기 알고리즘)를 반환해야합니다.

[256,64,16,4] 1을 반환해야합니다 (나눗셈 알고리즘)

일반 규칙


2
이것은 다음에 나오는 것의 단순화 된 버전입니다 . 경계선 복제.
피터 테일러

7
앞으로는 다른 사람의 의견을 미리받을 수 있도록 게시 하기 전에 샌드 박스 에 게시하는 것이 좋습니다 .
Leaky Nun

5
정수 나누기에 대한 테스트 사례를 실제로 추가해야합니다. 거의 모든 답변에서 [261,65,16,4], [4,2,1,0] 또는 [2,1,0,0]에 대한 정확한 결과를 얻지 못함
Damien

5
중복 투표에 동의하지 않습니다. 알고리즘을 찾는 것은 하나의 연산 만 고려한다는 점에서 더 단순하지만, 동시에 정수 나누기를 고려해야하기 때문에 더 어렵다. 다른 도전에서 답변을 포팅하는 것이 처음부터 새로 작성하는 것보다 훨씬 쉽다고 생각하지 않습니다.
Dennis

3
나누기 계열이 음수이면 두 가지 해석이 있으므로 음이 아닌 정수를 지정해야합니다. 예를 들어 -81/4중 하나입니다 21 r 3또는 -20 r -1.
Jonathan Allan

답변:


6

05AB1E , 18 16 18 바이트

D¥¬QPi`+s-ë`r/s\*î

설명

D                   # duplicate
 ¥                  # delta's
  ¬Q                # compare first delta to the other deltas
    P               # product (1 if all deltas are equal, otherwise 0)
     i              # if 1 (we're dealing with addition or subtraction)
      `+s-          # add the difference between the elements to the last element
          ë         # else (we're dealing with multiplication or division)
           `r/      # divide the 2nd element by the 1st
              s\*   # multiply with the 4th element
                 î  # round up

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


[4,2,1,0]에서 출력이 잘못되었습니다 ...
Damien

@Damien : 알려 주셔서 감사합니다. 나는 그것을
고쳤고

큰. 이제 모든 테스트 사례를 확인합니다.
Damien

4로 나누기 위해 엣지 케이스를 사용해보십시오.[-325, -82, -21, -6]
Jonathan Allan

... 실제로 질문은 음이 아닌 정수에 대한 것이거나 사용할 규칙을 지정해야한다고 생각합니다.
Jonathan Allan

14

자바 스크립트 (ES6),  44   42  44 바이트 (고정)

(a,b,c,d)=>a-b+d-c?d/(a<b?a/b:a/b|0)|0:d+c-b

IsmaelMiguel의 조언에 따라 2 바이트를 절약했습니다.
의 버전을 고정 [2,1,0,0]하고 [1,0,0,0]edc65에 의해 제안

30 바이트 버전

레코드의 경우 첫 번째 시도는 32 30 바이트이지만 나누기에 대한 floor () 지원이 부족했습니다. 또한 같은 특별한 경우 실패 [2,1,0,0]하고 [1,0,0,0].

(a,b,c,d)=>c-2*b+a?d*c/b:d+c-b

데모

var f =
(a,b,c,d)=>a-b+d-c?d/(a<b?a/b:a/b|0)|0:d+c-b

var test = [
  [ 14, 24, 34, 44 ],     // should return 54 (addition Algorithm)
  [ 105, 45, -15, -75 ],  // should return -135 (subtraction algorithm)
  [ 5, 25, 125, 625 ],    // should return 3125 (multiplicative algorithm)
  [ 256, 64, 16, 4 ],     // should return 1 (division algorithm)
  [ 260, 65, 16, 4 ],     // should return 1 (division algorithm with floor())
  [ 2, 1, 0, 0 ],         // should return 0 (special case of division algorithm)
  [ 1, 0, 0, 0 ]          // should return 0 (special case of division algorithm)
];

test.forEach(l => console.log('[' + l.join`, `+ '] => ' + f(...l)));


와우, js에 패턴 일치가 있다는 것을 몰랐습니다.
Leaky Nun

@LeakyNun- ES6에 구조적 할당 이 실제로 도입되었습니다. [a,b]=>함수 매개 변수에 대해서는 수행 할 수 없습니다 . 괄호가 필요합니다.
Arnauld

훌륭하지만 정수 나누기를 처리해야합니다. [260, 65, 16, 4] => 0.9846153846153847. 1
Damien을

@Damien-아 잘 ... 누군가 알아 차릴 것입니다. ;-) 수정되었습니다.
Arnauld

[2,1,0,0]은 어떻습니까? 0을 주어야합니다. b*2==c+a<=> 더하기 / 빼기 알고리즘에 대한 유일한 반대 예라고 생각합니다
Damien

11

Brachylog , 37 33 27 바이트

b:[E]cL,?:Iz{:+a|:*a|:/a}Lt

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

@LeakyNun 덕분에 10 바이트를 절약했습니다 .

설명

Input = [A:B:C:D]

b:[E]cL,     L = [B:C:D:E]
?:Iz         Create the list [[B:I]:[C:I]:[D:I]:[E:I]]
{            Either…
    :+a          Sum all couples of that list
|            or…
    :*a          Multiply all couples of that list
|            or…
    :/a          Integer divide all couples of that list
}L          The result is L
t           Output is the last element of L

LeakyNun이 지적했듯이 정수일 I수 있으므로 빼기 대 / 소문자가 필요하지 않습니다 .


4
와우, brachylog (& 프롤로그)는 굉장하다
Maltysen

2
덧셈과 뺄셈은 동일합니다
Leaky Nun

1
@LeakyNun 맞습니다, 감사합니다!
Fatalize



6

하스켈, 65 바이트

f l@[a,b,c,d]|[a,b..d]==l=d+b-a|z<-b+0^b=div(d*b)$a-mod(max b a)z

5

파이썬 2, 40 바이트

lambda(a,b,c,d):[d+c-b,d*c/b][c-2*b+a>0]

말 그대로 파이썬으로 포팅 된 JS 답변입니다 (@LeakyNun 감사합니다!). 이전의 접근 방식은 말도 안되게 길었지만 여기에 있습니다.

파이썬 2, 169166 바이트

두 번째와 세 번째 수준은 각각 원시 탭과 원시 탭에 공백을 더한 것으로, Markdown과 함께 매우 나쁘게 재생 되므로 탭이 2 개의 공백으로 대체되었습니다.

x=input()
q='%d%s%d'
for i in range(max(x)):
 for o in'+-*/':
  a=1
  for e,n in zip(x,x[1:]):
   try:1/(eval(q%(e,o,i))==n)
   except:a=0
  if a:print eval(q%(x[-1],o,i))

꽤 간단합니다. 상수가 될 수 있다고 생각하는 모든 상수와 연산자를 시도한 다음 상수 / 연산자 조합이 목록의 모든 요소에 대해 작동하면 ( try/ except쌍을 사용하여 ZeroDivisionErrors 피하기 ) 목록의 마지막 요소에 대한 결과를 인쇄합니다.

여기에 더 좋은 방법이 있다고 확신합니다. 이것은 순진한 방법입니다.


js 답변을 Python으로 포팅하는 것이 좋습니다.
Leaky Nun

[1,0,0,0]출력해야 할 브레이크0
Jonathan Allan

3

TSQL, 55 바이트

이 스크립트는 같은 검사에서 덧셈과 뺄셈을 시도한 다음 실패하면 곱셈을 시도합니다.

DECLARE 
@1 INT=6561,
@2 INT=729,
@3 INT=81,
@  INT=9

PRINT IIF(@2-@1=@-@3,@*2-@3,IIF(@1*@2=@3,@*@1,sqrt(@)))

깡깡이


3

C #, 63 바이트

int f(int[]x)=>2*x[1]-x[0]==x[2]?x[3]+x[1]-x[0]:x[3]*x[1]/x[0];

첫 번째 요소와 두 번째 요소의 차이가 두 번째 요소와 세 번째 요소의 차이와 같은지 확인합니다. 그렇다면 더하기 / 빼기를하고 그렇지 않으면 곱셈 / 나누기를합니다.


2

자바 스크립트, 73 바이트

(a,b,c,d)=>(x=b-a,c-b==x&&d-c==x)?d+x:(x=b/a,b*x|0==c&&c*x|0==d)?d*x|0:-1

테스트 :

console.log(s.apply(null,[14,24,34,44]), 54);
console.log(s.apply(null,[105,45,-15,-75]), -135);
console.log(s.apply(null,[5,25,125,625]), 3125);
console.log(s.apply(null,[256,64,16,4]), 1);

console.log(s.apply(null,[2,1,0,0]),0);
console.log(s.apply(null,[1,0,0,0]),0);
console.log(s.apply(null,[-325,-82,-21,-6]),-1);

console.log(s.apply(null,[-1,-1,-1,-1]),-1);
console.log(s.apply(null,[0,0,0,0]),0);

그들 모두를 위해 작동합니다.


1
에티켓에 대해 확신하지 못했습니다. 이미 다른 JS 답변이 있음을 알고 있지만 중요한 경우를 다루지 않습니다. 광산은 더 길지만 모든 것을 처리합니다. 내가 제대로하지 않았다면 알려주십시오.
Whothehellisthat

1
다른 답변과 동일한 언어로 답변을 게시하는 데 아무런 문제가 없습니다. 특히 답변이 정확하고 다른 답변이 아닌 경우. 충분한 담당자가 있는지는 모르겠지만 해당 답변에 의견을 달아 누락 된 가장 중요한 사례를 알려주고 싶을 수도 있습니다.
DJMcMayhem

나는 실제로 다른 게시물에서 우위를 차지했지만 문제를 해결하지 못했습니다. ; P
Whothehellisthat

2

GameMaker 언어, 70 바이트

a=argument0;If a[3]+a[1]=a[2]*2return a[4]*2-a[3]return a[4]*a[4]/a[3]

2

R, 68 (74)

배열 : 68 바이트

function(x)if(x[2]-x[1]==x[3]-x[2])x[4]+x[2]-x[1]else x[4]%/%(x[1]%/%x[2])

> (function(x)if(x[2]-x[1]==x[3]-x[2])x[4]+x[2]-x[1]else x[4]*x[2]/x[1])(c(14,24,34,44))
[1] 54

4 개의 입력 : 45 바이트

function(a,b,c,d)if(b-a==c-b)d+b-a else d*b/a

덤 용액 log, exp, var71 바이트

if(var(v<-diff(x<-scan(,1)))==0)x[4]+v[1]else x[4]*exp(diff(log(x)))[1]

업데이트 : 정수 나누기


이것이 배열이 아닌 4 개의 변수를 취하지 않습니까? 그렇지 않으면 b-a바이트를 절약하기 위해 괄호를 제거 할 수 있습니다 (예제 호출은 공백을 다시 추가한다는 점에 유의하십시오).
Jonathan Allan

@JonathanAllan 당신이 맞아요. 배열을받지 않습니다. 바이트 수가 업데이트되었습니다. 다른 이유로 괄호가 필요하지만 대신 공백을 추가하여 바이트를 절약 할 수 있습니다. 통화는 추가 공간이 필요하지 않습니다.
Vlo

그렇기 때문에, 내가 2 바이트 대신 1 바이트를 절약 할 수 있다고 말한 이유
Jonathan Allan

현재 정수 나누기 요구 사항을 완전히 처리하지는 않습니다. 예를 들어 261,65,16,4반환 0.9961686하는 것이 아니라 반환합니다 1(물론 테스트 케이스가 있어야 함).
Jonathan Allan

1
@JonathanAllan 함수 (x) if (x [2] -x [1] == x [3] -x [2]) x [4] + x [2] -x [1] 다른 x [4] % / % (x [1] % / % x [2])
Vlo

1

자바, (125) 123 바이트

골프 :

int m(int[]a){int r=(a[1]>a[0])?a[1]/a[0]:a[0]/a[1];return(a[0]-a[1]==a[1]-a[2])?a[3]-a[0]+a[1]:(a[0]<a[1])?a[3]*r:a[3]/r;}

언 골프 드 :

int m(int[] a)
{
    int r = (a[1] > a[0]) ? a[1] / a[0] : a[0] / a[1];
    return (a[0] - a[1] == a[1] - a[2]) ? a[3] - a[0] + a[1] : (a[0] < a[1]) ? a[3] * r : a[3] / r;
}

이 코드는 0으로 나누기 등을 처리하지 않기 때문에 분명히 몇 가지 문제가 있습니다. 입력 배열에 정수가 4 개보다 많거나 적은 경우에는 물론 작동하지 않습니다 a. 어리석은 것을 넘어서지 만 재미있었습니다. :)

사용해보십시오 : https://ideone.com/nELH5I


1

TI 기본, 37 바이트

모든 TI-83 / 84 계산기에서 작동

Input L1                     gets input into an array
L1(4)²/L1(3                  calculate the fifth number in a geometric series
If not(sum(ΔList(ΔList(L1    if ΔList(ΔList(L1)) yields an array of all zeroes
L1(4)2-L1(3                  calculate the fifth number in an arithmetic series
                             Ans is implicitly returned

1

파이썬 2, 75 66 65 61 바이트

lambda(a,b,c,d):d*2-c if d-c==b-a else d*b/a or b and d/(a/b)

이전의 38 바이트 항목보다 훨씬 길어 분할 시리즈가 올바르게 제공되지 않았습니다 (대부분의 다른 것들은 그렇지 않았습니다).

테스트 사례 및 더 많은 사례는 아이디어가 있습니다.

참고 : 여기에 음수 정수 나누기는 제수와 같은 부호와 나머지를 가진 것으로 정의된다, 그래서 -81/4-21의 나머지 3-81/-420의 나머지 -1.


1
음수를 음수로 나눈 값은 양수입니다 ...-81/-4 != -21
Destructible Lemon

@DestructibleWatermelon 사실입니다. 이를 편집하고 테스트 사례를 추가했습니다 [325, -82,20, -5].
Jonathan Allan

1

젤리 , 14 바이트

ṪḤ_ṪµṪ²:ṪµIE$?

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

ṪḤ_ṪµṪ²:ṪµIE$?  Main Link =
             ?  If
          IE$   [condition]
          I     The differences between consecutive elements
           E    Is equal
ṪḤ_Ṫ            [then]
Ṫ               The last element
 Ḥ              Doubled
  _             Minus
   Ṫ            The last element (second-last of original list)
    µṪ²:Ṫµ      [else]
     Ṫ          The last element
      ²         Squared
       :        Divided by
        Ṫ       The last element (second-last of original list)

0

피 이스, 18 바이트

?-+vzJEyQ/^E2J-yEJ

줄 바꿈으로 구분 된 값 목록으로 입력을 허용합니다.

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

설명:

?                         If
 -                          the following are not equal:
  +vzJE                      the sum of first and third values (and call the third value J)
       yQ                    and the second value * 2;
                            (i.e. if it is not an additive or subtractive formula)
          ^E2             Then: square the fourth value
         /   J              and divide by the third
?                         Else:
               yE           double the fourth value
              -  J          and subtract the third
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.