Selamlar herkese! İkinci günün bulmacası ‘Taş-Kağıt-Makas’ hakkında. Çok zorlu olmayan bu göreve şu hikaye ile başlıyoruz:
Birinci Bölüm:
Elfler sahilde kamp kurmaya başlar. Kimin çadırının atıştırmalık deposuna en yakın olacağına karar vermek için dev bir Taş Kağıt Makas turnuvası başlamıştır.
Taş Kağıt Makas iki oyuncu arasında oynanan bir oyundur. Her oyun birçok tur içerir; her turda oyuncuların her biri aynı anda bir el şekli kullanarak Taş, Kağıt veya Makas seçeneklerinden birini seçer. Ardından, o tur için bir kazanan seçilir: Taş Makası yener, Makas Kağıdı yener ve Kağıt Taşı yener. Eğer her iki oyuncu da aynı şekli seçerse, tur berabere biter.
Dünkü yardımınız için minnettar olan bir Elf size kazanmanıza yardımcı olacağını söylediği şifreli bir strateji rehberi (bulmaca girdiniz) veriyor. “İlk sütunda rakibinizin ne oynayacağı yazıyor: Taş için A, Kağıt için B ve Makas için C. İkinci sütun–” Birdenbire Elf, birinin çadırına yardım etmesi için çağrılıyor.
İkinci sütun, buna karşılık sizin oynamanız gereken oyun olmalı: Taş için X, Kağıt için Y ve Makas için Z. Her seferinde kazanmak şüpheli olurdu, bu yüzden yanıtlar dikkatlice seçilmiş olmalı.
Tüm turnuvanın galibi en yüksek puanı alan oyuncudur. Toplam puanınız, her tur için puanlarınızın toplamıdır. Tek bir turun puanı, seçtiğiniz şeklin puanı (Taş için 1, Kağıt için 2 ve Makas için 3) artı turun sonucunun puanıdır (kaybettiyseniz 0, tur berabere kaldıysa 3 ve kazandıysanız 6).
Elf’in size yardım etmeye mi yoksa sizi kandırmaya mı çalıştığından emin olamayacağınız için, strateji kılavuzunu takip etmeniz durumunda alacağınız puanı hesaplamalısınız.
https://adventofcode.com/2022/day/2
Örneğin, size aşağıdaki strateji kılavuzunun verildiğini varsayalım:
A Y
B X
C Z
Bu strateji rehberi aşağıdakileri öngörür ve önerir:
- İlk turda rakibiniz Taşı (A) seçecek ve siz de Kağıdı (Y) seçmelisiniz. Bu, 8 puanla sizin için bir galibiyetle sonuçlanır (2 çünkü Kağıt’ı seçtiniz + 6 çünkü kazandınız).
- İkinci turda, rakibiniz Kağıt (B) seçecek ve siz de Taş (X) seçmelisiniz. Bu sizin için 1 puanla (1 + 0) mağlubiyetle sonuçlanır.
- Üçüncü turda her iki oyuncu da Makas’ı seçerek berabere kalır ve 3 + 3 = 6 puan alırsınız.
- Bu örnekte, strateji kılavuzunu takip etseydiniz, toplam 15 puan (8 + 1 + 6) alırdınız.
Her şey tam olarak strateji kılavuzunuza göre giderse toplam puanınız ne olur?
Hemen karşımıza bir taş kağıt makas haritası alalım ve ilgili harfleri üstüne yazalım. Böylelikle kodlama yaparken kafamız karışmasın.

Bu şekilde taşın karşı taraftaki oyuncunun ‘A‘ olarak bizim ise ‘X‘ olarak kodlandığı gibi bilgiler de gösterilmiştir. Sonuç olarak ilk problemde bizden her bir oyun için alınan puanları toplayıp skorumuzu girmemiz isteniyor. Öncelikle kendi inputumu kopyalayıp kodu yazdığım klasör içerisine ‘strategy.txt’ olarak kaydettim. Bu problemi çözmek için aşağıdaki bol bol if-else statement içeren kodu yazdım.
score = 0 # Set score to 0 (this is the variable we will use to store the score)
with open('strategy.txt', 'r', encoding="utf-8") as f: # Open the file
lines = f.readlines() # Read the lines
for line in lines: # For each line
if line[2] == 'X': # If we play rock
score += 1
elif line[2] == 'Y': # If we play paper
score += 2
elif line[2] == 'Z': # If we play scissors
score += 3
if (line[0] == 'A' and line[2] == 'X') or (line[0] == 'B' and line[2] == 'Y') or (line[0] == 'C' and line[2] == 'Z'): # If draw
score += 3
else:
if line[0] == 'A' and line[2] == 'Y': # If we play paper and they play rock
score += 6
elif line[0] == 'A' and line[2] == 'Z': # If we play scissors and they play rock
pass
elif line[0] == 'B' and line[2] == 'X': # If we play rock and they play paper
pass
elif line[0] == 'B' and line[2] == 'Z': # If we play scissors and they play paper
score += 6
elif line[0] == 'C' and line[2] == 'X': # If we play rock and they play scissors
score += 6
elif line[0] == 'C' and line[2] == 'Y': # If we play paper and they play scissors
pass
print(score) # Print the score
Burada kısaca yaptığım şey text dosyasının her bir sayırından tek tek geçip karşı tarafın ve bizim oynadığımız duruma göre skorumuzu arttırmak. Kod öncelikle basit bir if else komutu ile bizim hangi durumu oynadığımıza bakıyor ve bu duruma göre bize 1,2 veya 3 puan veriyor. Daha sonra başka bir if statement içine giriyor ve orada bizim oynadığımız durumu karşı tarafla karşılaştırım beraberlik, yenilgi ve kazanma durumuna göre 3,0 veya 6 puan daha ekliyor.
İkinci Bölüm:
Sonucu doğru girdikten sonra yeni açılan bölümde ise bizi şöyle bir hikaye karşılıyor:
Elf çadıra yardım etmeyi bitiriyor ve gizlice size doğru geliyor. “Her neyse, ikinci sütun turun nasıl bitmesi gerektiğini söylüyor: X kaybetmeniz gerektiği, Y raundu berabere bitirmeniz gerektiği ve Z kazanmanız gerektiği anlamına gelir. İyi şanslar!”
A Y
B X
C Z
Toplam puan hala aynı şekilde hesaplanır, ancak şimdi turun belirtildiği gibi bitmesi için hangi şekli seçeceğinizi bulmanız gerekir. Yukarıdaki örnek şimdi şöyle devam ediyor:
- İlk turda rakibiniz Taşı (A) seçecek ve turun berabere bitmesi (Y) gerekiyor, bu yüzden siz de Taşı seçeceksiniz. Bu size 1 + 3 = 4 puan verir.
- İkinci turda rakibiniz Kağıt’ı (B) seçecek ve siz de Taş’ı seçeceksiniz, böylece 1 + 0 = 1 puanla (X) kaybedeceksiniz.
- Üçüncü turda, rakibinizin Makas’ını Taş ile yenerek 1 + 6 = 7 puan alacaksınız.
- Artık çok gizli strateji rehberinin şifresini doğru bir şekilde çözdüğünüze göre, toplam 12 puan alacaksınız.
İkinci sütun için Elf’in talimatlarını izleyerek, her şey tam olarak strateji rehberinize göre giderse toplam puanınız ne olur? Hemen yeni durumun haritasını çizelim:

Bu bulmacada izlediğim yol ise şu şekilde:
score = 0 # Set score to 0 (this is the variable we will use to store the score)
with open('strategy.txt', 'r', encoding="utf-8") as f: # Open the file
lines = f.readlines() # Read the lines
for line in lines: # For each line
if line[2] == 'X': # If we loose
score += 0
if line[0] == 'A': # If opponent plays rock, so we play scissors
score += 3
elif line[0] == 'B': # If opponent plays paper, so we play rock
score += 1
elif line[0] == 'C': # If opponent plays scissors, so we play paper
score += 2
elif line[2] == 'Y': # If we draw
score += 3
if line[0] == 'A': # If opponent plays rock, so we play rock
score += 1
elif line[0] == 'B': # If opponent plays paper, so we play paper
score += 2
elif line[0] == 'C': # If opponent plays scissors, so we play scissors
score += 3
elif line[2] == 'Z': # If we win
score += 6
if line[0] == 'A': # If opponent plays rock, so we play paper
score += 2
elif line[0] == 'B': # If opponent plays paper, so we play scissors
score += 3
elif line[0] == 'C': # If opponent plays scissors, so we play rock
score += 1
print(score) # Print the score
Burda ise izlediğim yol şu şekilde. Önce bizim yenme, yenilme veya beraberlik durumunu ikinci sütündaki X,Y ve Z durumuna göre seçiyorum ve uygun puanı ekliyorum. Bu durumu seçtikten sonra başka bir if yapısına girip burada karşı tarafın ne oynadığını görüp, bizim kendimizin oynama durumuna göre puanımızı ekliyorum. Son olarakta toplam skorumuz yazdırılıyor.
AoC’un ikinci günü de bu kadardı. Vakit ayırıp okuduğunuz için teşekkür ederim. Eğer yazıyı beğendiyseniz, kodlamaya meraklı arkadaşlarınızla paylaşmayı unutmayın
Herhangi bir sorunuz olursa veya benimle iletişim kurmak isterseniz tüm sosyal medya hesaplarıma bu linke tıklayarak ulaşabilirsiniz. Ayrıca tüm çözümlerimi görebilmeniz için bir github reposu açtım. Bu repoya da bu linkten ulaşabilirsiniz.