Das Dekantierungsproblem

23

Bei N Dekantern (0 < N <10), die C 0 ... C N-1 Liter (0 < C <50) und ein Ziel G Liter enthalten können, stellen Sie bitte fest, ob es möglich ist, dieses Ziel nur mit der zu erreichen folgende Aktionen:

  • Füllen Sie eine Karaffe
  • Eine Karaffe leeren
  • Von einer Karaffe in eine andere füllen, bis die, in die gegossen wird, voll ist oder die, aus der gegossen wird, leer ist

Die Zielmenge G muss die Wassermenge in einem der Behälter am Ende sein. Sie können keinen Ausgangsdekanter haben.

Beispiele

N : 2
C 0 : 5
C 1 : 12
G : 1
Ergebnis: Ja

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
Ergebnis: Nr

Hinweis: Um zu berechnen, ob es möglich ist, überprüfen Sie, ob G durch die GCD der Kapazitäten teilbar ist. Stellen Sie außerdem sicher, dass es in einen Behälter passt.

Denken Sie daran, dass dies , sodass der Code mit der niedrigsten Anzahl von Bytes gewinnt.

Bestenlisten

Hier ist ein Stapel Snippet sowohl eine regelmäßige Rangliste und einen Überblick über die Gewinner von Sprache zu erzeugen.

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

Oliver Ni
quelle
Verbunden.
Martin Ender
Gibt es einen "Output-Dekanter"? Aka, wenn ich eine Karaffe der Größe 1 habe, ist eine Kapazität möglich?
Nathan Merrill
@ MartinEnder Ahh. Fest.
Oliver Ni
@ NathanMerrill Es gibt keinen "Ausgang Dekanter". Sie müssen in der Lage sein, es in einem der angegebenen Dekanter zu bekommen.
Oliver Ni
9
Dieselbe Herausforderung war Sandboxing .
22.

Antworten:

5

Jelly , 9 8 7 Bytes

-1 Byte dank @Dennis (verwenden Sie die Ganzzahldivision :, anstatt nicht weniger als, )

Ṁ:a⁸g/ḍ

TryItOnline

Wie?

Ṁ: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
quelle
17

Haskell, 35 Bytes

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

Dieses Papier beweist ein Ergebnis, das das Problem erheblich vereinfacht. Prop 1 sagt das

Sie können ein Ziel genau dann erreichen, wenn es beides ist:

  • Ein Vielfaches des größten gemeinsamen Divisors (gcd) der Kapazitäten,
  • Höchstens die maximale Kapazität

Es ist klar, warum beides notwendig ist: Alle Beträge bleiben Vielfache des gcd, und das Ziel muss in einen Container passen. Der Schlüssel des Ergebnisses ist ein Algorithmus, um jeden Zielbetrag zu erzeugen, der diesen Bedingungen entspricht.

Rufen Sie den Operator %gerne an [3,6,12]%9.

Eine 37-Byte-Alternative:

l%n=elem n[0,foldr1 gcd l..maximum l]
xnor
quelle
Ich glaube, das Ziel muss in einen der Dekanter passen , es sollte weniger als das größte Volumen des Dekanters sein (basierend auf @ Olivers Kommentar "Sie müssen in der Lage sein, es in einen der angegebenen Dekanter zu bekommen.").
m-chrzan
Praktischerweise ist das tatsächlich die Definition, die in der Zeitung verwendet wird, und ich habe sie falsch verstanden. Das ist also eine einfache Lösung.
Xnor
6

05AB1E , 9 8 9 Bytes

Verwendet die CP-1252- Codierung

ZU¿%²X>‹‹

Erläuterung

          # 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

Probieren Sie es online!

1 Byte mit dem weniger als Trick aus Luis Mendos MATL-Antwort gespeichert

Emigna
quelle
1
Ich benutze den Trick, den ich von Dennis gelernt habe :-)
Luis Mendo
Die eigentliche Antwort ist noch 9 Bytes ;-)
ETHproductions
@ETHproductions Hoppla! Anscheinend habe ich nur die Erklärung und den TIO-Link aktualisiert, nicht den eigentlichen Code. Danke :)
Emigna
5

MATL , 10 Bytes

&Zd\&G<~a<

Probieren Sie es online!

Hierbei wird der @ xnor-Ansatz verwendet .

&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
quelle
5

Excel: 43 Bytes

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

Probieren Sie es online !

So verwenden Sie:
Setzen Sie diese Formel überall außer A1-A10.
Geben Sie dann Ihr Dekantierungsvolumen in die Zellen A1: A9 (da die Anzahl der Dekantierungen festgelegt ist) und das Ziel in A10 ein. Zellen ohne Dekanter sollten leer bleiben. Wo auch immer Sie die Formel einfügen, sie enthält das Ergebnis. WAHR, wenn Sie das Ziel erreichen können, FALSCH, wenn Sie nicht können.


quelle
5

JavaScript (ES6), 58 Byte

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

Ein weiterer Port von @ xnors Antwort. Ja, ich kann es wieder benutzen reduce!

Neil
quelle
3
Alternative Unterfunktion: e=>n<=eist ein visuelles Palindrom;)
ETHproductions
4

Netzhaut , 39 Bytes

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

Die Eingabe sollte eine durch Kommas getrennte Liste der Dekanter sein, gefolgt von einem Semikolon und dem Zielvolumen. Z.B:

6,9,21;5

Die Ausgabe ist 0(falsch) oder 1(wahr).

Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)

Erläuterung

\d+
$*

Dadurch wird die Eingabe nur in unär umgewandelt. Danach ordnen wir einfach gültige Eingaben einem einzigen regulären Ausdruck zu:

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

Der innere Teil (?>...)findet den GCD. Wir finden dazu den größten Teilstring, 1+mit dem wir alle Dekanter abgleichen können (optional ,nur nach einer vollständigen Übereinstimmung der GCD). Die Atomgruppe ( (?>...)n) selbst, damit die Regex-Engine nicht zu Teilern der GCD zurückkehrt, wenn das Zielvolumen nicht erreicht werden kann (andernfalls wird die Gruppe 1irgendwann auf die Übereinstimmung mit einer einzelnen reduziert 1und alle Eingaben sind wahr). .

Sobald wir den GCD gefunden haben, versuchen wir, das Zielvolumen als Vielfaches mit einem einfachen Wert abzugleichen (\1+)$.

Schließlich überprüfen wir, ob das Zielvolumen nicht größer als die Kapazität des größten Dekanters ist, indem wir sicherstellen, dass das Volumen in jedem Dekanter mit diesem übereinstimmt (?<=\3.+).

Martin Ender
quelle
3

Ruby, 35 Bytes

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

PARI / GP , 31 Bytes

Ziemlich unkompliziert. Das Überprüfen von max ( vecmax) ist sehr kostspielig und ich frage mich, ob es besser geht.

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

Perl, 47 Bytes

Beinhaltet +2 für -ap

Laufen Sie mit den Glasgrößen in der ersten Zeile von STDIN und dem Zielglas in der zweiten Zeile:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

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

Diese Lösung ist insofern ungewöhnlich, als sie die Eingabe zeilenweise verarbeitet und für jede Zeile etwas ausgibt. Die Ausgabe für die erste Zeile wurde sorgfältig so gestaltet, dass sie leer ist, während die zweite Zeile die Lösung druckt. Zwei Bytes verloren auf , ()weil <und >sind so konzipiert, dass nicht-assoziativ in Perl.

Die Regex-Lösung ist auch schön, aber 49 Bytes:

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

(einige Teile aus der Retina-Lösung gestohlen)

Geben Sie dazu STDIN als Jars ein, die durch Leerzeichen und Ziel nach a getrennt sind ::

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

Schwer zu übertreffende Sprachen mit einem eingebauten gcd(21 Bytes) und max(7 Bytes) für dieses ...

Tonne Hospel
quelle
0

Scala, 90 53 Bytes

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

Funktioniert im Prinzip genauso wie die anderen Antworten, aber scala hat keine eingebaute gcd-Funktion. Scala hat eine eingebaute gcd-Funktion, aber nur für BigInt.

corvus_192
quelle