Explication
Deux chaînes peuvent être mélangées en intercalant leurs lettres pour former une nouvelle chaîne, tout comme deux piles de cartes peuvent être mélangées pour former une seule pile.
Par exemple, les chaînes HELLO
et WORLD
peuvent être mélangées pour former HWEOLRLLOD
, ou HEWORLLLDO
, ou peut-être simplement HELLOWORLD
.
Ce n'est pas un mélange si l'ordre des lettres d'origine n'est pas conservé. Par exemple, le D
in WORLD
ne peut jamais apparaître avant le R
après avoir été mélangé. Cela signifie que EHLLOWRDLO
, par exemple, n'est pas un mélange de HELLO
et WORLD
, même s'il contient toutes les lettres originales.
Une chaîne est un mélange de jumeaux si elle peut être formée en mélangeant deux chaînes identiques. Par exemple, ABACBDECDE
est un mélange de jumeaux car il peut être formé par mélange ABCDE
et ABCDE
. DBEACBCADE
n'est pas un mélange de jumeaux car il ne peut pas être formé en mélangeant deux chaînes identiques.
Détails du programme
Étant donné une chaîne d'entrée, sortez 0
si ce n'est pas un mélange de jumeaux, et sortez l'une des chaînes jumelles s'il s'agit d'un mélange de jumeaux.
Vous pouvez supposer que la chaîne d'entrée a une longueur comprise entre quatre et vingt caractères et est entièrement composée de caractères alphabétiques majuscules. Il devrait pouvoir fonctionner dans un laps de temps raisonnable, disons moins de 10 minutes.
C'est le golf de code, donc la solution la plus courte l'emporte.
Exemple d'E / S
> ABACBDECDE
ABCDE
> DBEACBCADE
0
> FFFFFF
FFF
> FFGGG
0
> ABBA
0
> AABB
AB
> AABAAB
AAB
J'ai un exemple d'implémentation (non-golfé) .
la source
that the input string has a length inclusively between four and twenty characters
et ne me dites pas "ne faites jamais confiance aux entrées de l'utilisateur!", "Ne faites jamais confiance aux spécifications!"FFGGG
pour le rendre cohérent.Réponses:
Haskell, 114
Non golfé:
Explication:
La plupart du travail se fait dans la
partitions
fonction. Il fonctionne en générant récursivement toutes les partitions(a, b)
de la fin de la liste, puis en utilisant la monade de liste pour ajouter l'élément initialx
à chacune d'entre elles et rassembler tous les résultats.findMatch
fonctionne en filtrant cette liste afin qu'il ne reste que les partitions où les sous-séquences sont égales. Il renvoie ensuite la première sous-séquence de la première partition. S'il n'en reste pas, la liste est vide, donc le"0"
texte ajouté à la fin est renvoyé à la place.main
lit simplement l'entrée, la fait passer par ces deux fonctions et l'imprime.la source
R, 113 caractères
Non golfé (et à la place une fonction qui prend la chaîne):
La solution repose sur la
combn
fonction qui génère toutes les combinaisons d'indices sous forme de colonnes dans une matrice.apply
applique ensuite une fonction à chaque colonne (dimension2
) de la matrice et renvoie un vecteur de chaînes ou de zéros.max
puis trouvez la plus grande chaîne (qui l'emporte sur 0).Une caractéristique intéressante de R est la possibilité de sélectionner un sous-ensemble d'un vecteur donné un vecteur d'indices, puis de sélectionner le complément de ce sous-ensemble en annulant les indices:
x[i] == x[-i]
la source
Mathematica, 87
Ceci est directement basé sur le post de hammar, mais j'espère qu'il est suffisamment distinct pour mériter d'être publié.
Tester:
la source
ré
utilisation de la première recherche récursive en profondeur
Je peux faire plus vite avec une
int i = min(a.length,b.length);if(a[0..i]!=b[0..i])return "0";
clause de gardela source
void main(){writeln(c("ABCADABCAD"));}
- juste une version différente de D, ma faute, autre chose? Et ABCABCA?Ruby, 89 caractères
Ce code implémente un algorithme de recherche récursif simple. L'entrée doit être donnée sur STDIN.
la source
Perl, 68 caractères
La chaîne d'entrée supposée être dans la
$_
variable, la sortie est la valeur de l'expression. Les retours à la ligne en fin d'entrée sont ignorés. Vous pouvez l'exécuter à partir de la ligne de commande comme ceci:Ce code utilise le moteur d'expression rationnelle de Perl (et en particulier sa fonction d' exécution de code intégrée) pour effectuer le retour arrière. Fondamentalement, il fait correspondre la chaîne d'entrée à l'expression rationnelle
^((.+))+$
, en gardant une trace des sous-correspondances impaires et paires dans$x
et$,
, et en rejetant la correspondance à la fin si les deux ne sont pas égaux.la source
AABAAB
?AABAAB
c'est un cas facile pour cette solution, car le groupe externe n'a besoin que de correspondre deux fois. Il m'a fallu beaucoup plus de temps pour le gérerAABB
correctement.)Python, 168 caractères
la source