Şimdi Ara

Girilen Stringin Harflerini Küçültüp-Büyültme

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
5
Cevap
0
Favori
236
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • Forumdan birisin iş mülakatında sormuşlar benim de ilgimi çekti. Aynen aktarıyorum buraya yazıyı.

    @"abc" gibi bir string var. Bu stringin sırasını bozmayacak şekilde büyük-küçük harfli bütün olasılıklarını ekrana bastıran fonksiyon yaz.



    "abc" için "Abc", "AbC", "ABc", "ABC", "abc", "aBc", "aBC", "abC"



    Yol göstermeniz benim için yeterli olur. Hazır kod istemiyorum. Teşekkürler. (Javada yazacağım)



  • Kombinasyon hesabı
    n uzunluğunda bir string için olası kombinasyonların sayısı C(n,2) + C(n,3) + C(n,4) + ... + C(n,n) + 1 olur.

    ayrica "olasılıkları" değil "kombinasyonları ekrana bastıran" demesi lazım



    < Bu mesaj bu kişi tarafından değiştirildi seyfi84 -- 5 Mayıs 2019; 21:18:14 >
    < Bu ileti mini sürüm kullanılarak atıldı >
  • Uzun zamandır algoritmik programlarla uğraşmıyordum. Konunuzu görünce uğraşasım geldi.
    Önce biraz algoritmadan bahsedeyim:
    Hocam bunu binary sayılara benzetebilirsin. Binary sayılarda 0 ve 1 vardır. yani her karakter için 2 değişkenin oluyor.
    Bunu stringler için düşünürsek;
    "abc" diye bir stringin var harf harf aldığımızda "a" harfi için 2 sonuç vardır; "a" ve "A"
    "abc" stringi için gereken kombinasyon sayısı 2^(harfsayısı = 3) den 2^3 = 8 oluyor. Buradaki "2" de 2 değişkenin olduğu için oradan geliyor.
    Olayı kavramak için binary sayıları biraz yazayım;

    1 elemanlı binary sayılar
    ########################
    0
    1

    2 elemanlı binary sayılar
    ########################
    0 0
    0 1
    1 0
    1 1

    3 elemanlı binary sayılar
    ########################
    0 0 0
    0 0 1
    0 1 0
    0 1 1
    1 0 0
    1 0 1
    1 1 0
    1 1 1

    Basamaklarını farklı renklerle gösterdim dikkat edersen örüntüyü göreceksin ilk başta 1 basamaklıda 0 - 1 - 0 - 1 diye gidiyor
    2 basamaklıda olay 0 - 0 - 1 - 1 e dönüyor bu ne demek ? 2 basamaklıda 2^2 den 4 tane durum vardır. Bunun yarısı 0 yarısı 1 olmak zorunda

    2^(harfSayısı) / 2 diye bir formül geliştirerek yarısına geldiğinde 0 dan 1 e geçmesi gerektiğini anlıyoruz. ( Anlatamamış olabilirim kusura bakmayın )

    Şimdi gelelim bunu harfler için yaparsak olay şöyle olacak;
    "abc" stringi için aynı 0 ve 1 ler gibi bir tablo yaparsak;
    8 tane olasılık olacak
    Bu satırların ilk 4 tanesi küçük "a" ile başlayacak
    son 4 tanesi büyük "A" ile başlayacak

    b ler ilk 2 si küçük "b" olacak
    sonra gelen 2 li büyük "B" olacak ve böyle böyle örüntülü şekilde devam edecek

    c lerde de 1 li 1 li değişecek bir küçük "c" bir büyük "C" diye diye gidecek umarım anlamışsınızdır.

    a b c
    a b C
    a B c
    a B C
    A b c
    A b C
    A B c
    A B C

    olay bu şekilde kodunu da C# da yazdım buyrun:
    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine("Kelime girin: ");
    string cumle = Console.ReadLine();
    int kombinasyonSayisi = Convert.ToInt32(Math.Pow(2, cumle.Length));
    StringBuilder cumleBuilder = new StringBuilder(cumle);
    List<StringBuilder> olasiliklar = new List<StringBuilder>();
    List<string> tekrarOnlenmisOlasiliklar = new List<string>();
    for (int i = 0; i < kombinasyonSayisi; i++)
    olasiliklar.Add(new StringBuilder());


    int sayac = 0;
    bool degisti = false;
    for (int harfIndeks = 0; harfIndeks < cumle.Length; harfIndeks++) // abc için harfIndeks loopu: 0 < 3 e kadar
    {
    int degistirmeIndeksi = Convert.ToInt32(Math.Pow(2, (cumle.Length - harfIndeks)) / 2); // pow fonksiyonu double return ediyor ilk sutun için (2^(3-0)/2) = 4 olur 4 kez gittikten sonra bir önceki harf küçükse büyüğe çevireceğiz büyükse küçüğe çevireceğiz
    Console.WriteLine("################################################");
    Console.WriteLine("harfIndeks: " + harfIndeks + " degistirmeIndeksi: " + degistirmeIndeksi);
    sayac = 0;
    for (int satirIndeks = 0; satirIndeks < Math.Pow(2, cumle.Length); satirIndeks++) // 3 harf için 0 1 2 3 4 5 6 7 2^3 den = 8 tane satir yapar
    {
    Console.WriteLine("satirIndeks: " + satirIndeks + " sayac: " + sayac + " degisti: " + degisti);
    if (degisti == false)
    {
    cumleBuilder[harfIndeks] = char.ToLower(cumleBuilder[harfIndeks]);
    }
    else
    {
    cumleBuilder[harfIndeks] = char.ToUpper(cumleBuilder[harfIndeks]);
    }
    olasiliklar[satirIndeks].Append(cumleBuilder[harfIndeks]);

    if (sayac + 1 != degistirmeIndeksi)
    {
    sayac++;
    }
    else
    {
    sayac = 0;
    if (degisti == false)
    degisti = true;
    else
    degisti = false;
    }
    }
    }
    foreach (var item in olasiliklar)
    {
    if (!tekrarOnlenmisOlasiliklar.Contains(item.ToString())) // eğer "ab34c" gibi bir string girersek aynı eleman içeren durumlar oluyor
    {
    tekrarOnlenmisOlasiliklar.Add(item.ToString());
    }
    }

    Console.WriteLine("################################################");
    Console.WriteLine(cumle + " İçin tüm olasılıklar: ");
    foreach (var item in olasiliklar)
    {
    Console.Write(item + " ");
    }
    Console.WriteLine();

    Console.WriteLine("################################################");
    Console.WriteLine(cumle + " İçin harf dışında eleman girilirse tekrar edilmeyen hali ile olasılıklar: ");
    foreach (var item in tekrarOnlenmisOlasiliklar)
    {
    Console.Write(item + " ");
    }
    Console.WriteLine();
    }
    }



    < Bu mesaj bu kişi tarafından değiştirildi ksst06 -- 9 Mayıs 2019; 1:0:7 >




  • ksst06 kullanıcısına yanıt
    2 aylık konuyu hortlatmış olacağım fakat kod biraz uzun değil mi? Bir de bu soru mülakatta sorulmuş, bu kadar uzun kod yazmaya mülakat süresi yetmez.

    Aynı işlemin Perl 6 'da cok kısa çözümü var:

    my @d=<a b c>;for 1..2**@d ->$e {print join("", map {$e +& (2**$_) ?? uc(@d[$_]) !! @d[$_]}, (0..2)) ~ " ";}

    Satır çıktısı:
    Girilen Stringin Harflerini Küçültüp-Büyültme
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.