Objectif
Écrivez une routine qui accepte une chaîne de caractères ASCII imprimables, s , et renvoie une chaîne contenant les mêmes caractères que s , réorganisée de sorte qu'aucune sous-chaîne à deux caractères n'apparaisse plus d'une fois. Le programme doit traiter toutes les chaînes de référence (voir ci-dessous) en moins d'une minute chacune sur un ordinateur moderne . J'accorderai également un bonus spécial de 50 répétitions à la réponse ayant obtenu le score le plus bas qui traite toute chaîne de 30 caractères valide en moins d'une minute.
Par exemple, étant donné l'entrée Mississippi
, une sortie valide serait issiMspiips
(aucune sous-chaîne à deux caractères n'apparaît deux fois), tandis qu'une sortie non valide le serait ipMsispiiss
(puisque la sous-chaîne is
apparaît deux fois).
La routine peut prendre la forme de:
- une lecture complète du programme à partir de
stdin
(ou équivalent) ou de la ligne de commande, et une sortie versstdout
(ou équivalent) - une fonction acceptant un seul argument de chaîne et renvoyant une chaîne
Vous pouvez supposer que la chaîne d'entrée admet toujours au moins une sortie valide.
Le défi
Votre routine doit comprendre 5 lignes de code ou plus séparées par des retours à la ligne. Les lignes vides (qui incluent les lignes contenant uniquement des espaces blancs) sont ignorées dans tous les contextes et ne comptent pas dans le nombre total de lignes.
L'échange de deux lignes dans votre code source doit produire une erreur fatale. Par "erreur fatale", nous nous référons à l'une des conditions suivantes:
- le code source ne parvient pas à compiler, le compilateur / interprète déclarant une erreur fatale
- la routine s'interrompt avec une erreur fatale d'exécution ou une exception d'exécution non gérée
- la routine est forcée dans une interruption de programme anormale et abrupte qui ne produit aucune sortie d'aucune sorte, sauf pour un message d'erreur possible et / ou un vidage de pile
Alternativement , des blocs de code contigus ne contenant aucun caractère de nouvelle ligne peuvent être utilisés à la place des lignes. Ces blocs doivent chacun être affichés sur leur propre ligne dans le fichier source, étant entendu que les sauts de ligne sont supprimés avant que le code source soit compilé / interprété.
Par exemple, le code
aaaa
bbbb
cccc
se condenserait en
aaaabbbbcccc
avant d'être évalué.
Dans ce mode, la condition d'erreur fatale s'applique à l'échange de deux blocs de code (et donc à l'échange de lignes dans le code source avant la suppression des sauts de ligne). Par conséquent, dans l'exemple ci-dessus, les routines aaaaccccbbbb
, bbbbaaaacccc
et ccccbbbbaaaa
doivent toutes produire des erreurs fatales, soit au moment de la compilation soit à l'exécution.
Les soumissions utilisant ce mode alternatif doivent déclarer son utilisation.
Notation
Soit n le nombre de lignes de texte non vides dans votre fichier source, avec n ≥ 5. Soit c le nombre d'octets compris par la ligne de texte la plus longue (par longueur d'octet) dans votre fichier source, sans compter les sauts de ligne de fin.
La note d'une soumission est donnée par c ( n + 10).
La soumission avec le score le plus bas est gagnante.
Bonne chance. ;)
Cordes de référence
Abracadabra Alacazam
Is Miss. Mississauga Missing?
Ask Alaska's Alaskans
GGGGAAAATTTTCCCCgggaaatttccc
A Man A Plan A Canal Panama
Mspiisiipss
valable car la seule répétition est celle ii
qui ne se produit pas dans Mississippi
?
CooliO
, la sortieoOoCli
?