策展人的困境


9

介绍

您是一家美术馆策展人的朋友,他最近很高兴能从四位艺术家那里获得现代艺术(其中有些人会为策展人提供零艺术品,年轻的流氓)。由于这是现代艺术,因此任何给定艺术家的作品都看起来完全一样。您的朋友想使用计算机来帮助确定这些零件的放置顺序。

课程要求

您的程序必须使用五个整数(传递给函数或通过stdin输入(或以其他方式输入))。前四幅是四位艺术家各自提供的绘画数量。最后一个值是排列索引i(从1开始计数,而不是0)。策展人希望i按字典的顺序查看绘画的排列。

您的程序必须以任何合理的格式输出此排列:例如abbccd[0 1 1 2 2 3]。总输入少于十幅画的运行时间必须少于一个小时(希望这不会有问题)。

不允许使用任何内置函数来计算排列

例子

输入:0 1 2 0 2

假设我们有艺术家B的一幅画和艺术家C的两幅画(它们看起来都一样),则按字典顺序排列是:

['bcc',' cbc ','ccb']

高亮显示的排列将是正确的输出,因为它是按字典顺序排列的第二个。

输入:1 2 0 1 5

[“ abbd”,“ abdb”,“ adbb”,“ babd”,“ badb ”,“ bbad”,“ bbda”,“ bdab”,“ bdba”,“ dabb”,“ dbab”,“ dbba”]

测试中

这是一些应该正确的测试。

1 2 4 1 5    - ABBDCCCC
2 2 3 1 86   - ABBCACDC
4 1 2 0 24   - AACACBA
1 4 3 2 65   - ABBCBBDCDC

此处提供了应随机生成输入和输出的Python3中的一小段代码(不适用于输入,它使用排列的Python导入):

from itertools import permutations
from random import randint
a,b,c,d,n = randint(1,2),randint(1,2),randint(1,3),randint(1,3),randint(1,15)
print(str(a) + " " + str(b) + " " + str(c) + " " + str(d) + " " + str(n) + " - " + str(sorted(set([''.join(p) for p in permutations(a * "a" + b * "b" + c * "c" + d * "d")]))[n-1]))

计分板

Optimizer - CJam       - 39  - Confirmed - Bruteforce
EDC65     - JavaScript - 120 - Confirmed - Bruteforce
Jakube    - Python2    - 175 - Confirmed - Algorithmic

1
您说,“所有零件看起来都完全一样”。您是说“给定艺术家的所有作品看起来完全一样,但不同艺术家的作品看起来却不同”吗?
DavidC

这不是一个有效的条目,但我认为它可能仍然对某人有用:{:A.a.{~97+[:I.}:是有效的J并且可以工作,但是A.用于大多数工作,因此无效。如果您可以编写一个替换A.该函数并将其替换为该函数的函数,那么您将得到一个有效的答案。
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎs-您不必使用“ ABCD”,您完全可以使用任何字符/数字/符号系统。恐怕我不认识J,所以无法说出确切的问题,但希望对您有帮助=)
Alexander Craggs

@PopeyGilbert好了,一个版本刚吐出的数字是{:A.[:I.}:......的事情是,但我仍然不认为A.是有效的:jsoftware.com/help/dictionary/dacapdot.htm
ɐɔıʇǝɥʇuʎs

如果所需的排列不存在怎么办?1 0 0 0 100?
edc65

Answers:


5

Python 2:175163个字符

这不是一个严肃的高尔夫答案。使用不同的算法,我达到了138个字节。只是想在这里发布,因为它不使用蛮力。复杂度是Theta(#pictures)。

f=lambda x:0**x or x*f(x-1)
def g(Q,n):
 while sum(Q):
  for j in 0,1,2,3:
   p=f(sum(Q)-1)*Q[j]
   for k in Q:p/=f(k)
   if p<n:n-=p
   else:print j;Q[j]-=1;break

用法:

g([1, 4, 3, 2], 65)

编辑:

相同的算法,只是打高尔夫球:不导入阶乘方法,计算顺序几乎不变。

Pyth翻译:61个字符

Lu*GhHUb1WsPQV4J*@QNytsPQFZPQ=J/JyZ)I<JeQ XQ4-eQJ)EN XQNt@QNB

这里没什么特别的,我的python代码的确切翻译。太久了。我也用了一些丑陋的东西。仅前9个字母就是阶乘的定义。

Lu*GhHUb1    def y(b): G=1; for H in range(b): G*= H+1; return G

另外,东西Q[j]-=1太长了:(XQNt@QN比Python多1个字符!!!

用法:

在这里尝试:Pyth编译器/执行器。禁用调试模式并[2, 2, 3, 1, 86]用作输入。


有用!恭喜您提出了第一个Python解决方案!但是,我确实发现在我的环境中我必须移出from math import*该功能。将您添加到排行榜!
Alexander Craggs 2015年

哇...您的解决方案非常有效-对于32幅画,它只需要0.034秒o.0。
Alexander Craggs 2015年

3

CJam,50 43 39字节

q~(])\{W):Wa*}%s:X{Xm*:s_&}X,(*{$X=},$=

这可以打很多球。

从STDIN接受以下格式的输入:

4 1 2 0 24

输出绘画。例如,上面的输入:

0020210

在这里在线尝试

请注意,在线编译器放弃了较大的绘画尺寸。您将不得不在Java版本上尝试更大的输入


恭喜您成为第一个求解器!50字节无疑是一个很难克服的值。我会将您添加为页首横幅!
亚历山大·克拉格斯

@PopeyGilbert,您至少应该等待1周左右才能接受答案
Optimizer

啊,好的,非常抱歉!在我之前的挑战中,当有人遭到殴打时,我只是更改了接受的答案。我的错。
亚历山大·克拉格斯

1
@PopeyGilbert你们真是高贵(我希望所有挑战者都做到这一点),原则上您早日接受并没有错,但是,如果周围的挑战尽早接受答案,有些人似乎会不高兴(因为我猜猜,没有人期望作者更改接受的答案)。
马丁·恩德

我个人认为,即使接受得很早,接受之前也应该至少有两个答案可供选择。当然,如果直到一个星期左右只有一个答案,请接受。
Optimizer

3

的JavaScript(ES6)120 138 147

作为具有必需的五个参数的功能,可通过控制台输出。
使用符号0、1、2、3。我计算符号总数,然后构建并检查具有所需位数的每个基数4。数字错误的数字将被丢弃。
注意:使用JavaScript 32位整数,最多可处理15幅画。

编辑更短(避免使用.toString)和更快(修改退出条件)。每次测试的时间低于1秒。

Edit2没有算法更改,增加了更多功能(增加了缩进以提高可读性)

F=(w,x,y,z,n)=>{
  for(a=0;n;n-=l=='0,0,0,0')
    for(l=[w,x,y,z],t=w+x+y+z,v='',b=a++;t--;b/=4)--l[d=b&3],v=d+v;
  console.log(v)
}

无需高尔夫,无需FireFox

F=function(w,x,y,z,n) {
  for(a=0; n; a++) // exit when solution found (if wrong parameters, run forever)
  {
    l=[w,x,y,z]; // required number of each symbol
    t=w+x+y+z; // total of digits
    v=''; // init output string
    for(b=a;
      t--; // digit count down
      b >>= 2) // shift for next digit
    {
        d = b & 3; //get digit
        --l[d]; // decrement for the current digit
        v = d + v; // add to output string         
    }
    l[0]|l[1]|l[2]|l[3] // if digits ok
    ||--n // decrement counter
  }
  console.log(v) // when found, exit for and print the answer
}

在FireBug / FireFox控制台中测试

F(1, 2, 4, 1, 5) 
F(2, 2, 3, 1, 86)
F(4, 1, 2, 0, 24)
F(1, 4, 3, 2, 65)

输出量

01132222
01120232
0020210
0112113232

你好!运行时遇到麻烦。我正在下载FireFox,以查看是否有帮助。我会将您添加到排行榜!
亚历山大·克拉格斯

我在这里找到了一个不错的表格-我认为Firefox是必需的。经过测试,可以正常工作!将排行榜更改为已确认。
亚历山大·克拉格斯

排行榜,但没有支持...您真的不喜欢它!:(
edc65

啊!非常抱歉=(现在已投票=)
Alexander Craggs

我想知道该算法在CJam中使用多长时间。但是到目前为止,我还不知道它是如何工作的:P
Optimizer 2015年

2

珀斯 20

@fqPQm/TdU4^U4sPQteQ

在这里尝试。

输入采用Python列表形式,例如 [1, 2, 4, 1, 5]

输出也采用Python列表形式,例如[0, 1, 1, 3, 2, 2, 2, 2]上述输入。

解决的方法是蛮力,在我的机器上大约需要10秒钟(最坏的情况)。

怎么运行的:

@fqPQm/TdU4^U4sPQteQ
           ^U4sPQ         All permutations of [0, 1, 2, 3] with length equal to the number
                          of paintings.
     m/TdU4               Find the count (/) of paintings by painter in the input list.
 fqPQ                     Filter the permutations on the counts being the desired counts
                          in the input.
                          This gives all possible orderings of the paintings.
@                teQ      Index into this list at the given location - 1. (0-indexing)
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.