"sjoelen"게임에서 점수를 계산하십시오


31

그래, 어제 둘째 크리스마스 날이었고, 나의 조부모님과 나는 네덜란드에서 불렸던 "sjoelen"게임을 가졌다. 내면의 프로그래머가 나에게 왔지만 대답을 얻었을 때 나는 그것을 잃었다. 나는 당신이 그것을 리메이크하기를 원합니다.

규칙:

당신은 나무 판자, sjoelbak , 4 개의 상자가 있으며 각각 고유 번호가 있습니다. 때 쉬즈 프 (A 퍽 같은 개체) 상자 중 하나에 간다 당신은 상자 위의 포인트를 얻을.

_schijven_이있는 _sjoelbak_
있을 때 쉬즈 프 모든 상자 4, 당신은 10를 얻을하지 않습니다하지만 당신은 20 포인트를 얻을.

예:

왼쪽에서 오른쪽으로 3 5 4 3
각 상자는 적어도 3 갖는다 schijven (복수 쉬즈 프를 그 20 * 3 = 60 점 정도로).

결과 값 : 0 2 0
0 * 2 + 2 * 3 + 1 * 4 + 0 * 1 = 10 점.

총 60 + 10 = 70 포인트가됩니다.

입력 :
의 양 schijven 왼쪽에서 오른쪽으로, 즉 "4 5 4 5"[4,5,4,5] "4 \ N5 \ N4 \ N5"당신이 무엇을 좋아.

출력 :
출력, 변수, 리턴 또는 스택 맨 위의 포인트 수 (예 : 84)

각각의 모든 코드 골프에서와 같이 외부 스크립트를 사용할 수 없으며 바이트 수가 가장 적은 코드가 승리합니다.

추신 : 이미 알고 계시 겠지만, 저는 네덜란드 사람입니다. 문법 오류를 자유롭게 수정하십시오.


출력이 stdout이어야합니까 아니면 함수 반환 또는 스택에 남아있는 나머지 항목 (스택 기반 언어의 경우) 일 수 있습니까?
globby December

@globby 모든 것이 될 수 있습니다
Charlie

나는 쇼 엘렌이 백혈병이라고 생각한다!
Mark Knol

1
각 상자의 schijf 수에 제한이 있습니까?
The_Basset_Hound

@BassetHound 당신은 30 얻을 schijven 4 그렇게, 라운드 당 30 120 점 같습니다. 가능하지만 최고 점수는 아님 (전체 7 개 = 140, + 2 개 4 = 148)
Charlie

답변:


8

CJam, 23 21 20 바이트

q~_$0=f+1m>{X):X*+}*

나는 이것에서 몇 바이트를 골프 할 수있을 것입니다.

입력은 같다

[3 5 4 3]

출력은 점수입니다

70

작동 원리

q~                         "Read the input and evaluate into an array";
  _$0=                     "Copy the array, sort it and get the minimum number";
                           "This minimum is the number of common schijven";
      f+                   "Increment each of the schijven by the common schijven number"; 
        1m>                "Take 1 element from the end of the array and put";
                           "it in the beginning";
           {      }*       "Reduce the elements of the array based on this block";
            X):X           "Increment and update the value of X (initially 1)";
                *          "Multiply the number of schijven with X";
                 +         "Add it to current score";

연산

  • schijven의 수를 오른쪽으로 바꿨으므로 이제 점수 순서가됩니다 [1 2 3 4].
  • 또한, 1 + 2 + 3 + 4 = 10나는 보너스 10점수 의 효과를 얻기 위해 각각에 최소 공통 schijven을 추가 한다는 사실을 사용합니다 .
  • 이제 줄이면 처음에 두 개의 요소를 얻습니다. 첫 번째 요소는 무시합니다. 1각 요소 의 점수가 있는 요소는 두 번째 요소에 곱하고 2첫 번째 요소에 추가합니다. 다음 반복에서는 현재 합계와 점수 3schijven을 얻습니다 . 등등.

여기에서 온라인으로 사용해보십시오


최소 바이트 (지금까지)로 승인되었습니다. 설명 주셔서 감사합니다.
Charlie

@Charlie 왜 그렇게 빨리 답변을 받아들입니까? 답변을 수락하기 전에 1-2 주 정도 기다리는 것이 좋습니다.
ProgramFOX

8

Piet, 240 (30 * 8) 코덱, 138 개의 실제 코드

가시성 향상을위한 코덱 크기 10

피에트 : 쇼엘 포인트 수

테스트 예 :

D:\codegolf\npiet-1.3a-win32>npiet sjoelen_point_count_cs10.png
? 3
? 5
? 4
? 3
70
D:\codegolf\npiet-1.3a-win32>npiet sjoelen_point_count_cs10.png
? 4
? 5
? 4
? 5
84

흐름 표시 :

손쉬운 조작과 컴팩트 한 디스플레이를 위해 직접 사용합니다. 정확한 코덱 위치가 아니라 일반적인 프로그램 흐름을 보여줍니다.

NOP ADD DIV GRT DUP INC END
 0   +   /   >   =   c   ~
PSH SUB MOD PTR ROL OUN
 X   -   %   #   @   N
POP MUL NOT SWI INN OUC
 ?   *   !   $   n   C

1X!nnnn=5X2X@=5X2X@=5X2X@=5X1X@**
       0                        *
       0       @+5X1X@1X-4X1X@  !
       0       -             0  !
       0       X1!X1X6+*==X40000#  <--pointer if top of stack=1 (all boxes full,
       0                     0  2      add 20 points, decrement count for all boxes)
       0000-X1@X1X2-X1@X1X3-X1  X  |  pointer if top of stack=0 (not all boxes full,
                                *  V   add 2a+3b+4c+d)
           ~N++++*X4@X2X3*X3@X1X2

전체 설명 :

      (score=0)  a   b   c   d
      1 PSH NOT INN INN INN INN

      ..... sort and duplicate the numbers .....
**1** DUP 5 PSH 2 PSH ROL DUP 5 PSH 2 PSH ROL DUP 5 PSH 2 PSH ROL DUP 5 PSH 1 PSH ROL

      ( a*b*c*d ) (convert to boolean) 1 if all boxes are full, 0 if at least one box is empty
      MUL MUL MUL NOT NOT

      change direction if 1 (**2**)
      go straight ahead if 0 (**3**)
      PTR

      ( compress 20=4*4+4 )       (0-1=-1/ neg. roll) score+20
**2** 4 PSH DUP DUP MUL ADD 6 PSH 1 PSH NOT 1 PSH SUB ROL ADD

      (put score back to bottom of stack) ... a=a-1, b=b-1, c=c-1, d=d-1 ...
      5 PSH 1 PSH ROL 1 PSH SUB 4 PSH 1 PSH ROL 1 PSH SUB 3 PSH
      1 PSH ROL 1 PSH SUB 2 PSH 1 PSH ROL 1 PSH SUB

      loop to **1**

      (   a*2   )               (   b*3   )               (  c*4  )
**3** 2 PSH MUL 2 PSH 1 PSH ROL 3 PSH MUL 3 PSH 2 PSH ROL 4 PSH MUL

      +2a +3b +d +score
      ADD ADD ADD ADD

      output score
      OUN

이미지를 저장하고이 온라인 Piet 인터프리터에서 사용해보십시오.

PietDev 온라인 Piet 통역사


Piet answer ^. ^
The_Basset_Hound

당연하지! 관리 할 수있을 때마다 Piet 답변을 추가하려고합니다.;)
ML


7

Mathematica, 38 32 23 20 바이트

(#+Min@#).{2,3,4,1}&

( swish의 도움으로 )

입력을 끝까지 입력하여 사용하십시오.

(#+Min@#).{2,3,4,1}&@{3,5,4,3}

70

대체 (36 바이트) :

20*Min@#+Total[(#-Min@#)*{2,3,4,1}]&

Tr[(# + Min@#) {2, 3, 4, 1}] &
swish

@swish 그래서 영리합니다!
kukac67

1
이것이 전체 기능입니다. 추가 할 필요가 없습니다 . 20*Min@#편리하게 마이너스를 플러스로 바꾸면 제거 할 수 있습니다 2+3+4+1==10.
swish

@swish 아! 더 좋습니다. 그러나 왜 작동하는지 머리를 감쌀 수 없습니까?
kukac67

2
@swish 글쎄, 모든 도움을 주셔서 감사하지만, 당신은 자신의 답변을 게시해야합니다. : D
kukac67

7

R, 41 40 자

b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))

용법:

> b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
1: 4 5 4 5
5: 
Read 4 items
[1] 84
> b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
1: 3 5 4 3
5: 
Read 4 items
[1] 70

마지막 예에서, a벡터이고 3 5 4 3, a-b이며 0 2 1 0, 이는 우리 다중 벡터와 2 3 4 1이에주는 0 6 4 0우리가 추가되는 5*b주기 15 21 19 15( 5*b따라서 효과적으로 추가 첨가 벡터의 각 부재에 대한 재생되고 4*5*b, 따라서, 우리는 마침내 합산 된) 제공 70.


40 바이트 :b=min(a<-scan());sum(5*b+(a-b)*c(2:4,1))
Alex A.

5

자바 스크립트 (ES6), 93 47 바이트

s=(a,b,c,d)=>10*Math.min(a,b,c,d)+a*2+b*3+c*4+d

용법: s(1, 2, 3, 4)

작동 방식 :이 함수는 인수에서 가장 작은 숫자를 찾은 다음이 숫자에 10(와 함께 20)를 곱하고 나머지 점수를 더합니다. 20계산을 계속하기 위해 점수를 곱하고 점수에서 빼지 않아도됩니다 .

공유 개선을위한 edc65에 감사합니다!

언 골프 :

function score(a, b, c, d) {
    return 10 * Math.min(a, b, c, d) + a * 2 + b * 3 + c * 4 + d;
}

1
빼기 할 필요없이 최소 10을 사용하십시오 (함수 s (a, b, c, d) {return 10 * Math.min (a, b, c, d) + a * 2 + b * 3 + c * 4 + d;})
edc65

1
그리고 ES6에서 :S=(a,b,c,d)=>10*Math.min(a,b,c,d)+a*2+b*3+c*4+d
edc65

감사합니다!
ProgramFOX

5

피시스 , 15

sm*hd+@QtdhSQUQ

STDIN에 쉼표로 구분하여 입력해야합니다. 예 :

3,5,4,3

이것은 보너스를 설명하기 위해 각 요소에 최소값을 추가하는 다른 많은 솔루션과 동일한 트릭을 사용합니다. 최소값은 hSQ위 코드에 있습니다. 2, 3, 4 및 1을 곱하기 위해 d를 목록 [0,1,2,3]에 매핑하고 입력의 (dl) 번째 요소에 d + 1을 곱합니다. 따라서 -1 번째 요소에 1, 0을 2, 1을 3, 2를 4로 곱합니다.



4

타조 v0.1.0 , 48 41 자 (너무 길다)

.$0={}/:n;{n-}%)\+1:i;{i*i):i;}%{+}*20n*+

이것은 @전체 스택을 회전시키는 )\+데 사용하는 대신 (오른쪽 uncons) 대신 사용되는 것을 제외하고는 아래의 이전 버전과 동일합니다 .

구 버전:

.$0={}/:n;{n-}%{}/{4@}3*1:i;]{i*i):i;}%{+}*20n*+

실제로 새로 구현 된 언어에서 아래 설명에 주석이 달린 두 가지 버그가 발견되었습니다. (언어는 현재 Golfscript와 매우 유사하므로 Golfscript를 알고 있다면 읽기가 쉬워야합니다.

.$0=   get min value (for the *20 thingy)
{}/    *actually* get min value (BUG: `array number =' returns a single-element array...)
:n;    store as n
{n-}%  subtract this value from all array elements
{}/    dump array onto stack
{4@}3* rotate stack so that instead of 2 3 4 1, multipliers are 1 2 3 4
       (BUG: negative rotations don't work)
1:i;   set i (the multiplier) to 1
]{i*   multiply each array element by i
i):i;  increment i
}%     (do the previous 2 lines over each array element)
{+}*   add up all the array elements
20n*+  add 20*n (the min value we got in line 1)

내가 문 손잡이이고 v0.1.0에서 I / O를 구현하는 것을 잊었 기 때문에 STDIN에서 입력을 배열로 예상합니다.

타조에서 실제 문제를 해결하는 것은 좋았습니다. 언어에 얼마나 많은 것을 추가해야하는지 보여줍니다. : D


귀하의 언어와 행운을 빕니다, 그것은 지금까지 좋아 보입니다;)
Charlie

4

파이썬 2, 43 바이트

lambda i:i[1]-i[3]+2*(sum(i)+i[2]+5*min(i))

@ user2487951의 답변에서 영감을 얻었습니다.


좋은 알고리즘! 전체 프로그램을 위해서는 입력 및 인쇄 명령문도 필요합니다.
user2487951

1
@ user2487951 허용되는 출력 방법 중 하나가 "return"이므로 전체 프로그램이 아니지만 올바른 대답입니다.
isaacg 2014

3

Jagl Alpha 1.2-20 바이트

입력은 stdin 형식 (3 4 5 6)이며 출력은 스택에 남아 있습니다.

T~dqZ*S1 5r]%{U*}/b+

출력 형식에 대한 원본 포스터의 응답을 기다리는 중입니다. 입력이 "원하는 대로 " 지정되었으므로 입력 내용이 스택 맨 위에 배열이 될 수 있다고 가정합니다. 이제 stdin에서 입력을받습니다.

설명:

T~                            Get input from stdin and evaluate
  dqZ*                      Duplicate, get minimum, and multiply that by 10
      S1 5r]                Swap (so array is on top), push range 1-5 exclusive, and rotate
            %{U*}/          Zip arrays together, and multiply each pair
                  b+P       Get the sum of that, add the common minimum, and print

첫 번째 답변이 승인되고 수정 된 게시물이 명확 해짐
Charlie

@ 옵티 마이저 포인트가 촬영되었습니다. 편집했습니다.
globby December

3

하스켈, 40

g l@[a,b,c,d]=2*a+3*b+4*c+d+10*minimum l

나머지에서 최소 숫자를 제거하고을 추가하는 대신 최소 숫자에 20추가를 추가 10합니다.


좋은 해결책. 당신은 순서를 섞었다, 그것은..4*c+d..

3

MATLAB, 27

싱글 플레이어 게임이라는 것을 이해하기 위해 시간이 걸렸습니다. 익명 기능의 도움으로

f=@(N)N*[2;3;4;1]+10*min(N)

행 벡터로 호출됩니다.

f([3 5 4 3]) == 70
f([7 7 9 7]) == 148

1
나는 일반적 으로이 부분을 f=2 바이트 더 적게 넣는 것으로 받아 들여 진다고 생각합니다 . 함수는 ans대신 변수에 저장 됩니다.
BrainSteel

1
[2:4,1]입력이 열 벡터 인 경우 2 바이트를 제거합니다.
Sanchises 2016 년

2

자바, 84 바이트

int A(int[]a){int m=9;for(int i:a)m=i<m?i:m;return 10*m+a[3]+2*a[0]+3*a[1]+4*a[2];}

나는 이것이 더 이상 골프를 칠 수 있다는 생각을 가지고 있지만, 이것이 지금이다.

로 호출 A(new int[]{3,5,4,3})하면 출력이 int로 반환됩니다 ( System.out.println()바이트가 두 배 이므로 )

언 골프

int getScore(int[] input){
    int min=9;

    for(int x:input) {
        if(x<min){
            min=x;
        }
    }

    return 10*min + 2*input[0] + 3*input[1] + 4*input[2] + 1*input[3];
}

2

GolfScript, 22 바이트

~3,{1$>~;}%+$(11*+{+}*

stdin에서 입력을 형식으로 읽습니다 [3 5 4 3]. 출력을 stdout에 기록합니다. 스택에서 입력을 배열로 가져가는 것이 허용되면 행간 ~은 총 21 바이트 동안 생략 될 수 있습니다.

이것은 CJam / Pyth / 등의 솔루션과 다소 다른 전략을 사용합니다. 먼저 첫 번째 입력 값의 두 사본, 두 번째의 3, 3의 4 및 4 중 하나의 사본으로 배열을 만듭니다. 그런 다음이 배열을 정렬하고 가장 작은 요소를 꺼내고 11을 곱한 다음 다른 요소와 합산하십시오.


2

파이썬 2, 51

영감이 없지만 짧음 :

l=input()
print l[0]*2+l[1]*3+l[2]*4+l[3]+10*min(l)

더 많은 pythonic :

l=input()
print sum(map(lambda x,y:x*y,l,[2,3,4,1]))+10*min(l)

입력이 [3,5,4,3]이면 70을 반환합니까?
Charlie

예, 두 경우 모두에 해당합니다. [4,5,4,5]에 대해 84를 반환합니다.
user2487951

2

줄리아, 48 35 자

function p(m);sum([2 3 4 1].*m)+10minimum(m);end

간단한 과제 형태 :

p(m)=sum([2 3 4 1].*m)+10minimum(m)

예:

julia> p([3 5 4 3])
70

2

자바 스크립트, 97 바이트

a=prompt().split(" "),b=Math.min.apply(1,a);alert(20*b+2*(a[0]-b)+3*(a[1]-b)+4*(a[2]-b)+(a[3]-b))

1

자바 스크립트, ES6, 57

f=(a,b,c,d)=>a*b*c*d?20+f(--a,--b,--c,--d):a*2+b*3+c*4+d

나는 재귀가 어떻게 나오는지 알고 싶었고, 그것이 가장 짧은 대답은 아니지만, 그것이 잘 된 것처럼 느꼈습니다.

a*b*c*d: 입력 값을 가져 와서 모든 값의 곱을 찾아서 인라인 if 문의 부울 표현식으로 평가합니다. 하나 이상의 값이 0이면 false를 반환하고 다른 값에 대해서는 true를 반환합니다.

20+f(--a,--b,--c,--d):가 true를 돌려주는 경우,합니다 (에 대한 함수가 반환 20 schijven의 설정)을 더한 값을 모두 뺀 하나에 대한 함수의 재귀 호출 (즉 제거하려면 schijven 설정). 이러한 방식으로 적어도 하나의 상자가 비워 질 때까지 재귀 적으로 반복됩니다.

a*2+b*3+c*4+d하나 이상의 상자를 비운 후 인라인 if 문의 else 부분이 실행됩니다. 상자에 남아있는 schijven 의 포인트 만 반환합니다 .

따라서 마지막에 20 포인트 schijven 세트와 remanding 포인트가 합산되어 함수에서 반환되어 답을 얻습니다.


1

하스켈 42 자

f l=10*minimum l+sum(zipWith(*)[2,3,4,1]l)

코드 합 명시 : f l@[a,b,c,d]=10*minimum l+2*a+3*b+4*c+d- 2 개 문자 저장
MtnViewMark

1

HPPPL (HP Prime Programming Language), 58 57 바이트

10과 * 사이의 *는 필요하지 않으므로 제거했습니다.

EXPORT s(m)
BEGIN
return sum([2,3,4,1].*m)+10min(m);
END;

HPPPL은 HP Prime 컬러 그래프 계산기 / CAS의 프로그래밍 언어입니다.

예제 실행 :

Sjoelen 포인트 카운트 프로그램의 HPPPL 화면 캡처

그것이 프로그램 일 필요는 없다면, 그것은 40 1 바이트 라이너 39 바이트 :

m:=[3,5,4,3];sum([2,3,4,1].*m)+10min(m)

1

Staq, 72 자

't't't't{aii*XX}$&iia$&ia$&a+XX+XX+|{mxx}{lxX}{k>?m!l}kkk&iiqi&ii*s*t|+:

예제 실행 :

Executing D:\codegolf\Staq\sjoelen codegolf.txt

3
5
4
3
70

Execution complete.
>

Staq에는 두 개의 스택이 있습니다. 하나는 활성이고 하나는 수동입니다. 이 |명령은 활성 스택을 수동으로 또는 그 반대로 전환합니다.

중괄호 사이의 모든 것은 함수를 정의합니다. 여는 중괄호 다음의 첫 문자는 함수 이름이고 닫는 중괄호가 될 때까지 나머지는 함수 자체입니다. 재정의 함수, 재귀 및 중첩 함수가 가능합니다. 스택의 상단을 두 번 증가 {aii}시키는 함수 a 를 정의합니다 . a코드에서 다음의 모든 인스턴스 는로 대체됩니다 ii.

Staq prorams 내의 주석 : &스택 상단에 0을 추가하고 스택 상단이 0 인 [경우 포인터가 해당 항목으로 이동하도록 지시 ]하고 스택 x에서 최상위 값을 삭제합니다. 따라서 주석은 코드 형태로 코드에 작성할 수 있습니다.&[here is a comment]x

설명 (또한 실행 가능) :

'                                      &[input number]x
 t                                     &[copy top of active stack to passive stack]x
  t't't                                &[input next three numbers and copy them to the passive stack]x
       {aii*XX}                        &[define function a (increment twice, multiply the two topmost values, then delete the second value on the stack twice)]x
               $                       &[move top value to the bottom of the stack]x
                &ii                    &[put zero on top of the stack, incremment twice]x
                   a                   &[function a]x
                    $&ia$&a
                           +           &[put sum of the two topmost values on top of the stack]x
                            XX         &[delete second stack value, twice]x
                              +XX+
                                  |    &[switch active/passive stack]x
{mxx}                                  &[define function m: delete two topmost stack values]x
     {lxX}                             &[define function l: delete topmost stack value, then delete second value of remaining stack]x
          {k>?m!l}                     &[define function k: boolean top > second value? put result on top of the stack, if top>0 then execute m, if top = 0 then execute l]x
                  kkk&ii
                        q              &[put square of top value on top of the stack]x
                         i&ii
                             *         &[multiply two topmost values and put result on top of the stack]x
                              s        &[move bottom stack value to the top]x
                               *t|+
                                   :   &[output result]x

https://esolangs.org/wiki/Staq

이 프로그램은 하나의 스택 (초기 활성)을 사용하여 2a + 3b + 4c + d를 계산하고 두 번째 스택 (초기 수동)을 사용하여 입력 값의 최소값의 10 배를 계산합니다. 그런 다음 두 결과가 합산되어 표시됩니다.


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