Factorisation des mots de Lyndon

11

Contexte

Un mot Lyndon est une chaîne non vide qui est strictement lexicographiquement plus petite que toutes ses autres rotations. Il est possible de factoriser n'importe quelle chaîne uniquement comme la concaténation des mots de Lyndon de telle sorte que ces sous-mots sont lexicographiquement non croissants; votre défi est de le faire aussi succinctement que possible.

Détails

Vous devez implémenter une fonction ou un programme qui énumère la factorisation des mots Lyndon de toute chaîne ASCII imprimable, dans l'ordre, en sortant les sous-chaînes résultantes sous la forme d'un tableau ou d'un flux quelconque. Les caractères doivent être comparés par leurs points de code, et toutes les méthodes d'entrée et de sortie standard sont autorisées. Comme d'habitude pour le , le programme le plus court en octets l'emporte.

Cas de test

''           []
'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
la source
Notez que cela équivaut à une division par <=ness. (Je ne sais pas comment mieux l'exprimer: |)
CalculatorFeline
Est-ce équivalent à prendre à plusieurs reprises le premier caractère et le préfixe de tous les caractères plus gros que lui?
xnor
@xnor No. 'abac' est un mot de Lyndon.
user1502040
@ user1502040 Je vois, les liens sont intéressants. Je suggère d'ajouter des cas de test qui attrapent cela.
xnor

Réponses:

5

Pyth, 17 16 octets

-1 octet grâce à isaacg!

hf!ff>Y>YZUYT+./

Essayez-le en ligne!

Explication

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
la source
1
hf!ff>Y>YZUYT+./représente le cas de chaîne vide avec 1 octet de moins.
isaacg
Bien, merci! J'avais l'impression qu'il devait y avoir un chemin plus court.
notjagan
0

Pyth - 28 octets

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

Suite de tests .

Maltysen
la source
1
Cela semble échouer sur la chaîne vide.
user1502040