Hot Wheels 자동차는 얼마나 빠릅니까?


23

몇 년 전, Hot Wheels는 "Formula Fuelers Racers" 라는 간단한 플래시 게임을 만들었습니다 . 게임을하려면 냉장고에서 세 가지 재료를 선택하여 차에 넣고 컴퓨터의 무작위로 생성 된 차와 경쟁합니다. 이 게임의 메커니즘은 매우 간단합니다. 우선, 자동차의 실제 레이스 "시간"은 무작위로 생성되며 레이스에서 이길 지 여부와 관계가 없습니다. 두 번째로, 레이스의 승자는 선택한 재료로 계산 된 점수에 의해 결정됩니다 (중복 된 재료는 허용되며 순서는 중요합니다). 각 성분에는 다음 표와 같이 관련 "값"및 관련 "작업"이 있습니다.

#   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   +

편의상이 과제는 이름이 아닌 번호로 재료를 언급하는 것입니다. 점수를 계산하는 단계는 다음과 같습니다.

  1. 먼저, 첫 번째 성분의 값으로 점수를 초기화하십시오.
  2. 그런 다음 두 번째 성분의 연산을 사용하여 현재 점수와 두 번째 성분의 값을 결합하여 업데이트 된 점수를 얻습니다.
  3. 마지막으로, 세 번째 성분의 연산을 사용하여 현재 점수와 세 번째 성분의 값을 결합하여 최종 점수를 얻습니다.

높은 점수는 더 좋고 항상 낮은 점수를 이깁니다.

예를 들어, 재료 1 2 3의 점수는 (2+1)+1 = 4입니다. 재료 7 5 6의 점수는 (1*-3)+2 = -1입니다. 따라서 1 2 3이깁니다 7 5 6.

도전

이 도전에서, 당신은 순서대로 3 개의 정수 목록을 가지고 해당 점수를 출력하는 프로그램을 작성해야합니다.

입력

프로그램은 가장 편리한 형식으로 정수 3 개 목록을 허용 할 수 있습니다. 성분 이름에 대해 1- 인덱싱 (위와 같이)을 사용하거나 0- 인덱싱 (위의 모든 색인에서 1을 뺀)을 사용할 수 있습니다.

출력

프로그램은 점수를 나타내는 단일 정수를 출력해야합니다.

테스트 사례

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

*이 페이지는 꽤 구식이며 일부 브라우저에서는 작동하지 않지만이 도전을 위해 게임을 할 필요는 없습니다.


1
기본적으로 Salsa + Lunch + Mayo = 무적입니까?
Matthew Roh

3
@SIGSEGV 중복 성분이 허용됩니다. 살사, 런치, 런치의 점수는 18 점으로 12 점을
Level River St


4
누가 냉장고에 소금을 보관합니까? :)
Wossname

3
1. 소금이 냉장고에있는 이유를 모르겠습니다. 2. 네, 18 포인트 콤보를 발견하면 말 그대로 무적 상태가되고 게임은 무의미 해집니다.
PhiNotPi

답변:


13

젤리 , 24 바이트

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

0 색인 성분의 목록을 가져옵니다.

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

방법?

값을 기본 6 숫자로 압축하는 약간 복잡한 형태와 곱하기 항목이 음수라는 사실을 사용합니다. 기본 6 자리를 얻기 위해 단순히 3만큼 위로 이동하는 대신 증가 된 보완 된 값이 사용됩니다. 이렇게하면 원자가 보완 단계 이전에 음수 항목을 선택하도록하고 바이트는 250으로 저장합니다. 압축.

“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

"기본 250 압축 번호"파트는 어떻게 작동합니까?
ckjbgames

@ckjbgames zẈ€$ụ¤Jelly 코드 페이지에서 (1 인덱스) 인덱스로 읽히고 [123,188,13,37,226,4]기본 250 숫자로 해석됩니다. 123*250**5+188*250**4+13*250**3+37*250**2+226*250**1+4*250**0=120851767994004( 자습서문자열 리터럴 섹션 참조 )
Jonathan Allan

아, 문자열 리터럴.
ckjbgames

이것은 05AB1E 코드로 평가할 때 "-3"이 "-3"을 의미하지 않는다는 것을 깨달을 때까지 나의 접근 방식이었습니다.
Magic Octopus Urn

11

자바 스크립트 (ES6), 89 84 82 78 73 바이트

0- 인덱싱을 사용하여 입력을 3 개의 정수 배열로 취합니다.

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

테스트 사례

이전 버전, 78 바이트

(a)(b)(c)0- 인덱싱을 사용하여 카레 구문에서 3 개의 정수를 취 합니다.

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

작동 원리

이 코드에서 약간 특이한 점은 '일반적인'카레 구문에서 2 개의 인수 만 사용 a => b =>하고 결국 3 번째 인수 를 취하는 함수를 반환한다는 것입니다.

고장

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'

테스트 사례


1
엄밀히 말하면, 당신은 1 개의 인수를 취하고 1 개의 인수를 취하는 함수를 리턴하고, 1 개의 인수를 취하는 함수를 호출하기위한 값을 계산하고 1 개의 인수를 취하는 함수를 리턴하고 그 최종 함수를 리턴합니다 ...
Neil

6

Befunge, 74 73 바이트

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

여기 사용해보십시오! 내 코드 가이 인터프리터에서만 작동하는 것은 이상합니다.

두 번째 행에는 기본적으로 테이블의 모든 값이 포함됩니다. 숫자가 아닌 값은 실제로 ASCII 테이블의 숫자 앞에 오는 음의 값입니다. 숫자가 음수인지 아닌지를 결정하는 논리가 있으며, 그렇다면 숫자에 결과를 곱합니다.

세 번째 행의 오른쪽은 첫 번째 숫자를 초기화합니다. 그렇게 할 필요가 없다면 많은 바이트를 절약 할 수 있습니다.


6

PHP, 128 바이트

$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 바이트

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

온라인 버전

넓히는

$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

파이썬 (2) , 123 (110) 107 바이트

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

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


@mathjunkie 덕분에 -3 바이트


1
다음 은 개선 된 버전 인 118 바이트입니다.
Xcoder Mr.

2
5445054524413452545다음 3 당신을 저장할 수 있습니다 빼기 바이트를.
Magic Octopus Urn

1
n=[n+i,n*i][i<0]내부 루프는 3 바이트를 절약합니다
math junkie

5

05AB1E , 29 바이트

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

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

•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.

이것은 실제로 원하는만큼의 입력에 대해 작동하므로 4 개 이상의 특성을 가진 자동차 나 2를 가진 자동차를 가질 수 있습니다.


5

CJam , 43 38 바이트

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

목록을 더 압축하는 방법이있을 수 있습니다 ...

0 기반 인덱싱을 사용합니다.

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

설명

이 프로그램은 값이 음수 인 경우에만 부가적인 값 대신에 곱셈이라는 사실을 이용합니다.

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)

좋은 + *트릭!
Esolanging 과일

3

루아, 140 131 바이트

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

자바 스크립트, 85 72 바이트

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

[a,b,c]
ETHproduction 덕분에 -13 바이트 형식의 입력 을받습니다.


당신은 x=>(b="...",b<0?"*":"+")+b피하기 위해 할 수 return있다고 생각합니다. (또한 [... ]문자열에서 인덱싱 작업이 필요하지 않습니다. )
ETHproductions

@ETHproductions "예상 된 ';'을 얻습니다. 브라우저 일 수도 있고, a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b)).join``)작동합니까?
Bald Bantha

당신은 여분이있어 )후를 +b내가 생각
ETHproductions

2

R, 125 123 바이트

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

세 개의 정수를 입력으로 사용하는 익명 함수. 값과 연산의 목록을 정의한 다음 입력에 의해 호출 된 것과 즉 평가합니다 o3(o2(v1,v2),v3). 이 작업을 수행하는 골퍼가 거의 확실합니다!

업데이트 : 일부 재 작업 후 대안, 123 바이트도 있습니다. 다시 익명 함수이지만 입력 값을 세 개의 단일 벡터로 취합니다. 동일한 접근 방식을 사용하여 값 및 작업 목록을 정의하고 평가합니다.

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

하스켈 186 116 112 108 바이트

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

주요 기능은 k입니다. Code Golf를 처음 사용하므로 $연산자와 괄호 를 영리하게 사용하여 면도 할 수있는 몇 바이트가 있다고 확신 합니다. 개선 사항을 계속 찾으면 대답을 업데이트 할 것입니다.

기본적으로 프로그램은 다음과 같이 분류 할 수 있습니다.

  • v는 1 기반 인덱스를 가져오고 해당 음식 ID의 값을 반환하는 함수입니다.
  • o는 음식 값을 가져와 적절한 연산자를 반환하는 함수입니다 (예 : 음수 값은 항상 *양수 값입니다 +)
  • w는 v입력 정수 에 매핑 된 3 개의 부분 함수 목록을 가져 와서 각각의 적절한 연산과 값을 가져오고 적절한 출력을 반환하는 함수입니다.
  • k는 v를 입력에 맵핑하고 w를 위해이 목록을 작성하여 출력을 리턴하는 포인트 프리 스타일의 주요 기능입니다.

최신 정보

fromEnum 트릭을 지적 해 주셔서 감사합니다! 잘 작동했습니다. 또한 수용 가능한 솔루션이 정수 목록을 취하는 함수 일 수 있다고 언급 한 규칙에서 일부를 놓쳤습니다. 그 결과 엄청난 양의 작업이 절약되었습니다.

업데이트 2

다른 제안에 따라 작업을 재정렬하여 소수의 바이트를 줄였으며 항상 True로 평가되는 else 가드를 만들고 W에서 패턴 일치는 3 요소 목록에서 일치합니다. 제안 해 주셔서 감사합니다!

업데이트 3

내가 알지 못했던 더 많은 코드 골프 규칙을 지적 해 준 Laikoni에게 감사드립니다. 또한 v를 입력에 매핑하여 부분적으로 적용된 함수 목록을 만들면 놀라운 생각이었고 4 바이트를 더 절약했습니다!


1
특히 PPCG와 Haskell 골프에 오신 것을 환영합니다! [Int] -> Intstdin에서 읽고 stdout에 쓰는 대신 함수 를 작성하여 많은 바이트를 절약 할 수 있습니다 . 그렇게하는 것이 기본적으로 허용되지만,이 경우에는 입력으로서 정수 목록을 태울 수 있다는 도전에서 명시 적으로 언급됩니다.
Laikoni

1
가져 오기를 삭제할 수 있으므로 fromEnum대신 대신 사용 하는 digitToInt것이 더 짧을 수 있습니다.
Laikoni

@Laikoni 내가 알지 못하는 규칙 중 일부를 지적 해 주셔서 감사합니다! fromEnum 트릭도 매력처럼 작동했습니다 .ASCII 코드에서 작업하는 것을 생각하지 않았지만 엄청난 양의 바이트도 절약했습니다.
maple_shaft 1

1
v=(map((-51+).fromEnum)"95 ... 5"!!)두 개의 괄호를 저장합니다. o x|x<0=(*)|0<1=(+)두 번째 가드에 1 바이트를 저장합니다.
Laikoni

1
에서가 w왼쪽 여분의 공간입니다. 또한 길이 3의 목록 만 처리하면 w[x,y,z]=되므로 패턴 일치로 사용할 수 있습니다 .
Laikoni

0

하스켈, 92 87 바이트

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

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

@maple_shaft의 답변을 바탕으로, 나는 그것을 조금 분해했습니다.

5 바이트 동안 @Laikoni에게 감사합니다!



@Laikoni 나는 줄 바꿈이 중요
하다고

f=익명 함수가 제출로 허용되기 때문에 2 바이트를 계산하지 않았습니다 . Tio 예제를 작동시키기 만하면됩니다.
Laikoni

0

C, 171161 바이트

#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

8086 기계어 코드, 62 바이트

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

마지막 3 바이트에는 (인덱싱 된) 입력이 포함됩니다. 가장 편리한 입력 형식을 사용할 수 있다고 말해주었습니다. 이 경우에는 하드 코딩입니다!
출력은 쉘로 리턴 된 오류 코드입니다.

작동 방식 :

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