Oluşturulabilecek tüm dizinler

merhaba ben yeniyimde bilgim biraz zayıf ama bir koda ihtiyacım var
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz

karakterleriyle örnegin 10 karekterli tüm oluşturulabilecek kelimeleri nasıl oluşturup dosyaya yazdırırız…
çıktı
1111111111
1111111112
1111111113
1111111114

şeklinde olacak. teşekkürler

Oncelikle en az 4.7388463 exabyte’lik bir hard disk alman lazim.

Istersen simdiye kadar ne denedigini soyle, ona gore yardim edelim.

1 Beğeni

Şimdi elinizde 58 tane karakter var.

string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ" \
    "abcdefghijkmnopqrstuvwxyz"

İstediğiniz çıktıya göre bir karakter tekrar tekrar kullanılabilir.
10 haneli bir karakter elde etmek istiyorsunuz.
Her bir hane için 58 karakterden birini seçebilirsiniz.
Yani toplamda 58 ** 10 = 430804206899405824 adet 10 haneli karakterler elde edebilirsiniz. Bu sayı (430 katrilyon) büyük bir sayıdır.

Burada bahsettiğiniz ile ilgili biraz daha bilgi verebilir misiniz?

bu 3 karakterde olabilir 2 karakterde 10 karakterde burda boyuttan ziyade nasıl bir kod ile satır satır yazdırılabilir

123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
yukardaki karakterlerle örneğin 3 karakterlik üretilebilecek tüm keyleri bir dosyaya satır satır yazdırmak amaç bunu random yapıyoruz ama bana sorulan oluşabilecek tüm keyler
111
112
113
114
aaa
aab
aac
şeklinde oluşabilecek tüm çıktının bir txt dosyasına yazdırılması amaç

teşekkür şimdiden yardımlarınız için

Yapmak istediğiniz işlem uzun sürer ama madem kod görmek istiyorsunuz aşağıdaki kodları bir inceleyin:

1. yöntem: random modülü ile

import random


def f(string, n): 
    with open(f"{n}.txt", "w", encoding="utf-8") as f:
        ihtimaller = []
        say = 0
        while say != len(string) ** n:
            ihtimal = ""
            for i in range(n):
                ihtimal += random.choice(string)
            if ihtimal not in ihtimaller:
                ihtimaller.append(ihtimal)
                f.write(f"{ihtimal}\n")
                f.flush()
                say += 1
            
        
string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
f(string, 3)

2. yöntem: İç içe for döngüsü ile:

def f(string, n):
    with open(f"{n}.txt", "w", encoding="utf-8") as f:
        for i in string:
            for j in string:
                for k in string:
                    f.write(f"{i}{j}{k}\n")
                    f.flush()


string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
f(string, 3)

Hane sayısını 3’ten 4’e çıkarırsanız, işlem daha da uzayacaktır.

Eğer kullanılan bir karakter bir daha kullanılmayacaksa, permütasyon kullanırsınız.

from itertools import permutations

string = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
with open("3.txt", "w", encoding="utf-8") as f:
    for i in permutations(string, 3):
        f.write(f"{''.join(i)}\n")
        f.flush()
1 Beğeni

çok teşekkürler usta tam bir çözüm oldu elinize sağlık

Istenen formattaki dosyanin (yaklasik) boyutu. Tami 4,738,846,275,893,464,064 byte. Yuvarlayarak dosya sistemine, partition table’a filan 24 GB overhead vermisim :slight_smile:

1 Beğeni

Böyle hesaplamaları seviyorum.
İsterseniz sıfırdan hesaplamaya başlayalım.
Arkadaş elindeki 58 adet elemanı olan bir string verisi ile 10 haneli aşağıdaki gibi karakter dizileri oluşturmak istiyordu.

1111111111
1111111112

Her bir 10 haneli karakter 10 bayt yapar (Ascii karakterleri için). Bir de sonuna "\n" kaçış dizisini ekledik mi 1 bayt da buradan, yani her bir satır için 11 bayt yer gerekir.

Her bir hane için 58 karakterin hepsi yazılabilir mi? Evet.

O halde 58 ** 10 = 430804206899405824. Yani 430804206899405824 adet satır demek bu.
Her bir satır 11 bayt yer tutacaktı, o halde 11 * 430804206899405824 = 4738846275893464064 baytlık yere ihtiyacımız var. Bu da sizin dediğiniz gibi 4.7388462758934641883 exabyte yapar. :innocent:

Yani dediğiniz gibi arkadaş bu işlemi yapabilmek için yeni bir hard disk almak zorunda. :slight_smile:

Tahmin ettim :slight_smile: O yuzden “58^10*11 byte” demedim, saglamasi yapilabilsin diye tam sayiyi verdim :wink:

1 Beğeni

Bu mesajda bir yanlışlık yapmışım. Permütasyon yerine kombinasyon yazmışım. Mesaj düzeltildi.