Dada una cadena como entrada, encuentre la subcadena contigua más larga que no tenga ningún carácter dos veces o más. Si hay varias de estas subcadenas, también puede generarlas. Puede suponer que la entrada está en el rango ASCII imprimible si lo desea.
Tanteo
Las respuestas se clasificarán primero por la longitud de su propia subcadena no repetida más larga, y luego por su longitud total. Los puntajes más bajos serán mejores para ambos criterios. Dependiendo del idioma, esto probablemente se sentirá como un desafío de código de golf con una restricción de fuente.
Trivialidad
En algunos idiomas, lograr un puntaje de 1, x (lenguaje) o 2, x (Brain-flak y otras lonas de turing) es bastante fácil, sin embargo, hay otros idiomas en los que minimizar el subsuelo más largo que no se repite es un desafío. Me divertí mucho obteniendo un puntaje de 2 en Haskell, así que te animo a buscar idiomas donde esta tarea sea divertida.
Casos de prueba
"Good morning, Green orb!" -> "ing, Gre"
"fffffffffff" -> "f"
"oiiiiioiiii" -> "io", "oi"
"1234567890" -> "1234567890"
"11122324455" -> "324"
Presentación de puntaje
Puede calificar sus programas con el siguiente fragmento:
fuente
11122324455
Jonathan Allan se dio cuenta de que mi primera revisión no lo manejó correctamente.11122
ocurre después324
, pero se deduplica a12
.Respuestas:
C, puntuación de 2,
747720662 bytesFunciona al menos en MinGW de 32 bits (con optimizaciones deshabilitadas). No usa una sola palabra clave.
Al parecer, también funciona en TIO con gcc y clang: ¡ Pruébelo en línea! (¡Gracias @ Dennis!)
Llamar con:
Salida:
El código con un formato ligeramente más legible:
Y esto se puede usar para generar el espaciado adecuado para llegar al formato con puntaje 2: ¡ Pruébelo en línea!
C, puntaje 3, 309 bytes
Pruébalo en línea!
fuente
Haskell , puntaje 2,
492...307224212209207 bytesPruébalo en línea!
¡Golfó literalmente cientos de bytes gracias a WW y Ørjan Johansen !
Explicación
La función
(??)
toma un carácterc
y una cadenas
y devuelve el prefijo más largos
que no contienec
. Sin golf y no optimizado para la puntuación:La función
ss
utiliza(??)
para encontrar el prefijo más largo de caracteres únicos de una cadena dada:(##)
es una función que toma dos cadenas y devuelve la más larga. La comparación de longitud funciona repitiendo la cadenax
tantas veces comox
sea largo (x>>y
) y comoy
es largo (y>>x
) y verificando cuál de las cadenas resultantes es lexicográficamente más grande.Finalmente se
ff
repite sobre la cadena de entrada, genera el prefijo más largo conss
, determina recursivamente la subcadena no repetida más larga de la cola de la cadena y devuelve la más larga de las dos con(##)
:fuente
@
truco en realidad cuesta 2 bytes sobre solo hacer?
dos caracteres: 207Lua, puntaje 3, 274 bytes
Nota: se requiere Lua 5.2 o Lua 5.3
Uso:
Idea principal: intercalar todo con espacios, insertar
" "
(dos espacios) para dividir identificadores largosCódigo sin golf:
Programa real (después de eliminar todos los pares de espacios):
Por cierto, el fragmento JS para calcular la puntuación falla en mi código.
fuente
Retina 0.8.2 , 37 bytes, puntaje 9
Pruébalo en línea! La traducción directa de esta respuesta a Retina 1 guarda un byte usando en
N
lugar deO#
. Sin embargo, si ingenuamente juega golf, la Retina 1 responde a 28 bytes, ¡su puntuación en realidad aumenta a 10! Explicación:Genere todos los sufijos de la entrada.
Para cada sufijo, tome el prefijo hasta el primer carácter duplicado.
Ordene las cadenas restantes en orden inverso de longitud (es decir, las más largas primero).
Toma el más largo.
fuente
Jelly , puntaje 2, 14 bytes
Gracias a @JonathanAllan por el puntaje -1, +7 bytes y por notar un error.
Pruébalo en línea!
Cómo funciona
fuente
Limpio , puntaje
75, 276 bytesPruébalo en línea! Gracias a @ Οurous por mostrarme que es posible llamar al código de máquina ABC directamente desde Clean. Esto permite deshacerse del cuello de botella anterior
import
que establece el puntaje mínimo en 7, pero necesita la palabra clavecode
que establece el puntaje mínimo en 5 para este enfoque.Aquí puede encontrar una versión no optimizada y sin puntaje optimizado del código anterior: ¡ Pruébelo en línea!
Versión anterior con puntaje 7,
158154130 bytesPruébalo en línea!
Con la
import
puntuación no puede ir por debajo de 7. Sin la importación, sería necesario implementar la igualdad en cadenas o caracteres sin ninguna función de biblioteca queprobablemente nosea posible, como se puede ver en la nueva versión anterior.fuente
A code block with raw ABC instructions, which can be used for primitive functions like integer addition, for linking with C, bypassing the type system... welcome down the rabbit hole!
( de cloogle ) ciertamente suena atractivo. Lo investigaré mañana, ¡gracias por la sugerencia!-IL
bandera, ya que no se importa nada.Python 3 , puntaje 4, 155 bytes
Esto define una función
l
.Gracias a @xnor por señalar que las cadenas de longitud 3 no aumentan la puntuación, ahorrando 32 bytes.
Pruébalo en línea!
fuente
Brachylog , puntaje 2, 19 bytes
Pruébalo en línea!
Solo una vieja y aburrida respuesta de "espacia todo". Al menos aprendí que los metapredicados se pueden separar de los predicados y aún funcionan (y los subíndices y superíndices (paramétricos) no pueden).
s ᶠ
- encuentra todas las subcadenas de la cadena dadal ᵒ
- ordenarlos por su longitud (ascendente por defecto)≠ ˢ
- seleccione aquellos que tienen todos los elementos distintost
- obtener la cola (último elemento) de eso - el que tiene la mayor longitudfuente
Pyth , 11 bytes, puntaje 4
-4 puntuación gracias a Dennis
Pruébalo en línea!
fuente
Cáscara , puntaje 2, 10 bytes
Pruébalo en línea!
Explicación
El programa es equivalente a esto:
El incorporado
Ë
evalúa≠
en todos los pares ordenados de su argumentox
, y devuelvelength(x)+1
si cada resultado es verdadero, de lo contrario0
. Cuando maximizamos esto, encontramos la cadena más larga que no tiene caracteres repetidos.En el envío, simplemente inserto la función de identidad
I
entre cada función, dos veces. ComoIË
es lo mismo queË
,I≠
es lo mismo≠
y así sucesivamente, esto no cambia la semántica. El único peligro es que una función de orden superior podría decidir usar uno de losI
s como argumento, pero afortunadamente eso lleva a un error de tipo en nuestro programa, por lo que no sucede.fuente
Clojure, puntaje 4
¡Oh hombre, esto fue doloroso!
N
implementanext
,R
esreduce
,C
escount
,J
esconj
(funciona solo para vectores) yI
esiterate
.apply str
Es allí dos veces porque de lo contrario "aaaa" de entrada no volvería una cadena, sino un vector[\a]
. Afortunadamente, pude usarapply
yassoc
no sabía que podía asociar un índice más allá del último elemento de un vector: ofuente
Jalea , puntaje 5, 10 bytes
Pruébalo en línea!
fuente
ẆµQQ ⁼ µ Ðf µ Ṫ
(probablemente agregó demasiados espacios ahora, pero es solo un ejemplo. Dejaré la optimización de conteo de bytes versus espacios depende de usted).Python 3 , puntaje 4, 317 bytes
Pruébalo en línea!
Código no eliminado:
lambda a
contiene elmbda
que tiene puntaje 5, y necesita una funciónreturn
que aparentemente no se puedeexec
editar (por lo tanto, toma un puntaje de al menos 5 paraeturn
), por lo que fue necesario un programa completo. Probablemente sea posible reducir un poco el tamaño del código no ejecutado, pero no puedo ver una mejora clara y rápida.fuente
Alice , 40 bytes
(Nueva línea final)
Pruébalo en línea!
El puntero de instrucciones se mueve diagonalmente en modo ordinal, por lo que solo se ejecuta cualquier otro carácter.
fuente
Perl 6 , puntaje:
15 108, longitud:46 5562 bytesPruébalo
Pruébalo
Pruébalo
Expandido:
fuente
Java 8, puntaje
9 (384 B)7 (401 B)Versión inicial. Bajaré desde aquí. El puntaje es de 9"ubstring "
, porsubstring
lo que será la primera parte para reemplazar." length"
, lo que probablemente no pueda reducir aún más. Dudo que sea posible eliminar los cuatro usos delength
. Si es posible," eturn"
(6) podría reducir la puntuación en 1 como mejora final, pero supongo que esto es todo (excepto tal vez una pequeña reducción en el conteo de bytes ...)Pruébalo en línea.
fuente
Haskell , puntaje 7
-4 gracias a Laikoni.
Pruébalo en línea!
fuente
f s=snd$maximum[(0<$i,i)|i<-tails=<<inits s,nub i==i]
guarda un byte y dos en el puntaje.Mathematica, puntaje
119Afeitando un par de bytes de la cadena no repetitiva más larga al ocultar el nombre de la función:
fuente
Kotlin , puntuación:
11109 bytes, longitud:227246245 bytesEl más largo es
ubstring
, que son 9 caracteres.Se llama así:
fuente
roupingBy
y{
?roupingBy
(que es de 9 caracteres) peroeachCount
(en sistemas de arrastre espacio).roupingBy
tiene un espacio final (visible en el descuento, pero el renderizador parece despojarlo)Pyth , puntaje 3 (
1814 bytes)Pruébalo en línea!
La subcadena más larga que no se repite es
.:
.fuente
e f {I T .:
.05AB1E , 22 bytes | Puntuación: 2
-1 puntuación + 7 bytes gracias a HeebyJeeby
Pruébalo en línea!
05AB1E , 15 bytes | Puntuación: 3
Pruébalo en línea!
05AB1E , 8 bytes | Puntuación: 8
Pruébalo en línea!
05AB1E realmente puede hacer algo bastante barato ... agregar espacios en blanco en 05AB1E no hace nada.
Si hay una regla en contra de esto, también puedo usar
´
y gustar otros 7 caracteres.fuente