O gerenciamento de inventário do Minecraft é difícil. Você tem 17 diamantes, mas precisa de 7 para criar uma mesa de encantamento, uma picareta e uma espada. Você as pega e clica com o botão direito 7 vezes? Ou você clica com o botão direito uma vez e clica com o botão direito duas vezes e vira à esquerda o 7? É tão confuso!
para aqueles de vocês que agora estão confusos, não se preocupem, vou explicar tudo em um segundo
Desafio
Dado o tamanho de uma pilha de itens e a quantidade desejada, determine o menor número de cliques para obter essa quantidade. Você só precisa lidar com até 64 para ambas as entradas e pode assumir que possui infinitos slots de inventário. Você não pode usar o truque de arrastar para distribuir.
Definições
O inventário é uma coleção de slots onde você pode armazenar itens.
Um slot é um espaço de armazenamento em seu inventário onde você pode colocar até um tipo de item.
Uma pilha é um número de itens colocados no mesmo grupo. Para os propósitos deste desafio, uma pilha é simplesmente um monte de itens no mesmo local (portanto, ignore o tamanho da pilha)
O cursor é sua coisa pontuda. Aquele cursor. Pode ter itens "nele"; em outros termos, se você clicou em um slot e pegou itens, os itens que você pegou estão "no cursor" até que você os soltasse.
Especificações
Existem quatro situações possíveis. Você tem um item no cursor ou não, e você clica com o botão esquerdo ou com o botão direito.
Se você não possui um item no cursor e clica com o botão esquerdo do mouse em um slot, escolhe toda a pilha.
Se você não tiver um item no cursor e clicar com o botão direito do mouse em um slot, você pegará metade da pilha, arredondada para cima.
Se você tiver um item no cursor e clicar com o botão esquerdo do mouse em um slot, coloque todos os itens nesse slot. (Para todos os seus jogadores do Minecraft, você não terá> 64 itens para este desafio e todos eles são empilháveis em 64, e você só tem um tipo para que a troca de itens não se aplique aqui)
Se você tiver um item no cursor e clicar com o botão direito do mouse em um slot, coloque um item nesse slot.
Então, você começa com todos os itens fornecidos (primeira entrada ou segunda; pode escolher a ordem) em um slot e deseja terminar com a quantidade desejada (outra entrada) em seu cursor.
Vamos percorrer um exemplo. Digamos que você comece com 17 itens e deseje 7. Primeiro, clique com o botão direito do mouse na pilha, o que significa que você pegou 9 e há 8 nesse slot. Então, se você clicar com o botão direito do mouse na pilha novamente, coloque um item de volta no slot, deixando-o com 8 e o slot com 9. Por fim, clique com o botão direito do mouse novamente e você terá 7 e o slot terá 10. Assim, você retornaria 3
(o número de cliques).
Se você conseguir sair do campo de golfe comigo, informe-me e editarei o exemplo: P
Casos de teste
Estes são gerados manualmente, por isso, diga-me se houver algum erro. Eu faço o gerenciamento de inventário clicando com o botão direito do mouse, para não ter experiência com o gerenciamento ideal de inventário: P
Given, Desired -> Output
17, 7 -> 3
64, 8 -> 5
63, 8 -> 5
10, 10 -> 1
10, 0 -> 0 # note this case
25, 17 -> 7
Explicações
Esse desafio pode ser complicado para jogadores que não são do Minecraft, não faço ideia. Aqui estão algumas explicações.
64, 8 -> 5
porque você pega 32 usando o botão direito, coloque-o para baixo, pegue 16, coloque-o e depois 8.
63, 8 -> 5
pela mesma razão.
25, 17 -> 7
porque você pega 13, coloca-o no chão, pega 6 dos 12 restantes, coloca 2 de volta na pilha restante e, em seguida, coloca o 4 no cursor nos 13 e depois pega-os.
Regras
- Aplicam-se brechas padrão
- Você pode assumir que
0 <= desired <= given <= 64
- Você pode receber informações em qualquer ordem e executar E / S em qualquer formato razoável
0,[n]
, pode transitar: (1) a partir de0,[a,b,...]
aa,[b,...]
,b,[a,...]
,ceil(a/2),[floor(a/2),b,...]
, ouceil(b/2),[a,floor(b/2),...]
; ou (2) a partir dex,[a,b,...]
(x>0
) ax-1,[a+1,b,...]
,x-1,[a,b+1,...]
,x-1,[a,b,...,1]
,0,[a+x,b,...]
,0,[a,b+x,...]
,0,[a,b,...,x]
. O desafio é encontrar as transições mínimas possíveis de0,[g]
onde g é dado parat,L
ondet
está o alvo desejado eL
existe alguma lista?Respostas:
C ++ ,
498482457 bytesSe essa função for chamada apenas uma vez, pode ser 455 bytes.
Descobri que quase todos os compiladores on-line do GCC (incluindo o TIO) me proíbem de omitir o tipo da função
f
. No entanto, o GCC no meu computador permite isso, e não sei por quê.Este pode lidar com entradas grandes se um slot puder conter esse número de itens (embora precise de uma matriz maior e provavelmente fique sem tempo).
Ungolfed:
fonte
Geléia , 74 bytes
Um programa completo com a primeira entrada (terceiro argumento) a pilha atual e a segunda entrada (quarto argumento) o cursor desejado.
Experimente online! Devido à implementação, isso atinge o tempo limite de 60 segundos do TIO para o
25, 17
caso de teste. Isso pode ser solucionado com a remoção dos redundantes deixados para o golfe usando este byter de 84 (que filtra pilhas de tamanho zero e classifica as que restamḟ€Ṣ¥0¦€0
no final do link 6 e mantém apenas estados únicos em cada etapa com o uso deQ$
Main ligação).Quão?
O programa implementa a máquina de estado definida.
Ele cria o estado original e, em
[0, [argument 1]]
seguida, percorre todos os próximos estados possíveis repetidamente
até encontrar um correspondente
[argument 2, [...]]
.Nota: a entrada do programa está no "Link principal", que é o mais baixo (
Wṭ0WÇ€Ẏ$ÑпL’
)fonte