Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
0 beğenilme 0 beğenilmeme
567 kez görüntülendi

Pek yabancı olmadığımız bir kombinatorik sorusu ile başlayalım:

Problem: Bir kitabın sayfaları $1$'den $n$'ye kadar numaralandırıyorken klavyenin tuşlarına basılıyor. 

(a) Tuşlara kaç kez basılmıştır?

(b) Belli bir $m$ rakamı kaç kez kullanılmıştır?

Örneğin, $n=11$ sayfalı bir kitap ve $m=1$ rakamı için 

(a) Tuşlara $13$ defa basılmıştır.

(b) $1$ rakamı $4$ defa kullanılmıştır.

yanıtlarını (çıktılarını) alırız.

 

Soru: Python 3.9'da $n$ ve $m$ girdileri için yukarıdaki problemi çözen programı yazınız.

 

Açıklama: 

n = int(input())

m = input().strip()

gibi int (integer) veya str (string) türünde girdi tanımlamaları ile başlayabilirsiniz. Bir süre sonra kendi çözümümü de ekleyeceğim. 

Veri Bilimi kategorisinde (2.6k puan) tarafından 
tarafından yeniden kategorilendirildi | 567 kez görüntülendi

Sayin @lokman-gokce, eger sizin icin de uygunsa son iki sorunuzu Teorik Bilgisayar Bilimi kategorisinden Veri Bilimi kategorisine almak isterim . (Veri bilimi degildi uygulamali bilgisayar bilimiydi eskiden ama nedense degisti sonra) Implementasyon temelli sorulari orada toplamaya calisiyorum. Gene sizin icin uygunsa kodlama teorisi tagini degistirmek isterim, kodlama teorisi denilince benim aklima iletisimde kullanilan, kanal ve kaynak kodlama geliyor aklima (bkz. coding theory ).

Uygun yerlere, uygun etiketlerle taşıyabilirsiniz. İlginiz için teşekkürler.

2 Cevaplar

1 beğenilme 0 beğenilmeme
En İyi Cevap

Soyle nacizhane bir cozumum var

def hesapla(n,m):
     sayfalar=[str(i) for i in range(1,n++1)]
     tuslara_basma_sayisi = sum(len(i) for i in sayfalar)
     m_in_gecme_sayisi = sum(i.count(str(m)) for i in sayfalar)
     return (tuslara_basma_sayisi,m_in_gecme_sayisi)

hesapla(11,1)

##SONUC  (13, 4)

Burada str.count methodunu kullandik bir karakter dizgisi (string) icinde bir karakterin kac kere gectigini saymak icin.

 

Biray daha dusundum ve bosu bosuna liste yaratmanin mantiksiz olduguna kanaat getirdim ayni mantikla bir baska varyasyon

def hesapla(n,m):
     sayfalar="".join(str(i) for i in range(1,n+1))
     return (len(sayfalar),sayfalar.count(str(m)))
 
hesapla(11,1)

##SONUC (12,4)

 

(1.6k puan) tarafından 
tarafından seçilmiş
1 beğenilme 0 beğenilmeme

Çözüm 2: startswith() ve sep() fonksiyonları ile şöyle bir çözümüm var. Google colab'da keyfi değerler girilerek çalıştırılabilir

n = int(input())
m = input().strip()
pages = []
for i in range(1, n + 1):
    pages.append(i)
# print(*pages, sep = '') kodu ile kullanılan tüm numaralardan oluşan liste görülebilir.
# Şimdi bu 'boşluksuz' listeyi str biçimine dönüştürelim.
metin=""
for kelime in pages:
    metin=metin+ str(kelime)
print("Tuşlara {} defa basılmıştır.".format(len(metin)))
def count_substring(metin, m):
    count = 0
    for j in range(len(metin)):
        if metin[j:].startswith(m):
            count += 1
    return count
print("{} rakamı {} defa kullanılmıştır.".format(m, count_substring(metin, m)))

 

(2.6k puan) tarafından 
tarafından düzenlendi

Bu yorum biraz gereksiz kili kirk yarmak olacak ama pythonda stringlerden yeni string olusturmak icin toplama islemini kullanmak pahallidir, bunun yerine "".join(...) methodunun kullanilmasi onerilir. Su tartismayi suraya birakayim

Python'da yeni olduğum için şu anda problemlere gazapla kafa göz dalıyorum. Kodların optimizasyonu şu aşamada benim dikkat ettiğim bir konu değil. Mevcut öğrendiğim kodları uygulayıp pekştireceğim problemler bulup antrenman yapıyorum. Fazlaca fonksiyon kodları olduğu için bunlardan en çok işime yarayabilecekler üzerinden ilerliyorum. Bu sebeple, kaba saba kodlar görebilirsiniz benden. Farklı bir çözüm görürsem bazen onu da inceleyip not edebiliyorum.

 

Yukarıdaki kodu yazmamdaki fikri şöyle detaylandırabilirim:

range() içine $n$ tam sayısını yazacağım için n = int(input()) olarak aldım. pages=[] ise bir liste. Problemi çözecek ana kod parçacığım def count_substring(metin, m): biçiminde tanımladığım (aslında nette benzerini bulup kendi problemim için modifiye ettim) fonksiyon olduğundan $m$'yi de string türünde tanımladım. 'metin' dediğim dize de string türünde tabii. Ama bu metin'i list türündeki pages = [] den üreteceğim, bu sebeple listeyi string'e dönüştüren bir ara kod yazdım. Böylece string türündeki nesneleri art arda yazmak için araya + koyarak devam ettim. join, daha önce kullandığım ama görevini unuttuğum bir koddu. Bu aşamada .join() fonksiyonu ile yazılan çözümü bir başka uygulama olarak notlarıma ekleyebilirim. Teşekkürler.
20,282 soru
21,821 cevap
73,503 yorum
2,530,497 kullanıcı