Factorización de palabras de Lyndon

11

Antecedentes

Una palabra de Lyndon es una cadena no vacía que es estrictamente lexicográfica más pequeña que todas sus otras rotaciones. Es posible factorizar cualquier cadena de forma única como la concatenación de palabras de Lyndon de manera que estas subpalabras no sean lexicográficas; Su desafío es hacer esto de la manera más sucinta posible.

Detalles

Debe implementar una función o programa que enumere la factorización de palabras de Lyndon de cualquier cadena ASCII imprimible, en orden, generando las subcadenas resultantes como una matriz o secuencia de algún tipo. Los caracteres se deben comparar por sus puntos de código, y se permiten todos los métodos de entrada y salida estándar. Como de costumbre para , gana el programa más corto en bytes.

Casos de prueba

''           []
'C'          ['C']
'aaaaa'      ['a', 'a', 'a', 'a', 'a']
'K| '        ['K|', ' ']
'abaca'      ['abac', 'a']
'9_-$'       ['9_', '-', '$']
'P&O(;'      ['P', '&O(;']
'xhya{Wd$'   ['x', 'hy', 'a{', 'Wd', '$']
'j`M?LO!!Y'  ['j', '`', 'M', '?LO', '!!Y']
'!9!TZ'      ['!9!TZ']
'vMMe'       ['v', 'MMe']
'b5A9A9<5{0' ['b', '5A9A9<5{', '0']
user1502040
fuente
Tenga en cuenta que esto es equivalente a dividir por <=ness. (No tengo idea de cómo expresar esto mejor: |)
CalculatorFeline
¿Es esto equivalente a tomar repetidamente el primer carácter y el prefijo de todos los caracteres más grandes?
xnor
@xnor No. 'abac' es una palabra de Lyndon.
user1502040
@ user1502040 Ya veo, los lazos son interesantes. Sugeriría agregar algunos casos de prueba que capten esto.
xnor

Respuestas:

5

Pyth, 17 16 bytes

-1 byte gracias a isaacg!

hf!ff>Y>YZUYT+./

Pruébalo en línea!

Explicación

hf!ff>Y>YZUYT+./
              ./    Take all possible disjoint substring sets of [the input]
             +      plus [the input] itself (for the null string case).
 f                  Filter for only those sets which
  !f        T       for none of the substrings
    f  >YZUY        is there a suffix of the substring
     >Y             lexographically smaller than the substring itself.
h                   Return the first (i.e. the shortest) such set of substrings.
notjagan
fuente
1
hf!ff>Y>YZUYT+./representa el caso de cadena vacía con 1 byte menos.
isaacg
¡Genial gracias! Sentí que debía haber un camino más corto.
notjagan
0

Pyth - 28 bytes

hf&SI_T.Am.A>Rdt.u.>N1tddT./

Test Suite .

Maltysen
fuente
1
Esto parece fallar en la cadena vacía.
user1502040