Su tarea es determinar qué tan palíndromo perfecto es una cuerda. Su palíndromo típico (por ejemplo, 12321) es un palíndromo perfecto; su perfección es 1.
Para determinar la perfección de una cadena, puede ver cuántas secciones puede dividir en donde cada sección es un palíndromo. Si hay ambigüedades, como con aaaa
, como se puede dividirlo en [aa, aa]
o [aaaa]
, o [a, aaa]
, o [aaa, a]
, el conjunto más corto anulará, dando aaaa
una puntuación de 1, que es la longitud de la serie más corta.
Por lo tanto, debe escribir un programa o función que tome una entrada y salida no vacía y cuán perfecta sea (que es la longitud del conjunto más corto que puede dividir en donde cada elemento del conjunto es un palíndromo).
Ejemplos:
1111 -> 1 [1111]
abcb -> 2 [a, bcb]
abcbd -> 3 [a, bcb, d]
abcde -> 5 [a, b, c, d, e]
66a -> 2 [66, a]
abcba-> 1 [abcba]
x -> 1 [x]
ababacab -> 2 [aba, bacab]
bacababa -> 2 [bacab, aba]
26600 -> 3 [2, 66, 00] [my user id] [who has a more perfect user id?]
ababacabBACABABA -> 4 [aba, bacab, BACAB, ABA]
Tenga en cuenta que en los ejemplos, cualquier cosa entre corchetes no debería ser parte de la salida.
ababacab
y su reverso,bacababa
parecen ser buenos casos de prueba.ababacabBACABABA
También es un buen caso de prueba (algunas respuestas fallan).Respuestas:
Brachylog , 7 bytes
Pruébalo en línea!
Explicación
fuente
Jalea ,
131211 bytesPruébalo en línea!
Especificaciones
"ababacab"
(como argumento)2
fuente
"\"
, porque esa es una sintaxis no válida.ababacab
y su reverso,bacababa
.Pyth, 9 bytes
Banco de pruebas
Esto forma todas las particiones de la entrada, desde la más corta hasta la más larga. Luego, filtra esas particiones en invariancia bajo filtrado de los elementos en invariancia bajo inversión. Finalmente, tomamos el primer elemento de la lista filtrada de particiones y devolvemos su longitud.
Para explicar tan complicado paso, vamos a empezar con la invariancia bajo la inversión:
_I
. Eso verifica si su entrada es un palíndromo, porque verifica si la inversión cambia el valor.A continuación, el filtrado de palindromía:
_I#
. Esto mantendrá solo los elementos palindrómicos de la lista.A continuación, comprobar si hay invariancia bajo el filtrado para palindromía:
_I#I
. Esto es verdad si y solo si todos los elementos de la lista son palíndromos.Por último, vamos a filtrar para las listas donde todos los elementos de la lista son palíndromos:
_I#I#
.fuente
Haskell , 83 bytes
Pruébalo en línea!
Esto utiliza el gran consejo de Zgarb para generar particiones de cadena .
fuente
Clojure, 111 bytes
Se divide en todas las posiciones posibles, y cuando la primera parte es un palíndromo, procede a encontrar una partición para el resto de la cadena.
Pruébalo en línea .
Ungolfed, usa macro de último hilo
->>
.Una versión oscura, por favor no escriba código como este: D
fuente
f
ha de llamarse a sí mismo dentro de la para:(f b)
. En una posición de cola puede usarrecur
.defn
confn
y solo tener una función.(fn f[s]( ... ))
? Oh verdad. Ahorras 2 personajes con eso.JavaScript (ES6),
143126124 bytesGuardado 2 bytes gracias a Neil
Inspirado en el método NikoNyrh .
Formateado y comentado
Casos de prueba
Mostrar fragmento de código
Enfoque inicial,
173168bytesUna función recursiva bastante larga que calcula todas las particiones posibles de la cadena de entrada.
Formateado y comentado
Casos de prueba
Mostrar fragmento de código
fuente
,p=0
,s[p++]?
y,F(s,i,p)
.Jalea , 10 bytes
Pruébalo en línea!
¿Cómo?
Utiliza el hecho de que
[0]<[0,0]<[0,0,0],...,<[0,...,0,1]<...
, por lo tanto, si clasificamos las particiones por una clave "no es palindrómica para cada parte", la primera entrada será totalmente palindrómica y de longitud mínima.
Nota: cualquier cadena de longitud n no vacía siempre dará como resultado una clave con n ceros, ya que todas las cadenas de longitud 1 son palindrómicas.
fuente
Haskell , 69 bytes
Define una función
f
. Pruébalo en línea!Explicación
La función auxiliar infija
x ! y
calcula una lista de enteros, que son las longitudes de algunas divisionesreverse x ++ y
en palíndromos dondereverse x
se deja intacta. Se garantiza que contiene la longitud de la división mínima siy
no está vacía. Cómo funciona es esto.y
no está vacío, se saca un char y se empuja hacia adentrox
. Si sex
convierte en un palíndromo, llamamos a la función principalf
en la cola dey
y agregamos 1 para tener en cuentax
. Además, pedimos!
lo nuevox
yy
no perder ninguna división potencial.y
está vacío, devolvemos[0]
(una división de longitud 0) six
también está vacío, y[]
(sin división) de lo contrario.La función principal
f
solo llama"" ! x
y toma el mínimo de los resultados.fuente
JavaScript (Firefox 30-57), 97 bytes
Puerto ES6:
Parece una solución tan simple que sigo pensando que he olvidado algo, pero al menos pasa todos los casos de prueba.
fuente
Haskell,
139116109 bytesTodavía verde en el golf de Haskell, pero este es mi mejor intento que puedo encontrar rápidamente.
(and.map r)
para eliminar sublistas que no contienen un palíndromo, en cuyo punto se aplica la longitud a la lista, y luego el resultado es ordenado para que podamos agarrar la cabeza, que es la respuesta.Estaba pensando que una mejor respuesta podría ser capaz de aprovechar la naturaleza no determinista de las Listas en Haskell mediante el uso de Solicitantes. Podría ser posible eliminar muchos bytes de la función h usando aplicativos, incluso si tenemos que importar Control.Applicative. Comentarios para mejorar son bienvenidos.
ACTUALIZACIÓN1
Grandes ahorros basados en el recordatorio de Laikoni sobre la función mínima. Eliminar la clasificación en realidad me permitió eliminar la importación de Data.List porque el mínimo se define en Prelude!
ACTUALIZACIÓN2
Gracias a la sugerencia de nimi sobre el uso de las comprensiones de listas como un reemplazo útil para filter.map. Eso me ahorró algunos bytes. También tomé prestado el truco ordenado de partición de cadenas de la respuesta de Laikonis y también guardé un par de bytes allí.
fuente
h []=[[]]
yh (x:y)=map ([x]:)
contienen espacios en blanco innecesarios.head.sort
esminimum
.filter
Ymap
:g x=head$sort[length y|y<-h x,and$r<$>y]
.PHP, 319 bytes
Versión en línea
Expandido
Versión más larga sin E_NOTICE y salida de la matriz resultante
fuente
ababacabBACABABA