Indeks dan permainan poker
Cabaran Mingguan 291
Setiap minggu Mohammad S. Anwar menghantar Cabaran Mingguan, peluang untuk kita semua mencari penyelesaian kepada dua tugas mingguan. Penyelesaian saya ditulis dalam Python terlebih dahulu, dan kemudian ditukar kepada Perl. Ini cara yang bagus untuk kita semua mempraktikkan beberapa pengekodan.
Cabaran, Penyelesaian saya
Tugasan 1: Indeks Tengah
Tugasan
Anda diberi tatasusunan integer, @ints.
Tulis skrip untuk mencari indeks tengah paling kiri (MI) iaitu yang terkecil di antara semua yang mungkin.
Indeks tengah ialah indeks dengan ints[0] ints[1] … ints[MI-1] == ints[MI 1] ints[MI 2] … ints[ints.length-1].
- Jika MI == 0, jumlah sebelah kiri dianggap sebagai 0. Begitu juga,
- jika MI == ints.panjang - 1, jumlah sebelah kanan dianggap sebagai 0.
penyelesaian saya
Ini agak lurus ke hadapan. Saya gelung melalui kedudukan dari 0 hingga satu kurang daripada panjang input. Pada setiap kedudukan saya melihat jika syarat dipenuhi.
def middle_index(ints: list) -> int: for i in range(len(ints)): if sum(ints[:i]) == sum(ints[i + 1:]): # It is, so return this position return i return -1
Contoh
$ ./ch-1.py 2 3 -1 8 4 3 $ ./ch-1.py 1 -1 4 2 $ ./ch-1.py 2 5 -1
Tugasan 2: Kedudukan Tangan Poker
Tugasan
Sebuah tangan poker cabutan terdiri daripada 5 kad, diambil daripada pek 52: tiada pelawak, tiada kad liar. Ace boleh berpangkat sama ada tinggi atau rendah.
Tulis skrip untuk menentukan tiga perkara berikut:
- Berapa bilangan tangan 5 kad yang berbeza boleh diuruskan?
- Berapa banyak tangan yang berbeza bagi setiap 10 pangkat boleh ditangani? Lihat di sini untuk penerangan tentang 10 peringkat tangan Poker: https://en.wikipedia.org/wiki/List_of_poker_hands#Hand-ranking_categories
- Semak sepuluh nombor yang anda dapat dalam langkah 2 dengan menambahkannya bersama-sama dan menunjukkan bahawa ia adalah sama dengan nombor yang anda dapat dalam langkah 1.
penyelesaian saya
Ikat, kerana ini akan menjadi jawatan yang panjang. Ia juga merupakan kali pertama dalam masa yang lama bahawa tugasan tidak memerlukan sebarang input. Dalam cabaran yang telah saya selesaikan, yang terakhir ialah #177.
Untuk menjawab soalan pertama, terdapat 311,875,200 kemungkinan pilih atur kad yang boleh diuruskan (52 × 51 × 50 × 49 × 48). Walau bagaimanapun, susunan kad tidak penting. Untuk mana-mana lima kad yang dilukis, ia boleh disusun dalam 120 cara (5 × 4 × 3 × 2 × 1). Oleh itu terdapat 2,598,960 kombinasi unik.
Saya mulakan dengan mencipta dek kad. Untuk ini saya mempunyai pangkat (nombor kad) 1 hingga 13. 1 ialah ace, 2 hingga 10 ialah nombor, 11 ialah Jack, 12 ialah Ratu dan Raja ialah 13. Saya juga mempunyai saman s, c, d dan h (masing-masing alat ganti, kelab, berlian dan jantung). Dengan menggunakan gelung berganda, saya menjana kesemua 52 kad (satu tuple pangkat dan sut) dan menyimpannya dalam senarai yang dipanggil dek.
Saya kemudian mengulangi setiap gabungan lima kad dek yang unik dan menentukan tangan yang saya pegang. Akhirnya saya mencetak hasilnya.
def middle_index(ints: list) -> int: for i in range(len(ints)): if sum(ints[:i]) == sum(ints[i + 1:]): # It is, so return this position return i return -1
Itu bahagian yang mudah :)
Untuk fungsi get_hands, saya mulakan dengan membuat dict senarai yang disusun mengikut pangkat (nombor pada kad) dan sut (simbol pada kad). Saya juga mengira kekerapan pangkat, kerana ini sering digunakan untuk menentukan tangan.
$ ./ch-1.py 2 3 -1 8 4 3 $ ./ch-1.py 1 -1 4 2 $ ./ch-1.py 2 5 -1
Jadi untuk kad 10s, 10j, 9d, 8j, 2d, perkara berikut akan ditetapkan:
- kad_mengikut_pangkat {10: ['s', 'h'], 9: ['d'], 8: ['h'], 2: ['d']}
- cards_by_suit {'s': [10], 'h': [10, 8], 'd': [9, 2]}
- kira_demi_pangkat {1: 3, 2: 1} (terdapat tiga pangkat yang muncul sekali, dan satu yang mempunyai dua kad)
Masanya untuk menentukan tangan yang saya pegang. Kita akan mulakan dengan siram lurus dan siram. Ini adalah satu-satunya tangan yang mempertimbangkan sut kad, dan semua kad fives adalah sut yang sama. Ini ditentukan apabila dict card_by_suit hanya mempunyai satu nilai.
Untuk menentukan sama ada ia adalah siram lurus, saya memesan kad secara berangka (dari 1 hingga 13). Jika kad pertama ialah 1 (sebuah ace) dan kad terakhir ialah 13 (raja), saya mengeluarkan kad pertama dan menambah 14 pada penghujung senarai. Ini membolehkan 10, Jack, Queen, King dan Ace dianggap sebagai straight flush. Siram lurus berlaku apabila perbezaan antara nombor kad pertama dan kad terakhir ialah empat.
from collections import Counter, defaultdict from itertools import combinations def main(): deck = [(rank, suit) for rank in range(1, 14) for suit in ('s', 'c', 'd', 'h')] hands = defaultdict(int) for cards in combinations(deck, 5): hand = get_hand(cards) hands[hand] += 1 display_results(hands)
Untuk tangan empat jenis (empat daripada satu pangkat, dan kad terakhir rawak) dan rumah penuh (tiga daripada satu pangkat, dua daripada pangkat yang berbeza), saya boleh menggunakan dict count_by_rank untuk melihat sama ada tangan itu sepadan kriteria yang ditetapkan.
def get_hand(cards): cards_by_rank = defaultdict(list) cards_by_suit = defaultdict(list) for card in cards: number, suit = card cards_by_rank[number].append(card[1]) cards_by_suit[suit].append(card[0]) count_by_rank = Counter(len(cards_by_rank[r]) for r in cards_by_rank)
Untuk menentukan sama ada tangan lurus, saya menggunakan logik yang sama dengan straight flush. Saya mula-mula menyemak sama ada saya mempunyai lima kedudukan unik (nombor kad), memesannya, gerakkan ace jika perlu dan semak sama ada perbezaan antara tinggi dan rendah ialah 4.
if len(cards_by_suit) == 1: cards = sorted(cards_by_rank) if cards[0] == 1 and cards[4] == 13: cards.pop(0) cards.append(14) if cards[4] - cards[0] == 4: return 'Straight flush' return 'Flush'
Tiga jenis (tiga kad satu pangkat, dua kad pangkat berbeza), dua pasang (dua kad satu pangkat, dua kad pangkat berbeza, kad terakhir rawak), satu pasangan (dua kad satu pangkat, tiga kad pangkat berbeza setiap satu) semuanya boleh dikira menggunakan dict count_by_rank.
if count_by_rank[4]: return 'Four of a kind' if count_by_rank[3] and count_by_rank[2]: return 'Full house'
Dan akhirnya jika tiada yang sepadan, kembalikan 'Kad tinggi'. Anda pasti tidak mahu bertaruh rumah anda jika anda memegang tangan ini :)
if len(cards_by_rank) == 5: # Get the card ranks in the possible flush cards = sorted(cards_by_rank) if cards[0] == 1 and cards[4] == 13: cards.pop(0) cards.append(14) if cards[4] - cards[0] == 4: return 'Straight'
Fungsi display_results hanya memaparkan keputusan (disusun mengikut pangkat) dalam susun atur beruniform. Seperti yang dinyatakan pada permulaan untuk setiap kombinasi terdapat 120 pilih atur kad boleh dipesan.
if count_by_rank[3]: return 'Three of a kind' if count_by_rank[2] == 2: return 'Two pair' if count_by_rank[2]: return 'One pair'
Keluaran
return 'High card'
Ini mengambil masa kira-kira 15 saat untuk dijalankan pada PC rumah saya.
Seperti yang dapat kita lihat dari baris bawah, kita mempunyai 2,598,960 kombinasi dan 311,875,200 pilih atur. Ini sepadan dengan apa yang kami jangkakan untuk lihat dalam output.
Atas ialah kandungan terperinci Indeks dan permainan poker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas











Python lebih mudah dipelajari dan digunakan, manakala C lebih kuat tetapi kompleks. 1. Sintaks Python adalah ringkas dan sesuai untuk pemula. Penaipan dinamik dan pengurusan memori automatik menjadikannya mudah digunakan, tetapi boleh menyebabkan kesilapan runtime. 2.C menyediakan kawalan peringkat rendah dan ciri-ciri canggih, sesuai untuk aplikasi berprestasi tinggi, tetapi mempunyai ambang pembelajaran yang tinggi dan memerlukan memori manual dan pengurusan keselamatan jenis.

Untuk memaksimumkan kecekapan pembelajaran Python dalam masa yang terhad, anda boleh menggunakan modul, masa, dan modul Python. 1. Modul DateTime digunakan untuk merakam dan merancang masa pembelajaran. 2. Modul Masa membantu menetapkan kajian dan masa rehat. 3. Modul Jadual secara automatik mengatur tugas pembelajaran mingguan.

Python lebih baik daripada C dalam kecekapan pembangunan, tetapi C lebih tinggi dalam prestasi pelaksanaan. 1. Sintaks ringkas Python dan perpustakaan yang kaya meningkatkan kecekapan pembangunan. 2. Ciri-ciri jenis kompilasi dan kawalan perkakasan meningkatkan prestasi pelaksanaan. Apabila membuat pilihan, anda perlu menimbang kelajuan pembangunan dan kecekapan pelaksanaan berdasarkan keperluan projek.

Adakah cukup untuk belajar Python selama dua jam sehari? Ia bergantung pada matlamat dan kaedah pembelajaran anda. 1) Membangunkan pelan pembelajaran yang jelas, 2) Pilih sumber dan kaedah pembelajaran yang sesuai, 3) mengamalkan dan mengkaji semula dan menyatukan amalan tangan dan mengkaji semula dan menyatukan, dan anda secara beransur-ansur boleh menguasai pengetahuan asas dan fungsi lanjutan Python dalam tempoh ini.

Python dan C masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1) Python sesuai untuk pembangunan pesat dan pemprosesan data kerana sintaks ringkas dan menaip dinamik. 2) C sesuai untuk prestasi tinggi dan pengaturcaraan sistem kerana menaip statik dan pengurusan memori manual.

Pythonlistsarepartofthestandardlibrary, sementara

Python cemerlang dalam automasi, skrip, dan pengurusan tugas. 1) Automasi: Sandaran fail direalisasikan melalui perpustakaan standard seperti OS dan Shutil. 2) Penulisan Skrip: Gunakan Perpustakaan Psutil untuk memantau sumber sistem. 3) Pengurusan Tugas: Gunakan perpustakaan jadual untuk menjadualkan tugas. Kemudahan penggunaan Python dan sokongan perpustakaan yang kaya menjadikannya alat pilihan di kawasan ini.

Aplikasi utama Python dalam pembangunan web termasuk penggunaan kerangka Django dan Flask, pembangunan API, analisis data dan visualisasi, pembelajaran mesin dan AI, dan pengoptimuman prestasi. 1. Rangka Kerja Django dan Flask: Django sesuai untuk perkembangan pesat aplikasi kompleks, dan Flask sesuai untuk projek kecil atau sangat disesuaikan. 2. Pembangunan API: Gunakan Flask atau DjangorestFramework untuk membina Restfulapi. 3. Analisis Data dan Visualisasi: Gunakan Python untuk memproses data dan memaparkannya melalui antara muka web. 4. Pembelajaran Mesin dan AI: Python digunakan untuk membina aplikasi web pintar. 5. Pengoptimuman Prestasi: Dioptimumkan melalui pengaturcaraan, caching dan kod tak segerak
