Supposons que nous utilisions les règles suivantes pour extraire une seule chaîne d'une autre chaîne, l'une contenant uniquement des caractères imprimables ASCII et appelée chaîne de caractères *
. Si la chaîne s'épuise avant l'arrêt du processus, c'est une erreur et le résultat du processus n'est pas défini dans ce cas:
- Commencer avec
d=1, s=""
- Chaque fois que vous rencontrez un
*
, multipliezd
par 2. Chaque fois que vous rencontrez un autre personnage, concaténez-le à la fins
et soustrayez 1 ded
. Si maintenantd=0
, arrêtez et revenezs
Exemples définis :
d->d
769->7
abcd56->a
*abcd56->ab
**abcd56->abcd
*7*690->769
***abcdefghij->abcdefgh
Exemples indéfinis : (notez que la chaîne vide serait également l'une d'entre elles)
*7
**769
*7*
*a*b
*
Votre travail consiste à prendre une chaîne et à renvoyer la chaîne la plus courte *
qui produit cette chaîne.
Exemples de programme :
7->7
a->a
ab->*ab
abcd->**abcd
769->*7*69
Votre programme doit gérer toute chaîne contenant au moins un caractère et uniquement des *
caractères imprimables non ASCII. Vous ne pouvez jamais renvoyer de chaînes pour lesquelles le processus n'est pas défini, car par définition, elles ne peuvent produire AUCUNE chaîne.
Les failles standard et les règles d'E / S s'appliquent.
*
?Réponses:
Pyth (
3627 octets)Merci à Jakube pour une amélioration de 9 octets! Actuellement pas aussi bon que la réponse de muddyfish , mais peu importe
Suite de tests
Traduction en python:
la source
JavaScript (ES6), 61 octets
Fonction récursive qui effectue les opérations suivantes:
Si
d
est inférieur ou égal à la longueur de chaîne restante divisée par 2:Ajouter
*
à la sortie et multiplierd
par 2Autre:
Déplacez la chaîne et ajoutez à la sortie, soustrayez 1 de
d
.Voyez-le en action:
la source
f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
Pyth,
2927(cassé remarqué)272625 octetsExplication à venir.
Suite de tests
la source
C, 125 octets
Cela profite du modèle très régulier de positions d'étoiles pour produire le codage correct. Au départ, j'ai essayé une solution récursive bruteforce, mais rétrospectivement, il aurait dû être évident qu'il existait une solution mathématique plus simple.
Essentiellement, vous aurez toujours des
2^floor(log_2(length))
étoiles au début de votre sortie et une dernière étoile après les2^ceil(log_2(length)) - length
caractères (si cela correspond à au moins 1 caractère).La version (légèrement) non golfée est la suivante
la source
JavaScript (ES6),
8877 octetsAu début, je pensais que cela
abcde
devait être,*a**bcde
mais il s'avère que**abc*de
fonctionne aussi bien. Cela signifie que la sortie est facilement construite à l'aide d'étoiles de tête (log₂ (s.length)), plus une étoile supplémentaire pour les cordes dont la longueur n'est pas une puissance de deux.Modifier: 8 octets enregistrés en calculant le nombre d'étoiles principales de manière récursive. Enregistré 3 octets supplémentaires par des chaînes de boîtier spécial de longueur 1, afin que je puisse traiter les chaînes dont la longueur est une puissance de 2 comme ayant une étoile de tête supplémentaire.
la source
Haskell, 68 octets
Identique aux autres réponses, vraiment. Si EOF, affichez une chaîne vide. Si la longueur restante est supérieure à deux fois
d
, émettez une étoile et doubled
. Sinon, sortez le caractère suivant et soustrayez-en und
.Non golfé:
la source