デカンティング問題


23

C 0 ... C N-1リットル(0 < C <50)と目標Gリットルを保持できるN個のデカンタ(0 < N <10)が与えられた場合、次のアクション:

  • デカンターを満たします
  • デカンターを空にする
  • 注がれているものがいっぱいになるか、注がれているものが空になるまで、あるデカンタから別のデカンタに注ぐ

目標量Gは、最後の容器の1つに含まれる水の量でなければなりません。「出力デカンタ」を使用することはできません。

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で割り切れるかどうかを確認します。また、コンテナに収まることを確認してください。

これはであるため、バイト数が最小のコードが優先されます。

リーダーボード

これは、通常のリーダーボードと言語別の勝者の概要の両方を生成するスタックスニペットです。

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出物のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

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

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

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

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

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



「出力デカンタ」はありますか?別名、サイズ1のデカンタがある場合、容量は可能ですか?
ネイサンメリル

@MartinEnderああ。一定。
オリバーNi

@NathanMerrill「出力デカンター」はありません。指定されたデカンターの1つで取得できる必要があります。
オリバーNi

9

回答:


5

ゼリー9 8 7 バイト

@Dennis -1バイトのおかげ(分割整数使用:ではなく、以上、

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

目標はデカンターの1つに収まらなければならないと思います。これは最大のデカンターの量よりも少なくなければなりません(@Oliverのコメント「指定されたデカンターの1つで取得できる必要があります」)。
m-chrzan

便利なことに、それは実際に論文で使用されている定義であり、私は読み違えているので、簡単に修正できます。
XNOR

6

05AB1E9 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

オンラインでお試しください!

Luis MendoのMATLアンサーの小なりトリックを利用して1バイトを保存しました


1
デニスから学んだより少ないトリックを活用します:
ルイスメンドー

実際の答えはまだ9バイトです;-)
ETHproductions

@ETHproductionsおっと!実際のコードではなく、説明とTIOリンクのみを更新したようです。ありがとう:)
エミグナ


5

Excel:43バイト

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

オンラインでお試しください

使用方法:
A1-A10以外の場所にこの数式を配置します。
次に、セルA1:A9(デカントの数が固定されているため)にデカント保持ボリュームとA10の目標を入力します。デカントのないセルは空白のままにしてください。数式を配置する場所には、結果が含まれます。目標を達成できる場合はTRUE、達成できない場合はFALSE。


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が完全に一致した後にのみオプションを許可します)。原子団((?>...))自体ので、対象ボリュームが一致しない場合、正規表現エンジンはGCDの除数にバックトラックしないこと(そうでなければ、グループ1のある時点での意志が単一のマッチングに減少させること1と、すべての入力がtruthyであろう) 。

GCDが見つかったら、単純なを使用してターゲットボリュームをその倍数として一致させようとし(\1+)$ます。

最後に、デカンター内でボリュームがで​​一致することを確認することにより、最大デカンターの容量以下のターゲットボリュームであることを確認し(?<=\3.+)ます。



2

PARI / GP、31バイト

かなり簡単です。最大値(vecmax)を確認するのは非常にコストがかかりますが、もっと良くできるかどうかは疑問です。

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

2

Perl、47バイト

+2を含む -ap

STDINの1行目にjarサイズを、2行目にターゲットjarを指定して実行します。

decanter.pl; echo
2 5 12
1
^D

decanter.pl

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

このソリューションは、入力を行ごとに処理し、それぞれに対して何かを出力するという点で異常です。最初の行の出力は空になるように慎重に設計され、2番目の行はソリューションを印刷します。perlでは非結合になるように設計されている()ため<、2バイトが失われます>

正規表現ソリューションも素晴らしいですが、49バイトです。

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

(Retinaソリューションから盗まれた一部)

このために、スペースで区切られたjarとしてSTDINに入力し、後にaを指定し:ます。

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にはbuilt.in gcd関数がありますが、BigInt専用です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.