O Problema da Decantação


23

Dado N decantadores (0 < N <10) com capacidade para armazenar C 0 ... C N-1 litros (0 < C <50) e uma meta G litros, determine se é possível alcançar essa meta usando apenas o seguintes ações:

  • Encha uma garrafa
  • Esvaziar uma garrafa
  • Despeje de um decantador para outro até que o que está sendo derramado esteja cheio ou o que está sendo derramado esteja vazio

O valor da meta G deve ser a quantidade de água em um dos recipientes no final. Você não pode ter um 'decantador de saída'.

Exemplos

N : 2
C 0 : 5
C 1 : 12
G : 1
Resultado: Sim

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
Resultado: Não

Dica: Para calcular se é possível, verifique se G é divisível pelo GCD das capacidades. Além disso, verifique se ele se encaixa em um recipiente.

Lembre-se, isso é , então o código com o menor número de bytes vence.

Classificação

Aqui está um snippet de pilha para gerar uma classificação regular e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, inicie-a com um título, usando o seguinte modelo de remarcação:

# Language Name, N bytes

onde Nestá o tamanho do seu envio. Se você melhorar sua pontuação, poderá manter as pontuações antigas no título, identificando-as. Por exemplo:

# Ruby, <s>104</s> <s>101</s> 96 bytes

Se você quiser incluir vários números no cabeçalho (por exemplo, porque sua pontuação é a soma de dois arquivos ou você deseja listar as penalidades do sinalizador de intérpretes separadamente), verifique se a pontuação real é o último número no cabeçalho:

# Perl, 43 + 2 (-p flag) = 45 bytes

Você também pode transformar o nome do idioma em um link que será exibido no snippet do placar de líderes:

# [><>](http://esolangs.org/wiki/Fish), 121 bytes



Existe um "decantador de saída"? Aka, se eu tiver um decantador de tamanho 1, é possível obter alguma capacidade?
Nathan Merrill

@MartinEnder Ahh. Fixo.
Oliver Ni

@NathanMerrill Não existe "decantador de saída". Você precisa ser capaz de obtê-lo em um dos decantadores fornecidos.
Oliver Ni

9
Esse mesmo desafio estava sendo protegido por sandbox .
xnor

Respostas:


5

Geléia , 9 8 7 bytes

-1 byte graças a @Dennis (use divisão inteira :, em vez de não menos que, )

Ṁ:a⁸g/ḍ

TryItOnline

Quão?

Ṁ:a⁸g/ḍ - Main link: capacities, goal
Ṁ       - maximum capacity
 :      - integer division with goal (effectively not less than goal since non-0 is True)
  a     - and
   ⁸    - left argument (capacities)
    g/  - gcd reduce over list (gcd of capacities)
      ḍ - divides

17

Haskell, 35 bytes

l%n=n`mod`foldr1 gcd l<1&&any(>=n)l

Este artigo prova um resultado que simplifica bastante o problema. O suporte 1 diz que

Você pode atingir uma meta exatamente quando são as duas coisas:

  • Um múltiplo do maior divisor comum (mcd) das capacidades,
  • No máximo, a capacidade máxima

Está claro por que ambos são necessários: todos os valores permanecem múltiplos do MDC e a meta deve caber em um contêiner. A chave do resultado é um algoritmo para produzir qualquer valor de meta que atenda a essas condições.

Ligue para o operador %como [3,6,12]%9.

Uma alternativa de 37 bytes:

l%n=elem n[0,foldr1 gcd l..maximum l]

Acredito que o objetivo deve caber em um dos decantadores, que deve ser menor que o maior volume do decantador (com base no comentário de @ Oliver "Você precisa consegui-lo em um dos decantadores fornecidos").
M-chrzan 22/09/16

Convenientemente, essa é realmente a definição usada no artigo e eu a interpretei errado, portanto é uma solução fácil.
xnor

6

05AB1E , 9 8 9 bytes

Usa a codificação CP-1252

ZU¿%²X>‹‹

Explicação

          # true if
   %      # target size modulo
ZU¿       # gcd of decanter sizes
        ‹ # is smaller than
    ²X>‹  # target size is less than or equal to max decanter size

Experimente online!

Economize 1 byte utilizando o truque menos da resposta MATL de Luis Mendo


1
utilizando a menos de truque ... o que eu aprendi com Dennis :-)
Luis Mendo

A resposta real é ainda 9 bytes ;-)
ETHproductions

@ETHproductions Opa! Parece que atualizei apenas a explicação e o link TIO, não o código real. Obrigado :)
Emigna

5

MATL , 10 bytes

&Zd\&G<~a<

Experimente online!

Isso usa a abordagem do @ xnor .

&Zd    % Take array C as input. Compute the gcd of its elements
\      % Take number G as input. Compute that number modulo the above. Call this A
&G     % Push the two inputs again: C, then G
<~a    % Gives 1 if some element of C is at least G; 0 otherwise. Call this B
<      % Gives true if A is 0 and B is 1; otherwise gives false

5

Excel: 43 bytes

=AND(MOD(A10,GCD(A1:A9))=0,A10<=MAX(A1:A9))

Experimente online !

Como usar:
Coloque esta fórmula em qualquer lugar, exceto A1-A10.
Em seguida, insira seus volumes de retenção de decantação nas células A1: A9 (porque o número de decantação é fixo) e a meta em A10. as células sem decantação devem ser deixadas em branco. Onde quer que você coloque a fórmula, conterá o resultado. VERDADEIRO se você pode alcançar a meta, FALSO se não puder.


5

JavaScript (ES6), 58 bytes

(n,a)=>a.some(e=>n<=e)&n%a.reduce(g=(d,e)=>d?g(e%d,d):e)<1

Outra porta da resposta do @ xnor. Sim, eu uso reducenovamente!


3
Sub-função alternativa: e=>n<=eé um palíndromo visual;)
ETHproductions

4

Retina , 39 bytes

\d+
$*
^(?>(1+)(,?\1)*;)(\1+)$(?<=\3.+)

A entrada deve ser uma lista separada por vírgula dos decantadores, seguida por um ponto e vírgula, seguida pelo volume de destino. Por exemplo:

6,9,21;5

A saída é 0(falsy) ou 1(truthy).

Experimente online! (A primeira linha ativa um conjunto de testes separado por avanço de linha.)

Explicação

\d+
$*

Isso apenas converte a entrada em unário. Depois, simplesmente combinamos entradas válidas com uma única regex:

^(?>(1+)(,?\1)*;)(\1+)$(?<=\3.+)

A parte interna (?>...)encontra o GCD. Fazemos isso encontrando a maior substring 1+com a qual podemos corresponder a todos os decantadores (permitindo um opcional ,somente após uma correspondência completa do GCD). O próprio grupo atômico (the (?>...)) para que o mecanismo regex não volte para os divisores do GCD se o volume alvo não puder ser correspondido (caso contrário, o grupo 1em algum momento será reduzido para corresponder a um único 1e todas as entradas serão verdadeiras) .

Depois de encontrarmos o GCD, tentamos combinar o volume alvo como um múltiplo dele com um simples (\1+)$.

Por fim, verificamos se o volume alvo não é maior que a maior capacidade do filtro, garantindo que o volume possa corresponder dentro de qualquer filtro (?<=\3.+).



2

PARI / GP , 31 bytes

Muito simples. Verificar o max ( vecmax) é muito caro, gostaria de saber se isso pode ser feito melhor.

f(c,g)=g%gcd(c)<1&&vecmax(c)>=g

2

Perl, 47 bytes

Inclui +2 para -ap

Execute com os tamanhos de jar na primeira linha de STDIN e o jar de destino na segunda linha:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

#!/usr/bin/perl -p
$_=($_<@G)>$_%$=;$=--while@G[@F]=grep$_%$=,@F

Essa solução é incomum, pois processa a entrada linha por linha e gera algo para cada um deles. A saída da primeira linha foi cuidadosamente projetada para ficar vazia enquanto a segunda linha imprime a solução. Dois bytes são perdidos em ()causa <e >são projetados para serem não-associativa em perl.

A solução regex também é boa, mas com 49 bytes:

#!/usr/bin/perl -p
s/\d+/1x$&/eg;$_=/^(?>(1+)( |\1)*:)(\1+)$/&/$3./

(algumas peças roubadas da solução Retina)

Para isso, insira STDIN como frascos separados por espaços e alvo depois de ::

decanter.pl <<< "2 5 12:1"

Idiomas difíceis de bater com um builtin gcd(21 bytes) e max(7 bytes) para este ...


0

Scala, 90 53 bytes

def h(g:Int,a:BigInt*)=a.max>g&&a.reduce(_ gcd _)%g<1

Funciona basicamente da mesma forma que as outras respostas, mas o scala não possui uma função gcd integrada. O Scala possui uma função gcd embutida, mas apenas para o BigInt.

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.