Ayant passé un peu de temps sur ce site, j'en suis venu à apprécier des choses aussi courtes que possible. C'est peut-être la raison pour laquelle je suis récemment offensé par les chaînes contenant les mêmes caractères plus d'une fois. Votre travail consiste à écrire une fonction ou un programme qui condense une chaîne donnée selon les règles suivantes:
Commencez avec une condensation 0 , c'est-à-dire recherchez la première paire (la plus à gauche) des mêmes caractères avec 0 autres caractères entre eux. Si une telle paire est trouvée, supprimez l'un des deux caractères et redémarrez l'algorithme en effectuant une autre condensation 0 . Si aucune de ces paires n'est trouvée, passez à l'étape suivante. Exemples:
programming
-C0->programing
aabbcc
-C0->abbcc
test
-C0->test
Ensuite, effectuez une condensation 1 , c'est-à-dire recherchez la première paire de mêmes caractères avec 1 autre caractère entre eux. Si une telle paire est trouvée, supprimez l'un d'eux et tous les caractères entre eux et redémarrez avec une condensation 0 . Si aucune de ces paires n'est trouvée, passez à l'étape suivante. Exemples:
abacac
-C1->acac
java
-C1->ja
Continuez avec une 2-condensation et ainsi de suite jusqu'à une n-condensation avec n étant la longueur de la chaîne d'origine, à chaque redémarrage après une condensation supprimée quelques lettres. Exemples:
programing
-C2->praming
abcdafg
-C3->afg
La chaîne résultante est appelée condensée et contient chaque caractère au plus une fois.
Contribution:
Une chaîne en minuscules de caractères ascii imprimables.
Sortie:
La chaîne condensée selon les règles ci-dessus.
Exemples:
examples -> es
programming -> praming
puzzles -> puzles
codegolf -> colf
andromeda -> a
abcbaccbabcb -> acb
if(x==1):x++ -> if(x+
fnabnfun -> fun
abcdefae -> abcde
Exemples détaillés pour clarifier le fonctionnement de l'algorithme:
fnabnfun -C0-> fnabnfun -C1-> fnabnfun -C2-> fnfun -C0-> fnfun -C1-> fun -C0-> fun
-C1-> fun -C2-> ... -C8-> fun
abcbaccbabcb -C0-> abcbacbabcb -C0-> abcbacbabcb -C1-> abacbabcb -C0-> abacbabcb
-C1-> acbabcb -C0-> acbabcb -C1-> acbcb -C0-> acbcb -C1-> acb -C0-> acb
-C1-> ... -C12-> acb
Votre approche ne doit pas implémenter l'algorithme d'en haut tant que votre solution et l'algorithme renvoient la même sortie pour toutes les entrées autorisées. Il s'agit d'un défi de code-golf .
Merci à @Linus pour les commentaires utiles du bac à sable!
Réponses:
JavaScript (ES6), 74 octets
la source
Perl,
38313029 octetsCela devrait laisser les langues autres que le golf loin derrière ...
-1 pour
$-[0]
remercier Riley-1 pour
@{-}
remercier DadaComprend +1 pour
-p
Donnez votre avis sur STDIN
condense.pl
:Cette version de 27 octets devrait fonctionner mais ce n'est pas le cas car perl ne s'interpole pas
@-
dans une expression régulière (voir /programming/39521060/why-are-etc-not-interpolated-in-strings )la source
@{\@-}
pièce? Je pensais@-
tenir les index de chaque correspondance, alors comment cela "compte" à chaque itération. De plus, si vous imprimez@{\@-}
avant et après chaque substitution, il n'en imprime que 1 ou 2././g
progresse de 1 dans la chaîne à chaque fois, sauf lorsque la chaîne change, puis il est réinitialisé à 0. Si vous imprimez@-
après le/./g
mais avant le,s///
vous le verrez augmenter (utilisez un test où la chaîne restante est suffisamment grande)$-[0]
donne les chiffres que j'attendrais. Agit-il@{\@-}
comme à$-[0]
cause du contexte d'expression régulière, mais pas lors de l'impression pour une raison quelconque?$-[0]
est un octet plus court que@{\@-}
s'ils sont identiques."@{\@-}"
n'est pas la même chose que@{\@-}
(sans"
)."@{\@-}"
c'est la même chose que"@-"
. Et cela devrait également être vrai pour une substitution d'expression régulière, mais ce n'est pas le cas. Simultanément$-[0]
devrait fonctionner mais ne fonctionne pas. PS: Vous aviez probablement en quelque sorte un contexte scalaire appliqué@-
lorsque vous avez fait votre impression, donc vous avez toujours 1 ou 2CJam , 35 octets
Essayez-le en ligne!
Vous pouvez voir les condensations individuelles en insérant
ed
la source
Python 2,
117104101 octetsEffectuez récursivement les remplacements nécessaires. Je construis le regex dynamiquement.
Essayez-le en ligne
la source
return i>len(t) and t or s!=t and f(t) or f(t,i+1)
un net de -4 octetsreturn t if i>len(t)else s!=t and f(t)or f(t,i+1))
e=s==t;return i>len(t)and t or f(t,i*e+e)
, vous pouvez supprimer lei=0
dans la définition de la fonction, mais vous devrez appeler avec 0 start.Perl
5352Comprend +1 pour -p
Essayez-le sur ideone .
la source
Mathematica, 101 octets
Il devrait y avoir un moyen de raccourcir cela ...
la source
PHP, 90 octets
ou 92 octets
la source
+$i
au lieu de$i+=0
(-2). 2)for
boucle au lieu dewhile
peut économiser deux octets et permettre de supprimer les curlys (-4). 3)$i=++$i*!$c
au lieu de$i=$c?0:$i+1
(-1). 4)\\2
n'est pas nécessaire, supprimez les parenthèses (-2). 5) Vous pouvez autoriser la limite9
au lieu de la1
vitesse (+0)+$i
ne fonctionne pas dans tous les cas. Essayezhammer
. PHP ne se plaint pas des accolades vides dans l'expression régulière; mais cela ne correspond pas comme souhaité. Au fait: je compte 91, pas 90. Mais essayez le nouveau 1)for($s=$argv[$c=1];$s[$i=++$i*!$c];)
$i+=0
et j'essaierai votre proposition plus tard. Que veut dire marteau?puzzle
ou quelque chose d'autre,(.)//1
mais il est d'accord avec votre proposition ou le$i´=0
Rubis,
756457 octets(56 octets de code +
p
option de ligne de commande.)Utilisation de l'interpolation de chaînes à l'intérieur d'une expression régulière pour contrôler la longueur des correspondances qui sont remplacées.
Tester:
la source
Haskell ,
9788 octetsEssayez-le en ligne!
Ancienne version de 97 octets:
Essayez-le sur ideone .
Explication:
La
(!)
fonction effectue une n-condensation lorsqu'elle reçoit une chaîne une fois entière et une fois avec les n premiers caractères supprimés, par exempleabcdbe
etcdbe
pour une 2-condensation, en comparant récursivement les deux premiers caractères.la source