Inspirado em /puzzling//q/626
Nas suas aventuras, você chega a uma série de 7 pontes que precisa atravessar. Debaixo de cada ponte vive um troll. Para atravessar a ponte, você deve primeiro dar ao troll um número de bolos como uma porcentagem do número de bolos que você está carregando. Por serem trolls gentis, eles devolvem um certo número de bolos a você.
No início de cada dia, o rei dos trolls locais define o percentual de imposto sobre bolos que cada viajante deve pagar e o reembolso do bolo - o número de bolos que cada troll deve devolver aos viajantes.
Seu trabalho é calcular o número mínimo de bolos necessários para passar pelas 7 pontes de trolls para as condições especificadas naquele dia.
Presumir:
- Dois parâmetros de entrada: porcentagem de imposto sobre bolos (número inteiro de 0 a 100) e reembolso do bolo de pesca à corrica.
- Ninguém, nem mesmo os trolls, quer um bolo parcialmente comido por outro troll. Se você ficar com uma fração de bolo, o troll o pega.
- Se um troll aceita um imposto de bolo, mas precisa devolver todos os bolos (fica com o mesmo ou menos bolos do que antes), ele fica com raiva e come você e seus bolos.
- Todo troll deve manter pelo menos um bolo completo.
- Você só pode carregar no máximo 100 bolos.
- Você precisa terminar o dia em que está atualmente ou do outro lado das 7 pontes.
Desafio:
Escreva um programa completo para gerar o número mínimo de bolos para viajar para o dia atual ou zero, se não for possível viajar com segurança hoje - você esperará para ver quais são os números amanhã.
A entrada deve ser passada como stdin, argumentos de linha de comando ou entrada de arquivo.
O código mais curto (contagem de bytes) vence.
Exemplo:
25% de imposto sobre o bolo, reembolso de 2 trolls.
comece com 19 bolos
antes do troll 1: (19 * 0,75) = 14,25
após o troll 1: (14 + 2) = 16
antes do troll 2: (16 * 0,75) = 12
após troll 2: (12 + 2) = 14
etc.
19 bolos -> 16 -> 14 -> 12 -> 11 -> 10 -> 9 -> 8
18 bolos -> 15 -> 13 -> 11 -> 10 -> 9 -> 8 -> 8 (regra 3)
Para 18 bolos, o último troll não conseguiria manter nenhum bolo. Portanto, o número mínimo de bolos para um dia de 25% / 2 é 19.
input: 25 2
output: 19
Exemplo 2:
90% de imposto sobre bolo, 1 reembolso para bolo troll
100 bolos -> 11 -> 2 -> 1 (regra 4)
O terceiro troll não conseguiu ficar com nenhum bolo. Portanto, não é possível viajar em um dia de 90% / 1, mesmo começando com o número máximo de bolos.
input: 90 1
output: 0
Dados
Faça um gráfico rápido dos valores de entrada e saída. Fiquei surpreso que isso não era "suave" (como uma curva de sino ou similar); existem várias ilhas visíveis.
Dados para os interessados. As colunas são divididas em intervalos de 5%, as linhas são unidades de 1 intervalo de reembolso de bolo (o Excel girou a imagem). Você pode ver que não pode haver um reembolso superior a 28 bolos.
27, 17, 13, 14, 15, 18, 20, 24, 53, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
47, 27, 20, 19, 19, 19, 24, 39, 48, 68, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0
67, 37, 28, 24, 23, 28, 27, 29, 50, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
87, 47, 33, 29, 27, 28, 31, 44, 37, 72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 57, 40, 34, 31, 29, 34, 34, 62, 74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 67, 48, 39, 35, 38, 37, 49, 57, 76, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 77, 53, 44, 39, 38, 47, 39, 59, 78, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 87, 60, 49, 43, 39, 40, 54, 46, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 97, 68, 54, 47, 48, 44, 44, 71, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 73, 59, 51, 48, 47, 59, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 80, 64, 55, 49, 51, 49, 68, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 88, 69, 59, 58, 54, 64, 70, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 93, 74, 63, 58, 57, 54, 57, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 100, 79, 67, 59, 67, 69, 82, 92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 84, 71, 68, 60, 59, 77, 94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 89, 75, 68, 64, 74, 79, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 94, 79, 69, 67, 64, 66, 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 99, 83, 78, 71, 79, 91, 100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 87, 78, 74, 69, 93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 91, 79, 77, 84, 88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 95, 88, 87, 74, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 99, 88, 80, 89, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 89, 84, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 87, 94, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 98, 91, 84, 99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 99, 94, 99, 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 97, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
25 2
caso de 11 bolos, você dá ao troll 2,75 bolos e recupera 2, para que o troll mantenha 0,75 (+ 25) e você sobreviva. No90 1
caso dos 2 bolos, você dá 1,8 ao troll e recebe 1 de volta, para que o troll fique com 0,8 (+. 2), mas você morre.Respostas:
CJam,
46434139383633 bytesEntrada via ARGV.
Existe um intérprete online, mas infelizmente ele não suporta argumentos de linha de comando. Para testar, você pode imitá-lo no STDIN com esta versão:
Explicação da versão baseada em ARGV:
O conteúdo da pilha é impresso automaticamente no final do programa.
fonte
55 2
(em0
vez de100
) e56 5
(em98
vez de94
). Isso ocorre100_0.55*-i
e é25_0.56*-i
vítima de imprecisão de ponto flutuante. Até onde eu sei, os pares também31 24, 31 25, 33 21, 33 22, 33 23, 35 10, 35 12, 35 15, 35 16, 35 27, 56 1, 57 4
dão resultados incorretos.CJam,
44 40 38 3735 bytesOu ao usar argumentos e
{}#
truques de linha de comando , 33 bytes :Não colocar este como meu principal como
{}#
abordagem é inspirado na resposta de Martin.Exemplo de execução:
Entrada:
Resultado:
Outro:
Entrada:
Resultado:
Como funciona
Experimente online aqui
fonte
]W=
truque, mas até agora, de todas as formas que tento usá-lo, acabo com a mesma contagem de caracteres.APL (39)
Explicação:
T R←⎕
: leia dois números do teclado e armazene-os emT
(imposto) eR
(retorno).Z←⍳M←100
: armazene o número100
emM
e todos os números de1
a100
emZ
.{
...}⍣7¨
: para cada elementoZ
, execute a seguinte função 7 vezes:R+⌊1-T÷M
: calcule quantos bolos precisam ser pagos,⍵(⊢×>)
: multiplique esse valor por 1 se o troll acabar com mais bolo do que ele começou, ou por 0 se não.⊃Z/⍨
: para cada elementoZ
, replique-o pelo número que essa função forneceu. (Portanto, todos os números para os quais a função retornou0
desaparecem.) Em seguida, selecione o primeiro item dessa lista. Se a lista acabou vazia, isso dá0
.fonte
C, 83 bytes
Se funcionar, funciona para todos os possíveis startcakes, não apenas de 1 a 100.
EDIT: Funciona. Golfe:
Com o limite máximo de 100 bolos:
91 bytes.
fonte
CJam, 36 bytes
fonte
C ++ - 202 caracteres
Como sempre, meu C ++ fez o pior:
fonte
APL, 36
Explicação
Observe que existe um "limite de bolo". Para taxa de imposto
x
e reembolsoy
, você precisará estritamente de mais dey÷x
bolos para passar pela próxima ponte.x y←⎕
pegue entrada e atribua ax
(imposto) ey
(retorno)⍳x÷←100
dividax
por 100 e gere uma matriz de 1 a 100{y+⍵-⌈⍵×x}⍣6
chame a função "passar ponte" 6 vezes:⌈⍵×x
o número de bolos que você tem, a taxa de imposto, arredondar para cima (o valor que você paga)⍵-
Subtrair do número de bolos que você temy+
Adicionar o reembolsoEm seguida, você obtém uma matriz de 100 elementos mostrando o número de bolos restantes após atravessar 6 pontes, se você começar com 1 a 100 bolos. Para ver se você pode atravessar a última ponte, verifique se você está acima do limite
y÷x
. Como alternativa:x×
multiplique a matrizx
y<
verificando se maior quey
Por fim,
1⍳⍨
encontre o índice da primeira ocorrência de1
(true), retorna101
se não for encontrado101|
mod 101fonte
C 128
Muito parecido com a outra solução C, mas acho que é inevitável. O principal truque é romper o loop interno com valores diferentes, dependendo se ele está completo ou não. Isso me permite usar?: Quando não podia, se usava break;
Ungolfed
fonte