Merhabalar. Elimizde birden fazla kelime olduğunu düşünelim. Bunların uzunlukları farklı olabilir. Örnek kelimeler;
yazbel
kitap
belge
Bu kelimelerden, kelime sayısı uzunluğunda yeni kombinasyonlar üretilmesi isteniyor. Birinci kelimeden başlama koşulu var. Şöyle örnek verelim. Elimizde 3 kelime varsa, oluşacak kelimelerin uzunluğu 3 olmalıdır. Oluşturma kuralı şöyle. Yukarıdan aşağıya inerek her kelimeden bir harf alıyoruz. Örneğin;
y a z b e l
k i t a p
b e l g e
ykb
yke
ykl
ykg
yke
Bunlar birinci iterasyondan oluşan kelimelerdir. İkinci iterasyon da şöyle;
yib
yie
yil
yig
yie
Kısaca yukarıdan aşağı, tüm kelimelerin tüm harflerini kullanarak kelime sayısı uzunluğunda yeni kelimeler üretilmek isteniyor. Bu soruyu çözmek için siz nasıl bir yol izlerdiniz? Şimdiden teşekkürler.
kabul edilebilir mi bilmiyorum ama product fonksiyonu işi bayağı kolaylaştırıyor
Örneğin
import time
from itertools import product
list = ["yazbel","kitap", "belge"]
print(list)
def olustur(kelime_listesi):
for j in product(*kelime_listesi):
kelime = ''.join(j)
print("\t", kelime)
olustur(list)
Yani kabul edilebilir neden olmasın? Ama product fonksiyonunun uyguladığı kartezyen çarpımı algoritması nasıl yapılabilir, başka yöntemlerle çözülebilir mi gibisinden sormuştum. Yine de teşekkür ederim
Evet mesela ben de ağaç veri yapısıyla çözülebilir diye düşündüm. Kök düğümden itibaren tüm ağacı gezdiğimizde kelimeler üretilmiş oluyor. Hafızada yer kaplamış oluyor ama yine de bir çözüm yöntemi diye düşünüyorum. Ya da yönlü graf yapılabilir, yukarıdan aşağıya yönlendirilmiş bir şekilde kök düğümden ilerlediğimizde son düğüme gelindiğinde gidilecek yer yoksa izlenilen yol yeni oluşturulan bir kelime olarak ele alınır. Ağaçtan farkı, aynı düğümü birçok kez oluşturmamış oluruz, sadece yönlendirme yapmış oluruz.
def product(iterable, lenght, i=0):
l = len(iterable)
for i in range(i, l ** lenght):
s = []
for j in range(lenght):
i, index = divmod(i,l)
s.append(iterable[index])
yield s
Merhaba @coderistan ,
Ne kadar verimli olur bilmemekle birlikte benim de aklıma şöyle bir çözüm geldi. Ben de ikilik, onluk sistemlerdeki mantığın bir benzerini bu soruda uyguladım
n = int(input()) # kelime sayisi
keys = []
keySizes = []
totalWordNum = 1
for i in range(n):
key = list(set( input() ))
keys.append(key)
keyLength = len(key)
keySizes.append(keyLength)
totalWordNum *= keyLength
num = [0] * n
for i in range(totalWordNum):
newStr = ""
for j in range(n - 1):
num[j + 1] += num[j] // keySizes[j]
num[j] %= keySizes[j]
newStr += keys[j][num[j]]
newStr += keys[n - 1][num[n - 1]]
print(newStr)
num[0] += 1
Katkılarınız için sağolun arkadaşlar Verilen cevaplarda(ve forum genelinde) dikkatimi çeken bir şey, değişken isimleri kısa ve amacına hitap eden bir isim ile isimlendirilmemiş, ben de dahil çok kişi dikkat etmiyor. Evet kod çalışıyor ama kodu okuyan kişi o değişkenin ne iş yaptığını anlamak için o değişkenin ismini hafızasına atıp aşağıya doğru iniyor ki ne işe yaradığını anlayabilsin. Bir yerden sonra takip edemez oluyor.
Okunabilir kod için mümkünse değişken isimlerini amacına uygun bir şekilde seçmeye dikkat etmemiz gerektiğini düşünüyorum Tekrar teşekkürler…