Entrada
Una cadena alfanumérica s.
Salida
La cadena más corta que aparece exactamente una vez como una subcadena (contigua) s. Los sucesos superpuestos se cuentan como distintos. Si hay varios candidatos de la misma longitud, debe mostrarlos todos en el orden de aparición. En este desafío, la cadena vacía ocurre n + 1veces en una cadena de longitud n.
Ejemplo
Considera la cuerda
"asdfasdfd"
La cadena vacía aparece 10 veces en ella, por lo que no es un candidato para una ocurrencia única. Cada una de las letras "a", "s", "d", y "f"tiene lugar al menos dos veces, así que no son candidatos tampoco. Las subcadenas "fa"y "fd"aparecen solo una vez y en este orden, mientras que todas las demás subcadenas de longitud 2 aparecen dos veces. Por lo tanto, la salida correcta es
["fa","fd"]
Reglas
Ambas funciones y programas completos están permitidos, y las lagunas estándar no. El formato exacto de la salida es flexible, dentro de lo razonable. En particular, no se permite producir ningún resultado para la cadena vacía, pero arrojar un error no. El conteo de bytes más bajo gana.
Casos de prueba
"" -> [""]
"abcaa" -> ["b","c"]
"rererere" -> ["ererer"]
"asdfasdfd" -> ["fa","fd"]
"ffffhhhhfffffhhhhhfffhhh" -> ["hffff","fffff","hhhhh","hfffh"]
"asdfdfasddfdfaddsasadsasadsddsddfdsasdf" -> ["fas","fad","add","fds"]
Tabla de clasificación
Aquí está la tabla de clasificación por idioma que prometí.
Para asegurarse de que su respuesta se muestre, comience con un título, utilizando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde Nestá 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
<script src='https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js'></script><script>site = 'meta.codegolf',postID = 5314,isAnswer = true,QUESTION_ID = 45056;jQuery(function(){var u='https://api.stackexchange.com/2.2/';if(isAnswer)u+='answers/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJeRCD';else u+='questions/'+postID+'?order=asc&sort=creation&site='+site+'&filter=!GeEyUcJFJO6t)';jQuery.get(u,function(b){function d(s){return jQuery('<textarea>').html(s).text()};function r(l){return new RegExp('<pre class="snippet-code-'+l+'\\b[^>]*><code>([\\s\\S]*?)<\\/code><\/pre>')};b=b.items[0].body;var j=r('js').exec(b),c=r('css').exec(b),h=r('html').exec(b);if(c!==null)jQuery('head').append(jQuery('<style>').text(d(c[1])));if (h!==null)jQuery('body').append(d(h[1]));if(j!==null)jQuery('body').append(jQuery('<script>').text(d(j[1])))})})</script>

Respuestas:
Pyth,
2726 bytesPruébalo aquí.
Tenga en cuenta que debido a un error en el compilador en línea, el caso de cadena vacía solo funciona correctamente en la versión de línea de comandos, que se puede encontrar aquí.
También puede curar el error dando una nueva línea como entrada para el compilador en línea.
Explicación:
fuente
zen ninguna entrada falla en línea, por lo que definitivamente es un error en el intérprete.Python 3,
12412311196 bytesBusca cadenas de modo que la primera aparición desde la izquierda sea la misma que la primera desde la derecha. El
+1en elrangees para acomodar el caso de cadena vacía.Ahora bien, si sólo se tenía una pitón
.count()que contó con la superposición de partidos, a continuación, esto habría sido una feria poco más corto.fuente
Mathematica,
959479 bytesStringCasesme proporciona todas las subcadenas posibles,TallyyCasesfiltra las que aparecen más de una vez yMinimalByencuentra las que son más cortas.fuente
&al final del código?GolfScript, 44 bytes
Toma de entrada como una cadena en la entrada estándar y las salidas en una sintaxis de doble matriz: por ejemplo
[["b"] ["c"]].Demostración en líneaDisección
Esto se organiza de modo que no se requiera un caso especial para la cadena vacía (que he incluido como caso de prueba en la demostración en línea vinculada anteriormente).
fuente
CJam,
52 4340 bytesLa entrada es la cadena sin comillas
Explicacion :
Ejemplo:
Salida
Pruébalo en línea aquí
fuente
Scala, 120 bytes
Comencé con 140, que al menos ya cabe en un tweet.
fuente
(_)funciona solo como la identidad en lugar del=>l?list.groupBy(_)es lo mismo quex => list.groupBy(x). No tengo idea de por qué lo implementaron así.JavaScript (ES6), 109
110Edite la búsqueda en lugar de indexOf, ya que la cadena de entrada es alfanumérica. Gracias @IsmaelMiguel
Función recursiva, buscando subcadenas que comienzan con longitud 1 y suben.
Desengañado y explicado
Prueba en la consola FireFox / FireBug
Salida
fuente
.searchlugar de.indexOfy ahorre 2 bytes.s.indexOf(a)+1). Si bien es cierto que no funcionará con esos caracteres, ¡no tiene que preocuparse! Citando el OP: "Input: An alphanumeric string s."Java, 168
176 233Aquí hay un ejemplo de bucle anidado bastante básico.
O un poco más legible:
fuente
+++para mostrar si es+ ++o++ +ayudaría ... Y si quieres ahorrar unos cuantos más bytes, puede haber una manera de hacer que al inicializarq=1, reemplazandoq++conq=t, y su sustituciónl++<t&q<1con algo parecidot>l+=q. Probablemente requiera ajustar uno o dos otros desplazamientos para que funcione.+++. He estado tratando de modificarlo (especialmenteq, lo que se siente un poco derrochador), pero aún no he encontrado nada sólido.+++siempre se resuelve++ +.Haskell,
169162155153151138120115Para usarlo:
Lo que da:
Por cierto. Odio la última línea de mi código (repetición deh y). ¿Alguien sugiere deshacerse de él?fuente
g y=q(minimum.(map l)$y)$y(sonmap lrealmente necesarios los paréntesis ?) Y luegof=g.concat.q 1.group.sort.concatMap inits.tails?>>=lugar deconcatMap, es decir,f x=p$concat$q 1$group$sort$(tails x>>=inits)ahorra 2 bytes. ¿Por qué laData.Ordimportación?qson innecesarios, ya que puede escribirfilter$(==)k.l, al igual que los últimos$y los espacios antes de laysp. También puede eliminar los puntos y comas después de las importaciones (Data.Ordparece realmente innecesario).$seguido de un no espacio. Afeitará algunos bytes, pero ¿está en la especificación del idioma?J,
61584442403837 bytesAquí hay una versión dividida en los componentes individuales de la solución:
x #/. ycalcula para cada elemento distinto conxqué frecuencia ocurre eny. Si usamos esto comoy #/. y, obtenemos el para cada elemento distinto enysu recuento. Por ejemplo,a #/. aparaa =. 1 2 2 3 4 4rendimientos1 2 1 2.1 = ycomprueba a qué elementos deyson iguales1. Por ejemplo,1 = a #/. arendimientos1 0 1 0.u~Es el reflejo de un verbo monádicou. Esto es,u~ yes lo mismo quey u y. Por lo tanto,#/.~ yes lo mismo que#/.~ y. Cuando se aplica a un verbo diádico,u~es el pasivo deu. Es decir,x u~ yes lo mismo quey u x. Estos se utilizan en muchos otros lugares que no menciono explícitamente.~. yes la protuberancia deyun vector con duplicados eliminados. Por ejemplo,~. arendimientos1 2 3 4.x # y( copia ) selecciona deylos elementos en los índices dondexcontiene a1.(1 = y #/. y) # (~. y)crea un vector de aquellos elementos de losycuales aparecen solo una vez. En notación tácita, este verbo se escribe como~. #~ 1 = #/.~; llamemos a esta fraseunqspara el resto de la explicación.x ]\ ycrea unaxpor1 + y - xmatriz de todos los infijos del vectoryde longitudx. Por ejemplo,3 ]\ 'asdfasdfdrendimientos# yes el recuento dey, es decir, el número de elementos eny.u\ yse aplicaua cada prefijo dey. Por cierto,#\ ycrea un vector de enteros desde1hasta#y.< yponeyen una caja. Esto es necesario porque las matrices no pueden ser desiguales y calculamos una matriz de sufijos de diferentes longitudes; una matriz en caja cuenta como un escalar.Por lo tanto,
(i. # y) <@:unqs@(]\) ygenera un vector de#ymatrices en caja de la longitud k (para todos los infijos de 0 ≤ k <#y) de y que ocurren exactamente una vez. La forma tácita de este verbo esi.@# <@unqs@(]\) ]oi.@# <@(~. #~ 1 = #/.~)@(]\) ]si no usamos elunqsnombre. Llamemos a esta fraseallsbsqpara el resto de esta explicación. Por ejemplo,allsbsq 'asdfasdfd'produce:(#@> y) # ytoma del vector de matrices en cajaylas que no están vacías.{. ytoma el primer elemento del vectory.> yquita la caja dey.> {. (#@> y) # yproduce la primera matriz no vacía sin caja del vector de matrices en cajay. Esta frase esta escrita>@{.@(#~ #@>)en notación tácita.Finalmente,
[: >@{.@(#~ #@>) allsbsqensambla la frase anterior conallsbsqpara crear una solución al problema que tenemos. Aquí está la frase completa con espacios:fuente
Haskell, 135 bytes
fuente
PHP,
171152134125http://3v4l.org/RaWTN
fuente
$j=0. Adelante, tienessubstr($s,$j++,$i). Sin definir$j, puede volver a escribir estosubstr($s,0+$j++,$i)y guardar 2 bytes. ¿Porqué es eso? Bueno, la primera vez,$jseránull. Y efectivamente pasarásnullasubstr, lo que no creo que funcione bien. El uso0+$j++convertirá elnulla0. Si ve que no es necesario, continúe sin él y simplemente quite la$j=0pieza.$jlo que no se borra y reinicia para cada iteración delwhile()bucle. Entonces, aunque es nulo (y, por lo tanto, se convertiría en0una$j++llamada) la primera vez, en futuras iteraciones del bucle externo se deja en el valor que tenía antes. No es tanto inicializar como reiniciar. Gracias por la sugerencia :-)function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)($b=substr($s,$j++,$i))&(strpos($s,$b)==strrpos($s,$b)&&($a[]=$b));return$a;}Cambios: Eliminé TODOS||1, usé bitwise&(AND) en lugar de&&en un lugar, moví la$j<$l&&[...]parte fuera defor(ahorrando 2 bytes) y eliminé algunos paréntesis innecesarios.function f($s){$l=strlen($s);while(!$a&&++$i<$l)for($j=0;$j<$l;)strpos($s,$b=substr($s,$j++,$i))==strrpos($s,$b)&&($a[]=$b);return$a;}Cambios realizados en el código anterior: movió$b=substr($s,$j++,$i)astrpos($s,$b)hacerlostrpos($s,$b=substr($s,$j++,$i)), eliminó los paréntesis más innecesarios y eliminó los innecesarios&.substr($s,$j++,$i)regresa""cuando$jalcanza la longitud de la cadena yfalse, a partir de entonces, esa asignación también puede servir como el salto condicional del bucle. Entonces solo queda un uso$lrestante, por lo que también se puede consolidar.Groovy (expresión regular de Java en la implementación de Oracle), 124
Probado en Groovy 2.4 + Oracle JRE 1.7. La expresión regular debería funcionar para Java 6 a Java 8, ya que el error que permite que funcione el código anterior no está solucionado. No estoy seguro de la versión anterior, ya que hay un error retrospectivo en Java 5 que se corrigió en Java 6.
La expresión regular encuentra la cadena más corta que no tiene una subcadena duplicada en otro lugar, en cada posición de la cadena de entrada. El código externo se encarga del filtrado.
(?=...).(.*?)búsquedas desde la subcadena más corta(?=(.*))captura el resto de la cadena para marcar la posición actual.(?<=^(?!.*\1(?!\2$)).*)es una emulación de retrospectiva de longitud variable, que aprovecha el error de implementación que permite(?<=.*)pasar la verificación de longitud.(?!.*\1(?!\2$))simplemente verifica que no puedas encontrar la misma subcadena en otro lugar. los(?!\2$)rechaza la posición original donde se empareja la subcadena.El límite de la construcción de búsqueda externa no se aplica a la construcción de búsqueda anidada. Por lo tanto, la vista anticipada negativa anidada
(?!.*\1(?!\2$))realmente comprueba la cadena completa, no solo hasta el límite derecho de la vista posterior.fuente
Rebol, 136 bytes
Sin golf:
Ejemplo de uso:
NÓTESE BIEN. Supongo que el corazón del código es cómo funciona la
findpieza. Esperemos que esto ayude a explicar ...fuente
Haskell, 119
fuente
q = lengthalgún lugar y usarq,Brachylog , 10 bytes
Pruébalo en línea!
Aunque
ᵍnaturalmente no se ordena por el valor por el que agrupa, en su lugar ordena los grupos por la primera aparición de cada valor, las primeras ocurrencias de cada longitud están en orden decreciente. No estoy 100% seguro de que el filtrado de singularidad no pueda estropear esto, pero aún no he encontrado un caso de prueba que falle.fuente
05AB1E , 10 bytes
No genera nada para una cadena vacía.
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Esto aprovecha que 05AB1E solo tiene
1un valor tan verdadero y todo lo demás como falsey. Siempre se garantiza que la subcadena única más corta se produce exactamente una vez para todas las cadenas de entrada posibles. (Para una cadena de entrada que contiene solo los mismos caracteres (es deciraaaaa), las cadenas de entrada en sí como subcadena ocurren solo una vez, por lo que el resultado es["aaaaa"]. Para una cadena de entrada con patrón repetitivo (es decir"abcabc"), todavía hay subcadenas únicas que solo ocurrir una vez (["abca","abcab","abcabc","bca","bcab","bcabc","ca","cab","cabc"]), por lo que esto resultará en["ca"])fuente
Pitón 2, 150
fuente
"", pero no imprime nada.Perl 5
-a,11487 bytesPruébalo en línea!
Método antiguo: 114 bytes
fuente