Problem dekantacji

23

Biorąc pod uwagę N dekanterów (0 < N <10), które mogą pomieścić C 0 ... C N-1 litrów (0 < C <50) i litrów G celu , określ, czy możliwe jest osiągnięcie tego celu przy użyciu tylko następujące działania:

  • Napełnij karafkę
  • Opróżnij dekanter
  • Wlewaj z jednego dekantera do drugiego, aż nalewany będzie pełny lub nalewany pusty

Docelowa kwota G musi być ilością wody w jednym z pojemników na końcu. Nie możesz mieć „dekantera wyjściowego”.

Przykłady

N : 2
C 0 : 5
C 1 : 12
G : 1
Wynik: Tak

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
Wynik: Nie

Wskazówka: Aby obliczyć, czy jest to możliwe, sprawdź, czy G jest podzielne przez GCD pojemności. Upewnij się również, że zmieści się w pojemniku.

Pamiętaj, to jest , więc wygrywa kod o najniższej liczbie bajtów.

Liderów

Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.

Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:

# Language Name, N bytes

gdzie Njest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:

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

Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik to suma dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:

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

Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:

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

Oliver Ni
źródło
Związane z.
Martin Ender
Czy istnieje „dekanter wyjściowy”? Aka, jeśli mam dekanter wielkości 1, czy możliwa jest jakakolwiek pojemność?
Nathan Merrill,
@MartinEnder Ahh. Naprawiony.
Oliver Ni
@NathanMerrill Nie ma „dekantera wyjściowego”. Musisz mieć możliwość uzyskania go w jednym z podanych dekanterów.
Oliver Ni
9
To samo wyzwanie było w piaskownicy .
xnor

Odpowiedzi:

5

Galaretka , 9 8 7 bajtów

-1 bajt dzięki @Dennis (użyj dzielenia liczb całkowitych :zamiast, nie mniej niż, )

Ṁ:a⁸g/ḍ

TryItOnline

W jaki sposób?

Ṁ: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
źródło
17

Haskell, 35 bajtów

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

Ten artykuł dowodzi wyniku, który znacznie upraszcza problem. Prop 1 tak mówi

Możesz osiągnąć cel dokładnie wtedy, gdy oba jednocześnie:

  • Wielokrotność największego wspólnego dzielnika (gcd) pojemności,
  • Co najwyżej maksymalna pojemność

Jest jasne, dlaczego oba są konieczne: wszystkie kwoty pozostają wielokrotnościami gcd, a cel musi zmieścić się w pojemniku. Kluczem do wyniku jest algorytm do wygenerowania dowolnej ilości celu, która spełnia te warunki.

Zadzwoń do operatora %jak [3,6,12]%9.

37-bajtowa alternatywa:

l%n=elem n[0,foldr1 gcd l..maximum l]
xnor
źródło
Uważam, że cel musi mieścić się w jednym z dekanterów, powinien być mniejszy niż pojemność największego dekantera (na podstawie komentarza @ Olivera: „Musisz mieć możliwość uzyskania go w jednym z dekanterów”).
m-chrzan
Dogodnie, taka jest właściwie definicja użyta w papierze i źle ją odczytałem, więc jest to łatwa poprawka.
xnor
6

05AB1E , 9 8 9 bajtów

Wykorzystuje kodowanie CP-1252

ZU¿%²X>‹‹

Wyjaśnienie

          # 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

Wypróbuj online!

Zapisano 1 bajt, wykorzystując mniej niż sztuczkę z odpowiedzi MATL Luisa Mendo

Emigna
źródło
1
wykorzystując mniej niż sztuczkę ... której nauczyłem się od Dennisa :-)
Luis Mendo
Rzeczywista odpowiedź to nadal 9 bajtów ;-)
ETHprodukcje
@ETHproductions Ups! Wygląda na to, że zaktualizowałem tylko objaśnienie i link do TIO, a nie rzeczywisty kod. Dzięki :)
Emigna
5

MATL , 10 bajtów

&Zd\&G<~a<

Wypróbuj online!

Wykorzystuje podejście @ 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
źródło
5

Excel: 43 bajty

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

Wypróbuj online !

Sposób użycia:
Umieść tę formułę w dowolnym miejscu z wyjątkiem A1-A10.
Następnie wprowadź swoje objętości przechowywania dekantu w komórkach A1: A9 (ponieważ liczba dekantów jest stała) i cel w A10. komórki bez dekantu należy pozostawić puste. Gdziekolwiek umieścisz, formuła będzie zawierać wynik. PRAWDA, jeśli możesz osiągnąć cel, FALSE, jeśli nie możesz.


źródło
5

JavaScript (ES6), 58 bajtów

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

Kolejny port odpowiedzi @ xnor. Tak, reduceznów skorzystam !

Neil
źródło
3
Alternatywna podfunkcja: e=>n<=eto wizualny palindrom;)
ETHprodukcje
4

Siatkówka , 39 bajtów

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

Dane wejściowe powinny być oddzieloną przecinkami listą dekanterów, po której należy wstawić średnik, a następnie wolumin docelowy. Na przykład:

6,9,21;5

Dane wyjściowe to 0(fałsz) lub 1(prawda).

Wypróbuj online!(Pierwszy wiersz włącza pakiet testowy oddzielony od linii).

Wyjaśnienie

\d+
$*

To po prostu przekształca dane wejściowe w jednoargumentowe. Następnie po prostu dopasowujemy prawidłowe dane wejściowe za pomocą jednego wyrażenia regularnego:

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

Część wewnątrz (?>...)znajduje GCD. Robimy to, znajdując największy podciąg, 1+z którym możemy dopasować wszystkie dekantery (pozwalając opcjonalnie ,dopiero po pełnym dopasowaniu GCD). Grupa atomowa ( (?>...)sama), aby silnik regex nie cofał się do dzielników GCD, jeśli docelowej objętości nie można dopasować (w przeciwnym razie grupa 1zostanie w pewnym momencie zredukowana do dopasowania jednego, 1a wszystkie dane wejściowe będą zgodne z prawdą) .

Po znalezieniu GCD staramy się dopasować docelową głośność jako wielokrotność za pomocą prostego (\1+)$.

Na koniec sprawdzamy, czy objętość docelowa nie jest większa niż pojemność największego dekantera, upewniając się, że objętość można dopasować do każdego dekantera (?<=\3.+).

Martin Ender
źródło
3

Rubin, 35 bajtów

->n,g{g<=n.max&&1>g%n.reduce(:gcd)}
m-chrzan
źródło
2

PARI / GP , 31 bajtów

Prawie proste. Sprawdzanie max ( vecmax) jest bardzo kosztowne, zastanawiam się, czy można to zrobić lepiej.

f(c,g)=g%gcd(c)<1&&vecmax(c)>=g
Charles
źródło
2

Perl, 47 bajtów

Obejmuje +2 za -ap

Uruchom z rozmiarami słoików w pierwszej linii STDIN i słojem docelowym w drugiej linii:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

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

To rozwiązanie jest niezwykłe, ponieważ przetwarza dane wejściowe linia po linii i wyświetla coś dla każdego z nich. Dane wyjściowe dla pierwszego wiersza zostały starannie zaprojektowane, aby były puste, podczas gdy drugi wiersz drukuje rozwiązanie. Dwa bajty zostaną utracone() bo <i >są przeznaczone do non-asocjacyjne w Perlu.

Rozwiązanie wyrażenia regularnego jest również ładne, ale 49 bajtów:

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

(niektóre części skradzione z rozwiązania Retina)

W tym celu podaj dane wejściowe STDIN jako słoiki oddzielone spacjami i celuj po ::

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

Trudne do pokonania języki z wbudowanym gcd(21 bajtów) i max(7 bajtów) dla tego ...

Ton Hospel
źródło
0

Scala, 90 53 bajtów

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

Działa zasadniczo tak samo jak inne odpowiedzi, ale scala nie ma wbudowanej funkcji gcd. Scala ma wbudowaną funkcję gcd, ale tylko dla BigInt.

corvus_192
źródło