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 .

ბიმო
fonte
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)

Arnauld
fonte
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)
l4m2
fonte
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.

Neil
fonte