超排列


26

介绍

您是窃取新技术创业公司Dejavu的一些秘密计划的罪犯。您潜入后墙,但发现一扇需要用别针打开的门。您可以识别出锁的型号,并且知道它需要使用5位数的密码,并且使用从0到4的所有数字。在输入每个数字之后,锁会检查输入的最后5位数,并在密码正确的情况下打开。您必须快速通过此锁定。

简而言之,超置换

排列是一组特定数字的所有可能组合。例如,数字0、1、2的所有排列为:

012、021、102、120、201和210。

如果将所有这些置换连接在一起,则会得到一个超置换:

012021102120201210

此超置换包含0、1、2的所有置换,但可以使该置换短一些。我将在这里略过一些,但是这些数字的最短置换是:

012010210

就我们的意图和目的而言,这实际上是最短的数字字符串,其中包含这些数字的所有可能排列,即超排列。

任务

您的任务比上面的超级置换示例要难一些,因为您还有两个数字需要担心。-如果您还没有阅读有关超置换的文章,或者我上面的例子不清楚,我强烈建议您阅读Patrick Honner撰写的有关该主题的出色文章(这一挑战受到他的文章的启发很大,因此对他表示敬意):https://www.quantamagazine.org/unscrambling-the-hidden-secrets-of-superpermutations-20190116/。您的目标是编写尽可能最短的程序,以产生数字0到4的超排列。

计分

您的程序不接受任何形式的任何输入,并且产生从0到4的数字的超置换。此超置换必须打印到控制台或以您选择的语言提供的可视化方式显示给用户。这不必是最短的排列,而必须是有效的超排列。因此,目标是编写具有最短超置换的最短程序,因此您应该像这样计算分数:

文件大小(字节)*生成的超置换长度(数字)

例如,如果我有一个40字节的程序,并且我的超置换长度为153位数字,那么我的分数将是:

40 * 153 = 6120

与往常一样,目标是使该分数尽可能低。

模板

这是发布答案的方法:

语言| 得分

链接到工作环境中的代码(如果可能)

code snippet

代码说明等

结局

这是我对此网站的第一个问题。因此,请告诉我是否遗漏了任何东西,或者尚不清楚我的挑战的一部分。谢谢,打高尔夫愉快!


我们可以知道最短置换的长度来获得最低分数的想法吗?
致命

1
@Fatalize 153是最短的
TFeld

1
@Fatalize参见A180632
Arnauld

1
乍一看,这似乎只是要求一个de Bruijn序列。但是,评分标准使这一挑战变得有趣。做得好!
暴民埃里克

3
@EriktheOutgolfer它不只是一个进球区别:superpermutation包括一些长度的所有排列,而德布鲁因序列包括一些长度的所有字符串。
Anders Kaseorg

Answers:


6

05AB1E,得分= 1673(7字节·239)

žBœ∊{3ý

在线尝试!

怎么运行的

žB          push 1024
  œ         permutations: ["1024", "1042", …, "4201"]
   ∊        vertically mirror: ["1024", "1042", …, "4201", "4201", …, "1042", "1024"]
    {       sort: ["0124", "0124", "0142", "0142", …, "4210", "4210"]
     3      push 3
      ý     join: "01243012430142301423…3421034210"

Pyth,分数= 1944(9字节·216)

s+R+4d.p4

在线尝试!

怎么运行的

 +R   .p4   append to each permutation d of [0, 1, 2, 3]:
   +4d        [4] + d
s           concatenate

1
vy3yJ保存一个字节
Emigna

1
在Pyth代码中,m+d-> +R保存一个字节。
isaacg

8
由于方法和编程语言都不同,将其作为两个分开的答案发布会更好吗?
Kevin Cruijssen

@KevinCruijssen Meh,它们都是将4个元素的排列与其余元素结合在一起的主题;我的05AB1E答案实际上与我的Pyth答案有很多共同之处,与它自己的不同版本一样。因此,我不想为切换语言要求两倍的投票。
Anders Kaseorg

3

Brachylog,得分= 2907(19字节×153)

4⟦pᶠP∧~l.g;Pz{sᵈ}ᵐ∧

太慢了,看不到任何东西,但是如果您更改42,可以对其进行测试:在线尝试!

这样可以找到最短的超置换:

4⟦                   The range [0,1,2,3,4]
  pᶠP                P is the list of all permutations of this range
     ∧
      ~l.            Try increasing lengths for the output
         g;Pz        Zip the output with P
             {sᵈ}ᵐ   For each permutation, it must be a substring of the output
                  ∧

2

JavaScript(ES6),26975(325 * 83字节)

借助这种评分系统,至少在非依索朗语言中,“硬编码最佳超置换”“仅使用简短的内置函数连接所有置换”之间几乎没有空间。

无论如何,这是一个尝试。

f=(a=[0,1,2,3,4],p=r='')=>a.map((v,i)=>f(a.filter(_=>i--),p+v))|~r.search(p)?r:r+=p

在线尝试!

它生成一个325个字节的字符串:

012340124301324013420142301432021340214302314023410241302431031240314203214032410341203421
041230413204213042310431204321102341024310324103421042310432201342014320314203412041320431
210342104330124301423021430241304123042131024310423201432041321044012340132402134023140312
4032141023410324201342031421034301243021431024320143210

您的观点很正确,我会说我对计分系统有些担心。将来,我将尽力考虑和评分,并采用多种方法。:D
Isaac C

如果你可以返回一个字符串小于23字节的样板,硬编码的分数比这更好的解决方案(26975/153-153>23
Sanchises

@Sanchises对于字符串,我们需要5个字节的样板,对于BigInt,我们需要4个样板。
Arnauld

@Sanchises我们可以稍微压缩一下字符串:在线尝试!(或者,如果您不计算输出的默认n后缀,则更少console.log
尼尔·

2

Python 2,得分:24327 15147 12852 12628(154 * 82字节)

S=str(int('OH97GKT83A0GJRVO309F4SGSRWD0S2T292S1JBPVKJ6CRUY8O',36))
print S+S[::-1]

在线尝试!


也:

Python 2,12628(154 * 82字节)

S=oct(int('FS02C3XQJX14OTVMGM70CGCPWU41MNJZ0CO37ZMU0A0Y',36))[:-1]
print S+S[::-1]

在线尝试!


2

05AB1E,得分:5355 2160(216 * 10 字节

3ÝœJε4yJ}J

@AndersKaseorg的Pyth答案端口,因此请确保支持他!

在线尝试。

说明:

3Ý           # Push a list in the range [0,3]: [0,1,2,3]
  œ          # Get all possible permutations of this list
   J         # Join each inner list together to a single string
    ε        # Map each string `y` to:
             #  (Push string `y` implicitly)
     4       #  Push 4
      y      #  Push string `y` again
       J     #  Join all three together
        }J   # After the map: Join all strings together to a single string
             # (and output it implicitly as result)

2

八度,27 x 442 = 11934

'01234'(perms(1:5)'(4:445))

在线尝试!

因此,事实证明,天真地生成所有排列,然后截断为仍然是有效超排列的最短子串比生成最短超排列要短。可悲的是,这次的成绩不是回文。

八度,97 x 153 = 14841

a=sym(9);while i<120
i=0;a+=1;q='01234';for t=q(perms(1:5))'
i+=any(regexp(char(a),t'));end
end
a

在线尝试!

条目更新了几件事

  • a++ 没有为符号数字实现。
  • contains()在八度中未实现。替换为any(regexp())
  • 在在线链接中,我手动输入了一个a非常接近153长度的超级置换。这样可以验证解决方案。

2

果酱(6 * 240 = 1440)

5e!72>

在线演示验证(输出0..4可以找到的每个排列的索引;由于原始程序向stdout提供了适当的输出,但是它不能直接使用,因此它需要使输出平坦化)。

接近从Sanchises被盗,虽然CJam的排列顺序不同,给予不同的字符串。


果酱(22 * 207 = 4554)

0a4{)W@+W+1$)ew\a*W-}/

在线演示验证

解剖

这使用了简单的递归构造。

0a       e# Start with a superpermutation of one element, [0]
4{       e# for x = 0 to 3:
  )      e#   increment it: n = x+1
  W@+W+  e#   wrap the smaller superpermutation in [-1 ... -1]
  1$)ew  e#   split into chunks of length n+1
  \a*    e#   insert an n between each chunk
  W-     e#   remove the -1s from the ends
}/


1

木炭,29个字节,输出长度153,得分4437

”)⊞⧴�r3⁼H⁴↓¦σ✳LïpWS [T↑ZωÞ”‖O

在线尝试!链接是详细版本的代码。说明:与@TFeld一样,我只打印了一个超置换的一半并进行镜像。我使用以下代码计算了超级置换:

Push(u, w);
for (u) {
    Assign(Plus(Plus(i, Length(i)), i), h);
    Assign(Ternary(i, Join(Split(w, i), h), h), w);
    Assign(Incremented(Length(i)), z);
    if (Less(z, 5)) for (z) Push(u, Slice(h, k, Plus(k, z));
}
Print(w);

这就翻译成Charcoal中的一个45字节程序,所以它的分数为6885。




0

Perl 6、7191(153 * 47字节)

say first *.comb(permutations(5).all.join),0..*

在线尝试!

查找包含数字0到4的所有排列的第一个数字。这将花费长时间来执行,但是您可以使用前两个排列00,1


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.