Un voyageur doit rester n jours dans un hôtel situé en dehors de la ville. Il n'a plus d'argent et sa carte de crédit est expirée. Mais il a une chaîne en or avec n liens.
La règle dans cet hôtel est que les résidents doivent payer leur loyer tous les matins. Le voyageur conclut un accord avec le responsable pour payer un maillon de la chaîne en or chaque jour. Mais le responsable exige également que le voyageur fasse le moins de dégâts possible à la chaîne en payant tous les jours. En d'autres termes, il doit trouver une solution pour couper le moins de liens possible.
Couper un lien crée trois sous-chaînes: une contenant uniquement le lien coupé et une de chaque côté. Par exemple, couper le troisième maillon d'une chaîne de longueur 8 crée des sous-chaînes de longueur [2, 1, 5]. Le responsable est heureux de rendre la monnaie, de sorte que le voyageur puisse payer le premier jour avec la chaîne de longueur 1, puis le deuxième jour avec la chaîne de longueur 2, en récupérant la première chaîne.
Votre code doit entrer la longueur n et générer une liste de liens à couper de longueur minimale.
Règles :
- n est un entier> 0.
- Vous pouvez utiliser l'indexation 0 ou 1 pour les liens.
- Pour certains numéros, la solution n'est pas unique. Par exemple, si les
n = 15
deux[3, 8]
et[4, 8]
sont des sorties valides. - Vous pouvez soit renvoyer la liste, soit l’imprimer avec un séparateur raisonnable.
- C'est le code-golf , donc le code le plus court en octets gagne.
Cas de test :
Input Output (1-indexed)
1 []
3 [1]
7 [3]
15 [3, 8]
149 [6, 17, 38, 79]
Exemple détaillé
Pour n = 15, couper les liens 3 et 8 donne des sous-chaînes de longueur [2, 1, 4, 1, 7]
. C'est une solution valable pour les raisons suivantes:
1 = 1
2 = 2
3 = 1+2
4 = 4
5 = 1+4
6 = 2+4
7 = 7
8 = 1+7
9 = 2+7
10 = 1+2+7
11 = 4+7
12 = 1+4+7
13 = 2+4+7
14 = 1+2+4+7
15 = 1+1+2+4+7
Il n’existe pas de solution avec une seule découpe, c’est donc une solution optimale.
Addenda
Notez que ce problème est lié au partitionnement entier. Nous sommes à la recherche d'une partition P de n tel que tous les entiers de 1 à n ont au moins un patition qui est un sous - ensemble de P .
Voici une vidéo YouTube sur un algorithme possible pour ce problème.
la source
1+2
. D'où vient la deuxième chaîne à 2 maillons?Réponses:
05AB1E ,
23118 octetsEssayez-le en ligne!
Utilise l'indexation basée sur 0.
Explication:
иg
Cela ressemble à un noop, mais il fait deux choses utiles: il tronque un entier (;
renvoie un float) et bloque l'interpréteur si x est négatif (c'est la seule condition de sortie).La solution à 23 octets utilisait une approche très différente, donc la voici pour la postérité:
ÅœʒR2äθP}ʒæOê¥P}θ2äθη€O
( TIO , explication ).la source
Ø.Ø
. Avez-vous simplement essayé des choses aléatoires afin d’établir un plan et de cartographier tous les négatifs-1
? Quoi qu'il en soit, très bonne réponse et beaucoup plus courte que prévue. Je pensais environ 20 octets après avoir posté mon mauvais 42 octets.Ø.Ø
était en fait ma première idée. Votre commentaire m'a inspiré pour essayer des choses au hasard: J'ai trouv鮟à
,ï®M
et plus important encore ,иg
, ce qui donne cette belle 8 byter. J'ai toujours trouvé ennuyeux qu'Osabie préfère ne rien faire en cas de plantage (div par 0, type incorrect, etc.), alors ce plantage sera utile.Python 2 , 75 octets
Essayez-le en ligne!
Explication:
Construit une séquence de morceaux «binaires», avec un numéro de base correspondant au nombre de coupes.
Par exemple:
63
peut être fait en 3 coupes, ce qui signifie une partition en base 4 (comme nous avons 3 anneaux simples):Cuts:,
5, 14, 31
qui donne des chaînes de4 1 8 1 16 1 32
(trié:)1 1 1 4 8 16 32
.Tous les nombres peuvent être faits:
Autres exemples:
la source
f=
au début? Puisque vous utilisez un appel àf
dans la fonction lambda, et je ne peux que supposer que vous vous référez au même lambda que vous définissez.f
n'est pas récursif, mais il est cependant référencé dans le code et doit donc être nommé.R ,
7769 octets-8 octets grâce à Aaron Hayman
Essayez-le en ligne!
(La dernière sous-chaîne devra peut-être être raccourcie si nous dépassons la longueur totale de la chaîne.)
Ungolfed (basé sur la version précédente similaire):
la source
n=1
, mais une autre façon de générer les seuils est la récurrence1, 4, 4a(n-1)-4a(n-2)
.k
; cela correspond à OEIS A134401: oeis.org/A134401 Mais mon implémentation de la relation de récurrence utilise plus d'octets que le code actuel.sum
au lieu dematch
.Gelée , 12 octets
Essayez-le en ligne!
Traduction de la réponse 05AB1E de Grimy, assurez-vous donc de l'emporter également! Légèrement déçu, cela vient dans un octet plus long, mais a au moins quelque chose qui ressemble un peu à une émoticône que les trois premiers octets!
la source
JavaScript (ES6), 66 octets
Ceci est une réponse de TFeld .
Essayez-le en ligne!
la source
C ++,
109, 107 octets-2 octets grâce à Kevin
L'algorithme est similaire à la réponse de Robin Ryder. Le code est écrit sous une forme complète compilable. Essayez le!
Détails:
Cela a une variation C avec la même longueur d'octet (ne semble pas avoir besoin d'une réponse séparée):
la source
=0
aprèsk
peuvent être supprimés, puisque c'est0
par défaut.std::cin>>n;while(++k<<k<n);
peut êtrefor(std::cin>>n;++k<<k<n;);
. J'ai aussi le sentiment que l'for(n-=k;n>0;k*=2,n-=k+1)
on peut simplifier en combinant des choses, mais je ne sais pas comment. PS: Changer le séparateur de virgule en un espace est légèrement meilleur car vous ne voyez pas le dernier imo, mais c'est purement cosmétique :)=0
c'était nécessaire pour la portabilité;) J'ai aussi réalisé que l'espace après#include
n'est pas nécessaire.std::cin>>n
intérieur.Retina 0.8.2 , 61 octets
Essayez-le en ligne! Port indexé 1 de la réponse de @ Grimy. Explication:
Commencez avec
N=2
et l'entrée convertie en unaire.Essayez à plusieurs reprises de soustraire
N
de l’entrée puis de diviser par 2.En cas de succès, rappelez-vous de plus que l'entrée de la ligne précédente, incrémentez
N
la ligne actuelle et mettez à jour l'entrée avec la nouvelle valeur.Supprimez
N
et incrémentez la dernière valeur pour qu'elle soit également indexée sur 1.Supprimez l'entrée d'origine incrémentée.
Convertir les résultats en décimal.
la source
Ruby , 62 octets
Essayez-le en ligne!
Surtout volé dans la réponse Python de TFeld.
la source