Hitung poin dalam game "sjoelen"

31

Oke, jadi kemarin adalah hari Natal ke-2 dan orangtuaku (grand) dan aku punya permainan "sjoelen", seperti yang disebut di Belanda. Programmer batin muncul dalam diri saya, tetapi tepat ketika saya memiliki jawabannya, saya kehilangan jawabannya. Saya ingin Anda membuatnya kembali.

Aturan:

Anda memiliki papan kayu, sjoelbak , dengan 4 kotak, masing-masing dengan nomor mereka sendiri. Ketika schijf ( Objek keping-suka) masuk ke dalam salah satu kotak Anda mendapatkan poin di atas kotak itu.

A _sjoelbak_ dengan _schijven_
Ketika ada schijf di semua 4 kotak, Anda tidak mendapatkan 10 tetapi Anda mendapatkan 20 poin.

Contoh:

Dari kiri ke kanan: 3 5 4 3
Setiap kotak memiliki setidaknya 3 schijven (Plural of schijf ) sehingga 20 * 3 = 60 poin.

Nilai yang dihasilkan: 0 2 1 0
0 * 2 + 2 * 3 + 1 * 4 + 0 * 1 = 10 poin.

Yang membuat total 60 + 10 = 70 poin.

Input:
Jumlah skema dari kiri ke kanan, yaitu "4 5 4 5", [4,5,4,5], "4 \ n5 \ n4 \ n5", apa pun yang Anda suka.

Output:
Jumlah poin, yaitu 84, sebagai output, variabel, return atau di atas tumpukan, apa pun yang Anda suka.

Seperti dalam setiap dan setiap kode golf, Anda tidak dapat menggunakan skrip eksternal dan kode dengan byte paling sedikit menang.

PS: Seperti yang sudah Saudara ketahui, saya orang Belanda. Jangan ragu untuk mengedit kemungkinan kesalahan tata bahasa.

Charlie
sumber
Apakah output harus stdout atau dapatkah itu berfungsi kembali atau item yang tersisa tersisa di stack (untuk bahasa berbasis stack)?
globby
@globby Bisa jadi segalanya
Charlie
Saya pikir sjoelen adalah leuk!
Mark Knol
1
Apakah ada batasan jumlah schijf di setiap kotak?
The_Basset_Hound
@BassetHound Anda mendapatkan 30 schijven per ronde, jadi 30 di 4 sama dengan 120 poin. Itu mungkin, tetapi bukan skor terbaik (7 secara keseluruhan = 140, + 2 dalam 4 = 148)
Charlie

Jawaban:

8

CJam, 23 21 20 byte

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

Saya mungkin bisa bermain golf beberapa byte dari ini.

Inputnya seperti

[3 5 4 3]

Output adalah skor

70

Bagaimana itu bekerja

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

Algoritma

  • Karena saya telah benar menggeser jumlah schijven, urutan skor sekarang menjadi [1 2 3 4].
  • Selain itu, dengan menggunakan fakta itu 1 + 2 + 3 + 4 = 10, saya cukup menambahkan schijven umum minimum untuk masing-masing untuk mendapatkan efek 10skor bonus .
  • Sekarang ketika saya mengurangi, saya mendapatkan 2 elemen awalnya di stack, yang pertama, yang saya abaikan adalah yang memiliki skor 1 masing masing, lalu saya gandakan yang kedua dengan 2dan menambahkannya ke yang pertama. Dalam iterasi berikutnya, saya mendapatkan jumlah dan skor 3saat ini. Dan seterusnya.

Cobalah online di sini

Pengoptimal
sumber
Paling tidak byte (sejauh ini), diterima. Terima kasih untuk penjelasannya.
Charlie
@Charlie Mengapa Anda menerima jawaban begitu cepat? Anda sebaiknya menunggu 1-2 minggu sebelum menerima jawaban.
ProgramFOX
8

Piet, 240 (30 * 8) codels, 138 berisi kode aktual

Ukuran codel 10, untuk visibilitas yang lebih baik

Piet: jumlah titik sjoelen

Contoh uji:

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

Tampilan aliran:

Menggunakan steno saya sendiri untuk penanganan yang lebih mudah dan tampilan yang ringkas. Ini menunjukkan aliran program umum, bukan lokasi yang tepat dari codels.

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

Penjelasan lengkap:

      (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

Simpan gambar dan coba di penerjemah online Piet ini:

PietDev, penerjemah online Piet

ML
sumber
A Piet answer ^. ^
The_Basset_Hound
Tentu saja! Saya mencoba menambahkan jawaban Piet kapan pun dapat dikelola;)
ML
8

APL (Dyalog Classic) , 16 13 12 byte

-3 terima kasih kepada @ Adám

(+/+\)1⌽⌽+⌊/

Cobalah online!

⌽+⌊/ membalikkan (arg) + min (arg)

1⌽ putar 1 ke kiri

+\ jumlah parsial

+/ jumlah

ngn
sumber
7

Mathematica, 38 32 23 20 byte

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

(Dengan bantuan dari desir )

Gunakan dengan menempelkan input ke akhir:

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

70

Alternatif (36 byte):

20*Min@#+Total[(#-Min@#)*{2,3,4,1}]&
kukac67
sumber
Tr[(# + Min@#) {2, 3, 4, 1}] &
desir
@ Berharap begitu pintar!
kukac67
1
Itulah keseluruhan fungsinya. Anda tidak perlu menambahkan 20*Min@#, Anda bisa menghilangkannya dengan mengganti minus dengan plus, karena dengan mudah 2+3+4+1==10.
desir
@berharap Oh! Itu lebih baik. Tapi saya tidak bisa membungkus kepala saya mengapa itu berhasil?
kukac67
2
@ Berharap Baiklah, terima kasih atas semua bantuannya, tetapi Anda seharusnya baru saja memposting jawaban Anda sendiri. : D
kukac67
7

R, 41 40 karakter

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

Pemakaian:

> 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

Dalam contoh terakhir, aadalah vektor 3 5 4 3, a-byaitu 0 2 1 0, yang kita gandakan dengan vektor 2 3 4 1sehingga memberi 0 6 4 0yang kita tambahkan dengan 5*bmemberi 15 21 19 15( 5*bdidaur ulang untuk setiap anggota vektor ditambahkan, maka secara efektif menambahkan 4*5*b), yang akhirnya kita jumlahkan, dengan demikian memberi 70.

plannapus
sumber
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

Pemakaian: s(1, 2, 3, 4)

Cara kerjanya: fungsi mencari angka terkecil dalam argumen, dan mengalikannya dengan 10(bukan dengan 20) dan menambahkan sisa skor. Tidak perlu mengalikan 20dan mengurangi bagian dari skor untuk melanjutkan perhitungan.

Terima kasih kepada edc65 untuk berbagi peningkatan!

Tidak golf:

function score(a, b, c, d) {
    return 10 * Math.min(a, b, c, d) + a * 2 + b * 3 + c * 4 + d;
}
ProgramFOX
sumber
1
Gunakan 10 dengan min, tidak perlu mengurangi (fungsi s (a, b, c, d) {return 10 * Math.min (a, b, c, d) + a * 2 + b * 3 + c * 4 + d;})
edc65
1
Dan dalam ES6:S=(a,b,c,d)=>10*Math.min(a,b,c,d)+a*2+b*3+c*4+d
edc65
@ edc65 Luar biasa, terima kasih!
ProgramFOX
5

Pyth , 15

sm*hd+@QtdhSQUQ

Input harus diberikan koma yang dipisahkan pada STDIN, mis

3,5,4,3

Ini menggunakan trik yang sama dengan yang digunakan banyak solusi lain, yaitu menambahkan minimum pada setiap elemen untuk memperhitungkan bonus. Minimum ada hSQdi kode di atas. Untuk menghitung mengalikan dengan 2, 3, 4, dan 1, saya memetakan d pada daftar [0,1,2,3], dan mengalikan elemen (dl) input dengan d + 1. Jadi, elemen -1 dikalikan dengan 1, nol dengan 2, yang pertama dengan 3 dan yang kedua dengan 4. Lalu aku menjumlahkan.

isaacg
sumber
5

J, 23 22 karakter

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

Contoh:

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

Coba di sini.

(23 fungsi panjang definisi eksplisit: v=:3 :'+/+/\.3|.y+<./y')

randomra
sumber
Kenapa tidak adil +/2 3 4 1*(+<./)?
desir
@ harap saya lebih suka menulis fungsi lengkap walaupun itu bukan keharusan di sini. Poskan / tambahkan jika Anda mau.
randomra
Bagaimana dengan 2 3 4 1+/ .×]+<./?
Adám
4

Burung unta v0.1.0 , 48 41 karakter (terlalu panjang)

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

Ini sama persis dengan versi lama di bawah ini, kecuali bahwa alih-alih menggunakan @untuk memutar seluruh tumpukan, )\+(bukan kanan) digunakan sebagai gantinya.

Versi lama:

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

Saya sebenarnya telah menemukan dua bug dalam bahasa saya yang baru diimplementasikan, dijelaskan dalam uraian di bawah ini. (Bahasa saat ini sangat, sangat mirip dengan Golfscript, jadi jika Anda tahu Golfscript seharusnya cukup mudah dibaca.

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

Mengharapkan input sebagai larik pada STDIN, karena saya gagang pintu dan lupa menerapkan I / O di v0.1.0.

Menyelesaikan masalah aktual di Burung Unta itu bagus, karena itu menunjukkan kepada saya berapa banyak hal yang perlu saya tambahkan ke bahasa: D

Gagang pintu
sumber
Semoga berhasil dengan bahasa Anda, kelihatannya sejauh ini;)
Charlie
4

Python 2, 43 byte

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

Terinspirasi oleh jawaban @ user2487951.

isaacg
sumber
Algoritma yang bagus! Untuk program lengkap, Anda perlu input dan pernyataan cetak juga.
user2487951
1
@ user2487951 Salah satu cara keluaran yang diizinkan adalah "kembali", jadi meskipun ini bukan program lengkap, ini adalah jawaban yang valid.
isaacg
3

Jagl Alpha 1,2 - 20 byte

Input dalam format stdin (3 4 5 6), output dibiarkan di tumpukan:

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

Menunggu respons dari poster asli tentang format output. Karena input ditentukan sebagai "apa pun yang Anda suka" , saya akan menganggap bahwa input saya dapat berupa array di bagian atas tumpukan. Sekarang ambil input pada stdin.

Penjelasan:

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
globby
sumber
Jawaban pertama diterima, posting yang diedit untuk membuatnya jelas
Charlie
@Optimizer titik diambil. Diedit.
globby
3

Haskell, 40

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

alih-alih menghapus nomor minimum dari yang lain dan menambahkan tambahan 20, ini menambahkan tambahan 10untuk jumlah minimum.

haskeller bangga
sumber
Solusi bagus Anda memang mencampuradukkan pesanan, seharusnya..4*c+d..
3

Matlab, 27

Butuh waktu beberapa saat untuk memahami bahwa ini adalah permainan pemain tunggal. Dengan bantuan fungsi anonim

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

yang dipanggil dengan vektor baris

f([3 5 4 3]) == 70
f([7 7 9 7]) == 148
zabalajka
sumber
1
Saya pikir secara umum diterima di sekitar bagian-bagian ini untuk menjatuhkan f=2 byte lebih sedikit. Fungsi itu disimpan dalam ansvariabel sebagai gantinya.
BrainSteel
1
[2:4,1]akan memangkas 2 byte jika inputnya adalah vektor kolom.
Sanchises
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];}

Saya punya ide ini bisa bermain golf lebih jauh, tapi ini dia untuk sekarang.

Panggilan dengan A(new int[]{3,5,4,3}), output dikembalikan sebagai int (Karena System.out.println()akan menggandakan byte)

Tidak disatukan

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];
}
Charlie
sumber
2

GolfScript, 22 byte

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

Membaca input dari stdin, dalam format [3 5 4 3]. Menulis output ke stdout. (Jika mengambil input sebagai array pada stack diperbolehkan, pimpinan ~dapat dihilangkan dengan total 21 byte.)

Ini menggunakan strategi yang agak berbeda dari solusi CJam / Pyth / etc.: Saya pertama kali membangun sebuah array dengan 2 salinan dari nilai input pertama, 3 dari yang kedua, 4 dari yang ketiga dan satu dari yang keempat. Lalu saya mengurutkan array ini, mengeluarkan elemen terkecil, kalikan dengan 11 dan jumlah dengan elemen lainnya.

Ilmari Karonen
sumber
2

Python 2, 51

Tidak terinspirasi, tetapi singkat:

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

Lebih pythonic:

l=input()
print sum(map(lambda x,y:x*y,l,[2,3,4,1]))+10*min(l)
pengguna2487951
sumber
Jika inputnya [3,5,4,3], apakah ini akan mengembalikan 70?
Charlie
Ya, dalam kedua kasus itu. Dan mengembalikan 84 untuk [4,5,4,5].
user2487951
2

Julia, 48 35 karakter

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

dalam bentuk penugasan ringkas:

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

Contoh:

julia> p([3 5 4 3])
70
ML
sumber
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))
SuperJedi224
sumber
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

Saya ingin melihat bagaimana rekursi akan berubah, dan sementara itu jelas bukan jawaban yang terpendek, saya merasa sepertinya itu baik-baik saja.

a*b*c*d: Dibutuhkan nilai input dan menemukan produk dari semuanya, dan mengevaluasi itu sebagai ekspresi Boolean untuk pernyataan inline if. Ini akan mengembalikan false jika satu atau lebih nilai adalah 0, dan berlaku untuk nilai lainnya.

20+f(--a,--b,--c,--d): Jika mengembalikan true, fungsi mengembalikan 20 (untuk set schijven ) ditambah panggilan rekursif dari fungsi untuk semua nilai minus satu (Untuk menghapus set schijven itu ). Dengan cara ini akan berulang secara berulang sampai setidaknya satu kotak kosong.

a*2+b*3+c*4+dSetelah setidaknya satu kotak kosong, bagian lain dari inline jika pernyataan akan berjalan. Itu hanya mengembalikan poin untuk yang tersisa schijven yang di dalam kotak.

Jadi pada akhirnya semua set 20 poin schijven , dan titik-titik yang diberikan diringkas dan dikembalikan dari fungsi, menghasilkan jawabannya.

skycon
sumber
1

Haskell 42 karakter

f l=10*minimum l+sum(zipWith(*)[2,3,4,1]l)
HEGX64
sumber
Kode jumlah secara tegas: f l@[a,b,c,d]=10*minimum l+2*a+3*b+4*c+d- menghemat 2 karakter
MtnViewMark
1

HPPPL (Bahasa Pemrograman Utama HP), 58 57 byte

* Antara 10 dan menit tidak diperlukan, jadi saya menghapusnya.

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

HPPPL adalah bahasa pemrograman untuk kalkulator grafik warna HP Prime / CAS.

Contoh berjalan:

HPPPL screen capture of sjoelen point count program

Jika tidak harus berupa program, maka itu dapat diwujudkan dalam 40 39 byte satu-liner:

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

Staq, 72 karakter

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

Contoh dijalankan:

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

3
5
4
3
70

Execution complete.
>

Staq memiliki dua tumpukan, satu aktif, satu pasif. The |perintah switch stack aktif untuk pasif dan sebaliknya.

Segala sesuatu antara kurung kurawal menentukan suatu fungsi, huruf pertama setelah kurung buka adalah nama fungsi, sisanya sampai kurung kurawal adalah fungsi itu sendiri. Fungsi-fungsi utama, fungsi rekursi dan bersarang dimungkinkan. {aii}akan mendefinisikan fungsi a yang akan menambah bagian atas tumpukan dua kali. Setiap instance berikut adalam kode akan diganti olehii .

Komentar di dalam prorams Staq : &menambahkan nol di atas tumpukan, [menginstruksikan pointer untuk melompat ke yang sesuai ]jika bagian atas tumpukan adalah nol, xmenghapus nilai teratas pada tumpukan. Jadi, komentar dapat ditulis ke dalam kode dalam bentuk&[here is a comment]x

Penjelasan (juga dapat dieksekusi):

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

Program ini menggunakan satu tumpukan (awalnya aktif) untuk menghitung 2a + 3b + 4c + d, dan tumpukan kedua (awalnya pasif) untuk menghitung 10 kali minimum dari nilai input. Kemudian kedua hasil disimpulkan dan ditampilkan.

ML
sumber