Python Proje Yardım

Merhaba arkadaşlar projemin ufak bir kısmında şu şekilde bir yardıma ihtiyacım var.

Elimizde uzun bir string olsun(‘Ali ata bak’) gibi mesela

Dışarıdan harf girişleri yapıcam yaptığım her harf girişinde bu string içerisinde var ise eğer bunu boş bir liste içerisine sıralı şekilde yerleştirecek…Örnek olarak önce b sonra t girdim ama liste içerisine anlamlı şekilde gelmesi için t,b şekilnde sıralanacak.Harf girişleri sonunda yukarıda belirttiğim uzun string oluşturulacak…

Yardımlşarınız için teşekkür ederim şimdiden

  1. Her harf girisinde bos bir listeye sirali sekilde yerlestirecek?
  • A girdim
  • Bos liste: []
  • Sirali sekilde: [‘A’]
  • B girdim
  • Bos liste: []
  • Sirali sekilde: [‘B’]

Olmadi sanki.

  1. Neye gore sirali?
  2. Ne sekilde anlamli?
  3. Harfleri neye gore gireceksin?
  4. Sonunda uzun string olusturulacaksa listeyle niye ugrastik?

Ali ata bak örneğini vermiştim

önce diyelim l girdim
daha sonra t girdim
daha sonra a girdim
daha sonra da k girdim

sistem bunu yukarıdaki stringe bakıp düzenli şekilde sıralıcak

yeni listem = [ a,l,a,t,a,k ] gibi olacak

Bu tur gevsek sifatlardan kacinip daha aciklayici/net olursan, problemi cozmen kolaylasacaktir. Sadece soruyu sorarken degil, dusunurken de.

Tek a girdigin halde yeni listede 3 tane a var. Yeni liste, harflerin sirali hali degil.

dediğiniz hiç bir şekilde anlaşılmıyor alfabetik sıraya v.s dizilse olabilir de dediğiniz şekilde nasıl dizilebilir bilemiyorum

metin="ali ata bak"
yeni=[]
for i in range (0,len(metin)):
    yeni.append('_')
don=True
while don:
    harf=input("bir harf girin:")
    for i in range (0,len(metin)):
        if harf==metin[i]:
            yeni[i]=harf

    if metin==''.join(yeni):
        don=False
    print(yeni)

don = True yerine while True kullanın ve döngüyü bitirmek istediğinizde ise break kullanmanız hafıza için daha iyi olacaktır.

def iterate(f, x0):
    yield x0
    yield from iterate(f, f(x0))

def takewhilePlusOne(pred, xs):
    for x in xs:
        yield x
        if not pred(x): break

def seq(*fs):
    return list(fs)[-1]

ask = lambda prompt, target: list(takewhilePlusOne(lambda g: (seq(print(list(map(lambda c: c if c in g else '_', target))), not all(map(lambda c: c in g, target)))), iterate(lambda ii: ii + [input(prompt)], [])))

ask("bir harf girin: ", "ali ata bak")
1 Beğeni

sekans yerine arrow (&&&) kullanirsak “target c in guess” kontrolunun tekrarini onluyoruz:

def iterate(f, x0):
    yield x0
    yield from iterate(f, f(x0))

def takewhilePlusOne(pred, xs):
    for x in xs:
        yield x
        if not pred(x): break

def arrowAnd(f, g):
    return lambda x: (f(x), g(x))

ask = lambda prompt, target: list(takewhilePlusOne(lambda g: arrowAnd((lambda hs_ts: print(list(map(lambda hs_ts: hs_ts[1] if hs_ts[0] else '_', zip(*hs_ts))))), (lambda hs_ts: not all(hs_ts[0])))((list(map(lambda c: c in g, target)), target))[1], iterate(lambda ii: ii + [input(prompt)], [])))

print(list(ask("bir harf girin: ", "ali ata bak")))
2 Beğeni

Sevgili @aib, karmaşık ve ilginç yöntemler üretiyorsunuz. :+1: Sizin izlediğiniz yönteme göre oldukça basit kaçıyor ama ben mesela benzer bir sonuç üretmek için aşağıdaki yöntemi tercih ederdim.

def ask(prompt, string):
   items = ["_"] * len(string)
   while "".join(items) != string:
       print(items)      
       letter = input(prompt)
       if len(letter) == 1:
           for i, j in enumerate(string):
               if letter == j:
                   items[i] = j
   print(items)                      
   
   
ask("bir harf girin: ", "ali ata bak")
1 Beğeni

Fonksiyonel programlama (ve ucundan lambda calculus) pratigi yapiyorum. Odev sorularina ve “benim icin x yaz” isteklerine bu sekilde cevap verme prensibim var :slight_smile: (ama bi yandan yardim etmeye calisiyorum da)

Basit her zaman (cogunlukla) en iyisidir.


Bu da benim basit denemem:

def ask(prompt, target):
    def print_status(target, guesses):
        print(list(map(lambda l: l if l in guesses else "_", target)))

    guesses = []

    while True:
        print_status(target, guesses)
        done = all(map(lambda l: l in guesses, target))
        if done: break
        guesses += input(prompt)

ask("bir harf girin: ", "ali ata bak")
2 Beğeni

Evet, Lambda fonksiyonunu sık kullandığınız dikkatimi çekmişti. :slight_smile:

1 Beğeni