Tıknaz palindromlar


15

Palindromlar eğlencelidir, ancak diğer dizelerden bazıları dışlanmış hissetmeye başlar. Bu dizeleri , palindromik parça dizilerine bölerek tıknaz palindromlara dönüştürebiliriz.

Örneğin, "abcabca"karakter karakter karakter okursak dize bir palindrom değildir, ancak tıknaz bir palindrom yapmak için üç farklı yolumuz vardır:

["abcabca"]
["a" "bcabc" "a"]
["a" "bc" "a" "bc" "a"]

Gördüğünüz gibi, tıknaz palindromiklik çok kapsayıcı bir kavramdır; her dize en az bir şekilde tıknaz bir palindrom haline getirilebilir.

Görev

Bir dizeyi girdi olarak alan ve palindromik yığınlığını , yani palindromik diziler olan bölümlerinin sayısını döndüren bir program veya işlev yazın .

Test senaryoları

 OUTPUT | INPUT
--------+---------------------------------------------
      1 | ""                                          
      1 | "a"                                         
      1 | "ab"                                        
      2 | "aa"                                        
      2 | "aaa"                                       
      3 | "abcabca"                                   
      4 | "abababab"                                  
     28 | "abcabcaabababababcabca"                    
      1 | "bbbbabababbbbababbbaaaaa"                  
     20 | "ababbaaaabababbbaaabbbaa"                  
      5 | "baaabaabababaababaaabbaab"                 
     62 | "bbaaababbabbabbbabaabaabb"                 
      2 | "a man a plan a canal panama"               
     25 | "ama nap lan aca nal pan ama"               
     93 | "SATOR   AREPO   TENET   OPERA   ROTAS"     
    976 | "abcabcaabcabcaabcabcaabcabcaabcabcaabcabca"
  28657 | "ababababababababababaababababababababababa"
2097152 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

Ek kurallar

  • Girişin, isteğe bağlı olarak dilinizin dize sınırlayıcılarıyla çevrili ve / veya ardından yeni satır içeren 42 veya daha az yazdırılabilir ASCII karakterden oluşacağını varsayabilirsiniz.

  • Her geçerli giriş dizesi için, kodun makinemde bir dakikadan daha kısa sürede bitmesi gerekir (Intel Core i7-3770, 16 GiB RAM, Fedora 21).

    Yeterli bir algoritma ile, bu zaman sınırına uymak kolay olmalıdır. Ancak, büyük olasılıkla giriş dizesinin tüm bölümlerini yineleyemezsiniz.

  • Çıkışı STDOUT'a yazdırmayı seçerseniz, bunu tek bir satırsonu izleyebilir.

  • Standart kuralları geçerlidir.

Yanıtlar:


4

Pyth, 40 34 27 22 bayt

Lhsmy:bd_df!xb>TbS/lb2

Çevrimiçi yorumlayıcıda deneyin .

İlk 40 baytlık sürümden yoğun bir şekilde golf. FryAmTheEggman sayesinde toplam 6 baytlık tasarruf sağlayan birkaç kullanışlı operatörü (dokümanlar aramak zor!) Sonucunu yorumlayarak tasarrufu akıllı bir tek bayt için Dennis sayesinde x- bir truthy / falsy değerinden ziyade bir endeks olarak !xb>Tbyerine q<bT>Tb.


Nasıl çalışır:

Biz kendini ydizgilerin balt dizelerinde özyinelemeli olarak çağırarak dizenin tıkanıklığını belirleyen bir işlev tanımlarız b. İşlevler Pyth içinde otomatik olarak hafızaya alınır, bu nedenle özyinelemenin zaman açısından çok az yükü vardır.

L                              def y(b): return ___
                 S/lb2         The range [1,2,...,len(b)/2]
          f!xb>Tb              Filter n for which b[:n] == b[-n:]
   m                           Map each n in the list to...
    y:bd_d                     y(b[d:-d])       
 hs                            Take the sum and add one (implicit return)

Evet, Pyth öğrenmenin çoğu ortak / deneme ve hata / lexer okumak, daha çok golf oynamak için iyi bir iş! :)
FryAmTheEggman

1
1. İşlevi göndererek iki bayt kaydedebilirsiniz. Bunu aramanıza gerek yok yz. 2. İki harita ve filtre yerine, üç bayt kaydeden tek bir harita ve koşullu ( bağlantı ) kullanabilirsiniz.
Dennis

2

CJam ( 41 39 bayt)

qM{_,2/,\f{\~_2$>@2$<@~)/(@=\M*j*}1b)}j

Çevrimiçi demo

Bu, her "merkezi" dize için tıknaz palindromların sayısını bulması açısından "istekli" dir (yani, orijinal dizenin her iki ucundan aynı sayıda karakterin kaldırılmasının sonucu), ancak otomatik hatırlamayı kullandığından j operatör her biri yalnızca bir kez hesaplanır ve çok hızlı bir program verir (ve hatırlatılmamış bir uygulama üzerine birkaç karakter kaydeder).

Dennis'e bir bayt tasarruf için teşekkürler.


1

Mathematica, 77 72 57 bayt

1+Tr[#0/@ReplaceList[#,{a__,b___,a__}:>{b}]]&@*Characters

1

Perl, 86 bayt

84 bayt kodu + 2 anahtar

Daha kısa bir yöntem olmalı, ama işte gidiyor:

perl -lpe 'sub c{my($x,$i)=@_;$x=~/^(.{$i})(.*)\1$/&&c($2,0*++$s)while++$i<length$x}c$_;$_=++$s'

Satır başına bir dize olan STDIN'den girdi alır.

Açıklama: Değerler için, sol ve sağ parçaları almak için 1<=$i<length(input string)normal ifadeyi kullanır /^(.{$i})(.*)\1$/ve sayımı artırır. Daha sonra dizenin orta kısmı için özyineli olarak aynısını yapar.

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.