Arkadaşlar mesela hack dedim bana kcah ackh diye bunu karıştıran bir kütüphane lazım random un böyle bir özelliği varmı acaba
Şöyle yapabilirsiniz:
import random
yeni_kelime = ""
def f(kelime):
global yeni_kelime
if len(kelime) == 0:
pass
else:
sec = random.choice(kelime)
yeni_kelime += sec
kelime = kelime.replace(sec, "", 1)
return f(kelime)
f("merhaba")
print(yeni_kelime)
# emhabar
embahar yazdı sonra arasında merhabanın tüm içeriğini yapan gerekiyo bana yoksa tersten yazmakda bişey yok teşekkürler yinede
Aşağıdaki kodları bir inceleyin isterseniz. İlk kelime ile sonradan random ile üretilen kelimeler eşleşene kadar döngü devam eder. Döngü erken de bitebilir geç de bitebilir.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import random
def f(kelime):
global yeni_kelime
if len(kelime) == 0:
pass
else:
sec = random.choice(kelime)
yeni_kelime += sec
kelime = kelime.replace(sec, "", 1)
return f(kelime)
while True:
yeni_kelime = ""
kelime = "adana"
f(kelime)
if yeni_kelime != kelime:
print(yeni_kelime)
else:
print("eşleşti")
break
Aşağıdaki yöntemle de bir kelimeden türetilebilecek bütün kelimeleri listeleyebilirsiniz. Bu işlem için tekrarlı permütasyonu kullanıyoruz.
Örneğin:
Kelime “adana” ise;
"adana" kelimesindeki toplam harf sayısı = 5
tekrar eden kelime = “a”, sayısı = 3
O halde;
Toplam 5! / 3! adet kelime üretebiliriz.
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import random
def kelimeyi_karistir(kelime):
global yeni_kelime
if len(kelime) == 0:
pass
else:
sec = random.choice(kelime)
yeni_kelime += sec
kelime = kelime.replace(sec, "", 1)
return kelimeyi_karistir(kelime)
def kelime_uzunlugu_faktoriyel(kelime):
sonuc = 1
uzunluk = len(kelime)
while uzunluk > 1:
sonuc *= uzunluk
uzunluk -= 1
return sonuc
def faktoriyel(n):
sonuc = 1
for i in range(1, n + 1):
sonuc *= i
return sonuc
def tekrar_eden_harfleri_bul(kelime):
a = []
for i in kelime:
if kelime.count(i) > 1:
a.append(kelime.count(i))
kelime = kelime.replace(i , "")
sonuc = 1
for i in a:
sonuc *= faktoriyel(i)
return sonuc
a = set()
while True:
yeni_kelime = ""
kelime = "abi"
kelimeyi_karistir(kelime)
if len(a) != kelime_uzunlugu_faktoriyel(kelime) / \
tekrar_eden_harfleri_bul(kelime):
a.add(yeni_kelime)
else:
break
print(a)
# Sonuç: {'aib', 'iba', 'iab', 'bia', 'abi', 'bai'}
Bunun, soruyu soranın istediği cevap olduğunu sanmıyorum. İlk kelime üretilmeden önce diğer tüm olası kelimelerin üretileceğinin garantisi yok. Ya da bir şey mi kaçırıyorum acaba?
@Lazi_Bere08; başlığı, soruyu daha iyi açıklayacak bir şekilde değiştirebilir misiniz? Böylece benzer sorulara sahip arkadaşlar konuyu daha kolay bulabilirler.
Haklısın İsmail Kardeş, ben de sonradan benzer bir şekilde düşündüm. Ve yeni bir mesajla başka bir yöntem daha paylaşmaya karar verdim.
Aşağıdaki kod işinizi görür mü:
def karistir(kelime,yeni_kelime=""):
import random
yeni_sıra=random.sample(range(len(kelime)),len(kelime))
for i in yeni_sıra:
yeni_kelime+=kelime[i]
return yeni_kelime
def bul(kelime):
sayı=1
liste=[]
for i in range(1,len(kelime)+1):
sayı*=i
while len(liste)!=sayı:
kelime=karistir(kelime)
if(not(kelime in liste)):
liste.append(kelime)
return liste
from itertools import permutations
kelime = "asd"
yeni = list(permutations(kelime,len(kelime)))#len(kelime) yerine farklı uzunluk girilebilir
for i in yeni: print "".join(i)
#Çıktı
#asd
#ads
#sad
#sda
#das
#dsa
Kendi algoritmanızı geliştirmek istemiyorsanız bu işinizi görecektir.
@hasser
Kelimenin içinde, tekrar eden harf olmazsa, program sorunsuz bir şekilde çalışıyor, ama kelimenin içinde bir harften en az iki tane olursa program donuyor.
Tekrarlı permütasyondan kaynaklanıyor olsa gerek. Onu da bilmiyorum. @smhgk çözdüğüne göre düzeltmeye de gerek yok.
Ancak @smhgk nin kodunda da buna benzer bir sıkıntı var. Aynı harftan birden fazla olduğunda aynı sonuçları veriyor. Bu sorunu çözmek için for döngüsünden hemen önce şu eklenmeli:
yeni=list(set(yeni))
@smhgk’nin yazdığı kodlarda, benzer sonuçlar bir kaç kez listede yer alıyor. Donma sorunu yok yazdığı kodlarda. Veriler listeye değil de kümeye ait olursa, aynı kelimelerin tekrar etmesi önlenebilir.
#!/usr/bin/python
# -*- coding: utf-8 -*-
from itertools import permutations
kelime = "ankara"
yeni = set(permutations(kelime,len(kelime)))#len(kelime) yerine farklı uzunluk girilebilir
for i in yeni: print("".join(i))
Random modülünün shuffle fonksiyonuna bir bakın:
>>> a = list("menemen")
>>> a
['m', 'e', 'n', 'e', 'm', 'e', 'n']
>>> random.shuffle(a)
>>> a
['e', 'n', 'n', 'e', 'e', 'm', 'm']