Il problema della decantazione


23

Dati N decanter (0 < N <10) che possono contenere C 0 ... C N-1 litri (0 < C <50) e un obiettivo G litri, si prega di determinare se è possibile raggiungere quell'obiettivo usando solo il azioni seguenti:

  • Riempi un decantatore
  • Svuota un decantatore
  • Versare da un decanter all'altro fino a quando quello che viene versato è pieno o quello da cui viene versato è vuoto

La quantità obiettivo G deve essere la quantità di acqua in uno dei contenitori alla fine. Non è possibile avere un "decanter di uscita".

Esempi

N : 2
C 0 : 5
C 1 : 12
G : 1
Risultato: Sì

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

Suggerimento: per calcolare se è possibile, verificare se G è divisibile per il GCD delle capacità. Inoltre, assicurati che si adatti a un contenitore.

Ricorda, questo è , quindi vince il codice con il minor numero di byte.

Classifiche

Ecco uno snippet di stack per generare sia una classifica regolare che una panoramica dei vincitori per lingua.

Per assicurarti che la tua risposta venga visualizzata, ti preghiamo di iniziare la risposta con un titolo, usando il seguente modello Markdown:

# Language Name, N bytes

dov'è Nla dimensione del tuo invio. Se si migliora il punteggio, è possibile mantenere i vecchi punteggi nel titolo, colpendoli. Per esempio:

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

Se si desidera includere più numeri nell'intestazione (ad es. Perché il punteggio è la somma di due file o si desidera elencare separatamente le penalità del flag dell'interprete), assicurarsi che il punteggio effettivo sia l' ultimo numero nell'intestazione:

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

Puoi anche rendere il nome della lingua un collegamento che verrà quindi visualizzato nello snippet della classifica:

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



Esiste un "decanter di uscita"? Ah, se ho un decanter di taglia 1, è possibile una capacità?
Nathan Merrill,

@MartinEnder Ahh. Fisso.
Oliver Ni,

@NathanMerrill Non esiste un "decanter di output". Devi essere in grado di ottenerlo in uno dei decanter forniti.
Oliver Ni,

9
Questa stessa sfida era in sandbox .
xnor

Risposte:


5

Gelatina , 9 8 7 byte

-1 byte grazie a @Dennis (usa la divisione intera :, piuttosto che non meno di )

Ṁ:a⁸g/ḍ

TryItOnline

Come?

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

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

Questo documento dimostra un risultato che semplifica enormemente il problema. Prop 1 dice questo

Puoi raggiungere un obiettivo esattamente quando sono entrambi:

  • Un multiplo del massimo comune divisore (gcd) delle capacità,
  • Al massimo la capacità massima

È chiaro il motivo per cui entrambi questi sono necessari: tutti gli importi restano multipli del gcd e l'obiettivo deve rientrare in un contenitore. La chiave del risultato è un algoritmo per produrre qualsiasi importo obiettivo adatto a queste condizioni.

Chiama l'operatore %come [3,6,12]%9.

Un'alternativa a 37 byte:

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

Credo che l'obiettivo debba rientrare in uno dei decanter, dovrebbe essere inferiore al volume del decanter più grande (basato sul commento di @ Oliver "Devi essere in grado di ottenerlo in uno dei decanter forniti").
m-chrzan,

Convenientemente, questa è in realtà la definizione utilizzata nel documento e ho letto male, quindi è una soluzione semplice.
xnor

6

05AB1E , 9 8 9 byte

Utilizza la codifica CP-1252

ZU¿%²X>‹‹

Spiegazione

          # 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

Provalo online!

Ho salvato 1 byte utilizzando il minimo del trucco dalla risposta MATL di Luis Mendo


1
utilizzando il trucco meno che ... che ho imparato da Dennis :-)
Luis Mendo,

La risposta effettiva è ancora 9 byte ;-)
ETHproductions

@ETHproductions Oops! Sembra che abbia aggiornato solo la spiegazione e il collegamento TIO, non il codice effettivo. Grazie :)
Emigna il

5

MATL , 10 byte

&Zd\&G<~a<

Provalo online!

Questo utilizza l'approccio di @ 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 byte

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

Provalo online !

Come usare:
Metti questa formula ovunque tranne A1-A10.
Quindi inserisci i volumi di decantazione nelle celle A1: A9 (perché il numero di decantazioni è fisso) e l'obiettivo in A10. le celle senza decantazioni devono essere lasciate vuote. Ovunque metti la formula conterrà il risultato. VERO se riesci a raggiungere l'obiettivo, FALSO se non puoi.


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

Un'altra porta della risposta di @ xnor. Sì, posso reduceriutilizzarlo!


3
e=>n<=e
Sottofunzione

4

Retina , 39 byte

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

L'input deve essere un elenco separato da virgole dei decanter, seguito da un punto e virgola, seguito dal volume di destinazione. Per esempio:

6,9,21;5

L'output è 0(falso) o 1(verità).

Provalo online! (La prima riga abilita una suite di test separata da avanzamento riga.)

Spiegazione

\d+
$*

Questo converte l'input in unario. Successivamente abbiniamo semplicemente input validi con un unico regex:

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

La parte all'interno (?>...)trova il GCD. Facciamo questo trovando la sottostringa più grande 1+con cui possiamo abbinare tutti i decantatori (consentendo un optional ,solo dopo una corrispondenza completa del GCD). Il gruppo atomico (il (?>...)) stesso in modo che il motore regex non torni indietro ai divisori del GCD se il volume target non può essere abbinato (altrimenti il ​​gruppo 1sarà ridotto ad abbinare un singolo 1e tutti gli input saranno veritieri) .

Una volta trovato il GCD, proviamo ad abbinare il volume target come multiplo di esso con un semplice (\1+)$.

Infine, controlliamo che il volume target non sia superiore alla capacità del decanter più grande, assicurandoci che il volume possa essere abbinato all'interno di qualsiasi decanter con (?<=\3.+).



2

PARI / GP , 31 byte

Praticamente semplice. Controllare max ( vecmax) è molto costoso, mi chiedo se si possa fare di meglio.

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

2

Perl, 47 byte

Include +2 per -ap

Esegui con le dimensioni del vaso sulla prima riga di STDIN e il vaso di destinazione sulla seconda riga:

decanter.pl; echo
2 5 12
1
^D

decanter.pl:

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

Questa soluzione è insolita in quanto elabora l'input riga per riga e genera qualcosa per ciascuno di essi. L'output per la prima riga è stato accuratamente progettato per essere vuoto mentre la seconda riga stampa la soluzione. Si perdono due byte ()perché <e >sono progettati per essere non associativi in ​​perl.

Anche la soluzione regex è carina ma 49 byte:

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

(alcune parti rubate dalla soluzione Retina)

Per questo dare input su STDIN come vasi separati da spazi e target dopo un ::

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

Lingue difficili da battere con un builtin gcd(21 byte) e max(7 byte) per questo ...


0

Scala, 90 53 byte

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

Funziona sostanzialmente come le altre risposte, ma scala non ha una funzione gcd integrata. Scala ha una funzione built-in gcd, ma solo per BigInt.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.