Um viajante precisa ficar n dias em um hotel fora da cidade. Ele está sem dinheiro e seu cartão de crédito expirou. Mas ele tem uma corrente de ouro com n elos.
A regra neste hotel é que os residentes paguem o aluguel todas as manhãs. O viajante chega a um acordo com o gerente para pagar um elo da cadeia de ouro por dia. Mas o gerente também exige que o viajante cause o menor dano possível à cadeia e pague todos os dias. Em outras palavras, ele tem que encontrar uma solução para cortar o menor número possível de links.
Cortar um link cria três sub-cadeias: uma contendo apenas o link de corte e uma de cada lado. Por exemplo, cortar o terceiro elo de uma cadeia de comprimento 8 cria sub-cadeias de comprimento [2, 1, 5]. O gerente tem o prazer de fazer alterações, para que o viajante possa pagar o primeiro dia com a cadeia de comprimento 1, depois o segundo dia com a cadeia de comprimento 2, recuperando a primeira cadeia.
Seu código deve inserir o comprimento n e gerar uma lista de links para cortar no tamanho mínimo.
Regras :
- n é um número inteiro> 0.
- Você pode usar a indexação com base em 0 ou em 1 para os links.
- Para alguns números, a solução não é única. Por exemplo, se
n = 15
ambos[3, 8]
e[4, 8]
são saídas válidas. - Você pode retornar a lista ou imprimi-la com qualquer separador razoável.
- Isso é código-golfe , então o código mais curto em bytes vence.
Casos de teste :
Input Output (1-indexed)
1 []
3 [1]
7 [3]
15 [3, 8]
149 [6, 17, 38, 79]
Exemplo detalhado
Para n = 15, cortar os links 3 e 8 resulta em sub-cadeias de comprimento [2, 1, 4, 1, 7]
. Esta é uma solução válida porque:
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
Não existe solução com apenas um corte; portanto, essa é uma solução ideal.
Termo aditivo
Observe que esse problema está relacionado ao particionamento inteiro. Estamos à procura de uma partição P de n tal que todos os inteiros de 1 a n ter pelo menos um patition que é um subconjunto de P .
Aqui está um vídeo do YouTube sobre um possível algoritmo para esse problema.
fonte
1+2
. De onde veio a segunda cadeia de 2 elos?Respostas:
05AB1E ,
23118 bytesExperimente online!
Usa indexação baseada em 0.
Explicação:
иg
parece um noop, mas na verdade faz duas coisas úteis: trunca para um número inteiro (;
retorna um número flutuante) e trava o interpretador se x for negativo (esta é a única condição de saída).A solução de 23 bytes usou uma abordagem muito diferente, então aqui está a posteridade:
ÅœʒR2äθP}ʒæOê¥P}θ2äθη€O
( TIO , explicação ).fonte
Ø.Ø
. Você tentou algumas coisas aleatórias para mostrar e mapear todos os negativos-1
? Independentemente, resposta muito agradável e muito mais curta do que eu previa. Eu estava pensando em cerca de 20 bytes depois de postar meu 42-byter ruim.Ø.Ø
foi realmente a minha primeira ideia. O seu comentário me inspirou a tentar coisas aleatórias: eu encontrei®Ÿà
,ï®M
e, mais importante,иg
que produz este simpático 8 Byter. Eu sempre achei irritante que osabie preferisse não fazer nada demais em muitos casos (div por 0, tipo errado, etc.), então essa falha será útil.Python 2 , 75 bytes
Experimente online!
Explicação:
Cria uma sequência de blocos 'binários', com um número base correspondente ao número de cortes.
Por exemplo:
63
pode ser feito em 3 cortes, o que significa uma partição na base-4 (como temos 3 anéis únicos):Cortes:,
5, 14, 31
que fornece cadeias de4 1 8 1 16 1 32
(classificadas:)1 1 1 4 8 16 32
.Todos os números podem ser feitos:
Outros exemplos:
fonte
f=
ao início? Como você usa uma chamadaf
na função lambda, e posso apenas assumir que você se refere à mesma lambda que está definindo.f
is not recursive, but it's however referenced in the code and therefore has to be named.R,
7769 bytes-8 bytes thanks to Aaron Hayman
Try it online!
Letk be the number of cuts needed; k is the smallest integer such that (k+1)⋅2k≥n . Indeed, a possible solution is then to have subchains of lengths 1,1,…,1 (k times) and (k+1),2(k+1),4(k+1),8(k+1),…,(k+1)⋅2k−1 . It is easy to check that this is sufficient and optimal.
(The last subchain might need to be made shorter if we exceed the total length of the chain.)
Ungolfed (based on previous, similar version):
(Proof that the value ofk is as I state: suppose we have k cuts. We then have k unit subchains, so we need the first subchain to be of length k+1 . We can now handle all lengths up to 2k+1 , so we need the next one to be of length 2k+2 , then 4k+4 ... Thus the maximum we can get out of k cuts is obtained by summing all those lengths, which gives (k+1)⋅2k−1 .)
Ifa(k) is the smallest integer n requiring k cuts, then a(k) is OEIS A134401.
fonte
n=1
, but an alternative way to generate the cutoffs is the recurrence1, 4, 4a(n-1)-4a(n-2)
.k
; this corresponds to OEIS A134401: oeis.org/A134401 But my implementation of the recurrence relation takes up more bytes than the current code.sum
instead ofmatch
.Jelly, 12 bytes
Try it online!
Translation of Grimy's 05AB1E answer so be sure to upvote that one too! Slightly disappointed this comes in a byte longer, but does at least have something a bit like an emoticon as the first three bytes!
fonte
JavaScript (ES6), 66 bytes
This is a port of TFeld's answer.
Try it online!
fonte
C++,
109,107 bytes-2 bytes thanks to Kevin
The algorithm is similar to the Robin Ryder's answer. The code is written in a compilable, whole form. Try it!
Details:
This has a C variation with the same byte length (doesn't seem to need a separate answer):
fonte
=0
afterk
can be removed, since its0
by default.std::cin>>n;while(++k<<k<n);
can befor(std::cin>>n;++k<<k<n;);
. I also have the feelingfor(n-=k;n>0;k*=2,n-=k+1)
can be simplified somehow by combining stuff, but not sure how. PS: Changing the comma-delimiter to a space looks slightly better since you don't see the trailing one imo, but this is purely cosmetic :)=0
was necessary for portability ;) I also realized that the space after#include
is not necessary.std::cin>>n
inside it.Retina 0.8.2, 61 bytes
Try it online! 1-indexed port of @Grimy's answer. Explanation:
Start with
N=2
and the input converted to unary.Repeatedly try to subtract
N
from the input and then divide by 2.If successful, remember 1 more than the input on the previous line, increment
N
on the current line, and update the input to the new value.Remove
N
and increment the last value so that it's also 1-indexed.Remove the incremented original input.
Convert the results to decimal.
fonte
Ruby, 62 bytes
Try it online!
Mostly stolen from TFeld's Python answer.
fonte