倾析问题


23

给定N个卧螺离心机(0 < N <10),可以容纳C 0 ... C N-1升(0 < C <50)升目标G升,请确定是否可以仅使用以下动作:

  • 装满de水器
  • 清空a水器
  • 从一个de水器倒入另一个de水器,直到倒入的水已满或倒空

目标量G必须是最后一个容器中的水量。您不能有“输出倾析器”。

例子

Ñ:2
Ç 0:5
Ç 1:12
ģ:1个
结果:是

Ñ:3
Ç 0:6
Ç 1:9
Ç 2:21
ģ: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



是否有“输出output水器”?再说,如果我有一个1号的can水器,那可能有容量吗?
内森·美林

@MartinEnder啊。固定。
奥利弗·尼

@NathanMerrill没有“输出倾析器”。您需要能够使用给定的倾析器之一来获得它。
奥利弗·尼

9
同样的挑战也被沙盒化了
xnor

Answers:


5

果冻9 8 7 字节

感谢@Dennis -1个字节(使用整数除法:,而不是不小于

Ṁ:a⁸g/ḍ

在线试用

怎么样?

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

我相信目标必须适合其中一个卧螺式离心机,它应该小于最大卧螺式离心机的体积(基于@Oliver的评论“您需要能够使用其中一个卧螺式离心机来获得它。”)。
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链接,而不是实际代码。谢谢:)
Emigna '16

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以外的任何位置。
然后在A1:A9单元格中输入您的Decant容纳量(因为Decant的数量是固定的),并在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.+)

输入应该是用逗号分隔的list水器列表,其后是分号,然后是目标体积。例如:

6,9,21;5

输出为0(虚假)或1(真实)。

在线尝试!(第一行启用换行分隔的测试套件。)

说明

\d+
$*

这只是将输入转换为一元。之后,我们只需将有效输入与单个正则表达式匹配即可:

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

里面的部分(?>...)找到GCD。为此,我们找到了1+可以与所有string水器匹配的最大子串(,只有在完全匹配GCD之后才允许使用可选子串)。原子组(?>...)本身,这样,如果无法匹配目标体积,则正则表达式引擎就不会回溯到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第一行运行jar大小,第二行运行目标jar:

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上输入由jar组成的罐子,并用空格和目标分隔开:

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。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.