Belirli bir dizeyle kaç mesa başlar?


11

Aşağıdaki koşullar geçerliyse boş olmayan bir dize listesine mesa diyelim :

  1. Listelenen her dize boş değildir ve yalnızca ilk dizede oluşan karakterleri kullanır.
  2. Birbirini izleyen her dize, bir önceki dizeden tam olarak bir karakter daha uzundur.
  3. Listede hiçbir dize olduğu altdizi listesindeki diğer herhangi dize.

"Mesa" terimi şu şekilde görselleştirmektir (burada xs çeşitli karakterler olacaktır):

    xx..x
    xx..xx
    xx..xxx
    .
    .
    .
    xx..xxx..x 

Not: Verilen bir dizeyle sadece sonlu birçok mesanın başlaması matematiksel bir gerçektir. Arasında ayrım Not sekans genel substring ; örneğin, 'anna', 'muz'un bir alt dizisidir (ancak bir alt dize değildir).

Meydan okuma:

  • Boş olmayan bir alfasayısal giriş dizesi alan ve bu dizeyle başlayan mesaların sayısını çıkaran en kısa programı yazın.

Giriş (stdin):

  • Boş olmayan alfasayısal dizeler.

Çıktı (stdout):

  • Girdi dizesiyle başlayan mesaların sayısı.

puanlama:

  • Kazanan, en az bayt sayısına sahip programdır.

Örnek mesas

Sadece bir mesa ile başlar a:

a

Sadece bir mesa ile başlar aa:

aa

Birçok mesas şunlarla başlar ab:

ab        ab        ab        ab        (and so on)
          baa       aaa       bbb
                    bbba      bbaa
                              baaaa
                              aaaaaa

Mesa'nın benzersizliği nasıl belirlenir? Mesela, anlatabilirdim ab, bbbsadece ikinci dönem de durdurarak platonun olarak. Bu geçerli mi? Yoksa her zaman mümkün olduğunca uzun süre yapılmaları mı gerekiyor? Ayrıca, nthterimin birden fazla olası yeniden düzenlemesi varsa ( baa,, abagibi aab), hepsi de ayrı mezalar olarak sayılır mı (elbette hepsinin kurallara uyması şartıyla)?
mellamokb

@mellamokb - Herhangi bir şekilde farklı olmaları durumunda farklı mesalar. Örneğin, ab, ab/baa, ab/bbb, ab/bbb/bbaa, ab/bbb/bbaa/baaaa, ab/bbb/bbaa/baaaa/aaaaaafarklı mesas vardır.
res

@mellamokb - Başka güzel sorular getiriyorsun; örneğin, belirli bir dizeyle kaç tane maksimum uzunluklu mesi başlar ve bu maksimum uzunluk nedir? Bu soruların diğer sürümleri, verilen boyuttaki bir alfabeyi (alfabe boyutu girdi olacaktır) düzeltir ve yalnızca verilen alfabedeki harfleri kullanan tüm memaları (koşul # 1 olmadan yeniden tanımlanır) dikkate alacaktır - yine sadece çok sayıda vardır.
res

Yanıtlar:



2

Ruby, 142 karakter

m=->l{[*l[0].chars].repeated_permutation(l[-1].size+1).reduce(1){|s,x|l.any?{|y|x*''=~/#{[*y.chars]*'.*'}/}?s:s+m[l+[x*'']]}}
p m[[gets.chop]]

Bu algoritma yapıcıdır, yani girdi dizesi için olası tüm mesaları oluşturur ve bunları sayar. Programı gerçekten, gerçekten yavaş yapıyor - ama hey, codegolf.

Örnek çalıştırmalar:

> a
1
> aa
1
> ab
43

3 (ör. aab) Uzunluğundaki önemsiz ikili dizelerden bazılarıyla başlayan tüm memaların mümkün uzunlukta olmasını umuyordum , ama emin değilim - programınız bu örnek için yaklaşık bir saat çalışıyor. Not: İkiden fazla farklı harf içeren herhangi bir girdi için uygun çıktı olmayacaktır; örneğin, bazı mesalarınabc uzunluğu 7000. Ackermann sayısından fazladır .
res

C # optimize edilmiş bir sürümünü inşa ettik ve ben 300,000girişleri oluşturduktan sonra aabhala ilk 10 ya da öylesine terimlerin hepsi aynı olduğunu görüyordum. Bu yüzden bence iki karakterden daha büyük bir şey için uygun olmayabilir. En azından bazı zeka ve sezgisel hesaplamalar olmadan değil.
mellamokb
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.