Проблема декантації


23

Враховуючи N графіка (0 < N <10), що може містити C 0 ... C N-1 літрів (0 < C <50) і цілі G літрів, будь ласка, визначте, чи можна досягти цієї мети, використовуючи лише наступні дії:

  • Заповніть графин
  • Порожній графин
  • Перелийте з одного графіка в інший до тих пір, поки не виповниться той, який виливають, або не випорожниться

Цільова кількість G повинна бути кількістю води в одному з контейнерів на кінці. Ви не можете мати «графік виводу».

Приклади

N : 2
C 0 : 5
C 1 : 12
G : 1
Результат: Так

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
Результат: Ні

Підказка: Щоб обчислити, чи можливо, перевірте, чи G ділиться на GCD ємностей. Також переконайтесь, що він вміститься в контейнері.

Пам'ятайте, що це , тому виграє код з найменшою кількістю байтів.

Табло лідерів

Ось фрагмент стека для створення як звичайного табло, так і огляду переможців за мовою.

Щоб переконатися, що ваша відповідь відображається, будь ласка, почніть свою відповідь із заголовка, використовуючи наступний шаблон Markdown:

# Language Name, N bytes

де Nрозмір вашого подання. Якщо ви покращите свій рахунок, ви можете зберегти старі бали у заголовку, прокресливши їх. Наприклад:

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

Якщо ви хочете включити у свій заголовок декілька чисел (наприклад, тому що ваш результат становить суму двох файлів або ви хочете окремо вказати штрафні санкції для перекладача), переконайтесь, що фактичний результат - це останнє число у заголовку:

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

Ви також можете зробити ім'я мови посиланням, яке потім з’явиться у фрагменті таблиць лідерів:

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



Чи є "графік виводу"? Ака, якщо у мене є графін розміром 1, чи можлива будь-яка ємність?
Натан Меррілл

@MartinEnder Ahh. Виправлено.
Олівер Ні

@NathanMerrill Немає "графічного виводу". Потрібно мати змогу отримати його в одному з поданих графіків.
Олівер Ні

9
Цей самий виклик був і пісочницею .
xnor

Відповіді:


5

Желе , 9 8 7 байт

-1 байт завдяки @Dennis (використовуйте ціле ділення :, а не менше, ніж )

Ṁ:a⁸g/ḍ

TryItOnline

Як?

Ṁ: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 байт

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

Цей документ доводить результат, який значно спрощує проблему. Реквізит 1 говорить про це

Ви можете досягти мети саме тоді, коли це обоє:

  • Кратна з найбільших спільних дільниць (gcd) ємностей,
  • Максимум максимальна потужність

Зрозуміло, для чого потрібне обоє: всі суми залишаються кратними gcd, і мета повинна вміщуватися в контейнер. Ключ результату - алгоритм для створення будь-якої мети, яка відповідає цим умовам.

Телефонуйте оператору, %як [3,6,12]%9.

37-байтна альтернатива:

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

Я вважаю, що мета повинна вписатись в один із графів, вона повинна бути меншою за найбільший об'єм графіка (на основі коментаря @ Олівера "Вам потрібно мати змогу отримати її в одному із заданих графін.").
m-chrzan

Зручно, що насправді це визначення, яке використовується у статті, і я неправильно прочитав, тому це легко виправити.
xnor

6

05AB1E , 9 8 9 байт

Використовує кодування CP-1252

ZU¿%²X>‹‹

Пояснення

          # 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

Спробуйте в Інтернеті!

Збережено 1 байт, використовуючи менше, ніж хитрість, з відповіді MATL Луїса Мендо


1
використовуючи менш хитрість ... про що я дізнався від Денніса :-)
Луїс Мендо


@ETHproductions На жаль! Здається, я оновив лише посилання на пояснення та TIO, а не власне код. Дякую :)
Емінья

5

MATL , 10 байт

&Zd\&G<~a<

Спробуйте в Інтернеті!

Для цього використовується підхід @ 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 байти

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

Спробуйте в Інтернеті !

Як користуватися:
Розмістіть цю формулу де завгодно, крім A1-A10.
Потім введіть ваші обсяги Decant у клітинках A1: A9 (оскільки кількість декантів фіксовано) та мета в A10. осередки без декантів слід залишити порожніми. Куди б ви не поставили, формула буде містити результат. ПРАВИЛЬНА, якщо ви можете досягти мети, ЛАЖНА, якщо не можете.


5

JavaScript (ES6), 58 байт

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

Ще один порт відповіді @ xnor. Так, я reduceзнову користуюся !


3
Альтернативна підфункція: e=>n<=eце зоровий паліндром;)
ETHproductions

4

Сітківка , 39 байт

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

Вхід повинен бути розділеним комою списками декантів, а потім крапкою з комою, а потім цільовим томом. Наприклад:

6,9,21;5

Вихідний результат 0(фальшивий) або 1(простий).

Спробуйте в Інтернеті! (Перший рядок включає тестовий набір, відокремлений виведенням ліній.)

Пояснення

\d+
$*

Це просто перетворює вхід в одинаковий. Згодом ми просто співставляємо дійсні дані з одним регулярним виразом:

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

Частина всередині (?>...) знаходить GCD. Ми робимо це, знаходячи найбільшу підрядку, 1+з якою ми можемо зіставити всі графіни (дозволяючи необов’язковою ,лише після повного збігу GCD). Сама атомна група (the (?>...)), щоб двигун регулярних виразів не повертався до дільників GCD, якщо цільовий об'єм не може бути зібраний (інакше група 1в якийсь момент буде зменшена до відповідності одиничному, 1і всі вхідні дані будуть надійними) .

Як тільки ми знайшли GCD, ми намагаємось зіставити цільовий об'єм як кратний з простим (\1+)$.

Нарешті, ми перевіряємо, що цільовий об'єм не перевищує найбільшу ємність графіка, гарантуючи, що об'єм може бути узгоджений у будь-якому графіка з (?<=\3.+) .



2

PARI / GP , 31 байт

Досить прямо. Перевірка max ( vecmax) дуже дорога, мені цікаво, чи можна це зробити краще.

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

2

Perl, 47 байт

Включає +2 для -ap

Виконати з розмірами банки в першому рядку STDIN і цільовій банці в другому рядку:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

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

Це рішення незвичне тим, що воно обробляє рядок введення за рядком і видає щось для кожного з них. Вихід для першого рядка був ретельно розроблений як порожній, а другий рядок друкує рішення. Два байти втрачаються на ()тому, що <і> призначені для неассоціатівное в Perl.

Рішення для регулярних виразів також добре, але 49 байт:

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

(деякі частини, викрадені з розчину Сітківки)

Для цього введіть STDIN у вигляді банок, розділених пробілами та цілями після ::

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

Важко перемогти мови з вбудованим gcd(21 байт) і max(7 байт) для цього ...


0

Scala, 90 53 байти

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

Працює в основному так само, як і інші відповіді, але scala не має вбудованої функції gcd. Scala має вбудовану функцію gcd, але лише для BigInt.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.