Dalam permainan kartu poker, kita ingin menemukan kartu terbaik yang dapat kita dapatkan dari tangan yang diberikan dan lima kartu di atas dek. Untuk mencapai tujuan ini, saya memutuskan untuk menggunakan pendekatan brute force.
Pencarian Brute Force
Logika saya adalah menggunakan itertools
untuk mendapatkan semua kombinasi grup kartu dari tangan saya dan menambahkan kartu-kartu pertama 5-n pada dek. Untuk setiap kombinasi kartu, saya dapat menjalankan fungsi check_hand()
dan mempertahankan rangking tertinggi, kemudian mengembalikan kartu terbaik sebagai kartu terbaik.
Kode saya untuk bagian ini adalah sebagai berikut:
from itertools import combinations
hand_dict = {9:"straight-flush", 8:"four-of-a-kind", 7:"full-house", 6:"flush", 5:"straight", 4:"three-of-a-kind", 3:"two-pairs", 2:"one-pair", 1:"highest-card"}
# Pencarian brute force menggunakan itertools.combinations
def play(cards):
hand = cards[:5]
deck = cards[5:]
best_hand = 0
for i in range(6):
possible_combos = combinations(hand, 5-i)
for c in possible_combos:
current_hand = list(c) + deck[:i]
hand_value = check_hand(current_hand)
if hand_value > best_hand:
best_hand = hand_value
return hand_dict[best_hand]
Pengecekan Test Case
Saya perlu memeriksa setiap kartu dan mencetak kartu terbaik yang dapat kita dapatkan. Kode saya untuk bagian ini adalah sebagai berikut:
for i in sys.stdin.readlines():
cards = list(map(lambda x:x, i.split()))
hand = cards[:5]
deck = cards[5:]
print("Hand:", " ".join(hand), "Deck:", " ".join(deck), "Best hand:", play(cards))
Optimasi
Saya dapat mencoba untuk melakukan beberapa refactoring untuk membuat kode lebih rapih dan efisien. Saya juga dapat menggunakan pendekatan berbasis objek dengan membuat kelas untuk kartu dan tangan, serta method-method untuk mengevaluasi tangan.
Namun, saya tidak memiliki waktu untuk mempertimbangkan efisiensi atau analisis Big O dari masalah ini.
Kesimpulan
Dalam permainan kartu poker, kita ingin menemukan kartu terbaik yang dapat kita dapatkan dari tangan yang diberikan dan lima kartu di atas dek. Saya menggunakan pendekatan brute force untuk mencapai tujuan ini. Meskipun kode saya tidak sangat efisien, saya dapat mencoba untuk melakukan beberapa refactoring untuk membuat kode lebih rapih dan efisien.