Dekantör Sorunu


23

Verilen N sürahiler (0 < N <10) C 0 ... C N-1 litre (0 < C <50) ve bir hedef G litre tutabilir , lütfen yalnızca bu hedefe ulaşmak için bu hedefe ulaşmak mümkün olup olmadığını belirleyin aşağıdaki eylemler:

  • Bir sürahi doldurun
  • Bir sürahiyi boşaltın
  • Bir sürahiden diğerine dökülene kadar veya döküldüğü boş olana kadar dökün

Hedef G miktarı, sonunda yer alan konteynerlerden birinin içindeki su miktarı olmalıdır. Bir 'çıktı sürahisine' sahip olamazsınız.

Örnekler

N : 2
C 0 : 5
C 1 : 12
G : 1
Sonuç: Evet

N : 3
C 0 : 6
C 1 : 9
C 2 : 21
G : 5
Sonuç: Hayır

İpucu: Mümkün olup olmadığını hesaplamak için, G'nin kapasitelerin GCD'sine bölünebilir olup olmadığını kontrol edin . Ayrıca, bir kaba sığacağından emin olun.

Unutmayın, bu , bu yüzden en düşük bayt sayısına sahip olan kod kazanır.

Liderler

Burada hem düzenli bir lider tablosu hem de kazananların dile göre genel bir bakış oluşturması için bir Stack Snippet'i var.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

# Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

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

Başlığınıza birden çok sayı eklemek istiyorsanız (örneğin, puanınız iki dosyanın toplamı olduğundan veya tercüman bayrağı cezalarını ayrı ayrı listelemek istediğinizden dolayı), gerçek puanın başlıktaki son sayı olduğundan emin olun :

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

Dil adını, daha sonra büyük afiş snippet'inde görünecek bir bağlantı da yapabilirsiniz:

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



Bir "çıkış sürahisi" var mı? Aka, eğer 1 beden dekantörüm varsa, herhangi bir kapasite mümkün mü?
Nathan Merrill

@MartinEnder Ahh. Sabit.
Oliver Ni

@NathanMerrill "Çıkış sürahisi" yok. Verilen sürahilerden birinde bunu elde edebilmeniz gerekir.
Oliver Ni

9
Bu aynı zorluk Sandbox'tı .
xnor

Yanıtlar:


5

Jöle , 9 8 7 bayt

@Dennis sayesinde -1 bayt (en :az değil, tam sayı bölme kullanın )

Ṁ:a⁸g/ḍ

TryItOnline

Nasıl?

Ṁ: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 bayt

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

Bu makale sorunu büyük ölçüde basitleştiren bir sonuç ortaya koymaktadır. Pervane 1 diyor ki

Her ikisinde de tam olarak bir hedefe ulaşabilirsiniz:

  • Kapasitelerin en büyük ortak böleninin (gcd) bir çarpımı,
  • Maksimum kapasitede

Bunların ikisinin de neden gerekli olduğu açık: tüm miktarlar gcd'nin katları olarak kalıyor ve amaç bir konteynere sığmalı. Sonucun anahtarı, bu koşullara uyan herhangi bir hedef miktarını üretecek bir algoritmadır.

%Gibi operatörü arayın [3,6,12]%9.

37 baytlık bir alternatif:

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

Amacın, dekantörlerden birine sığması gerektiğine inanıyorum, en büyük dekantör hacminden daha az olması gerekiyor (@ Oliver'ın “Verilen dekantörlerden birine girebilmeniz gerekir” yorumuna göre).
m-chrzan

Uygun olarak, aslında kağıtta kullanılan tanım bu ve yanlış okudum, bu yüzden kolay bir düzeltme.
xnor

6

05AB1E , 9 8 9 bayt

CP-1252 kodlamasını kullanır

ZU¿%²X>‹‹

açıklama

          # 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

Çevrimiçi deneyin!

Luis Mendo'nun MATL cevabından gelen püf noktadan az kullanarak 1 bayt kurtarıldı


1
Dennis :-) 'den öğrendiğim
hünerden

Asıl cevap hala 9 bayt ;-)
ETHproductions 22:16

@ETHproductions Hata! Görünüşe göre gerçek kodu değil sadece açıklama ve TIO bağlantısını güncelledim. Thanks :)
Emigna 22:16

5

MATL , 10 bayt

&Zd\&G<~a<

Çevrimiçi deneyin!

Bu @ xnor yaklaşımını kullanır .

&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 bayt

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

Çevrimiçi deneyin !

Nasıl kullanılır:
Bu formülü A1-A10 Dışında herhangi bir yere koyun.
Daha sonra Decant tutma hacimlerinizi A1: A9 hücrelerine (kiracıların sayısı sabit olduğu için) ve A10'daki hedefi girin. dekant içermeyen hücreler boş bırakılmalıdır. Nereye koyduğunuz her yerde sonucu içerecektir. Hedefe ulaşabilirseniz DOĞRU, yapamazsanız YANLIŞ.


5

JavaScript (ES6), 58 bayt

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

@ Xnor'ın cevabının başka bir limanı. Evet, reducetekrar kullanmaya başladım !


3
Alternatif alt fonksiyon: e=>n<=egörsel bir palindrom;)
ETHproductions 22:16

4

Retina , 39 bayt

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

Girdi, sürahilerin virgülle ayrılmış bir listesi, ardından noktalı virgül, ardından hedef hacmi izlemelidir. Örneğin:

6,9,21;5

Çıktı 0(falsy) veya 1(truthy).

Çevrimiçi deneyin! (İlk satır, satır besleme ayrılmış bir test takımı sağlar.)

açıklama

\d+
$*

Bu sadece girişi unary'e çevirir. Daha sonra geçerli girdileri tek bir regex ile eşleştiriyoruz:

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

İçerideki kısım (?>...)GCD'yi bulur. Bunu 1+, tüm dekantörlerle eşleştirebileceğimiz en geniş alt tabakayı bularak yapıyoruz ( ,yalnızca GCD'nin tam bir eşleşmesinden sonra isteğe bağlı olarak izin verir ). Atomik grubun ( (?>...)) kendisi, böylelikle, eğer hedef hacim eşleştirilemiyorsa, regex motoru, GCD'nin bölenlerine geri dönmez (aksi halde grup 1bir noktada tek bir eşleşmeye indirgenir 1ve tüm girdiler truthy olur) .

GCD’yi bulduktan sonra, hedef hacmi basit bir şekilde çoklu olarak eşleştirmeye çalışırız (\1+)$.

Son olarak, hacmin herhangi bir dekantörle eşleştirilebilmesini sağlayarak hedef hacmin en büyük dekantör kapasitesinden daha büyük olmadığını kontrol ediyoruz (?<=\3.+).



2

PARI / GP , 31 bayt

Hemen hemen anlaşılır. Max ( vecmax) 'i kontrol etmek çok pahalı, acaba daha iyi yapılabilir mi diye merak ediyorum.

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

2

Perl, 47 bayt

İçin +2 içerir -ap

STDIN'in ilk çizgisinde ve ikinci çizgideki hedef kavanozu ile koşun:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

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

Bu çözüm giriş satırını satır satır işlemesi ve her biri için bir şey çıkarması olağandışıdır. İlk satırın çıktısı, ikinci satır çözümü yazdırırken dikkatlice boş olacak şekilde tasarlandı. İki bayt üzerinde kaybolur ()çünkü <ve >perl'de olmayan ilişkisel olacak şekilde tasarlanmıştır.

Regex çözümü de güzel ama 49 bayt:

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

(Retina çözeltisinden çalınan bazı parçalar)

Bunun için, STDIN'e boşluklarla ayrılmış kavanozlar ve a'dan sonra hedef olarak girdi verin ::

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

Bunun için yerleşik gcd(21 bayt) ve max(7 bayt) dilleri yenmek zor ...


0

Scala, 90 53 bayt

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

Temelde diğer cevaplarla aynı şekilde çalışır, ancak scala'nın yerleşik bir gcd işlevi yoktur. Scala'nın yerleşik bir gcd işlevi vardır, ancak yalnızca BigInt için.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.