Xe Hot Wheels của tôi nhanh như thế nào?


23

Vài năm trước, Hot Wheels đã tạo ra một trò chơi flash đơn giản có tên "Racers Racers Racers" *. Để chơi trò chơi, bạn chọn ba thành phần từ tủ lạnh để đưa vào xe của mình, sau đó đua với chiếc xe được tạo ngẫu nhiên của máy tính. Hóa ra cơ chế của trò chơi này khá đơn giản. Trước hết, "thời gian" thực tế của chiếc xe của bạn được tạo ngẫu nhiên và không ảnh hưởng đến việc bạn có chiến thắng cuộc đua hay không. Thứ hai, người chiến thắng trong cuộc đua được xác định bằng số điểm được tính từ các thành phần được chọn (các thành phần trùng lặp được cho phép và thứ tự là vấn đề). Mỗi thành phần có một "giá trị" liên quan và một "hoạt động" liên quan như được hiển thị trong bảng sau:

#   ingredient     val  op
1   Hot Salsa       2   +
2   Root Beer       1   +
3   Milk            1   +
4   Pickle Juice    2   +
5   Mystery Lunch   -3  *
6   BBQ Sauce       2   +
7   Egg             1   +
8   Ketchup         2   +
9   Mustard         -1  *
10  Melon           1   +
11  Chocolate Milk  1   +
12  Mayonnaise      -2  *
13  Baby Food       0   +
14  Pepper          1   +
15  Salt            2   +
16  Syrup           -1  *
17  Salad Dressing  2   +
18  Orange Juice    1   +
19  Soy Sauce       2   +

Để thuận tiện, thách thức này sẽ được đề cập đến các thành phần theo số lượng của họ chứ không phải tên của họ. Dưới đây là các bước để tính điểm:

  1. Đầu tiên, khởi tạo điểm số với giá trị của thành phần đầu tiên.
  2. Sau đó, sử dụng thao tác của thành phần thứ hai để kết hợp điểm hiện tại và giá trị của thành phần thứ hai để có được điểm cập nhật.
  3. Cuối cùng, sử dụng hoạt động của thành phần thứ ba để kết hợp điểm số hiện tại và giá trị của thành phần thứ ba để có được điểm số cuối cùng.

Điểm cao hơn là tốt hơn và luôn luôn đánh bại điểm thấp hơn.

Ví dụ, các thành phần 1 2 3có một số điểm (2+1)+1 = 4. Các thành phần 7 5 6có một số điểm (1*-3)+2 = -1. Do đó, 1 2 3nhịp đập 7 5 6.

Thử thách

Trong thử thách này, bạn sẽ viết một chương trình lấy danh sách 3 số nguyên theo thứ tự và đưa ra số điểm tương ứng.

Đầu vào

Chương trình của bạn có thể chấp nhận danh sách ba số nguyên ở định dạng thuận tiện nhất. Bạn được phép sử dụng lập chỉ mục 1 cho tên thành phần (như trên) hoặc lập chỉ mục 0 (trừ 1 từ mọi chỉ số ở trên).

Ouput

Chương trình của bạn phải xuất một số nguyên duy nhất cho biết điểm số.

Các trường hợp thử nghiệm

4 5 5  =>  18 // max score
5 5 5  =>  -27 // min score
13 13 13  =>  0
1 2 3  =>  4
7 5 6  =>  -1
16 2 19  =>  2
19 7 12  =>  -6

* Trang này khá lỗi thời và không hoạt động trong một số trình duyệt, nhưng bạn không cần chơi trò chơi cho thử thách này.


1
Vậy về cơ bản Salsa + Ăn trưa + Mayo = Bất khả chiến bại?
Matthew Roh

3
@SIGSEGV Thành phần trùng lặp được cho phép. Salsa, Ăn trưa, Ăn trưa được phép cho số điểm 18 so với số 12 của bạn
Level River St


4
Ai giữ muối trong tủ lạnh? :)
Wossname

3
1. Tôi không biết tại sao muối sẽ có trong tủ lạnh. 2. Có, một khi bạn khám phá ra một combo 18 điểm, bạn sẽ trở nên bất khả chiến bại và trò chơi trở nên vô nghĩa.
PhiNotPi

Câu trả lời:


13

Thạch , 24 byte

“zẈ€$ụ¤’b6’ị@µỊị⁾+׿CFḊV

Đưa ra một danh sách các thành phần 0 chỉ mục.

Hãy thử trực tuyến! hoặc xem một bộ thử nghiệm

Làm sao?

Sử dụng một hình thức hơi phức tạp của việc nén các giá trị dưới dạng số cơ sở 6 và thực tế là các mục nhân là số âm. Thay vì chỉ tăng lên 3 để có được các chữ số cơ bản 6, các giá trị bổ sung tăng dần được sử dụng - điều này giúp tiết kiệm byte bằng cách cho phép nguyên tử chọn ra các mục tiêu cực trước bước bổ sung đồng thời lưu một byte trong cơ sở-250 nén.

“zẈ€$ụ¤’b6’ị@µỊị⁾+׿CFḊV - Main link: 0-based ingredient list  e.g. [6,4,5]
“zẈ€$ụ¤’                 - base 250 compressed number: 120851767994004
        b6               - convert to base 6: [1,1,0,5,0,1,0,3,1,1,4,2,1,0,3,0,1,0,0]
          ’              - decrement: [0,0,-1,4,-1,0,-1,2,0,0,3,1,0,-1,2,-1,0,-1,-1]
           ị@            - index into [reversed @rguments]          [0,4,-1]
             µ           - monadic chain separation (call that x)
              Ị          - insignificant(x)? (abs(x)<=1)            [1,0,1]
                ⁾+×      - ['+','×']
               ị         - index into                               ['+','×','+']
                    C    - complement(x) (1-x)                      [1,-3,2]
                   ż     - zip                                      [['+',1],['×',-3],['+',2]]
                     F   - flatten                                  ['+',1,'×',-3,'+',2]
                      Ḋ  - dequeue                                  [1,'×',-3,'+',2]
                       V - evaluate as Jelly code                   -1

Phần "số nén 250 cơ sở" hoạt động như thế nào?
ckjbgames

@ckjbgames Chúng zẈ€$ụ¤được đọc dưới dạng chỉ mục (1 chỉ mục) của chúng trong trang mã Jelly, được [123,188,13,37,226,4]hiểu và được hiểu là số cơ sở 250: 123*250**5+188*250**4+13*250**3+37*250**2+226*250**1+4*250**0=120851767994004(xem phần chuỗi ký tự của hướng dẫn .)
Jonathan Allan

Oh, một chuỗi chữ.
ckjbgames

Đây là cách tiếp cận của tôi cho đến khi tôi nhận ra "-3" không có nghĩa là "-3" khi đánh giá là mã 05AB1E.
Bạch tuộc ma thuật Urn

11

JavaScript (ES6), 89 84 82 78 73 byte

Lấy đầu vào là một mảng gồm 3 số nguyên, sử dụng lập chỉ mục 0.

a=>(o=a=>F()<0?a*n:a+n)(o((F=_=>n='5445054524413452545'[a.shift()]-3)()))

Các trường hợp thử nghiệm

Phiên bản trước, 78 byte

Lấy 3 số nguyên trong cú pháp currying (a)(b)(c), sử dụng chỉ mục 0.

a=>b=>(o=a=>b=>(n=F(b))<0?a*n:a+n)(o((F=n=>'5445054524413452545'[n]-3)(a))(b))

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

Một điều hơi bất thường về mã này là nó chỉ mất 2 đối số theo cú pháp curry 'chung' a => b =>và cuối cùng trả về một hàm lấy cái thứ ba.

Phá vỡ

F = n => '5445054524413452545'[n] - 3
o = a => b => (n = F(b)) < 0 ? a * n : a + n
f = a => b => o(o(F(a))(b))
f(a)(b)(c)
  |  |  |
  |  |  +-- 'b' argument of the function returned by the outer call to 'o'
  |  +----- 'b' argument of the function returned by 'f'
  +-------- 'a' argument of 'f'

Các trường hợp thử nghiệm


1
Nói một cách chính xác, bạn đang lấy 1 đối số và trả về một hàm có 1 đối số, tính toán một giá trị để gọi một hàm lấy 1 đối số và trả về một hàm lấy 1 đối số và trả về hàm cuối cùng đó ...
Neil

6

Befunge, 74 73 byte

>&:0`!#^_1g68*-^:0`!#v_+
^2112-212/11.012/212 >*
^   @.$<       >">"35*0p

Hãy thử nó ở đây! Thật kỳ lạ khi mã của tôi chỉ hoạt động trên một trình thông dịch này.

Hàng thứ hai về cơ bản chứa tất cả các giá trị từ bảng. Các giá trị không phải là số thực sự là các giá trị âm khi chúng xuất hiện trước các chữ số trên bảng ASCII. Có một chút logic ở đó xác định xem số đó có âm hay không và nếu có, số này được nhân với kết quả.

Phía bên phải của hàng thứ ba khởi tạo số đầu tiên. Nếu tôi không phải làm điều đó, tôi có thể tiết kiệm rất nhiều byte.


6

PHP, 128 byte

$i="5445054524413452545";[,$a,$b,$c]=$argv;echo(bc.($i[$c]-3<0?mul:add))((bc.($i[$b]-3<0?mul:add))($i[$a]-3,$i[$b]-3),$i[$c]-3);

PHP, 138 byte

$d=decbin(506743);$i="5445054524413452545";[,$a,$b,$c]=$argv;echo(bc.($d[$c]?add:mul))((bc.($d[$b]?add:mul))($i[$a]-3,$i[$b]-3),$i[$c]-3);

Phiên bản trực tuyến

Mở rộng

$d=decbin(506743);
$i="5445054524413452545";
[,$a,$b,$c]=$argv;
echo(bc.($d[$c]?add:mul))((bc.($d[$b]?add:mul))($i[$a]-3,$i[$b]-3),$i[$c]-3);

6

Python 2 , 123 110 107 byte

a,b,c=input()
s=[int(i)-3for i in'05445054524413452545']
n=s[a]
for i in s[b],s[c]:n=[n*i,n+i][n>0]
print n

Hãy thử trực tuyến!


-3 byte nhờ @mathjunkie


1
Đây là phiên bản cải tiến, 118 byte
Ông Xcoder

2
5445054524413452545sau đó trừ 3 có thể giúp bạn tiết kiệm hàng tấn byte.
Bạch tuộc ma thuật Urn

1
n=[n+i,n*i][i<0]bên trong vòng lặp giúp bạn tiết kiệm 3 byte
nghiện toán học

5

05AB1E , 29 byte

•6SÚ²ÄOÕ6BS3-©¹è|v®yèD0‹i*ë+

Hãy thử trực tuyến!

•6SÚ²ÄOÕ6BS3-©               # Push [2, 1, 1, 2, -3, 2, 1, 2, -1, 1, 1, -2, 0, 1, 2, -1, 2, 1, 2] and store.
               ¹è             # Get first score.
                 |v           # Iterate through remaining scores.
                   ®yèD0‹i*ë+ # Push score list, grab relevant score.
                              # If negative, multiply, else add.

Điều này thực sự hoạt động cho nhiều hoặc ít đầu vào như bạn muốn, vì vậy bạn có thể có những chiếc xe có 4 đặc điểm trở lên hoặc ô tô chỉ với 2. Điều này không có chủ ý, chỉ là nó đã kết thúc như thế nào.


5

CJam , 43 38 byte

q~[YXXY-3YXYWXX-2TXYWYXY]f={_W>42+c~}*

Có thể có một cách để nén danh sách hơn nữa ...

Sử dụng lập chỉ mục dựa trên 0.

Hãy thử trực tuyến!

Giải trình

Chương trình này sử dụng thực tế là một giá trị được nhân lên thay vì phụ gia khi và chỉ khi giá trị âm của nó.

q~                     e# Get the list from input
  [...]                e# Push the list of values for each ingredient. T=0, W=-1, 
                       e#   X=1, Y=2. 
       f=              e# Get the elements at the given indices 
         {             e# Reduce over this block:
          _W>          e#  Check if the second number is > -1 (returning 0 or 1)
             42+c      e#  Add the result to 42 and cast to a char. 
                       e#    (ASCII 42 is * and 43 is +)
                 ~     e#  Eval the char (* is multiply, + is add)
                  }*   e# (end block)

Đẹp + *lừa!
Esolanging Fruit

3

Lua, 140 131 byte

i={2,1,1,2,-3,2,1,2,-1,1,1,-2,0,1,2,-1,2,1,2}function f(a,b,c)loadstring(("print("..i[a].."+"..i[b].."+"..i[c]..")"):gsub('%+%-','*-'))()end

i={2,1,1,2,-3,2,1,2,-1,1,1,-2,0,1,2,-1,2,1,2}function f(a,b,c)x,y,z=i[a],i[b],i[c]v=y>0 and x+y or x*y;print(z>0 and v+z or v*z)end

3

JavaScript, 85 72 byte

a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b).join``)

Có đầu vào ở định dạng [a,b,c]
-13 byte nhờ vào ETHproductions


Bạn có thể làm x=>(b="...",b<0?"*":"+")+bđể tránh return, tôi nghĩ. (Ngoài ra, bạn không cần [... ], lập chỉ mục hoạt động trên chuỗi)
ETHproductions

@ETHproductions Tôi nhận được "Dự kiến ​​';'. Nó có thể là trình duyệt của tôi, có phù a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b)).join``)hợp với bạn không?
Bald Bantha

Bạn đã có thêm một khoản tiền )sau đó +b, tôi tin rằng
ETHproductions

2

R, 125 123 byte

function(a,b,c){v=c(5,4,4,5,0,5,4,5,2,4,4,1,3,4,5,2,5,4,5)-3
o=rep("+",19)
o[v<0]="*"
get(o[c])(get(o[b])(v[a],v[b]),v[c])}

Hàm ẩn danh có ba số nguyên làm đầu vào. Xác định danh sách các giá trị và hoạt động, và sau đó chỉ đánh giá các giá trị được gọi bởi đầu vào, nghĩa là o3(o2(v1,v2),v3). Gần như chắc chắn có một cách chơi gôn để làm điều này!

Cập nhật: sau khi hoạt động trở lại, tôi có một thay thế, cũng là 123 byte . Một lần nữa, một hàm ẩn danh, nhưng lấy đầu vào là một vectơ duy nhất gồm ba giá trị. Sử dụng cùng một cách tiếp cận, xác định danh sách các giá trị và hoạt động và đánh giá nó.

function(x,f=c(sum,prod)[x[-1]%in%c(5,9,12,16)+1],s=c(5,4,4,5,0,5,4,5,2,4,4,1,3,4,5,2,5,4,5)[x]-3)f[[2]](el(f)(s[-3]),s[3])

2

Haskell, 186 116 112 108 byte

o x|x<0=(*)|0<1=(+)
v=(map((-51+).fromEnum)"95445054524413452545"!!)
w [x,y,z]=(o z)((o y)x y)z
k=w.map v

Chức năng chính là k. Mới sử dụng Code Golf nên tôi chắc chắn có một vài byte tôi có thể tắt bằng cách sử dụng $toán tử thông minh so với dấu ngoặc đơn. Tôi có thể sẽ cập nhật câu trả lời khi tôi tiếp tục tìm thấy sự cải thiện.

Về cơ bản chương trình có thể được chia nhỏ như thế này:

  • v là một hàm lấy chỉ số dựa trên 1 và trả về giá trị của id thực phẩm đó.
  • o là một hàm lấy giá trị thực phẩm và trả về toán tử thích hợp (Ví dụ: các giá trị âm luôn luôn là *nơi luôn có giá trị dương+ )
  • w là một hàm có Danh sách 3 hàm một phần của v được ánh xạ tới các số nguyên đầu vào và tìm nạp các hoạt động và giá trị thích hợp từ mỗi hàm và trả về đầu ra thích hợp.
  • k là hàm chính theo kiểu tự do điểm ánh xạ v đến đầu vào và soạn danh sách này cho w để trả về đầu ra.

CẬP NHẬT

Cảm ơn đặc biệt vì đã chỉ ra thủ thuật từEnum! Điều đó làm việc độc đáo. Ngoài ra, tôi đã bỏ lỡ một phần trong các quy tắc đã nêu một giải pháp chấp nhận được có thể là một hàm có danh sách các số nguyên. Điều đó đã tiết kiệm một lượng lớn công việc.

CẬP NHẬT 2

Theo các đề xuất khác, hãy cạo một số byte bằng cách sắp xếp lại các hoạt động, tạo một bộ bảo vệ khác luôn luôn đánh giá là True và một mẫu khớp với W mà mẫu đó khớp với Danh sách 3 phần tử. Cảm ơn những lời đề nghị!

CẬP NHẬT 3

Một lời cảm ơn khác đến Laikoni vì đã chỉ ra nhiều quy tắc chơi golf mà tôi không biết. Ngoài ra ánh xạ v vào đầu vào của tôi để tạo danh sách các hàm được áp dụng một phần là một ý tưởng phi thường và giúp tôi tiết kiệm thêm 4 byte!


1
Chào mừng bạn đến với sân golf PPCG và Haskell nói riêng! Bạn có thể tiết kiệm rất nhiều byte bằng cách viết một hàm [Int] -> Intthay vì đọc từ stdin và viết vào stdout. Làm như vậy được cho phép theo mặc định, nhưng trong trường hợp này, nó thậm chí còn được đề cập rõ ràng trong thách thức rằng việc lấy một danh sách các số nguyên làm đầu vào là chấp nhận được.
Laikoni

1
Sử dụng fromEnumthay vì digitToIntcó khả năng ngắn hơn vì nó cho phép bạn bỏ nhập.
Laikoni

@Laikoni Rất cám ơn bạn đã chỉ ra một số quy tắc tôi không biết! Thủ thuật fromEnum cũng hoạt động như một bùa mê, không biết tại sao tôi không nghĩ đến việc làm việc từ mã ASCII nhưng điều đó cũng tiết kiệm được một lượng lớn byte.
maple_shaft

1
v=(map((-51+).fromEnum)"95 ... 5"!!)lưu hai dấu ngoặc đơn. o x|x<0=(*)|0<1=(+)lưu một byte trong bảo vệ thứ hai.
Laikoni

1
Trong wlà một không gian thừa còn lại. Ngoài ra, vì bạn chỉ cần xử lý danh sách có độ dài 3, bạn có thể sử dụng w[x,y,z]=làm mẫu khớp.
Laikoni

0

Haskell, 92 87 byte

x#y|x<0=(y*)|0<1=(y+)
k[x,y,z]=z#z$y#x$y
k.map([read[q]-3|q<-"95445054524413452545"]!!)

Hãy thử trực tuyến!

Dựa trên câu trả lời của @ maple_shaft, tôi chỉ tính đến nó một chút.

Cảm ơn @Laikoni cho 5 byte!



@Laikoni Tôi khá chắc chắn số lượng dòng mới
BlackCap

Tôi đã không đếm hai byte f=vì các hàm ẩn danh được phép dưới dạng đệ trình. Họ chỉ được yêu cầu để làm cho ví dụ tio hoạt động.
Laikoni

0

C, 171 161 byte

#include<stdio.h>
r,z[3],*a=z,i;f(x){i?x<0?r*=x:(r+=x):(r=x);}main(){scanf("%d %d %d",a,a+1,a+2);for(;i++<3;f("05445054524413452545"[*a++]-51));printf("%d",r);}

0

Mã máy 8086, 62 byte

00000000  be 3b 01 31 c0 86 c4 ac  e8 0a 00 81 fe 3e 01 72  |.;.1.........>.r|
00000010  f4 b4 4c cd 21 bb 32 01  d0 e8 d7 73 03 c0 e0 04  |..L.!.2....s....|
00000020  c0 f8 04 e3 05 31 c9 c3  86 c4 78 03 00 e0 c3 f6  |.....1....x.....|
00000030  ec c3 21 12 d2 12 f1 1e  01 2f 12 00 00 00        |..!....../....|
0000003e

Ba byte cuối cùng chứa đầu vào (không có chỉ mục). Hey, bạn nói với tôi rằng tôi có thể sử dụng định dạng đầu vào thuận tiện nhất. Trong trường hợp này, đó là mã hóa cứng!
Đầu ra là mã lỗi được trả về vỏ.

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

            |   org 0x100
            |   use16
be 3b 01    |       mov si, input   ; source = input
31 c0       |       xor ax, ax      ; clear ax
86 c4       |   @@: xchg al, ah     ; swap al/ah (ah = total value)
ac          |       lodsb           ; al = *si++
e8 0a 00    |       call fn
81 fe 3e 01 |       cmp si, input+3 ; end of input?
72 f4       |       jb @b           ; repeat if not
b4 4c       |       mov ah, 0x4c    ; dos function: exit with al=error code
cd 21       |       int 0x21        ; syscall
            |
bb 32 01    |   fn: mov bx, table   ; pointer to lookup table
d0 e8       |       shr al, 1       ; divide input by 2
d7          |       xlatb           ; al = *(bx + al)
73 03       |       jnc @f          ; skip next instruction if input was odd
c0 e0 04    |       shl al, 4       ; shift low nibble to high nibble
c0 f8 04    |   @@: sar al, 4       ; shift high nibble to low nibble with sign-extension
e3 05       |       jcxz @f         ; return if cx is non-zero (only happens for the first input)
31 c9       |       xor cx, cx      ; clear cx
c3          |       ret
86 c4       |       xchg al, ah     ; swap al/ah (al = total value)
78 03       |   @@: js @f           ; multiply if negative, add if positive
00 e0       |       add al, ah      ; al = al+ah
c3          |       ret
f6 ec       |   @@: imul ah         ; ax = al*ah
c3          |       ret
21 12 d2 12 |   table db 0x21, 0x12, 0xd2, 0x12, 0xf1, 0x1e, 0x01, 0x2f, 0x12
f1 1e 01 2f |                       ; each value is stored in a 4-bit nibble
12          |
00 00 00    |   input db 3 dup(0)
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.