Arka fon
olay , alışılmadık bir programlama dilidir, çünkü belirteçlerin listesi önceden belirlenmiş değildir, aksine girdilerden çıkarılmıştır. Bu nedenle, bir Olay programını belirtmek, özellikle verimli bir şekilde yapmak istiyorsanız, oldukça zor olabilir. Bu görev kendin yapmakla ilgili.
Görev
Programınıza girdi olarak bir dize verilecektir. İşte Olayı belirtmek için kullandığı algoritma:
- Girdinin alt dizisi olarak gerçekleşen tüm dizeleri tam olarak üç şekilde tanımlayın (örn. Bu dizgenin girdi içinde tam olarak üç oluşumu vardır).
- Başka tür dize alt dize olan bu dizeleri herhangi atın (örneğin girişi için
ababab
, geriye kalan tek dize olurduab
değil,a
yab
çünküa
veb
her iki altdizgelerin vardırab
). - Girdi içinde çakışan dizeleri atın. (Örneğin,
aaaa
tam olarak üç kopya içeriraa
, ancak bu kopyalar ikinci ve üçüncü karakterlerde çakışır, bu nedenle atılır. Benzer şekildeabababa
, içeride üç kopyaab
ve üç kopya vardırba
, ancak ikinci ila altıncı karakter bir üst üsteab
veba
, ikisi de çokab
veba
atılır) olacaktır. - Bu noktada kalan herhangi bir dize, program tarafından kullanılan belirteçlerdir. Orijinal girişi bu belirteçlerin bir sırasına sokun (önceki adımdaki atma nedeniyle, bunu yapmanın yalnızca bir yolu olacaktır). Girdideki herhangi bir simgenin parçası olmayan karakterler yorum olarak kabul edilir ve atılır.
Programınız girdi olarak bir dize almak ve dizenin karşılık gelen belirtecini (her biri dize olarak ifade edilen belirteçlerin bir listesi) çıktı olarak döndürmelidir. Ek olarak, bu en azından orta derecede verimli yapılmalıdır; özellikle, programın ikinci dereceden ("O (n²)") veya daha iyi çalışması gerekir. (Bu arada, ikinci dereceden daha hızlı gitmek neredeyse kesinlikle mümkün, ama bu en hızlı algoritma değil , bu yüzden karmaşıklık sınırlarına uyan bulabileceğiniz en keskin algoritmayı kullanmaktan çekinmeyin.)
Açıklamalar
- Her ne kadar Olay programları teorik olarak 256 oktetten herhangi birini içerebilse de, programınızın yalnızca yazdırılabilir ASCII'den (boşluk dahil), ayrıca yeni satırdan ve sekmeden oluşan girişleri işlemesi için bu zorluğun amacı kabul edilebilir. (Bilinen tüm Olay programları kendilerini bu alt kümeyle sınırlandırmaktadır). Space / newline / tab'in özel olmadığını ve belirteçlerin ortasında görünebileceğini unutmayın; Olay, 256 oktetinin tümünü opak olarak kabul ediyor.
- "İkinci dereceden zaman" tanımı, eğer girişin büyüklüğü iki katına çıkarsa, program sabit artı 4'lük bir faktörden daha fazla yavaş çalışmayacaktır ", yani eğer t ( x ), programınızın azami zamanı boyutu, bir giriş işlemek x , daha sonra bir sabit olmalıdır k , öyle ki t (2 x ) <4 t ( x ) + k tüm x . Dizeleri karşılaştırmanın dizelerin uzunluğu ile orantılı olarak zaman alacağını unutmayın.
- Programınız, sınırsız hafızası olan ve sınırsız tamsayılar kullanan (muhtemelen varsayımsal) bir dilde çalıştırıldığında, sınırsız belleğe sahip ve sınırsız tamsayılar kullanıyorsa, programın herhangi bir uzunlukta giriş programlarını kullanabilmesi gerekir. dilin tamsayıları veya hafızası aslında oldukça büyüktür). Girişin uzunluğundan daha büyük olmayan tam sayıların, sabit zaman içinde karşılaştırılabileceğini (örneğin, girişi bir cihaza dönüştürmek nedeniyle daha büyük değerler kullanıyorsanız aklınızda bulundurmalısınız) kabul edebilir (karmaşıklığı hesaplama amacıyla). tek bir tamsayı, sahip oldukları basamak sayısıyla orantılı olarak karşılaştırmak için biraz zaman alırlar).
- Aynı sonuçları ürettiği sürece yukarıda belirtilen algoritma ile aynı adımları izlemese bile karmaşıklık sınırlarına uyan herhangi bir algoritmayı kullanabilirsiniz.
- Bu yapboz girdiyi biçimlendirme hakkında değil, çıktıyı biçimlendirme hakkında değil. Dilinizde bir liste çıkarmanın en doğal yolu belirsiz bir biçim içeriyorsa (örn. Dizeler değişmez satırlar içerdiğinde veya dizeler arasında sınırlayıcılar olmadan newline ayrılmış), çıktının belirsiz hale gelmesi konusunda endişelenmeyin ( liste aslında yapıldığı sürece). Testinize yardımcı olmak için net çıktı sağlayan ikinci bir versiyon yapmak isteyebilirsiniz, ancak orijinal versiyon puanlama için sayılan versiyondur.
Test durumu
Aşağıdaki giriş dizesi için:
aaabcbcbcdefdfefedghijghighjkllkklmmmmonono-nonppqpq-pqprsrsrstststuvuvu
programınız aşağıdaki çıktı listesini üretmelidir:
a a a bc bc bc d e f d f e f e d gh gh gh k l l k k l pq pq pq u u u
Zafer durumu
Bu kod golf , yani bayt cinsinden ölçülen en kısa geçerli (yani doğru girdi / çıktı davranışı ve yürütülmesi için yeterince hızlı) programı kazanır.