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 + 1
veces 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 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
<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
z
en 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
+1
en elrange
es 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 bytesStringCases
me proporciona todas las subcadenas posibles,Tally
yCases
filtra las que aparecen más de una vez yMinimalBy
encuentra 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
.search
lugar de.indexOf
y 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<1
con 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 l
realmente 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.Ord
importación?q
son innecesarios, ya que puede escribirfilter$(==)k.l
, al igual que los últimos$
y los espacios antes de lay
sp
. También puede eliminar los puntos y comas después de las importaciones (Data.Ord
parece 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 #/. y
calcula para cada elemento distinto conx
qué frecuencia ocurre eny
. Si usamos esto comoy #/. y
, obtenemos el para cada elemento distinto eny
su recuento. Por ejemplo,a #/. a
paraa =. 1 2 2 3 4 4
rendimientos1 2 1 2
.1 = y
comprueba a qué elementos dey
son iguales1
. Por ejemplo,1 = a #/. a
rendimientos1 0 1 0
.u~
Es el reflejo de un verbo monádicou
. Esto es,u~ y
es lo mismo quey u y
. Por lo tanto,#/.~ y
es lo mismo que#/.~ y
. Cuando se aplica a un verbo diádico,u~
es el pasivo deu
. Es decir,x u~ y
es lo mismo quey u x
. Estos se utilizan en muchos otros lugares que no menciono explícitamente.~. y
es la protuberancia dey
un vector con duplicados eliminados. Por ejemplo,~. a
rendimientos1 2 3 4
.x # y
( copia ) selecciona dey
los elementos en los índices dondex
contiene a1
.(1 = y #/. y) # (~. y)
crea un vector de aquellos elementos de losy
cuales aparecen solo una vez. En notación tácita, este verbo se escribe como~. #~ 1 = #/.~
; llamemos a esta fraseunqs
para el resto de la explicación.x ]\ y
crea unax
por1 + y - x
matriz de todos los infijos del vectory
de longitudx
. Por ejemplo,3 ]\ 'asdfasdfd
rendimientos# y
es el recuento dey
, es decir, el número de elementos eny
.u\ y
se aplicau
a cada prefijo dey
. Por cierto,#\ y
crea un vector de enteros desde1
hasta#y
.< y
poney
en 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@(]\) y
genera un vector de#y
matrices 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 elunqs
nombre. Llamemos a esta fraseallsbsq
para el resto de esta explicación. Por ejemplo,allsbsq 'asdfasdfd'
produce:(#@> y) # y
toma del vector de matrices en cajay
las que no están vacías.{. y
toma el primer elemento del vectory
.> y
quita la caja dey
.> {. (#@> y) # y
produce la primera matriz no vacía sin caja del vector de matrices en cajay
. Esta frase esta escrita>@{.@(#~ #@>)
en notación tácita.Finalmente,
[: >@{.@(#~ #@>) allsbsq
ensambla la frase anterior conallsbsq
para 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,$j
seránull
. Y efectivamente pasarásnull
asubstr
, lo que no creo que funcione bien. El uso0+$j++
convertirá elnull
a0
. Si ve que no es necesario, continúe sin él y simplemente quite la$j=0
pieza.$j
lo que no se borra y reinicia para cada iteración delwhile()
bucle. Entonces, aunque es nulo (y, por lo tanto, se convertiría en0
una$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$j
alcanza 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$l
restante, 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
find
pieza. Esperemos que esto ayude a explicar ...fuente
Haskell, 119
fuente
q = length
algú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
1
un 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