Hot Wheels車はどのくらいの速度ですか?


23

数年前、Hot Wheelsは「Formula Fuelers Racers」と呼ばれるシンプルなフラッシュゲームを作成しました。ゲームをプレイするには、冷蔵庫から3つの材料を選択して車に入れ、コンピューターのランダムに生成された車と競います。このゲームの仕組みは非常にシンプルであることがわかりました。まず最初に、あなたの車の実際のレース「時間」はランダムに生成され、あなたがレースに勝ったかどうかには関係ありません。第二に、レースの勝者は、選択された材料から計算されるスコアによって決定されます(重複した材料は許可され、順序が重要です)。各成分には、次の表に示すように、関連する「値」と関連する「操作」があります。

#   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. 次に、2番目の成分の操作を使用して、現在のスコアと2番目の成分の値を組み合わせて、更新されたスコアを取得します。
  3. 最後に、3番目の成分の操作を使用して、現在のスコアと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
だから基本的にサルサ+ランチ+マヨ=無敵?
マシュー

3
@SIGSEGV成分の重複は許可されています。サルサ、昼食、昼食はあなたの12を打つ18のスコアのために許可されている
レベル川セント


4
誰が冷蔵庫に塩を入れますか?:)
Wossname

3
1.なぜ塩が冷蔵庫に入れられるのか分かりません。2.はい。18ポイントのコンボを発見すると、文字通り無敵になり、ゲームは無意味になります。
PhiNotPi

回答:


13

ゼリー、24 バイト

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

0インデックスの成分のリストを取得します。

オンラインでお試しください!またはテストスイートを見る

どうやって?

値を基数6の数値として圧縮するわずかに複雑な形式を使用し、乗算エントリが負のエントリであるという事実を使用します。単純に3ずつシフトして基数6桁を取得する代わりに、増分された補数値が使用されます。これにより、補数ステップの前にアトムが負のエントリを選択できるため、バイトが節約されます。圧縮。

“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-indexed)インデックスとして読み取られます。これは[123,188,13,37,226,4]、base-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」を意味しないことに気付くまでの私のアプローチでした。
魔法のタコUr

11

JavaScript(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))

使い方

このコードの少し変わった点の1つは、「共通」カリー化構文で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

ここで試してみてください!私のコードがこの1つのインタープリターでのみ動作するのは奇妙です。

2行目には、基本的にテーブルのすべての値が含まれます。非数値は、ASCIIテーブルの数字の前に来るため、実際は負の値です。数値が負であるかどうかを判断するロジックが少しあり、そうである場合、この数値に結果が乗算されます。

3番目の行の右側は、最初の数値を初期化します。それをする必要がなければ、多くのバイトを節約できました。


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


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

CJam43 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)

ナイス+ *トリック!
エソランジングフルーツ

3

Lua、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

JavaScript、85 72バイト

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

[a,b,c]
ETHproductionsのおかげで、-13バイトの形式で入力を受け取ります


x=>(b="...",b<0?"*":"+")+bを回避するためにあなたができるreturnと思います。(また、必要はありません[... ]、インデックス作成は文字列で動作します)
-ETHproductions

@ETHproductions「Expected ';」が表示されます。それは私のブラウザかもしれません。 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])}

入力として3つの整数を取る匿名関数。値と操作のリストを定義し、入力によって呼び出されたもの、つまりを評価するだけo3(o2(v1,v2),v3)です。これを行うには、間違いなくゴルファーの方法があります!

更新:いくつかの再作業の後、代替手段もあります。これも123バイトです。再び、匿名関数ですが、入力を3つの値の単一ベクトルとして受け取ります。同じアプローチを使用して、値と操作のリストを定義し、評価します。

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ガードを作成し、そのパターンが3つの要素のリストで一致するWで一致します。提案をありがとう!

更新3

私が知らなかったより多くのコードゴルフ規則を指摘してくれたライコニにもう一つ感謝します。また、vを入力にマッピングして、部分的に適用された関数のリストを作成することは驚くべきアイデアであり、さらに4バイト節約しました!


1
特にPPCGとHaskellゴルフへようこそ![Int] -> Intstdinから読み取り、stdoutに書き込む代わりに関数を記述することで、多くのバイトを節約できます。そうすることはデフォルトで許可されていますが、この場合、チャレンジとして、入力として整数のリストを計算することは受け入れられると明示的に言及されています。
ライコニ

1
fromEnum代わりに使用するとdigitToInt、インポートを削除できるため、短くなる可能性があります。
ライコニ

@Laikoni私が知らなかったいくつかのルールを指摘してくれてありがとう!fromEnumのトリックも魅力のように機能しました。ASCIIコードからの作業を考えていなかった理由がわかりませんが、それによって膨大な量のバイトが節約されました。
maple_shaft

1
v=(map((-51+).fromEnum)"95 ... 5"!!)2つの括弧を保存します。o x|x<0=(*)|0<1=(+)2番目のガードに1バイトを保存します。
ライコニ

1
w左の余分なスペースです。また、長さ3のリストのみを処理する必要があるためw[x,y,z]=、パターンマッチングとして使用できます。
ライコニ

0

Haskell、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私はかなり確信して改行をカウントしています
BlackCap

f=匿名関数が送信として許可されているため、2バイトはカウントしませんでした。これらは、tioの例を機能させるためにのみ必要です。
ライコニ

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.