Seberapa cepat mobil Hot Wheels saya?

23

Beberapa tahun yang lalu, Hot Wheels membuat flash game sederhana yang disebut "Formula Fuelers Racers" *. Untuk memainkan permainan, Anda memilih tiga bahan dari lemari es untuk dimasukkan ke dalam mobil Anda, yang kemudian berpacu melawan mobil yang dihasilkan secara acak komputer. Ternyata mekanisme permainan ini cukup sederhana. Pertama-tama, "waktu" balapan sebenarnya dari mobil Anda dihasilkan secara acak dan tidak berpengaruh apakah Anda memenangkan perlombaan atau tidak. Kedua, pemenang lomba ditentukan oleh skor yang dihitung dari bahan-bahan yang dipilih (bahan rangkap diperbolehkan, dan urutannya penting). Setiap bahan memiliki "nilai" dan "operasi" terkait seperti yang ditunjukkan pada tabel berikut:

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

Untuk kenyamanan, tantangan ini akan merujuk pada bahan dengan nomor mereka dan bukan nama mereka. Berikut adalah langkah-langkah untuk menghitung skor:

  1. Pertama, inisialisasi skor dengan nilai bahan pertama.
  2. Kemudian, gunakan operasi bahan kedua untuk menggabungkan skor saat ini dan nilai bahan kedua untuk mendapatkan skor yang diperbarui.
  3. Akhirnya, gunakan operasi bahan ketiga untuk menggabungkan skor saat ini dan nilai bahan ketiga untuk mendapatkan skor akhir.

Skor yang lebih tinggi lebih baik dan selalu mengalahkan skor yang lebih rendah.

Misalnya, bahan 1 2 3memiliki skor (2+1)+1 = 4. Bahan 7 5 6memiliki skor (1*-3)+2 = -1. Karena itu, 1 2 3ketukan 7 5 6.

Tantangan

Dalam tantangan ini, Anda harus menulis sebuah program yang mengambil daftar 3 bilangan bulat yang diurutkan dan menghasilkan skor yang sesuai.

Memasukkan

Program Anda dapat menerima daftar tiga bilangan bulat dalam format yang paling nyaman. Anda diperbolehkan menggunakan indeks-1 untuk nama bahan (seperti di atas) atau indeks-0 (kurangi 1 dari setiap indeks di atas).

Ouput

Program Anda harus mengeluarkan bilangan bulat tunggal yang menunjukkan skor.

Uji Kasus

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

* Halaman ini cukup usang dan tidak berfungsi di beberapa browser, tetapi Anda tidak perlu bermain game untuk tantangan ini.

PhiNotPi
sumber
1
Jadi pada dasarnya Salsa + Makan Siang + Mayo = Tak Terkalahkan?
Matthew Roh
3
@SIGSEGV Bahan duplikat diizinkan. Salsa, Makan Siang, Makan Siang diperbolehkan untuk skor 18 yang mengalahkan 12. Anda
Level River St
2
Untuk referensi, di sini adalah arsip permainan.
Matthew Roh
4
Siapa yang menyimpan garam di lemari es? :)
Wossname
3
1. Saya tidak tahu mengapa garam ada di lemari es. 2. Ya, setelah Anda menemukan kombo 18-poin Anda menjadi benar-benar tak terkalahkan dan permainan menjadi tidak berarti.
PhiNotPi

Jawaban:

13

Jelly , 24 byte

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

Mengambil daftar bahan yang diindeks 0.

Cobalah online! atau lihat test suite

Bagaimana?

Menggunakan bentuk yang agak berbelit-belit untuk mengompresi nilai sebagai angka dasar-6 dan fakta bahwa entri multiplikatif adalah yang negatif. Alih-alih hanya bergeser ke atas dengan 3 untuk mendapatkan digit basis-6, nilai-nilai yang ditambahkan bertambah digunakan - ini menghemat byte dengan memungkinkan atom untuk memilih entri negatif sebelum langkah komplemen sambil juga menyimpan byte di basis-250 kompresi.

“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
Jonathan Allan
sumber
Bagaimana cara kerja bagian "angka dasar 250"?
ckjbgames
@ckjbgames The zẈ€$ụ¤dibaca sebagai indeks (1-diindeks) mereka di halaman kode Jelly, yang [123,188,13,37,226,4], dan ditafsirkan sebagai nomor base-250: 123*250**5+188*250**4+13*250**3+37*250**2+226*250**1+4*250**0=120851767994004(lihat bagian string-literal dari tutorial .)
Jonathan Allan
Oh, string literal.
ckjbgames
Ini adalah pendekatan saya sampai saya menyadari "-3" tidak berarti "-3" ketika mengevaluasi sebagai kode 05AB1E.
Magic Gurita Guci
11

JavaScript (ES6), 89 84 82 78 73 byte

Mengambil input sebagai array 3 bilangan bulat, menggunakan 0-indexing.

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

Uji kasus

Versi sebelumnya, 78 byte

Mengambil 3 bilangan bulat dalam sintaks currying (a)(b)(c), menggunakan pengindeksan 0.

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

Bagaimana itu bekerja

Satu hal yang agak tidak biasa tentang kode ini adalah hanya dibutuhkan 2 argumen dalam sintaks currying 'umum' a => b =>dan akhirnya mengembalikan fungsi yang mengambil ke-3.

Kerusakan

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'

Uji kasus

Arnauld
sumber
1
Sebenarnya, Anda mengambil 1 argumen dan mengembalikan fungsi yang mengambil 1 argumen, menghitung nilai untuk memanggil fungsi yang mengambil 1 argumen dan mengembalikan fungsi yang mengambil 1 argumen, dan mengembalikan fungsi terakhir ...
Neil
6

Befunge, 74 73 byte

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

Coba di sini! Sungguh aneh bahwa kode saya hanya bekerja pada satu penerjemah saja.

Baris kedua pada dasarnya berisi semua nilai dari tabel. Nilai-nilai non-numerik sebenarnya nilai negatif karena mereka datang sebelum digit pada tabel ASCII. Ada sedikit logika di sana yang menentukan apakah angka itu negatif atau tidak, dan jika ya, angka ini dikalikan dengan hasilnya.

Sisi kanan dari baris ketiga menginisialisasi angka pertama. Jika saya tidak harus melakukan itu, saya bisa menghemat banyak byte.


sumber
6

PHP, 128 Bytes

$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 Bytes

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

Versi Online

Diperluas

$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);
Jörg Hülsermann
sumber
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

Cobalah online!


-3 byte terima kasih kepada @mathjunkie

ovs
sumber
1
Ini adalah versi yang disempurnakan, 118 byte
Mr. Xcoder
2
5445054524413452545kemudian kurangi 3 dapat menghemat banyak byte.
Guci Gurita Ajaib
1
n=[n+i,n*i][i<0]di dalam lingkaran menghemat 3 byte
pecandu matematika
5

05AB1E , 29 byte

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

Cobalah online!

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

Ini sebenarnya berfungsi untuk input sebanyak atau sesedikit yang Anda inginkan, sehingga Anda dapat memiliki mobil dengan 4 atau lebih sifat atau mobil dengan hanya 2. Ini tidak disengaja, hanya bagaimana akhirnya.

Guci Gurita Ajaib
sumber
5

CJam , 43 38 byte

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

Mungkin ada cara untuk mengompres daftar lebih lanjut ...

Menggunakan pengindeksan berbasis 0.

Cobalah online!

Penjelasan

Program ini memanfaatkan fakta bahwa suatu nilai adalah multiplikatif dan bukan aditif jika dan hanya jika negatif.

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)
Kucing Bisnis
sumber
+ *Trik yang bagus !
Buah Esolanging
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
Pengobrol
sumber
3

JavaScript, 85 72 byte

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

Mengambil input dalam format [a,b,c]
-13 byte berkat ETHproductions

Botak Bantha
sumber
Anda bisa lakukan x=>(b="...",b<0?"*":"+")+buntuk menghindari return, saya pikir. (Juga, Anda tidak memerlukan [... ], pengindeksan bekerja pada string)
ETHproduksi
@ETHproductions Saya mendapatkan "Expected ';'. Mungkin ini browser saya, apakah a=a=>eval(a.map(x=>(b="5445054524413452545"[x]-3,b<0?"*":"+")+b)).join``)berfungsi untuk Anda?
Bald Bantha
Anda punya tambahan )setelah +b, saya percaya
ETHproduk
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])}

Fungsi anonim yang mengambil tiga bilangan bulat sebagai input. Menentukan daftar nilai dan operasi, dan kemudian hanya mengevaluasi yang disebut oleh input, yaitu o3(o2(v1,v2),v3). Hampir pasti ada cara golf untuk melakukan ini!

Pembaruan: setelah beberapa kembali bekerja, saya punya alternatif, juga 123 byte . Sekali lagi, fungsi anonim, tetapi mengambil input sebagai vektor tunggal dari tiga nilai. Menggunakan pendekatan yang sama, mendefinisikan daftar nilai dan operasi dan mengevaluasinya.

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])
rturnbull
sumber
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

Fungsi utamanya adalah k. Baru di Code Golf jadi saya yakin ada beberapa byte yang bisa saya hilangkan dengan menggunakan $operator yang pintar dibandingkan tanda kurung. Saya mungkin akan memperbarui jawabannya karena saya terus menemukan peningkatan.

Intinya program dapat dipecah seperti ini:

  • v adalah fungsi yang mengambil indeks berbasis 1 dan mengembalikan nilai id makanan itu.
  • o adalah fungsi yang mengambil nilai makanan dan mengembalikan operator yang sesuai (Misalnya, nilai negatif selalu di *mana nilai positif selalu +)
  • w adalah fungsi yang mengambil Daftar 3 fungsi parsial yang vdipetakan ke input integer dan mengambil operasi dan nilai yang sesuai dari masing-masing dan mengembalikan output yang tepat.
  • k adalah fungsi utama dalam gaya bebas titik yang memetakan v ke input dan menyusun daftar ini untuk w untuk mengembalikan output.

MEMPERBARUI

Terima kasih khusus untuk menunjukkan trik fromEnum! Itu berhasil dengan baik. Saya juga melewatkan bagian dalam aturan yang menyatakan solusi yang dapat diterima bisa menjadi fungsi yang mengambil daftar bilangan bulat. Itu menghemat banyak sekali pekerjaan.

PEMBARUAN 2

Seperti saran lainnya, mencukur beberapa byte dengan menata ulang operasi, membuat penjaga lain yang selalu mengevaluasi ke True, dan pola yang cocok pada W yang cocok dengan pola pada daftar 3 elemen. Terima kasih atas sarannya!

PEMBARUAN 3

Terima kasih lain kepada Laikoni karena menunjukkan lebih banyak aturan golf kode yang tidak saya sadari. Juga memetakan v ke input saya untuk membuat daftar fungsi yang diterapkan sebagian adalah ide yang fenomenal dan menyelamatkan saya 4 byte tambahan!

maple_shaft
sumber
1
Selamat datang di PPCG dan golf Haskell khususnya! Anda dapat menyimpan banyak byte dengan menulis fungsi [Int] -> Intalih-alih membaca dari stdin dan menulis ke stdout. Melakukan hal itu diperbolehkan secara default, tetapi dalam kasus ini bahkan secara eksplisit disebutkan dalam tantangan yang mengaitkan daftar bilangan bulat sebagai input dapat diterima.
Laikoni
1
Menggunakan fromEnumbukan digitToIntcenderung lebih pendek karena memungkinkan Anda untuk menjatuhkan impor.
Laikoni
@Laikoni Terima kasih banyak kepada Anda karena menunjukkan beberapa aturan yang tidak saya ketahui! Trik fromEnum bekerja seperti mantra juga, tidak tahu mengapa saya tidak berpikir untuk bekerja dari kode ASCII tapi itu menghemat banyak byte juga.
maple_shaft
1
v=(map((-51+).fromEnum)"95 ... 5"!!)menghemat dua tanda kurung. o x|x<0=(*)|0<1=(+)menyimpan satu byte di penjaga kedua.
Laikoni
1
In wadalah ruang ekstra yang tersisa. Juga, karena Anda hanya perlu menangani daftar panjang 3, Anda dapat menggunakan w[x,y,z]=sebagai pencocokan pola.
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"]!!)

Cobalah online!

Berdasarkan jawaban @ maple_shaft, saya hanya memfaktorkannya sedikit.

Terima kasih kepada @Laikoni selama 5 byte!

BlackCap
sumber
1
87 byte: Cobalah secara online!
Laikoni
@Laikoni Saya cukup yakin jumlah baris baru
BlackCap
Saya tidak menghitung dua byte f=karena fungsi anonim diizinkan sebagai kiriman. Mereka hanya diminta untuk membuat contoh tio bekerja.
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);}
Peter Lenkefi
sumber
0

8086 kode mesin, 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

Tiga byte terakhir berisi input (diindeks-nol). Hei, Anda bilang saya bisa menggunakan format input yang paling nyaman. Dalam hal ini, itu hardcoding!
Output adalah kode kesalahan yang dikembalikan ke shell.

Bagaimana itu bekerja:

            |   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)
pengguna5434231
sumber