Cuerdas privilegiadas
El conjunto de cadenas privilegiadas se define de forma recursiva de la siguiente manera.
- Todas las cadenas de longitud 0 o 1 tienen privilegios.
- Una cadena
s
de longitud de al menos 2 tiene privilegios, si existe una cadena privilegiada más corta t
que se produce s
exactamente dos veces, una como prefijo y otra como sufijo. Los sucesos superpuestos se cuentan como distintos.
Por ejemplo, las cadenas aa
, aaa
y aba
son privilegiadas, pero ab
y aab
no lo son.
Entrada
Una cadena alfanumérica.
Salida
Todas las subcadenas privilegiadas de la cadena de entrada, cada una exactamente, en cualquier orden. La salida se puede proporcionar en el formato de matriz nativo de su idioma (o el equivalente más cercano), o imprimir una subcadena por línea.
Hecho de la diversión
El número de cadenas en la salida siempre es exactamente length(s) + 1
( fuente ).
Reglas
Ambas funciones y programas completos están permitidos. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
Estos se ordenan primero por longitud y luego alfabéticamente, pero cualquier orden es aceptable.
"" -> [""]
"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"]
Tabla de clasificación
Aquí hay una tabla de clasificación por idioma, cortesía de Martin Büttner .
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# 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
puede no ser un solo símbolo. Por ejemplo,aaa
es una cadena privilegiada, ya que tieneaa
como prefijo y sufijo, y ocurre solo dos veces. Lo agregué como ejemplo.Respuestas:
.NET Regex, 31 bytes
Las cadenas se capturan
\1
en cada partido.Explicación
fuente
CJam,
33453938 bytesDigamos que se imprime sin una nueva línea final. Entonces, la nueva línea final significa una subcadena vacía ...
Explicación
fuente
Python 2,
179173164 bytesBastante voluminoso actualmente: me pregunto si es posible combinar el cheque y la generación de subcadenas de alguna manera ...
La lambda
f
es básicamente unais_privileged()
función, que combina las tres condiciones en una comparación (la subcadena es privilegiada, aparece dos veces, es sufijo y prefijo).Expandido:
fuente
Python 3,
131129 bytesEsto recursivamente encuentra subcadenas privilegiadas, comenzando con las más cortas y agregándolas a un conjunto. El conjunto se usa para determinar si las subcadenas más largas tienen privilegios.
Desafortunadamente, es una función de un solo uso. Aquí hay un programa completo correspondiente ( 145 bytes ):
fuente
Pitón,
152147126116 bytesComo se demostró en el documento vinculado, hay un sufijo privilegiado único para cada prefijo de una cadena. Ese sufijo es de la forma
p·u·p
dondep
es la subcadena privilegiada más larga encontrada previamente, que es un sufijo del prefijo. (La búsqueda es el argumento demax
, que en realidad encuentra la longitud dep
porque era más fácil de hacermax
quelongest
). Una vez quep
se encuentra, el sufijo en sí se forma buscando la segunda última aparición dep
en el prefijo, usandorfind
restringido para no usar el último personaje Sabemos que funcionará, porquep
es un sufijo encontrado previamente. (Una prueba más rigurosa del algoritmo puede derivarse del documento).Estoy bastante seguro de que esto podría implementarse en tiempo lineal usando un árbol de sufijos, en lugar del algoritmo cúbico
cuadráticoutilizado anteriormente, pero el programa anterior es ciertamente lo suficientemente rápido en todos los casos de prueba y maneja una cadena de 2000a
s en un poco menos de un segundo en mi laptop (no superpoder).fuente
Ruby, 87
Siento que hay una solución de expresión regular recursiva aquí en alguna parte, pero no soy muy buena en eso, así que aquí hay una función recursiva muy lenta y larga.
El algoritmo es más o menos el mismo que el de los grc , y se hace más lento (pero más corto) al no tener caracteres individuales de mayúsculas y minúsculas . Una cadena de un solo carácter puede considerarse privilegiada debido a que tiene la cadena vacía como prefijo, sufijo y en ningún otro lugar.
El otro truco interesante aquí es el uso de
$'
una variable mágica heredada de Perl que toma el valor de la cadena después de la coincidencia de expresión regular más reciente. Esto me da una forma corta de cortar el primer carácter de una cadena, aunque obtengo casi todos esos caracteres al tener que configurarlo ens[/./]
lugar des[0]
. Lo uso de nuevo para verificar que la segunda coincidencia de subcadena ocurre al final de la cadena.fuente
J, 92 bytes
Toma un par de segundos en la entrada más larga.
p
comprueba si una cadena tiene privilegios (con recursividad),s
comprueba cada subcadena conp
.Pruebas:
fuente
JavaScript (ES6) 195
La función P verifica recursivamente que una cadena tiene privilegios.
La función F intenta cada subcadena contenida en la cadena dada. Las cadenas encontradas se almacenan como claves de una tabla hash para evitar duplicados.
Por fin, las claves se devuelven como salida.
fuente