Tính số điểm trong trò chơi sjoelen-trò chơi


31

Được rồi, vì vậy ngày hôm qua là ngày Giáng sinh thứ 2 và bố mẹ (tôi) của tôi và tôi đã có một trò chơi "sjoelen", như được gọi ở Hà Lan. Lập trình viên bên trong xuất hiện trong tôi, nhưng chỉ khi tôi có câu trả lời, tôi đã đánh mất nó. Tôi muốn bạn làm lại nó.

Những quy định:

Bạn có một tấm ván gỗ, một sjoelbak , với 4 hộp, mỗi hộp có số riêng. Khi một schijf (Một vật thể giống như puck) đi vào một trong các ô bạn sẽ nhận được các điểm phía trên ô đó.

Một _sjoelbak_ với _schijven_
Khi có một schijf trong tất cả 4 ô, bạn không được 10 nhưng bạn được 20 điểm.

Thí dụ:

Từ trái sang phải: 3 5 4 3
Mỗi hộp có ít nhất 3 schijven (Số nhiều của schijf ) sao cho 20 * 3 = 60 điểm.

Giá trị kết quả: 0 2 1 0
0 * 2 + 2 * 3 + 1 * 4 + 0 * 1 = 10 điểm.

Mà làm cho tổng cộng 60 + 10 = 70 điểm.

Đầu vào:
Lượng schijven từ trái sang phải, nghĩa là "4 5 4 5", [4,5,4,5], "4 \ n5 \ n4 \ n5", bất cứ điều gì bạn thích.

Đầu ra:
Số lượng điểm, tức là 84, dưới dạng đầu ra, biến, trả về hoặc trên đầu ngăn xếp, bất cứ thứ gì bạn thích.

Như trong mỗi và mọi mã golf, bạn không thể sử dụng các tập lệnh bên ngoài và mã có ít byte nhất sẽ thắng.

Tái bút: Như bạn có thể đã nhận thấy, tôi là người Hà Lan. Hãy thoải mái chỉnh sửa các lỗi ngữ pháp có thể.


Đầu ra có phải là thiết bị xuất chuẩn hay nó có thể là hàm trả về hoặc là mục còn lại trên ngăn xếp (đối với ngôn ngữ dựa trên ngăn xếp)?
globalby

@globby Có thể là tất cả
Charlie

Tôi nghĩ rằng sjoelen là leuk!
Đánh dấu Knol

1
Có giới hạn về số lượng schijf trong mỗi hộp không?
The_Basset_Hound

@BassetHound Bạn nhận được 30 schijven mỗi vòng, vì vậy 30 trong 4 bằng 120 điểm. Điều đó là có thể, nhưng không phải là điểm số tốt nhất (7 trong tất cả = 140, + 2 trong 4 = 148)
Charlie

Câu trả lời:


8

CJam, 23 21 20 byte

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

Tôi có thể chơi golf một vài byte.

Đầu vào giống như

[3 5 4 3]

Đầu ra là điểm số

70

Làm thế nào nó hoạt động

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";

Thuật toán

  • Vì tôi đã thay đổi đúng số lượng schijven, nên thứ tự điểm số trở thành [1 2 3 4].
  • Hơn nữa, bằng cách sử dụng thực tế rằng 1 + 2 + 3 + 4 = 10, tôi chỉ cần thêm các sơ đồ chung tối thiểu cho mỗi người để có được hiệu ứng của 10điểm thưởng .
  • Bây giờ khi tôi giảm, tôi nhận được 2 phần tử ban đầu trên stack, phần tử đầu tiên mà tôi bỏ qua là phần tử có điểm số của 1mỗi phần tử, sau đó tôi nhân phần tử thứ hai với 2và thêm nó vào phần đầu tiên. Trong lần lặp lại tiếp theo, tôi nhận được tổng hiện tại và điểm 3schijven. Và như vậy.

Dùng thử trực tuyến tại đây


Ít nhất byte (cho đến nay), được chấp nhận. Cảm ơn đã giải thích.
Charlie

@Charlie Tại sao bạn chấp nhận một câu trả lời nhanh như vậy? Tốt nhất bạn nên đợi 1-2 tuần trước khi chấp nhận câu trả lời.
Chương trìnhFOX

8

Piet, 240 (30 * 8) codel, 138 chứa mã thực tế

Codel size 10, cho tầm nhìn tốt hơn

Piet: số điểm sjoelen

Ví dụ kiểm tra:

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

Hiển thị dòng chảy:

Sử dụng tốc ký của riêng tôi để xử lý dễ dàng hơn và hiển thị nhỏ gọn. Nó cho thấy luồng chương trình chung, không phải là vị trí chính xác của các codel.

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

Giải thích đầy đủ:

      (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

Lưu hình ảnh và thử nó trong trình thông dịch trực tuyến này:

Phiên dịch trực tuyến của PietDev


Câu trả lời của Piet ^. ^
The_Basset_Hound

Tất nhiên! Tôi cố gắng thêm câu trả lời của Piet bất cứ khi nào có thể quản lý được;)
ML


7

Toán học, 38 32 23 20 byte

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

(Với sự giúp đỡ từ swish )

Sử dụng bằng cách giải quyết đầu vào đến cuối:

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

70

Thay thế (36 byte):

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

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

@swish Thật thông minh!
kukac67

1
Đó là toàn bộ chức năng. Bạn không cần phải thêm 20*Min@#, bạn có thể loại bỏ nó bằng cách thay thế bằng dấu cộng, bởi vì thuận tiện 2+3+4+1==10.
swish

@swish ơi! Điều đó thậm chí còn tốt hơn. Nhưng tôi không thể quấn đầu xung quanh tại sao nó lại hoạt động?
kukac67

2
@swish Vâng, cảm ơn vì tất cả sự giúp đỡ, nhưng bạn nên đăng câu trả lời của riêng bạn. : D
kukac67

7

R, 41 40 ký tự

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

Sử dụng:

> 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

Trong ví dụ cuối cùng, alà vectơ 3 5 4 3, a-b0 2 1 0, chúng ta nhân với vectơ, 2 3 4 1do 0 6 4 0đó chúng ta thêm vào bằng 5*bcách cho 15 21 19 15( 5*bđược tái chế cho mỗi thành viên của vectơ đã thêm, do đó thêm vào một cách hiệu quả 4*5*b), do đó cuối cùng chúng ta tổng hợp 70.


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

5

JavaScript (ES6), 93 47 byte

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

Sử dụng: s(1, 2, 3, 4)

Cách thức hoạt động: hàm tìm số nhỏ nhất trong các đối số và nhân số đó với 10(không phải với 20) và thêm phần còn lại của điểm. Không cần thiết phải nhân 20và trừ các phần từ điểm số để tiếp tục tính toán.

Cảm ơn edc65 đã chia sẻ cải tiến!

Chưa chơi gôn:

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

1
Sử dụng 10 với min, không cần trừ (hàm s (a, b, c, d) {return 10 * Math.min (a, b, c, d) + a * 2 + b * 3 + c * 4 + d;})
edc65

1
Và trong ES6:S=(a,b,c,d)=>10*Math.min(a,b,c,d)+a*2+b*3+c*4+d
edc65

@ edc65 Tuyệt vời, cảm ơn!
Chương trìnhFOX

5

Bình thường , 15

sm*hd+@QtdhSQUQ

Đầu vào phải được phân tách bằng dấu phẩy trên STDIN, ví dụ:

3,5,4,3

Điều này sử dụng cùng một thủ thuật mà nhiều giải pháp khác đã sử dụng, đó là thêm mức tối thiểu cho mỗi yếu tố để tính tiền thưởng. Tối thiểu là hSQtrong mã trên. Để tính toán nhân với 2, 3, 4 và 1, tôi ánh xạ d qua danh sách [0,1,2,3] và nhân phần tử (dl) của đầu vào với d + 1. Do đó, phần tử thứ -1 được nhân với 1, số 0 bằng 2, số thứ nhất bằng 3 và số thứ hai bằng 4. Sau đó tôi tính tổng.


5

J, 23 22 ký tự

   (+/ .*&2 3 4 1@(+<./))

Thí dụ:

   test =. 3 5 4 3
   (+/ .*&2 3 4 1@(+<./)) test
70

Hãy thử nó ở đây.

(23 định nghĩa hàm rõ ràng dài v=:3 :'+/+/\.3|.y+<./y':)


Tại sao không chỉ +/2 3 4 1*(+<./)?
swish

@swish Tôi thích viết các hàm hoàn chỉnh mặc dù đây không phải là một yêu cầu ở đây. Đăng / thêm nó nếu bạn muốn.
ngẫu nhiên

Thế còn 2 3 4 1+/ .×]+<./?
Adám

4

Đà điểu v0.1.0 , 48 41 ký tự (quá dài)

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

Điều này chỉ đơn giản giống như phiên bản cũ bên dưới, ngoại trừ việc thay vì sử dụng @để xoay toàn bộ ngăn xếp, )\+(vô thức phải) được sử dụng thay thế.

Phiên bản cũ:

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

Tôi thực sự đã phát hiện ra hai lỗi trong ngôn ngữ mới được triển khai của mình, được chú thích trong phần mô tả bên dưới. (Ngôn ngữ hiện tại rất, rất giống với Golfscript, vì vậy nếu bạn biết Golfscript thì nó khá dễ đọc.

.$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)

Yêu cầu đầu vào dưới dạng một mảng trên STDIN, vì tôi là tay nắm cửa và quên thực hiện I / O trong v0.1.0.

Giải quyết một vấn đề thực tế trong Đà điểu là tốt, bởi vì nó cho tôi thấy chính xác tôi cần thêm bao nhiêu thứ vào ngôn ngữ: D


Chúc may mắn với ngôn ngữ của bạn, nó trông rất tuyệt cho đến nay;)
Charlie

4

Python 2, 43 byte

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

Lấy cảm hứng từ câu trả lời của @ user2487951.


Thuật toán đẹp! Đối với một chương trình đầy đủ, bạn cũng cần báo cáo đầu vào và in.
dùng2487951

1
@ user2487951 Một trong những phương tiện đầu ra được phép là "return", vì vậy trong khi đây không phải là một chương trình đầy đủ, thì đó là một câu trả lời hợp lệ.
isaacg

3

Jagl Alpha 1.2 - 20 byte

Đầu vào ở định dạng stdin (3 4 5 6), đầu ra được để lại trên ngăn xếp:

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

Chờ phản hồi từ người đăng ban đầu về định dạng đầu ra. Vì đầu vào được chỉ định là "bất cứ điều gì bạn thích" , tôi sẽ giả định rằng đầu vào của tôi có thể là một mảng trên đỉnh của ngăn xếp. Bây giờ có đầu vào trên stdin.

Giải trình:

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

Câu trả lời đầu tiên được chấp nhận, chỉnh sửa bài đăng để làm cho rõ ràng
Charlie

@Optimizer điểm lấy. Đã chỉnh sửa.
globalby

3

Haskell, 40

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

thay vì xóa số tối thiểu khỏi phần còn lại và thêm 20s bổ sung , điều này sẽ bổ sung thêm 10cho số tối thiểu.


Giải pháp tốt đẹp. Mặc dù vậy, bạn đã trộn lẫn thứ tự, nên là..4*c+d..

3

Matlab, 27

Mất một lúc tôi mới hiểu đó là game chơi đơn. Với sự trợ giúp của chức năng ẩn danh

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

được gọi với vector hàng

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

1
Tôi nghĩ rằng nó thường được chấp nhận xung quanh các phần này để giảm f=thêm 2 byte. Thay vào đó, hàm được lưu trữ trong ansbiến.
BrainSteel

1
[2:4,1]sẽ tắt 2 byte nếu đầu vào là vectơ cột.
Sanchise

2

Java, 84 byte

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];}

Tôi có ý tưởng rằng điều này có thể được chơi golf hơn nữa, nhưng bây giờ nó là nó.

Gọi với A(new int[]{3,5,4,3}), đầu ra được trả về là int (Vì System.out.println()sẽ nhân đôi số byte)

Ung dung

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 byte

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

Đọc đầu vào từ stdin, ở định dạng [3 5 4 3] . Ghi đầu ra vào thiết bị xuất chuẩn. (Nếu cho phép đầu vào là một mảng trên ngăn xếp được cho phép, hàng đầu ~có thể bị bỏ qua với tổng số 21 byte.)

Điều này sử dụng một chiến lược hơi khác so với các giải pháp của CJam / Pyth / vv: Trước tiên tôi xây dựng một mảng với 2 bản sao của giá trị đầu vào đầu tiên, 3 của thứ hai, 4 của thứ ba và một của thứ tư. Sau đó, tôi sắp xếp mảng này, rút ​​ra phần tử nhỏ nhất, nhân nó với 11 và tính tổng của nó với các phần tử khác.


2

Con trăn 2, 51

Không mệt mỏi, nhưng ngắn:

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

Thêm pythonic:

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

Nếu đầu vào là [3,5,4,3], điều này có trả về 70 không?
Charlie

Vâng, nó làm trong cả hai trường hợp. Và trả về 84 cho [4,5,4,5].
dùng2487951

2

Julia, 48 35 ký tự

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

ở dạng bài tập nhỏ gọn:

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

Thí dụ:

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

2

Javascript, 97 byte

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

Javascript, ES6, 57

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

Tôi muốn xem làm thế nào đệ quy sẽ bật ra, và trong khi nó chắc chắn không phải là câu trả lời ngắn nhất, tôi cảm thấy như nó bật ra tốt.

a*b*c*d: Nó nhận các giá trị đầu vào và tìm sản phẩm của tất cả chúng và đánh giá đó là biểu thức Boolean cho câu lệnh if nội tuyến. Điều này sẽ trả về false nếu một hoặc nhiều giá trị bằng 0 và đúng với bất kỳ giá trị nào khác.

20+f(--a,--b,--c,--d): Nếu nó trả về true, hàm trả về 20 (đối với tập schijven ) cộng với lệnh gọi đệ quy của hàm cho tất cả các giá trị trừ đi một (Để loại bỏ tập schijven đó ). Theo cách này, nó sẽ lặp lại theo cách đệ quy cho đến khi ít nhất một trong các ô trống.

a*2+b*3+c*4+dSau ít nhất một ô trống, phần còn lại của câu lệnh if sẽ chạy. Nó chỉ trả về điểm cho schijven còn lại trong các hộp.

Do đó, ở cuối tất cả các tập hợp schijven 20 điểm , và các điểm còn lại được tổng hợp và trả về từ hàm, tạo ra câu trả lời.


1

Haskell 42 ký tự

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

Mã số tiền rõ ràng: f l@[a,b,c,d]=10*minimum l+2*a+3*b+4*c+d- lưu 2 ký tự
MtnViewMark

1

HPPPL (Ngôn ngữ lập trình HP Prime), 58 57 byte

* Trong khoảng từ 10 đến phút là không cần thiết, vì vậy tôi đã xóa nó.

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

HPPPL là ngôn ngữ lập trình cho máy tính vẽ đồ thị màu HP Prime / CAS.

Ví dụ chạy:

Chụp màn hình HPPPL của chương trình đếm điểm sjoelen

Nếu nó không phải là một chương trình, thì nó có thể thực hiện được trong 40 39 byte một lớp:

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

1

Staq, 72 ký tự

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

Chạy ví dụ:

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

3
5
4
3
70

Execution complete.
>

Staq có hai ngăn xếp, một chủ động, một thụ động. Các |lệnh chuyển stack tích cực thụ động và ngược lại.

Tất cả mọi thứ giữa các dấu ngoặc nhọn xác định một hàm, chữ cái đầu tiên sau dấu ngoặc mở là tên hàm, phần còn lại cho đến khi dấu ngoặc đóng là chính hàm đó. Các chức năng ghi đè, đệ quy và các hàm lồng nhau là có thể. {aii}sẽ định nghĩa một hàm a sẽ tăng đỉnh của ngăn xếp hai lần. Mỗi phiên bản sau của amã sẽ được thay thế bằng ii.

Nhận xét bên trong Staq prorams: &thêm số 0 ở trên cùng của ngăn xếp, [hướng dẫn con trỏ nhảy tới tương ứng] nếu đỉnh của ngăn xếp bằng 0, xxóa giá trị trên cùng của ngăn xếp. Vì vậy, ý kiến ​​có thể được viết vào mã dưới dạng&[here is a comment]x

Giải thích (cũng có thể thực thi):

'                                      &[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

Chương trình sử dụng một ngăn xếp (hoạt động ban đầu) để tính 2a + 3b + 4c + d và ngăn xếp thứ hai (thụ động ban đầu) để tính 10 lần mức tối thiểu của các giá trị đầu vào. Sau đó cả hai kết quả được tóm tắt và hiển thị.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.