Tantangan:
Dalam pertanyaan ini: Beri nama tangan poker Anda harus mengambil tangan lima kartu poker dan mengidentifikasinya. Pertanyaan ini serupa, dengan dua tikungan:
Pertama, hasilnya akan dalam huruf kecil semua. Hal ini memungkinkan untuk lebih banyak bermain golf, karena Anda tidak perlu khawatir dengan kapitalisasi flush
danstraight
high card
one pair
two pair
three of a kind
straight
flush
full house
four of a kind
straight flush
royal flush
Kedua, dengan popularitas Texas Hold'em dan 7 kartu stud, kita di sini di golf kode harus mampu mencetak tujuh kartu poker tangan aku benar? Saat mencetak tujuh kartu, gunakan lima kartu terbaik untuk kartu Anda dan abaikan dua kartu yang tidak Anda butuhkan.
Referensi:
Daftar tangan poker: http://en.wikipedia.org/wiki/List_of_poker_hands
Input (diangkat langsung dari utas sebelumnya)
7 kartu dari argumen stdin atau commandline. Kartu adalah string dua huruf pada formulir RS
, di mana R adalah peringkat dan S sesuai. The jajaran yang 2
- 9
(kartu angka), T
(sepuluh), J
(Jack), Q
(Queen), K
(Raja), A
(Ace). The jas yang S
, D
, H
, C
untuk sekop, berlian, hati dan klub masing-masing.
Contoh kartu
5H - five of hearts
TS - ten of spades
AD - ace of diamonds
Contoh input => output yang diinginkan
3H 5D JS 3C 7C AH QS => one pair
JH 4C 2C 9S 4H JD 2H => two pair
7H 3S 7S 7D AC QH 7C => four of a kind
8C 3H 8S 8H 3S 2C 5D => full house
AS KC KD KH QH TS JC => straight
Perhatikan pada contoh kedua sebenarnya ada tiga pasangan, tetapi Anda hanya dapat menggunakan lima kartu, jadi begitu two pair
. Pada contoh kelima, ada a three of a kind
dan straight
kemungkinan, tetapi a straight
lebih baik, jadi hasilnya straight
.
Mencetak gol
Ini kode-golf , jadi kode terpendek menang!
Kesalahan
- Anda tidak boleh menggunakan sumber daya eksternal.
- Ace tinggi dan rendah untuk lurus.
Jawaban:
Ruby 353
Ini didasarkan pada jawaban Chron dari pertanyaan awal.
Ini mengambil input sebagai argumen baris perintah. Pada dasarnya kami hanya mengulangi semua kombinasi ukuran 5 untuk mendapatkan jenis tangan apa itu. Setiap jenis tangan telah dimodifikasi sehingga dimulai dengan angka. ("royal flush" -> "0royal 4flush", "high card" -> "9high card"). Ini memungkinkan kami untuk mengurutkan string yang dikembalikan. String pertama setelah pengurutan adalah tangan terbaik. Jadi kami mencetaknya setelah menghapus semua angka dari string.
sumber
AS QS JS TS 9S 5H 5D
. Itu akan dikenakan biaya karakter!Haskell
618 603 598 525 512 504 480464Kartu diambil sebagai jalur input. Saya pikir saya sudah bermain golf ini sampai mati, tetapi akan dengan mudah dikalahkan oleh ruby dll menggunakan trik yang sama: jika Anda menghasilkan semua permutasi, Anda mendapatkan jenis maju yang Anda ingin mencari lurus, ditambah jenis terbalik yang Anda inginkan untuk pengujian N sejenis.
Diedit ke inline "pair" dan menggunakan awalan nomor setelah melihat entri @ FDinoff, juga menyusun fungsi peta untuk mencukur satu lagi char.
sumber
"one pair","two pair"
lebih pendeku=" pair" ... "one"++u,"two++u
C ++,
622553 karakterempat baris baru yang tidak perlu ditambahkan di bawah ini untuk kejelasan.
Hal-hal berubah dalam versi golf:
Rev 1: Mengubah semua variabel numerik ke
__int64
untuk deklarasi tunggal.Rev 1: Peningkatan golf dan kondisi
for
loopRev 0: Mengubah konstanta oktal ke desimal.
Rev 0: Mengubah
if
pernyataan menjadi tugas dengan operator bersyarat. Rev 1: Mengatur ulang lebih jauh menjadi satu ekspresi untukt
. Ini membutuhkan variabel baruv
untuk salah satu nilai menengahRev 0: Output verbose terhapus. Hanya menampilkan hasil keseluruhan terbaik.
Rev 0: Mengompresi teks output (sulit dalam C karena Anda tidak dapat menggabungkan string menggunakan operator +.) Menulis "flush" hanya sekali menyelamatkan saya 12 karakter tetapi biaya saya 15, membuat saya 3 chars lebih buruk dari keseluruhan. Jadi saya hanya menulisnya 3 kali.Rev 1: digunakanstd::string
bukanchar[]
seperti yang disarankan oleh FDinoff, sehingga memungkinkan untuk digabungkan dengan+
.Versi tidak dikoleksi, 714 karakter non-spasi noncomment.
Loop melalui semua 21 kartu yang mungkin dibuat dari 7 kartu dan setiap kartu ditolak 2 kali. Suit dan pangkat dari lima kartu yang dipilih dijumlahkan dalam variabel f dan p dengan digit oktal yang berbeda untuk setiap suit / pangkat. Berbagai operasi bit dilakukan untuk menentukan tipe tangan, yang kemudian disimpan dalam t (semua 21 kemungkinan merupakan output dalam versi yang tidak diklik.) Akhirnya tangan terbaik adalah output.
Output tidak terkendali
sumber
<string>
yang mendukung + untuk rangkaian string. Yang kemudian berarti Anda mungkin bisa menggunakan<iostream>
dan menggunakancout
Namun saya tidak benar-benar tahu apakah ada yang akan menyebabkan jumlah karakter lebih kecil" pair flush flush straight of a kind"
= 35 karakter. Setelah Anda menambahkan#include
tabungan minimal, maka Anda harus mempertimbangkan tambahan",=+
dan deklarasi konstanta. Saya juga baru mengenal C ++ dan berjuang dengan pengaturan IDE dan compiler (memaksa saya untuk menggunakanscanf_s
danprintf_s
bukannya versi "tidak aman" lama dan bantuan untuk memperbaikinya berputar-putar.)cout
Mungkin membantu sedikit, ada di saya untuk lakukan daftar, tetapi mungkin untuk program lain. Hal yang membunuhcout
bagi saya adalahusing namespace std
saya tidak tahu apakah ada cara untuk menghindari menulis semua itu.std::cout
untuk berkelilingusing namespace std
gets_s
&puts
, ditambahstd::string
ke concatenate, yang berarti saya harus mengonversi kechar*
ke output. Golf yang saya posting berfungsi dengan adilstring
atau hanyaiostream.
Aneh, saya harus menyertakan keduanya untuk menggunakan<<>>
operator dengancin/cout
&std::string
s. Secara keseluruhan, menggunakan kedua#include
s bekerja 5 byte lebih buruk, meskipun saya dapat mendeklarasikanh
sebagai astd::string
dan menghindarichar
deklarasi yang terpisah . Bisa ditebak, saya tidak dapat menemukan daftar apa yang adanamespace std
dalam bantuan (atau penjelasan tentang operator.)scanf
dangets
, kecuali untuk bermain golf, di mana program-programnya cukup tidak aman. Saya dapat mempersingkat 5 byte-s,99
jika saya bisa menggunakan,gets
bukangets_s
, tapi saya tidak bisa mendapatkan kompiler untuk membiarkan saya. Yang mengejutkan saya adalah betapa tidak amannya C / C ++ secara umum! Beberapa minggu yang lalu itu akan mengejutkan saya untuk menemukan yang_int64 x=1<<y
memberikan jawaban yang salah untuk Anda lebih dari 31. Tapi sekarang saya hanya sedikit kesal. Setelah melihat hal-hal dengan subscript array keluar dari batas tanpa pesan kesalahan, saya sudah terbiasa. Apakah ada cara untuk mengaktifkan pemeriksaan yang lebih baik?perl (> = 5.14),
411403400397400Sunting : sebaris sub yang hanya dipanggil sekali, menyimpan 8 karakter.
Sunting 2 : menghapus
.""
yang tersisa dari upaya awalSunting 3 : alih-alih variabel temp yang mempertahankan yang asli
$_
, gunakan satu untuk membuatnya tidak perlu. Keuntungan bersih 3 karakter.Sunting 4 : kegagalan tetap untuk mendeteksi rumah penuh terlalu penuh (2x 3-of-a-kind). biaya 3 karakter.
Bukan pemenang, tetapi detektor lurus adalah konsep yang menarik, saya pikir.
Versi yang diperluas:
sumber
JavaScript 600
penggunaan dengan nodeJS:
node code.js "7H 3S 7S 7D AC QH 7C"
sumber