var QUESTION_ID=98252,OVERRIDE_USER=20260;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/98252/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
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><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
ab
?Respuestas:
Python 2,
6863 bytesDevuelve verdadero o falso . Pruébalo en Ideone .
fuente
Retina , 11 bytes
Prueba todos los casos de prueba. Los primeros dos bytes lo hacen de varias líneas.
Interpretación bastante literal de las reglas, obviamente usa expresiones regulares, como lo harán todos los programas Retina.
fuente
perl -pE '$_=/^((.+)\2)+$/'
Jalea , 10 bytes
No es exactamente eficiente ... ¡ Pruébelo en línea!
Cómo funciona
fuente
Haskell,
7269 bytes (sin expresiones regulares)Un enfoque de fuerza bruta. Pruébalo en Ideone .
Gracias a BlackCap por -3 bytes.
Explicación
La función auxiliar
g
toma una lista de cadenas y comprueba que consta de pares de cadenas idénticas, como["aa","aa","bba","bba","ab","ab"]
. La función principal (anónima) divide una cadena de todas las formas posibles y comprueba que al menos una división da como resultado una lista queg
acepta.fuente
or.map
conany
any g.map(words.concat)
y pensé "bueno, me puede golf laany
queor
" ...Python 2, 60 bytes
Espero que esto sea correcto. Funciona bastante lento y
and
no se ve óptimo.fuente
and
que tienes allí.Jalea , 12 bytes
Dos bytes más largos que mi otra respuesta , pero este enfoque es mucho más eficiente y maneja todos menos uno de los casos de prueba.
Pruébalo en línea!
Cómo funciona
fuente
Pyth - Sin expresión regular -
1312 bytesComprueba si alguna de las particiones está formada por todas las cadenas que son iguales entre sí cuando se cortan en dos.
Test Suite .
fuente
Brachylog , 14 bytes (sin expresiones regulares)
Pruébalo en línea!
Esto es demasiado lento para algunos de los casos de prueba.
Explicación
fuente
JavaScript (ES6), no regexp,
7574 bytesDevoluciones
1
por pagar de lo contrario0
. Editar: guardado 1 byte gracias a @ edc65.fuente
substr
sin modificari
. Pero conslice
3 repetidas veces puede guardar 1 byte aliasingi
? Me doy cuenta de que esos.substr(i,i+i)
devuelve lo mismo,s.slice(i,i+=i)
pero luego uso el valor modificado dei
más tarde ...s.substr(i,i)
2 bytes menos, luegos.slice(i+i)
2 bytes másPython, 58 bytes
Esto se basa en el método recursivo de Dennis . El truco de negación booleana también se toma de allí.
La nueva idea es recurrir sobre particiones
(p,s)
de la cadena original comenzando('',s)
y moviendo repetidamente el primer carácter des
para ser el último carácter dep
. Esto permite que se haga referencia a las partes directamente sin segmentación de cadenas. Pero, debido a que la partición comienza conp
vacío, debemos tener cuidado de evitar bucles infinitos def(s)
llamadasf(s)
.fuente
JavaScript (ES6), 24 bytes
Probablemente no se acorte más que esto.
fuente
\2
?\1
, peroaab
regresatrue
... gracias por la solución.PHP, 40 bytes
imprime 0 para falso y 1 para verdadero
fuente
Python,
6664 bytes¡Gracias @Zgarb por -1 byte!
Devoluciones
True
oFalse
.Pruébalo en línea!
Cualquier ayuda de golf esto sería apreciada.
fuente
Raqueta 230 bytes
Imprime un '!' para cada forma en que la cadena es painable. Imprime un '.' al final.
Sin golf:
Pruebas:
Salida:
fuente
Perl, 16 +2 = 18 bytes (con expresiones regulares)
Corre con las
-nl
banderas.-E
está libre.Correr como:
Devuelve una lista de los grupos de captura (una verdad) si es deseable, cadena nula si no es deseable.
Explicación
Las
-nl
banderas ejecutarán el código en un bucle (-n
), colocando la entrada (con la nueva línea eliminada debido a-l
) en la variable$_
cada vez, luego evaluando el código cada vez que se ingresa la entrada, hasta que el programa se termina manualmente. El-E
indicador le permite evaluar el código en la línea de comando y habilita elsay
comando.Si se encuentra una coincidencia (por ejemplo, si la cadena se puede emparejar), la expresión regular devuelve una lista de los grupos de captura, que se evalúa como verdadera, que luego se pasa a
say
, y se . Si no se encuentra ninguna coincidencia, entonces la expresión regular devuelve la cadena vacía, que se evalúa como falsa, que luego se pasasay
y se emite.Muestra:
fuente
GNU Prolog,
4946 bytesProbablemente también funciona en otras variantes, aunque no todas representan cadenas de la misma manera; La representación de GNU Prolog es útil para este problema.
No está claro si esto cuenta como usar expresiones regulares o no. No utiliza ninguna característica similar a la expresión regular, pero toda la semántica del lenguaje es similar a la de la expresión regular.
Nueva versión (utiliza el truco de recursión visto en algunas otras respuestas):
Versión antigua:
Este es un predicado (equivalente de Prolog de una función) llamado
s
, no un programa completo. Úselo así:Una característica interesante de la solución anterior es que si le pregunta al intérprete "¿hay más soluciones?" mediante el uso de
;
en eltrue ?
indicador (en lugar de preguntar "¿hay alguna solución" al presionar la tecla de retorno en el indicador, como hice anteriormente), devuelve "verdadero" una cantidad de veces igual al número de formas diferentes en que la cadena se puede expresar en la forma dada (por ejemplo, devuelve "verdadero" dos veces cons("aaaa").
, ya que esto se puede analizar como(a a)(a a)
o como(aa aa)
).Programas Prolog son a menudo reversible (permitiendo
s
a generar una lista de cadenas con la propiedad dada). El anterior no lo es (entra en un bucle infinito), pero eso se debe al método de golf que utilicé para asegurarme de que C no esté vacío; si reescribe el programa para especificar C como no explícitamente explícito, genera cadenas de la forma "aa", "aabb", "aabbcc", etc. (Prolog es Prolog, no especifica identidades para los caracteres que los hacen arriba, solo una especificación de qué caracteres son iguales). El más nuevo genera cadenas de la forma "aa", "abab", "abcabc", y así sucesivamente; este es un bucle infinito por derecho propio y, por lo tanto, nunca llega al punto en el que se atascaría al no detectar una cadena de longitud cero.fuente
Brainfuck, 177 bytes
Formateado:
Espera entrada sin una nueva línea final. Imprime
\x00
para falso y\x01
para verdadero.Pruébalo en línea.
Esto implementa la búsqueda de profundidad primero. En particular: verifique los prefijos repetidos de longitud creciente a partir del sufijo actual, luego vaya al siguiente sufijo si se encuentra una coincidencia; de lo contrario, retroceda.
Al principio, la cadena se invierte y
\x01
se coloca un centinela al final.La cinta se divide en nodos de 4 celdas. El diseño de memoria de un nodo es:
c h x 0
dónde
c
está el carácter,h
es un indicador de si el carácter está en la primera mitad de un prefijo repetido yx
es un indicador para realizar un seguimiento del par de caracteres actual que se compara. Lash
banderas permanecen en su lugar mientras elx
banderas forman una ventana móvil.Si la cadena es deseable, el puntero aterriza junto al centinela al final del bucle principal; de lo contrario, el puntero se cae del lado izquierdo de la cadena mientras retrocede.
fuente
Brachylog , 5 bytes
Pruébalo en línea!
Tenga en cuenta que este algoritmo puede tomar muy largo tiempo, especialmente en los casos Falsey, ya que comprueba cada posible partición de la cadena de entrada.
Explicación
Para una cadena de entrada como
"ababcc"
,~c
intenta diferentes particiones hasta que llega["abab", "cc"]
, en cuyo punto~j
tiene éxito para ambos elementos de la lista,ᵐ
salidas["ab", "c"]
y el predicado tiene éxito.fuente
R , 31 bytes
Pruébalo en línea!
Basado en la respuesta de Retina.
R , 129 bytes
Y aquí hay una respuesta original, no regex:
Pruébalo en línea!
fuente
Lithp , 57 caracteres
Uso de la muestra:
fuente