Le problème de la décantation

23

Étant donné N carafes (0 < N <10) pouvant contenir C 0 ... C N-1 litres (0 < C <50) et un objectif G litres, veuillez déterminer s'il est possible d'atteindre cet objectif en utilisant uniquement le actions suivantes:

  • Remplissez une carafe
  • Vider une carafe
  • Versez d'une carafe à l'autre jusqu'à ce que celle versée soit pleine ou que celle versée soit vide

La quantité cible G doit être la quantité d'eau dans l'un des conteneurs à la fin. Vous ne pouvez pas avoir de «carafe de sortie».

Exemples

N : 2
C 0 : 5
C 1 : 12
G : 1
Résultat: Oui

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
Résultat: Non

Astuce: Pour calculer si c'est possible, vérifiez si G est divisible par le GCD des capacités. Assurez-vous également qu'il tiendra dans un récipient.

N'oubliez pas qu'il s'agit de , donc le code avec le plus petit nombre d'octets gagne.

Classements

Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.

Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle Markdown suivant:

# Language Name, N bytes

Nest la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les rayant. Par exemple:

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

Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:

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

Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:

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

Oliver Ni
la source
En relation.
Martin Ender
Existe-t-il un "décanteur de sortie"? Aka, si j'ai une carafe de taille 1, une capacité est-elle possible?
Nathan Merrill
@MartinEnder Ahh. Fixé.
Oliver Ni
@NathanMerrill Il n'y a pas de "carafe de sortie". Vous devez pouvoir l'obtenir dans l'une des carafes fournies.
Oliver Ni
9
Ce même défi était en Sandbox .
xnor

Réponses:

5

Gelée , 9 8 7 octets

-1 octet grâce à @Dennis (utilisez une division entière :, plutôt que pas moins de, )

Ṁ:a⁸g/ḍ

TryItOnline

Comment?

Ṁ: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
Jonathan Allan
la source
17

Haskell, 35 octets

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

Ce document prouve un résultat qui simplifie considérablement le problème. Prop 1 dit que

Vous pouvez atteindre un objectif exactement quand il est à la fois:

  • Un multiple du plus grand commun diviseur (pgcd) des capacités,
  • Tout au plus la capacité maximale

Il est clair pourquoi les deux sont nécessaires: tous les montants restent des multiples du pgcd, et l'objectif doit tenir dans un récipient. La clé du résultat est un algorithme pour produire n'importe quel montant d'objectif qui correspond à ces conditions.

Appelez l'opérateur %comme [3,6,12]%9.

Une alternative à 37 octets:

l%n=elem n[0,foldr1 gcd l..maximum l]
xnor
la source
Je crois que l'objectif doit tenir dans l' une des carafes, il devrait être inférieur au plus grand volume de la carafe (basé sur le commentaire de @ Oliver "Vous devez être en mesure de l'obtenir dans l'une des carafes données.").
m-chrzan
Idéalement, c'est en fait la définition utilisée dans le document et j'ai mal lu, c'est donc une solution facile.
xnor
6

05AB1E , 9 8 9 octets

Utilise l' encodage CP-1252

ZU¿%²X>‹‹

Explication

          # 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

Essayez-le en ligne!

1 octet enregistré en utilisant l'astuce moins que la réponse MATL de Luis Mendo

Emigna
la source
1
en utilisant le moins de truc ... que j'ai appris de Dennis :-)
Luis Mendo
La réponse réelle est toujours de 9 octets ;-)
ETHproductions
@ETHproductions Oups! Il semble que je n'ai mis à jour que l'explication et le lien TIO, pas le code réel. Merci :)
Emigna
5

MATL , 10 octets

&Zd\&G<~a<

Essayez-le en ligne!

Cela utilise l'approche de @ 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
Luis Mendo
la source
5

Excel: 43 octets

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

Essayez-le en ligne !

Comment utiliser:
Mettez cette formule n'importe où sauf A1-A10.
Saisissez ensuite vos volumes de décantation dans les cellules A1: A9 (car le nombre de décantes est fixe) et l'objectif dans A10. les cellules sans décantation doivent être laissées en blanc. Partout où vous mettez la formule contiendra le résultat. VRAI si vous pouvez atteindre l'objectif, FAUX si vous ne le pouvez pas.


la source
5

JavaScript (ES6), 58 octets

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

Un autre port de la réponse de @ xnor. Oui, je peux reduceréutiliser!

Neil
la source
3
Sous-fonction alternative: e=>n<=eest un palindrome visuel;)
ETHproductions
4

Rétine , 39 octets

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

L'entrée doit être une liste séparée par des virgules des carafes, suivie d'un point-virgule, suivi du volume cible. Par exemple:

6,9,21;5

La sortie est 0(fausse) ou 1(véridique).

Essayez-le en ligne! (La première ligne active une suite de tests séparés par un saut de ligne.)

Explication

\d+
$*

Cela convertit simplement l'entrée en unaire. Ensuite, nous faisons simplement correspondre les entrées valides avec une seule expression régulière:

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

La partie à l'intérieur (?>...)trouve le GCD. Nous le faisons en trouvant la plus grande sous-chaîne 1+avec laquelle nous pouvons faire correspondre toutes les carafes (permettant une option ,uniquement après une correspondance complète du GCD). Le groupe atomique (le (?>...)) lui-même afin que le moteur d'expression régulière ne revienne pas aux diviseurs du GCD si le volume cible ne peut pas être mis en correspondance (sinon le groupe 1sera à un moment donné réduit à correspondre à un seul 1et toutes les entrées seront véridiques) .

Une fois que nous avons trouvé le GCD, nous essayons de faire correspondre le volume cible en tant que multiple avec un simple (\1+)$.

Enfin, nous vérifions que le volume cible n'est pas supérieur à la plus grande capacité de la carafe, en veillant à ce que le volume puisse être adapté à l'intérieur de n'importe quelle carafe (?<=\3.+).

Martin Ender
la source
3

Rubis, 35 octets

->n,g{g<=n.max&&1>g%n.reduce(:gcd)}
m-chrzan
la source
2

PARI / GP , 31 octets

Assez simple. Vérifier le max ( vecmax) est très coûteux, je me demande si cela peut être mieux fait.

f(c,g)=g%gcd(c)<1&&vecmax(c)>=g
Charles
la source
2

Perl, 47 octets

Comprend +2 pour -ap

Exécutez avec les tailles de pot sur la première ligne de STDIN et le pot cible sur la deuxième ligne:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

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

Cette solution est inhabituelle en ce qu'elle traite l'entrée ligne par ligne et produit quelque chose pour chacun d'eux. La sortie de la première ligne a été soigneusement conçue pour être vide pendant que la deuxième ligne imprime la solution. Deux octets sont perdus sur ()car <et >sont conçus pour être non associatif en Perl.

La solution regex est également sympa mais 49 octets:

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

(certaines parties volées de la solution Retina)

Pour celui-ci, donnez une entrée sur STDIN sous forme de pots séparés par des espaces et ciblez après un : :

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

Langues difficiles à battre avec un intégré gcd(21 octets) et max(7 octets) pour celui-ci ...

Ton Hospel
la source
0

Scala, 90 53 octets

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

Fonctionne essentiellement de la même manière que les autres réponses, mais scala n'a pas de fonction gcd intégrée. Scala a une fonction gcd intégrée, mais uniquement pour BigInt.

corvus_192
la source