Otimizar minha ordem de asas


17

Este tweet lista os pedidos possíveis para as asas de um restaurante chinês 1 :

Menu de asas

Ao pedir Pizza, costumo calcular qual tamanho me dá a melhor relação preço-pizza, que é um cálculo simples. No entanto, minimizar o preço de um pedido neste restaurante não é uma tarefa tão simples, então eu gostaria de estar preparado para o meu próximo pedido lá.

Desafio

Dado um número inteiro maior ou igual a 4 , sua tarefa é retornar um pedido possível que minimize o preço (mais barato em geral) e o número de transações.

Exemplo

Se eu pedir 100 Wings, a melhor pechincha custará $111.20 . No entanto, existem vários pedidos que custarão esse valor, a saber:

[50,50],[25,25,50],[25,25,25,25]

Como o primeiro pedido utilizará a menor quantidade de transações ( 2 ), o resultado será [50,50].

Regras

  • A entrada será um número inteiro n4
  • A saída será uma lista / matriz / ... de tamanhos de pedidos que somam n e minimizam o preço do pedido
    • você pode optar por devolver todos os pedidos possíveis

Casos de teste

4 -> [4]  (4.55)
23 -> [23]  (26.10)
24 -> [6,18],[9,15],[12,12]  (27.20)
31 -> [6,25]  (34.60)
32 -> [4,28],[6,26],[7,25]  (35.75)
33 -> [4,29],[5,28],[6,27],[7,26],[8,25]  (36.90)
34 -> [6,28],[9,25]  (38.00)
35 -> [35]  (39.15)
125 -> [125]  (139.00)
200 -> [25,50,125]  (222.40)
201 -> [26,50,125]  (223.55)
250 -> [125,125]  (278.00)
251 -> [26,50,50,125]  (279.15)
418 -> [15,28,125,125,125],[18,25,125,125,125]  (465.20)
1001 -> [26,50,50,125,125,125,125,125,125,125]  (1113.15)
12345 -> [15,80,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125],[25,70,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125],[45,50,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125,125]  (13728.10)

Nota: listar Estes testcases todas as saídas possíveis, incluindo o preço, você só é obrigado a saída de um e você não exigido para a saída do preço!


1: Você pode encontrar os dados como um CSV aqui .


3
A verdadeira questão é: quem pede 200 ou até 100 asas? ...
Erik the Outgolfer

2
@Quintec: Por que você precisa de mais casos de teste?
ბიმო

1
Duas respostas interpretaram mal os requisitos, como apenas a necessidade de minimizar o preço. Como a minimização do preço e do número de transações é ambígua (o menor preço disponível nas formas com o menor número de transações ou o menor número de transações disponíveis nas formas com o menor preço), vale a pena editar o requisito para ser mais explícito
trichoplax 26/10/19


1
Percebo que para o preço é dado por 1n23120(68n3)25<n<=5025n25n<297080125

Respostas:


7

JavaScript (ES6), 123 bytes

Retorna a ordem como uma sequência separada por espaço.

f=n=>n?(x=n>128|n==125?125:n>50?n<54?25:n-70?302256705>>n-80&n>79&n<109?80:50:n:n-24&&n-49?n<31|n%5<1?n:25:9)+' '+f(n-x):''

Experimente online!

Quão?

n

n>128n=125

125n129n125

125<n<1294

n<31

n<31n=242×1218+615+99

31n50

25

  • n5
  • n=4940+928+219

51n53

Não podemos comprar 504252×26n=5225+27

54n128n125

50

  • n=70
  • n{80,86,89,92,98,105,108}8080108

    10010000001000001001001000001(2)=302256705(10)


4

JavaScript (Node.js) , 112 108 106 105 bytes

f=n=>n?(x=n>128|n==125?125:n>53&n!=70?1629>>n/3+6&n<99==n%3/2?80:50:~n%25?n>30&&n%5?25:n:9)+' '+f(n-x):''

Experimente online!

Otimizado a partir da resposta de Arnauld

Diferenças

  • 51≤n≤53 é mesclado em 31≤n≤50 (salvamento em 8 bytes)
  • Reescreva o bitmap (salvar 3 bytes)
  • Reorganizar alguma lógica ( 4 6 7 bytes salvos)

2

Retina 0.8.2 , 160 155 bytes

.+
$*
{`\b(1{80}(?=((111){2,6}|1{25}|1{28})?$)|1{70}$|1{9}(?=.{15}$|.{40}$)|(1{5}){6,9}$|1{26,29}$|1{4,23}$|1{125}|1{50}|1{25})+$
$1,$&
(1+),\1(1*)$
$.1,$2

Experimente online! O link inclui o cabeçalho que testa todos os valores denn

.+
$*

Converta para unário.

{`

Repita até que não seja possível comprar mais ofertas.

{`\b(1{80}(?=((111){2,6}|1{25}|1{28})?$)|1{70}$|1{9}(?=.{15}$|.{40}$)|(1{5}){6,9}$|1{26,29}$|1{4,23}$|1{125}|1{50}|1{25})+$
$1,$&

Encontre uma maneira de comprar transações e capture e duplique uma delas.

(1+),\1(1*)$
$.1,$2

n

As ofertas são adquiridas nas seguintes condições:

1{80}(?=((111){2,6}|1{25}|1{28})?$)

Compre 80 asas se deixar 0, 6, 9, 12, 15, 18, 25 ou 28 asas.

1{70}$

Compre 70 asas, se é tudo o que precisamos.

1{9}(?=.{15}$|.{40}$)

Compre 9 asas se isso deixar 15 ou 40 asas.

(1{5}){6,9}$

Compre 30, 35, 40 ou 45 asas, se é tudo o que precisamos.

1{26,29}$

Compre 26, 27, 28 ou 29 asas, se é tudo o que precisamos.

1{4,23}$

Compre de 4 a 23 asas, se é tudo o que precisamos.

1{125}|1{50}|1{25}

Compre 125, 50 ou 25 asas, se pudermos e se ainda pudermos comprar mais asas exatamente. Observe que temos essas opções no final da alternância para que as compras exatas sejam testadas primeiro.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.