Kelimenin harflerini karıştıran program

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 :slight_smile:

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'}
2 Beğeni

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? :thinking:

@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.

1 Beğeni

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.

1 Beğeni

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']
1 Beğeni