Masalah Decanting

23

Diberikan N decanters (0 < N <10) dengan yang dapat menampung C 0 ... C N-1 liter (0 < C <50) dan goal G liter, harap tentukan apakah mungkin untuk mencapai tujuan itu hanya dengan menggunakan tindakan berikut:

  • Isi botol
  • Kosongkan botol
  • Tuang dari satu botol ke botol lain sampai yang dituang penuh atau yang dituang kosong

Jumlah sasaran G harus menjadi jumlah air di salah satu wadah di akhir. Anda tidak dapat memiliki 'decanter keluaran'.

Contohnya

N : 2
C 0 : 5
C 1 : 12
G : 1
Hasil: Ya

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
Hasil: No

Petunjuk: Untuk menghitung jika memungkinkan, periksa untuk melihat apakah G dapat dibagi oleh GCD dari kapasitas. Juga, pastikan itu akan masuk ke dalam wadah.

Ingat, ini adalah , jadi kode dengan jumlah byte terendah menang.

Papan peringkat

Berikut ini adalah Stack Snippet untuk menghasilkan leaderboard biasa dan gambaran umum pemenang berdasarkan bahasa.

Untuk memastikan bahwa jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama, menggunakan templat Penurunan harga berikut:

# Language Name, N bytes

di mana Nukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda bisa menyimpan skor lama di headline, dengan mencoretnya. Contohnya:

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

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (mis. Karena skor Anda adalah jumlah dari dua file atau Anda ingin membuat daftar hukuman penterjemah secara terpisah), pastikan bahwa skor sebenarnya adalah angka terakhir di tajuk:

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

Anda juga dapat membuat tautan nama bahasa yang kemudian akan muncul di cuplikan papan peringkat:

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

Oliver Ni
sumber
Terkait
Martin Ender
Apakah ada "decanter keluaran"? Aka, jika saya memiliki botol ukuran 1, apakah ada kapasitas yang memungkinkan?
Nathan Merrill
@MartinEnder Ahh. Tetap.
Oliver Ni
@NathanMerrill Tidak ada "output decanter." Anda harus bisa mendapatkannya di salah satu decanters yang diberikan.
Oliver Ni
9
Tantangan yang sama sedang di-sandbox .
xnor

Jawaban:

5

Jelly , 9 8 7 byte

-1 byte terima kasih kepada @Dennis (gunakan divisi integer :,, bukannya tidak kurang, )

Ṁ:a⁸g/ḍ

TryItOnline

Bagaimana?

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

Haskell, 35 byte

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

Makalah ini membuktikan hasil yang sangat menyederhanakan masalah. Prop 1 mengatakan itu

Anda dapat mencapai tujuan tepat saat keduanya:

  • Kelipatan pembagi umum terbesar (gcd) dari kapasitas,
  • Paling banyak kapasitas maksimum

Jelas mengapa kedua hal ini diperlukan: semua jumlah tetap kelipatan gcd, dan tujuannya harus sesuai dengan sebuah wadah. Kunci dari hasil adalah algoritma untuk menghasilkan jumlah gol yang sesuai dengan kondisi ini.

Sebut %seperti operator [3,6,12]%9.

Alternatif 37 byte:

l%n=elem n[0,foldr1 gcd l..maximum l]
Tidak
sumber
Saya percaya tujuannya harus sesuai dengan salah satu decanters, itu harus kurang dari volume decanter terbesar (berdasarkan komentar @ Oliver "Anda harus bisa mendapatkannya di salah satu decanters yang diberikan.").
m-chrzan
Mudah, itu sebenarnya definisi yang digunakan di koran dan saya salah baca, jadi itu perbaikan yang mudah.
xnor
6

05AB1E , 9 8 9 byte

Menggunakan pengkodean CP-1252

ZU¿%²X>‹‹

Penjelasan

          # 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

Cobalah online!

Disimpan 1 byte menggunakan trik yang kurang dari jawaban MATL dari Luis Mendo

Emigna
sumber
1
memanfaatkan kurang dari trik ... yang saya pelajari dari Dennis :-)
Luis Mendo
Jawaban sebenarnya masih 9 byte ;-)
ETHproduk
@ETHProduk Ups! Sepertinya saya hanya memperbarui penjelasan dan tautan TIO, bukan kode yang sebenarnya. Terima kasih :)
Emigna
5

MATL , 10 byte

&Zd\&G<~a<

Cobalah online!

Ini menggunakan pendekatan @ 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
sumber
5

Excel: 43 byte

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

Cobalah online !

Cara menggunakan:
Letakkan formula ini di mana saja kecuali A1-A10.
Kemudian masukkan volume memegang Decant Anda di sel A1: A9 (karena jumlah decant diperbaiki) dan tujuannya di A10. sel tanpa decant harus dibiarkan kosong. Di mana pun Anda meletakkan formula akan berisi hasilnya. BENAR jika Anda dapat mencapai tujuan, SALAH jika Anda tidak bisa.


sumber
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

Port lain dari jawaban xnor. Ya, saya bisa menggunakannya reducelagi!

Neil
sumber
3
e=>n<=e
Subfungsi
4

Retina , 39 byte

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

Input harus berupa daftar decanters yang dipisahkan koma, diikuti oleh tanda titik koma, diikuti oleh volume target. Misalnya:

6,9,21;5

Outputnya adalah 0(falsy) atau 1(truthy).

Cobalah online! (Baris pertama memungkinkan suite tes yang dipisahkan dengan linefeed.)

Penjelasan

\d+
$*

Ini hanya mengubah input ke unary. Setelah itu kami cukup mencocokkan input yang valid dengan satu regex:

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

Bagian dalam (?>...)menemukan GCD. Kami melakukan ini dengan menemukan substring terbesar 1+yang kami dapat mencocokkan semua decanters (memungkinkan opsional ,hanya setelah kecocokan penuh GCD). Kelompok atom (the (?>...)) itu sendiri sehingga mesin regex tidak mundur ke pembagi GCD jika volume target tidak dapat dicocokkan (jika tidak, suatu kelompok 1akan dikurangi untuk mencocokkan satu 1dan semua input akan jujur) .

Setelah kami menemukan GCD, kami mencoba mencocokkan volume target sebagai kelipatannya dengan yang sederhana (\1+)$.

Akhirnya, kami memeriksa bahwa volume target tidak lebih besar dari kapasitas decanter terbesar, dengan memastikan bahwa volume dapat dicocokkan dengan decanter manapun (?<=\3.+).

Martin Ender
sumber
3

Ruby, 35 byte

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

PARI / GP , 31 byte

Cukup mudah. Memeriksa maks ( vecmax) sangat mahal, saya ingin tahu apakah itu bisa dilakukan dengan lebih baik.

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

Perl, 47 byte

Termasuk +2 untuk -ap

Jalankan dengan ukuran tabung pada baris pertama STDIN dan tabung target pada baris kedua:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

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

Solusi ini tidak biasa karena memproses input baris demi baris dan mengeluarkan sesuatu untuk masing-masingnya. Output untuk baris pertama dirancang dengan hati-hati agar kosong sementara baris kedua mencetak solusinya. Dua byte hilang ()karena <dan >dirancang untuk non-asosiatif dalam perl.

Solusi regex juga bagus tetapi 49 byte:

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

(beberapa bagian dicuri dari solusi Retina)

Untuk yang ini, berikan input pada STDIN sebagai guci yang dipisahkan oleh spasi dan target setelah ::

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

Sulit dikalahkan bahasa dengan builtin gcd(21 byte) dan max(7 byte) untuk yang satu ini ...

Ton Hospel
sumber
0

Scala, 90 53 byte

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

Bekerja pada dasarnya sama dengan jawaban lainnya, tetapi scala tidak memiliki fungsi gcd bawaan. Scala memiliki fungsi built.in gcd, tetapi hanya untuk BigInt.

corvus_192
sumber