Sou um jovem bruxo e tento muito não desperdiçar mana durante meus encontros mágicos.
Eu tenho X magias disponíveis a qualquer momento e cada uma delas tem seu próprio custo de mana Y.
X, Y sendo inteiros positivos estritamente menores que 11.
Como iniciante, meu pool de mana flutua muito (é sempre menor que 11) , e preciso de ajuda para lançar o menor número possível de feitiços (pergaminhos são caros, você sabe) enquanto esvazia minha reserva de mana. Se você não encontrar nenhuma combinação de feitiços que corresponda exatamente ao tamanho da minha reserva de mana, deverá me oferecer a mais próxima (e mais barata).
Eu vim até você e sua infinita sabedoria para me ajudar a me tornar o maior bruxo das trevas. Não ficarei desapontado.
Estilo INPUT (porque estilo é tudo):
Y; abcdef
Y é o tamanho da piscina de mana. (a, b, c, d, e, f) são os feitiços. Existem 6 magias, a primeira custa 'a' mana, a segunda custa custa 'b' mana, etc.
ENTRADA: 4; 1 2 3 3 7 6
Tenho 4 manas disponíveis e 6 feitiços disponíveis. Dois feitiços custam 1 mana, 1 feitiço custa 2 mana, dois feitiços custam 3 mana, etc.
SAÍDA: (3,1)
ENTRADA: 3; 1 3 5 2 10
SAÍDA: (3)
ENTRADA: 8; 4 1 9
SAÍDA: (4,1)
ENTRADA: 4; 1 2 2 3
SAÍDA: (2,2), (1,3)
Você deve produzir todas as combinações de feitiços, mas não há necessidade de distinguir feitiços com o mesmo custo.
O menor encantamento para qualquer máquina que você desejar receberá uma profusão de agradecimento e um chicote de destino.
Respostas:
GolfScript, 55 caracteres
Experimente online .
fonte
APL (87)
O formato de entrada é uma lista de APL, onde o primeiro elemento é o pool de mana e o restante dos elementos são os feitiços. A saída tem cada combinação possível de feitiços em uma linha separada.
Explicação:
k←1↓i←⎕
: leia uma lista da entrada e armazene-ai
. Solte o primeiro elemento (mana) e armazene o restantek
.1↓g←⍳⍴k
: gere uma lista1
até o tamanho dek
e armazene-ag
. Largue o primeiro elemento, dando[2..len k]
.{
...}¨
: Para cada um destes, obtenha os índices de cada combinação únicak
de comprimento⍵
:z←,⍳⍵/⍴k
: obtenha uma⍵
matriz tridimensional de índices de comprimentok
, alise-a e armazene-az
.∧/¨2>/¨
: para cada coordenada em cada índice, veja se todas as coordenadas para aN
quinta dimensão são mais altas que as daN-1
dimensão.z/⍨
: selecionez
os elementos para os quais o acima indicado é verdadeiro⊃,/g,
: porque o acima não funciona para vetores unidimensionais, adicioneg
à frente. Agora temos uma lista de listas de listas (por causa do foreach) de todos os índices exclusivosk
. Concatene as listas e desclassifique-as (por isso, terminamos com uma lista de listas).{
...}¨
: para cada lista possível de coordenadas, procure a combinação correspondente de valoresk
e filtre os que são muito caros:a←k[⍵]
: procure a combinação atualk
e armazene-aa
.a/⍨⊃i≥+/a
: selecionea
somente se o primeiro item emi
(pool de mana) for igual ou superior à soma dos elementos dea
.m←
: armazena todas as combinações de feitiços que não excedam o limite de manam
.m←m/⍨t=⌈/t←+/¨m
: selecionem
apenas as combinações cuja soma é igual à soma da combinação mais cara e guarde-am
novamente.m/⍨t=⌊/t←⊃∘⍴¨m
: selecionem
apenas as combinações cujo comprimento é igual ao comprimento da combinação mais curta.↑∪
: remova as duplicatas e converta em uma matriz (para exibir cada combinação em uma linha separada).fonte
Rubi,
114113 caracteresEntrada: uma matriz de dois elementos da mana do assistente e da lista de feitiços, formatada em JSON de uma linha.
Saída: uma matriz 2D das listas de feitiços, formatadas como JSON de uma linha ou
nil
se o assistente não puder lançar feitiços.Eu especialmente amo
x,y = eval gets
. Tão perigoso e mau, mas tão poderoso e simples. Perfeito para jogar golfe.Ambos
sort
euniq
são necessários. Caso contrário, isso produzirá duplicatas para entrada como[4, [1, 3, 1]]
. Eu não estou feliz com isso.find
é um método útil para controlar o fluxo. Seu valor de retorno não é tão útil aqui, no entanto. Em termos de comprimento, é comparávelany?
, cujo valor de retorno é ainda menos útil.Exemplos:
fonte
map
vez defind
? Além disso,.reduce(:+)
não é&
necessáriomap
não para no primeiro resultado positivo. Ele imprimiria todas as possibilidades, agrupadas por custo e tamanho de mana. Obrigado pelo segundo conselho.Haskell (GHC),
172 167143 charsDesofuscada:
[4,1,2,3,3,7,6]
).Solução simples: pegue o conjunto de potência da entrada e reduza-o filtrando as combinações para as quais temos mana suficiente, etc.
fonte
Mathematica 131
Deve haver maneiras mais curtas, mas é isso que pude inventar.
fonte