Cordas privilegiadas
O conjunto de cadeias de caracteres privilegiadas é definido recursivamente da seguinte maneira.
- Todas as cadeias de comprimento 0 ou 1 são privilegiadas.
- Uma sequência
s
de comprimento pelo menos 2 é privilegiada, se existir uma sequência privilegiada mais curta t
que ocorra s
exatamente duas vezes, uma vez como prefixo e outra como sufixo. Ocorrências sobrepostas são contadas como distintas.
Por exemplo, as cordas aa
, aaa
e aba
são privilegiados, mas ab
e aab
não são.
Entrada
Uma sequência alfanumérica.
Resultado
Todas as substrings privilegiadas da sequência de entrada, cada uma exatamente uma vez, em qualquer ordem. A saída pode ser fornecida no formato de matriz nativa do seu idioma (ou equivalente mais próximo) ou impressa uma subsequência por linha.
Fato engraçado
O número de strings na saída é sempre exatamente length(s) + 1
( origem ).
Regras
São permitidas funções e programas completos. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Casos de teste
Eles são classificados primeiro pelo comprimento e depois em ordem alfabética, mas qualquer pedido é aceitável.
"" -> [""]
"a" -> ["","a"]
"abc" -> ["","a","b","c"]
"abcaaabccaba" -> ["","a","b","c","aa","cc","aaa","aba","abca","abcca","bccab","bcaaab","caaabc"]
"1010010110101010001101" -> ["","0","1","00","11","000","010","101","0110","1001","01010","10001","10101","010010","101101","0101010","1010101","01011010","10100101","1010001101","1101010100011","00101101010100","011010101000110"]
"CapsAndDigits111" -> ["","1","A","C","D","a","d","g","i","n","p","s","t","11","111","igi","sAndDigits"]
Entre os melhores
Aqui está uma tabela de classificação por idioma, cortesia de Martin Büttner .
Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:
# Language Name, N bytes
onde N
está o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);i=i.replace("{{PLACE}}",t++ +".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45497;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*((?:[^,\s]|\s+[^-,\s])*)/
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src=https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js></script><link rel=stylesheet type=text/css href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"><div id=answer-list><h2>Leaderboard</h2><table class=answer-list><thead><tr><td></td><td>Author<td>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
t
pode não ser um símbolo único. Por exemplo,aaa
é uma sequência privilegiada, pois possuiaa
prefixo e sufixo e ocorre apenas duas vezes. Eu adicionei como um exemplo.Respostas:
Regex .NET, 31 bytes
As strings são capturadas
\1
em cada partida.Explicação
fonte
CJam,
33453938 bytesDigamos que seja impresso sem uma nova linha à direita. Portanto, a nova linha à direita significa uma substring vazia ...
Explicação
fonte
Python 2,
179173164 bytesBastante volumoso atualmente - gostaria de saber se é possível combinar a verificação e a geração de substring de alguma forma ...
O lambda
f
é basicamente umais_privileged()
função, combinando as três condições em uma comparação (a substring é privilegiada, aparece duas vezes, é sufixo e prefixo).Expandido:
fonte
Python 3,
131129 bytesIsso localiza recursivamente substrings privilegiados, começando pelos mais curtos e adicionando-os a um conjunto. O conjunto é então usado para determinar se substrings mais longos são privilegiados.
Infelizmente, é uma função de uso único. Aqui está um programa completo correspondente ( 145 bytes ):
fonte
Python,
152147126116 bytesComo demonstrado no artigo vinculado, há um sufixo privilegiado exclusivo para cada prefixo de uma sequência. Esse sufixo é da forma em
p·u·p
quep
é a substring privilegiada mais antiga encontrada anteriormente, que é um sufixo do prefixo. (A pesquisa é o argumento paramax
, que na verdade encontra a extensãop
porque era mais fácil de fazer domax
que issolongest
.) Uma vezp
encontrado, o sufixo é formado procurando pela segunda última ocorrência dep
no prefixo, usandorfind
restrito para não usar o último caractere. Sabemos que isso funcionará, porquep
é um sufixo encontrado anteriormente. (Uma prova mais rigorosa do algoritmo pode ser derivada do artigo.)Tenho certeza de que isso poderia ser implementado em tempo linear usando uma árvore de sufixos, em vez do algoritmo cúbico
quadráticousado acima, mas o programa acima é certamente rápido o suficiente em todos os casos de teste e lida com uma seqüência de 2000a
s em um pouco menos de um segundo no meu laptop (não superpoderoso).fonte
Ruby, 87
Eu sinto que há uma solução regex recursiva aqui em algum lugar, mas eu não sou muito bom nisso, então aqui está uma função recursiva muito lenta e longa.
O algoritmo é mais ou menos o mesmo que o grc , tornado mais lento (mas mais curto) por não apresentar caracteres únicos de maiúsculas e minúsculas. Uma cadeia de caracteres únicos pode ser considerada privilegiada por ter a cadeia vazia como prefixo, sufixo e em nenhum outro lugar.
O outro truque interessante aqui é o uso de
$'
, uma variável mágica herdada do Perl que pega o valor da string após a última correspondência de expressão regular. Isso me dá uma maneira curta de cortar o primeiro caractere de uma string, embora eu ganhe quase todos esses caracteres ao configurá-lo ems[/./]
vez des[0]
. Eu o uso novamente para verificar se a segunda correspondência de substring ocorre no final da string.fonte
J, 92 bytes
Leva alguns segundos na entrada mais longa.
p
verifica se uma string é privilegiada (com recursão),s
verifica cada substring usandop
.Testes:
fonte
JavaScript (ES6) 195
A função P verifica recursivamente que uma sequência de caracteres é privilegiada.
A função F tenta todas as subseqüências contidas na sequência especificada. As seqüências encontradas são armazenadas como chaves de uma tabela de hash para evitar duplicatas.
Por fim, as chaves são retornadas como saída.
fonte