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
CooliO
, la sortieoOoCli
?Mspiisiipss
valable car la seule répétition est celleii
qui ne se produit pas dansMississippi
?Réponses:
PHP, score = 289 (17 × (7 + 10))
Les fonctions intégrées de PHP facilitent assez mal cette opération. Le code suivant mélange simplement la chaîne jusqu'à ce qu'un résultat valide soit obtenu:
Repères
Temps d'exécution moyen et maximum calculés à l'aide du code suivant:
Résultats:
* J'ai changé
ä
poura
éviter les problèmes multi-octets† Il s'agit de la chaîne de 30 caractères la plus difficile que j'ai pu trouver. Il s'agit en fait des 30 premiers caractères de la séquence De Bruijn pour k = 'abcdef' et n = 2, avec le premier 'b' déplacé pour éviter une correspondance instantanée.
la source
Dyalog APL (11 (5 + 10) = 165)
Preuve:
⍵
se produirait en dehors d'une fonction, qui est aSYNTAX ERROR
.b
, elle ne peut donc pas être échangée contre des lignes3
ou4
, qui en dépendentb
. Il y aurait unVALUE ERROR
. (Et il ne peut évidemment pas être échangé avec1
ou5
non.)c
, donc elle ne peut pas être échangée contre la ligne4
, ce qui dépendc
. (Et nous avons déjà prouvé qu'aucune autre ligne ne peut être échangée avec la ligne3
.)la source
APL (Dyalog), 6 (5 + 10) = 90
J'utilise l'alternative, donc:
Il s'agit du même ancien algorithme.
L'explication
2,/⍵
donne un tableau de paires de caractères dans la chaîne d'entrée+/∘.≡⍨
génère un tableau numérique de combien de paires chaque paire égale (y compris elle-même)1∧.=
vérifie si chaque élément de ce tableau est égal à 1, et logique ET les résultats ensemble:⍵
Si c'est vrai (1
), retournez la chaîne d'entrée∇⍵[?⍨⍴⍵]
sinon brouiller la chaîne d'entrée et faire un appel récursifÉchange
Si la ligne 1 est échangée avec la ligne 2, vous vous retrouvez avec
+/∘.≡⍨{...}
ce qui n'est qu'un désordre de fonctions et d'opérateurs qui donneSYNTAX ERROR
.Si la ligne 1 est échangée avec la ligne 3 ou 4, alors vous avez en
⍵
dehors d'une définition de fonction, et c'est aSYNTAX ERROR
.Si la ligne 1 est remplacée par la ligne 5, les accolades asymétriques seules causeraient
SYNTAX ERROR
, alors ne vous inquiétez pas des autres erreurs de syntaxe 4.Si la ligne 5 est remplacée par la ligne 2/3/4, vous avez encore une fois en
⍵
dehors d'une définition de fonction. (SYNTAX ERROR
)Si la ligne 2 est remplacée par la ligne 3, vous vous retrouvez avec
1∧.=2,/⍵:⍵
. Cette syntaxe est appelée garde (pensez-y comme conditionnelle). La condition de garde doit être évaluée à0
ou1
ou à un tableau à 1 élément de0
ou1
. Ici, il s'évalue à quelque chose de plus complexe que cela (un scalaire contenant un tableau à 2 éléments). C'est donc unDOMAIN ERROR
.Si la ligne 2 est remplacée par la ligne 4, vous obtenez l'instruction
1∧.=
, qui tente d'appliquer la fonction∧.=
sans l'argument gauche requis. (SYNTAX ERROR
).Si la ligne 3 est remplacée par la ligne 4, vous obtenez à nouveau un désordre de fonctions et d'opérateurs (
1∧.=+/∘.≡⍨
) donc vous obtenezSYNTAX ERROR
.Repères
(nombres en millisecondes)
Je pense toujours à différentes répartitions. J'ai aussi une façon déterministe et systématique de faire la tâche. Je ne peux tout simplement pas en faire un algorithme (enlevez la partie créative de «faire les bons chiffres») et je ne peux pas m'assurer que cela fonctionne à chaque fois.
la source
Haskell, 129 = 3x (33 + 10)
cela utilise le mode alternatif.
ou sous une forme lisible:
Haskell est un langage très strict. par exemple, le
import
doit venir en premier; les définitions des
doivent se réunir; tous les types doivent s'accorder et il n'y a aucun moyen de lancer entre eux, et ainsi de suite. cela conduit à une erreur non fatale presque impossible. en fait, avoir une erreur fatale d'exécution est presque presque impossible.notez que si
g
est une fonction valide mais a un mauvais type (tout type différent alors[a]->[a]
ouString -> String
similaire), il s'agit d'une erreur fatale car il est impossible de l'appliquerg
aux entrées.les sorties:
la source