Motivation : Parfois, vous devez savoir où vous en êtes dans une chaîne. Vous voulez pouvoir regarder n'importe quelle partie d'une chaîne et savoir exactement où vous êtes, dans la mesure du possible.
Défi : écrire un programme pour sortir une chaîne de ruban à mesurer d'une longueur donnée. Un ruban à mesurer décrit lui-même sa longueur aussi souvent que possible sur sa propre longueur.
Règles :
- Votre programme doit prendre un paramètre entier positif, pour la longueur totale de la chaîne de ruban à mesurer
- Pour chaque chaîne de chiffres contiguës dans la sortie, ces chiffres doivent indiquer avec précision la longueur de la sortie jusqu'à présent - inclus !
- Les longueurs sont mesurées du début de la chaîne à la fin de chaque numéro
- Il faut inclure autant de numéros de longueur que possible dans la chaîne
- Évitez toute ambiguïté. Des séparateurs / délimiteurs peuvent être utilisés pour éviter la juxtaposition de nombres, c'est-à-dire
12
dit douze et non un, deux. - La chaîne doit toujours indiquer avec précision sa longueur totale à sa fin, sans séparateurs de fin
- Vous pouvez avoir besoin de plusieurs séparateurs pour garder les longueurs précises, par exemple, voici un exemple de chaîne de ruban à mesurer de longueur 4:
1--4
Exemples non normatifs / exhaustifs:
- ruban à mesurer de longueur 1:
1
- ruban à mesurer chaîne de longueur 2:
-2
- ruban à mesurer de longueur 3:
1-3
- ruban à mesurer de longueur 4:
1--4
ou-2-4
(les deux longueurs de rapport aussi souvent que possible, c'est-à-dire deux fois, et se terminent par la longueur totale correcte) - ruban à mesurer de longueur 10:
1-3-5-7-10
- ruban à mesurer chaîne de longueur 11:
1-3-5-7--11
ou1-3-5--8-11
ou1-3--6-8-11
ou1--4-6-8-11
ou-2-4-6-8-11
(tous ont autant de numéros de longueur que possible et finissent par la longueur totale de la chaîne)
-
, et vous devez avoir autant de marques de longueur que possible dans la chaîne?0
.Réponses:
Python,
50484746 octetsExplication
Solution lambda récursive assez simple
Nos cas de base sont 1 et 0 qui sont couverts par
"1"*x
sinon nous obtenons la chaîne de-x
with`-x`
et ajoutons le résultat de l'appel de la fonction surlen(`-x`)
less.la source
-x
?Mathematica,
6757 octetsMerci à Martin Ender d'avoir largué 10 octets!
Fonction sans nom prenant un argument entier non négatif et retournant une chaîne. À peu près l'algorithme récursif évident: assurez-vous que la chaîne se termine par le numéro d'entrée précédé de a
"-"
, puis appelez à nouveau la fonction à l'aide de#0
.Mais il y a un plaisir golfique à implémenter l'algorithme.
""["1"][[#]]
désigne le#
th argument de l'expression""["1"]
: le 0ème argument est la tête""
et le 1er argument est visiblement"1"
, ce qui fournit les cas de base de la récursivité. Si#
dépasse 1,""["1"][[#]]
lance alors un message d'erreur et reste comme une fonction non évaluée. Mais/._@__:>
c'est une règle qui prend n'importe quelle fonction non évaluée et la transforme en l'expression qui vient ensuite, qui est l'appel récursif à la fonction d'origine.Soumission originale:
la source
""["1"][[#]]/._@__:>#0[#-1-IntegerLength@#]<>ToString@-#&
enregistre un octet en évitant leIf
et un tas d'octets en évitantIntegerString
et"-"<>
._@__
is evil magicJavaScript (ES6), 49 octets
la source
f
Pyth, 23 octets
Volé ouvertement la solution récursive de la réponse de l'assistant de blé . De plus, je crois que ce n'est pas joué correctement.
Essayez-le ici!
la source
Perl 6 , 43 octets
Explication:
Ainsi, par exemple pour l'entrée 10, il génère la séquence
(-10, -7, -5, -3, -1)
, et à partir de là, la chaîne-1-3-5-7-10
, et à partir de cela la chaîne finale1-3-5-7-10
.Essayez-le en ligne .
la source