Golf pencetak gol golf

25

Sebagai seorang anak, saya sering bermain permainan kartu " golf " . Tantangan Anda, jika Anda memilih untuk menerimanya, adalah menghitung skor kartu golf. Karena ada lebih dari 9000 variasi pada permainan kartu 1 ini , kita akan mengikuti aturan yang saya ingat mainkan.

Aturan (dari game)

  • Anda mengakhiri putaran dengan 6 kartu, dan Anda ingin poin sesedikit mungkin.

  • Pelawak tidak digunakan.

  • Aces dan 2s masing-masing bernilai -1, dan -2 poin.

  • Jacks and Kings sama-sama bernilai 0 poin.

  • Kartu dari 3 hingga 10 bernilai nominal. Namun, ini dibatalkan saat Anda memasangkannya. Misalnya, 5 bernilai 5 poin, tetapi dua 5 bernilai nol. Tiga 5 bernilai 5 poin, (karena 2 pertama dipasangkan, tetapi 3 tidak.) Dan empat 5 bernilai 0 (karena menghasilkan 2 pasangan).

  • Queens bernilai 15 poin. Ratu tidak dapat dibatalkan, misalnya 2 ratu bernilai 30 poin.

Aturan (dari tantangan)

Input akan berupa array bilangan bulat, atau 6 bilangan bulat individual. Apapun yang Anda inginkan. 1 mewakili ace, 2-10 mewakili 2-10, dan Jack, Queen, dan King mewakili 11, 12, dan 13. Output adalah skor tangan sesuai dengan aturan di atas. Anda dapat dengan aman mengasumsikan bahwa semua input valid, mis. Tidak ada angka yang muncul lebih dari 4 kali, dan semua angka berada dalam kisaran [1, 13]. Input dan output dapat dalam format apa pun yang masuk akal.

Tes IO:

[11, 10, 3, 1, 2, 2]    --> 8
[4, 5, 5, 3, 8, 7]      --> 22
[2, 2, 2, 2, 1, 1]      --> -10 (The lowest score possible)
[12, 12, 12, 12, 10, 9] --> 79 (The highest score possible)
[9, 9, 9, 9, 11, 1]     --> -1
[8, 8, 8, 8, 11, 13]    --> 0
[10, 9, 3, 7, 12, 2]    --> 42
[1, 2, 3, 4, 5, 6]      --> 15
[10, 9, 2, 3, 4, 1]     --> 23
[10, 3, 12, 3, 7, 12]   --> 47

Jawaban terpendek dalam byte menang!


1 tidak juga, tetapi ada banyak variasi.

DJMcMayhem
sumber

Jawaban:

3

Pyth, 28 27 25 byte

s+*L%/Qd2}3Tm?<d3_d*15q12

Cobalah online. Suite uji.

Penjelasan

  • Pertama, Pyth menambahkan beberapa variabel secara otomatis. Kode sekarang s+*L%/Qd2}3Tm?<d3_d*15q12dQ.
  • }3Tmenghasilkan daftar [3, 4, 5, 6, 7, 8, 9, 10].
  • Lipat gandakan setiap angka dalam daftar itu ( *L) dengan jumlah hitungan itu di input ( /Qd), modulo 2 ( %... 2). Hasilnya adalah 0 untuk angka berpasangan dan angka itu sendiri untuk yang bukan pasangan.
  • Peta di atas nomor input ( m... Q):
    • Jika jumlahnya kurang dari 3 ( ?<d3), negasikan ( _d).
    • Kalau tidak periksa apakah 12 ( q12d), dan kalikan boolean dengan 15 ( *15). Hasilnya adalah 15 untuk ratu dan 0 untuk apa pun.
  • Gabungkan daftar ( +). Daftar yang dihasilkan sekarang berisi skor untuk nomor yang tidak berpasangan (bagian pertama) dan kartu khusus A, 2, Q (bagian kedua), dengan beberapa angka nol tambahan.
  • Akhirnya, ambil jumlah hasilnya ( s).

Alternatif solusi 25-byte

-+s*L%/Qd2}3T*15/Q12s<#3Q

Ini bekerja mirip dengan yang pertama, tetapi menghitung ratu secara terpisah dan meniadakan kartu As dan berpasangan dengan filter.

PurkkaKoodari
sumber
11

Python 2, 72 70 byte

f=lambda x,*T:[x*(-1)**T.count(x),~x%2*15,-x][(x-3)/8]+(T>()and f(*T))

Pada satu titik saya berharap Python dirawat 0**0 == 0sekali sehingga saya bisa melakukannya (-condition)**num. Sebut seperti f(11, 10, 3, 1, 2, 2).

Versi 72 byte sebelumnya:

f=lambda x,*T:[~x%2*15,x*(-1)**(x<3or T.count(x))][x<11]+(T>()and f(*T))
Sp3000
sumber
5

> <> , 63 57 56 + 2 = 65 59 58 byte

Angka-angka input diharapkan berada di tumpukan pada awal program, jadi +2 byte untuk -vflag. Cobalah online!

</!?lp6$+1g6:
3\0
?\::6g2%*{+}1+:b=
;\~16g-26g2*-c6gf*+n

Karena semua nilai yang tidak digunakan dalam bidang kode diinisialisasi 0, dapat digunakan untuk mengetahui berapa banyak dari masing-masing nilai yang ada pada tumpukan dengan mendapatkan nilai [value,6], menambahnya, dan meletakkannya kembali di bidang kode. Totalnya kemudian dihitung sebagai:

T = 0 + {for x in 3 to 10, x*([x,6]%2)} - [1,6] - 2*[2,6] + 15*[12,6]

Sunting: golf 6 byte off dengan merestrukturisasi input dan beralih langkah perhitungan sekitar. Versi sebelumnya:

:6g1+$6pl0=?\
/-*2g62-g610/
c ;n$\
6:b=?/>::6g2%*{+}1+!
\gf*+3/

Sunting 2: disimpan 1 byte, terima kasih kepada Sp3000

Sok
sumber
Saya telah melihat bahwa Anda telah menggunakan 0=?atau serupa beberapa kali - dapatkah Anda menggunakannya ?!?
Sp3000
@ Sp3000 Ack, tentu saja, Anda benar. Terima kasih, saya akan menambahkannya di
Sok
5

MATL , 27 26 byte

3:10=s2\7M*G12=15*Gt3<*_vs

Input adalah array kolom, yaitu nilai dipisahkan oleh titik koma.

Cobalah online! atau memverifikasi semua kasus uji (ini menambahkan loop untuk mengambil semua input, dan menggantikan Gdengan 1$0Gmenekan input terbaru).

Penjelasan

3:10=    % Take input implicitly. Compare with range [3 4 ... 10], with broadcast
s        % Sum of each column: how may threes, fours, ... tens there are
2\       % Modulo 2
7M       % Push [3 4 ... 10] again
*        % Element-wise multiply (the sum of this array is the score of 3...10)
G        % Push input again
12=      % Compare with 12, element-wise
15*      % Multiply by 15 (this is the score of 12)
G        % Push input again
t3<      % Duplicate. True for entries 1 or 2
*_       % Multiply and negate (the sum of this array is the score of 1, 2)
v        % Concatenate all stack concents into a vertical array
s        % Sum of array. Implicitly display
Luis Mendo
sumber
4

Pyth - 37 36 35

Ini sepertinya terlalu besar, tetapi FGITW.

J<#h;K-QS2++*15/K12sm*d%/Jd2{J_s@S2

Test Suite .

Maltysen
sumber
2
"Ini sepertinya terlalu besar, tapi FGITW." Jadi golf dulu?
kucing
Saya tidak melihat ini sampai aku selesai saya sendiri, tetapi mereka hampir identik kecuali menggunakan Jdan Ktampaknya benar-benar tidak perlu, dan juga Anda dapat golf +_untuk -;) saya mendapat 31:+*15/Q12-sm*d%/Qd2{>#2<#11Qs@S2
FryAmTheEggman
1
@FryAmTheEggman 24:+*15/Q12-s*R%/Qd2}3Ts@S2
Jakube
3

JavaScript (ES6), 63 byte

a=>a.map(e=>r+=e<3?-e:e>10?e-12?0:15:(m[e]^=1)?e:-e,r=0,m=[])|r

Atau jika Anda lebih suka,

a=>a.map(e=>r-=e<3?e:e>10?e-12?0:-15:(m[e]^=1)?-e:e,r=0,m=[])|r
Neil
sumber
0

Perl 5.10.0 + -n, 115 64 60 56 byte

$p+=$_-12?$_>2?$_<11?++$l[$_]%2?$_:-$_:0:-$_:15}{say$p

Cobalah online!

Penjelasan:

Menambahkan -nlingkaran di sekitarnya:

# Used variables:
# $_: input (auto)
# $p: points
# $l[n]: number of occurences of n (for 3-10)
while (<>) { # for every input
    $p += $_ - 12 ? # if the input is not 12 (queen) ...
        $_ > 2 ? # then: if it's > 2 (not ace or 2) ...
            $_ < 11 ? # then: if < 11 (3-10) ...
                ++$l[$_] % 2 ? # then: if it's an odd occurence (1st, 3rd, 5th, ...)
                    $_ # add it
                    : -$_ # else subtract it
            : 0 # no points for other stuff (J, K)
        : -$_ # negative points for ace and 2
    : 15 # 15 points for queen
}
{ # after input:
    say $p # output points
}
wastl
sumber