Bir dizenin çalışmalarını hesaplama


11

Alınan aşağıdaki tanımlara düşünün bir dizede koşular sayısına W. Rytter tarafından. Sözcük, dize ve alt dizenin kabaca eş anlamlı olduğunu unutmayın.

Bir dizedeki çalışma, bir dizedeki uzatılamaz (aynı minimum periyotla) periyodik segmenttir.

W kelimesinin bir periyodu p, bu denklemin her iki tarafı tanımlandığında w [i] = w [i + p] olacak şekilde herhangi bir pozitif tamsayı p'dir. (W) başına en küçük w döneminin boyutunu belirtelim. W kelimesinin, (w) <= | w | / 2 başına periyodik iff olduğunu söylüyoruz.

Örneğin, dizeyi ele alalım x = abcab. per(abcab) = 3olarak x[1] = x[1+3] = a, x[2]=x[2+3] = bve hiçbir küçük süresi vardır. Bu abcabnedenle dize periyodik değildir. Bununla birlikte, dize abab(abab) = 2'ye göre periyodiktir.

W dizesindeki bir çalışma (veya maksimum periyodiklik) j> = i ile bir aralık [i ... j] 'dır, öyle ki

  • w [i ... j] periyodik bir kelimedir ve p = per (w [i ... j])
  • Maksimaldir. Resmi olarak, ne w [i-1] = w [i-1 + p] ne de w [j + 1] = w [j + 1-p]. Gayri resmi olarak, çalışma aynı dönemle daha büyük bir çalışmada bulunamaz.

RUNS (w) ile w çalışma kümesini belirtin.

Örnekler

Dört koşusu atattatt[4,5] = tt, [7,8] = tt, [1,4] = atat, [2,8] = tattatt.

Dize aabaabaaaacaacacşu 7 çalışmayı içerir:

[1,2] = aa, [4,5] = aa, [7,10] = aaaa, [12,13] = aa, [13,16] = akas, [1,8] = aabaabaa, [9 , 15] = aakaaka.

Çıktınız bir koşu listesi olmalıdır. Her çalışma temsil ettiği aralığı belirtmelidir, ancak alt dizenin kendisinin çıktısını alması gerekmez. Kesin biçimlendirme sizin için uygun olan her şey olabilir.

Örnekler 1 dizinleme kullanır, ancak daha uygunsa bunun yerine 0 dizinlemeyi kullanabilirsiniz.

GÖREV

Bir dize veren kodu yazın, RUNS (w) çıktısını alın.

Diller ve giriş

İstediğiniz herhangi bir dili kullanabilir ve giriş dizesini en uygun biçimde alabilirsiniz. Ancak tam bir program vermelisiniz ve örnek girişinde çalışan kodunuzun bir örneğini göstermelisiniz.


4
Güzel bir meydan okuma, ancak varsayılan ve izin vermeme işlevlerini geçersiz kılmak için iyi bir neden var mı?
Martin Ender

@MartinEnder Bu sadece benim tercihim. İnsanların sadece kodu kopyalayıp yapıştırmasını ve kendileri denemesini kolaylaştırır, bu da cevapları daha fazla insan için daha ilginç hale getirir.

4
Ancak bu aynı zamanda çok fazla genel kod oluşturmasına neden olur ve bu da rekabeti ayrıntılı sözdizimine sahip diller için adaletsiz hale getirir. Örneğin ben class A{public static ...}golf kodu istedim her zaman yazmak zorunda Java Java golf olmazdı
Bassdrop Cumberwubwubwub 4:16

@BassdropCumberwubwubwub Artıları ve eksileri olduğunu görebiliyorum. Profesyonelleri daha güçlü tartıyorum. Bence APL ile Python'u karşılaştırmak yerine, benzer dillerde golf cevaplarının uzunluğunu karşılaştırmak en ilginç olanı.

"bir çalışma daha büyük bir çalışma içinde tam olarak yer almıyorsa maksimumdur" ancak ilk örneğinizde [7,8] [2,8] içinde tam olarak yer alır. Yoksa kesinlikle aynı alt dizeyi tekrarlayan koşulardan mı bahsediyorsunuz?
aditsu bıraktı çünkü SE EVIL

Yanıtlar:


2

Pyth, 38 bayt

{smm,hk+ekdfgaFTdcx1xM.ttB+0qVQ>QdZ2Sl

  m                                 SlQ   map for d in [1, …, len(input)]:
                            qVQ>Qd          pairwise equality of input[:-d] and input[d:]
                        tB+0                duplicate this list, prepending 0 to one copy
                      .t          Z         transpose, padding with 0
                    xM                      pairwise xor
                  x1                        find all occurrences of 1
                 c                 2        chop into groups of 2
           f                                filter for groups T such that:
             aFT                              the absolute difference between its elements
            g   d                             is greater than or equal to d
   m                                        map for groups k:
     hk                                       first element
    ,  +ekd                                   pair with the last element plus d
 s                                        concatenate
}                                         deduplicate

Test odası


"Atattatt" dan "[[3, 5], [6, 8], [0, 4], [1, 8]]" elde ederim. [3,5] "tt" yi temsil ediyor mu? Kullandığınız algoritmayı üst düzeyde açıklamak harika olurdu.

@Lembik Evet [i, j](0-endeksli) karakter arasında dilim başlangıç temsil eder i-1ve ive karakterler arasındaki bitiş j-1ve j. Bu olması gerektiği gibi Pyth ve çoğu aklı dilde standart sözleşmedir ( buraya ve buraya bakınız ).
Anders Kaseorg

Harika. Çözümünüzü sezgisel olarak tanımlamak mümkün mü? Ne yazık ki kod açıklamasından tersine mühendislik yapılamıyor.

1
@Lembik Varsayalım d. İ karakterinin i + d karakteriyle eşleştiği tüm konumları buluruz. Daha sonra bu tür en az d ardışık dizilişler buluruz. Herkes için tekrarlayın d. Sonunda tekilleştirmeliyiz çünkü gerçek dönem sadece d'nin bir böleni olabilirdi.
Anders Kaseorg

1

CJam, 66

q:A,2m*{~A>_@)_@<2*@@2*<=},{_2$-2>2,.+={+}&}*]{[_1=\)\0=2*)+]}%_&p

Çevrimiçi deneyin

Kısa açıklama:

Algoritma 4 adımda çalışır (ilk 3 tanesi gözlemleyebileceğiniz 3 ana bloğa karşılık gelir):

  1. Çoğaltılmış bir alt dizeye ( aba aba aaacaacac gibi) karşılık gelen tüm [uzunluk indeksi] çiftlerini bulun ; bunlar koşuların parçaları.
  2. Aynı çalışmanın parçası olan çiftleri birleştirin, yani ardışık indeksler ve aynı uzunluk / dönem.
  3. Minimum indeks ve maksimum indeks + 2 * uzunluk - 1 alarak gerçek koşuları oluşturun.
  4. Sonunda, yinelenen çalışmaları (farklı bir süre ile elde edilen aynı aralık olan) kaldırın

Daha fazla golf oynamak istiyorum, bu yüzden hepsi değişebilir.


Bunun için teşekkür ederim. Kullandığınız algoritmayı da açıklayabilir misiniz lütfen?

1
@Lembik ok, güncellendi
aditsu çıkın çünkü SE EVIL
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.