Python ile 1 Milyonluk Sorunun Çözümü
Bu örneğimizde, “Kim Milyoner Olmak İster” yarışmasında 1 milyonluk değeri olan sorunun çözümünü Python ile kodlayarak bulacağız.
Öncelikle sorumuzu tanıyalım: “Türkiye’deki 81 ilin adında bu dört harften hangisi diğer üçünden daha az bulunur?“
A. Ş
B. V
C. G
D. H
İlk iş olarak, problemimizi çözerken nasıl bir yaklaşım uygulayacağız adım adım yazıp temsili bir akış şemasını çizelim:
- Türkiye’deki illerin isimlerini içeren bir liste oluştur.
- Kontrol etmek istediğin harfleri ve şıklarını iki ayrı liste olarak tanımla.
- Her harfin illerin isimlerinde kaç kez geçtiğini hesapla. Bunu yapmak için, her harf için, iller listesini döngüye al, o harfin ilin isminde bulunup bulunmadığını kontrol et, eğer harf ilin isminde bulunuyorsa o harfin sayısını bir artır. Böylece, her harfin kaç kez geçtiğini bir sözlükte sakla.
- En az geçen harfi bulmak için min() fonksiyonunu kullan. min() fonksiyonunun key parametresini, sözlükteki değerlere göre sıralama yapmasını sağla.
- Bulduğun harfin hangi şık olduğunu bulmak için harfler listesindeki indeksini kullanarak secenekler listesinden şıkkını bul.
- Sonuç olarak bulduğun şıkkı ekrana yazdır.
# iller listesi
iller = [
"Adana", "Adıyaman", "Afyonkarahisar", "Ağrı", "Amasya", "Ankara", "Antalya", "Artvin", "Aydın",
"Balıkesir", "Bilecik", "Bingöl", "Bitlis", "Bolu", "Burdur", "Bursa", "Çanakkale", "Çankırı",
"Çorum", "Denizli", "Diyarbakır", "Edirne", "Elazığ", "Erzincan", "Erzurum", "Eskişehir", "Gaziantep",
"Giresun", "Gümüşhane", "Hakkâri", "Hatay", "Isparta", "İçel", "İstanbul", "İzmir", "Kars",
"Kastamonu", "Kayseri", "Kırklareli", "Kırşehir", "Kocaeli", "Konya", "Kütahya", "Malatya",
"Manisa", "Kahramanmaraş", "Mardin", "Muğla", "Muş", "Nevşehir", "Niğde", "Ordu", "Rize",
"Sakarya", "Samsun", "Siirt", "Sinop", "Sivas", "Tekirdağ", "Tokat", "Trabzon", "Tunceli",
"Şanlıurfa", "Uşak", "Van", "Yozgat", "Zonguldak", "Aksaray", "Bayburt", "Karaman", "Kırıkkale",
"Batman", "Şırnak", "Bartın", "Ardahan", "Iğdır", "Yalova", "Karabük", "Kilis", "Osmaniye", "Düzce"
]
# harfler listesi ve seçenekler
harfler = ['Ş', 'V', 'G', 'H']
secenekler = ['A', 'B', 'C', 'D']
# Her harfin kaç kez geçtiğini hesapla
harf_sayilari = {harf: sum(1 for il in iller if harf in il.upper()) for harf in harfler}
# En az geçen harfi bul
en_az_gecen_harf = min(harf_sayilari, key=harf_sayilari.get)
# Şık olarak yazdır
secenek = secenekler[harfler.index(en_az_gecen_harf)]
print(f"Cevap {secenek} Şıkkı, yani {en_az_gecen_harf} harfi olacak")
Sıra geldi sorumuzu adım adım incelemeye. Bunun için çözümü maddeler halinde yazacağım. Bakınız:
- İlk olarak, Türkiye’deki 81 ilin isimlerini içeren bir liste oluşturduk.
- Sonra, kontrol etmek istediğimiz harfleri ve onların seçeneklerini iki ayrı liste olarak tanımladık.
- Ardından, her harfin illerin isimlerinde kaç kez geçtiğini hesapladık. Bunu yapmak için, her harf için, iller listesini döngüye alıp, o harfin ilin isminde bulunup bulunmadığını kontrol ettik. Eğer harf, ilin isminde bulunuyorsa, o harfin sayısını bir artırdık. Böylece, her harfin kaç kez geçtiğini bir sözlükte sakladık.
- Daha sonra, en az geçen harfi bulmak için min() fonksiyonunu kullandık. min() fonksiyonu, bir iterable’daki (örneğin liste, tuple, vs.) en küçük elemanı döndürür. Ancak, bizim durumumuzda, en küçük sayıyı bulmak istediğimiz sözlükteki değerler arasında olduğu için, min() fonksiyonunun key parametresini, sözlükteki değerlere göre sıralama yapmasını sağlamak için kullandık. Böylece, en az geçen harfi bulmuş olduk.
- sum(1 for il in iller if harf in il.upper()) ifadesi, iller listesindeki her il için, eğer harf ilin isminde bulunuyorsa 1 döndürür, bulunmuyorsa 0 döndürür. sum() fonksiyonu, bu 1’lerin ve 0’ların toplamını alır. Yani, bu ifade, belirli bir harfin iller listesinde kaç kez geçtiğini belirler.
- Son olarak, bulduğumuz harfin hangi şık olduğunu bulmak için harfler listesindeki indeksini kullanarak secenekler listesinden şıkkını bulduk ve ekrana yazdırdık.
Alternatif yaklaşımlarla çözüm yapabilirsiniz. Mesala kodu çözdükten sonra aklıma iller
listesini tek bir string hale getirip işlem yapmak geldi. Bakınız:
# iller listesi
iller = [
"Adana", "Adıyaman", "Afyonkarahisar", "Ağrı", "Amasya", "Ankara", "Antalya", "Artvin", "Aydın",
"Balıkesir", "Bilecik", "Bingöl", "Bitlis", "Bolu", "Burdur", "Bursa", "Çanakkale", "Çankırı",
"Çorum", "Denizli", "Diyarbakır", "Edirne", "Elazığ", "Erzincan", "Erzurum", "Eskişehir", "Gaziantep",
"Giresun", "Gümüşhane", "Hakkâri", "Hatay", "Isparta", "İçel", "İstanbul", "İzmir", "Kars",
"Kastamonu", "Kayseri", "Kırklareli", "Kırşehir", "Kocaeli", "Konya", "Kütahya", "Malatya",
"Manisa", "Kahramanmaraş", "Mardin", "Muğla", "Muş", "Nevşehir", "Niğde", "Ordu", "Rize",
"Sakarya", "Samsun", "Siirt", "Sinop", "Sivas", "Tekirdağ", "Tokat", "Trabzon", "Tunceli",
"Şanlıurfa", "Uşak", "Van", "Yozgat", "Zonguldak", "Aksaray", "Bayburt", "Karaman", "Kırıkkale",
"Batman", "Şırnak", "Bartın", "Ardahan", "Iğdır", "Yalova", "Karabük", "Kilis", "Osmaniye", "Düzce"
]
# harfler listesi ve seçenekler
harfler = ['Ş', 'V', 'G', 'H']
secenekler = ['A', 'B', 'C', 'D']
# iller listesini bir string'e dönüştür
iller_string = ' '.join(iller)
# Her harfin kaç kez geçtiğini hesapla
harf_sayilari = {harf: iller_string.upper().count(harf) for harf in harfler}
# En az geçen harfi bul
en_az_gecen_harf = min(harf_sayilari, key=harf_sayilari.get)
# Şık olarak yazdır
secenek = secenekler[harfler.index(en_az_gecen_harf)]
print(f"Cevap {secenek} Şıkkı, yani {en_az_gecen_harf} harfi olacak.")
Bu yaklaşımda, iller
listesini bir string’e dönüştürürüz. Sonra, string.count()
metodunu kullanarak her harfin kaç kez geçtiğini belirleriz. Bu metod, bir string’in içinde belirli bir alt string’in kaç kez geçtiğini belirler. Örneğin, 'abcabcabc'.count('a')
ifadesi 3 döndürür.