混乱的重排


14

您的任务是编写一个计算机程序,以便将其切成几行(用换行符分隔)时,行的每种排列将输出1n之间的不同数字(其中n是总行数)。两种不同的布置均不得输出数字,并且每种布置均应在此范围内输出数字。既然有n!排列程序行的方式,这意味着每个数字应通过一次重新排列输出。

例如python程序

print 1;"""
print 2;"""

有两种安排

print 1;"""
print 2;"""

print 2;"""
print 1;"""

第一输出1和第二输出2

您可以使用所使用语言的标准输出格式。您可能不会假设任何样板。我认为,如果您必须解决语言所坚持的任何格式,那么这一挑战将变得更加有趣。

计分

您的分数将是程序中的行数,分数越高越好。如果愿意,您可以选择输出0n!-1之间的数字。


3
呈现出适用于任何结构的答案n呢?他们是否都以∞分并列?
马丁·恩德

@MartinEnder是的。∞是一个好成绩。如果您找到这样的建筑,那么您将获胜。
发布Rock Garf Hunter,

@AdmBorkBork是的,每个安排都应输出一个数字。可以更清楚吗?
发布Rock Garf Hunter,

1
@totallyhuman您使用的任何语言的标准输出规则。我将对此问题进行更新,以使其完全清楚。
发布Rock Garf Hunter,

1
@EriktheOutgolfer没有决胜局。马丁可能已经找到了在CJam中获得无穷大的方法,但是还有许多其他语言可以尝试。
发布Rock Garf Hunter,

Answers:


7

CJam,得分:∞

每行的形式

];Lx+:L{__(f<0+:+\,,(;1+:**\(;}h]:+

x0到的数字在哪里n-1?结果是范围为0n!-1

在线尝试!(用于n=3。)

学分jimmy23013一个计算实际置换索引的代码。我只替换了读取输入的位,该位];Lx+:L将丢弃前一行的结果,然后将当前行的索引添加到变量L(最初是一个空数组)中。


哦,我确实写过。但这看起来并不象高尔夫球一样...(例如0+:+),我认为您可以使用来获得更短的版本,m!#
jimmy23013 '18

4

Perl:∞

$z.="-1,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-2,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-3,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}

延伸至您喜欢的任何长度

由于内存使用量像O(n ^ n),将很快耗尽内存。但是,用O(n)代码替换置换索引器会很容易,只需更长的时间。我只是END{}在perl中说明可用于此任务的方式。所有END{}块都在退出时运行,但是由于/A/测试,只有第一个被调用的块(代码中的最后一个)将输出任何内容,这仅是一次

请注意,$m计数器必须计数为字符串,因为它会溢出(比Universe末尾晚,但这是计数的原理)。出于相同的原因,我通过构造As 字符串而不是使用实数计数器来“计数”行数,尽管这种溢出甚至会在以后发生。

在perl中执行此操作的另一种方法:

@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"1".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"2".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"3".!($a.=A),

这利用了在foo = bar bar之后执行in的事实foo。顺便说一下,此版本不会在时间和空间上发疯,但这会使代码更长

还有另一种想法是使用DESTROY,其优点在于将仅执行其中一个。我不会重复已经给出两个示例的置换索引代码。

push@F,"1";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"2";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"3";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }

或使用BEGIN

BEGIN{push@F,"1"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"2"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"3"} print"Work out permutation index of @F\n"; exit;

3

果冻,∞

;3ÇQŒ¿$⁼Q$?
;2ÇQŒ¿$⁼Q$?
;1ÇQŒ¿$⁼Q$?

(带有的示例n=3。)

在线尝试!

23 13每行 11个字节。

对于带有n行的程序,行的格式为

; <i> ÇQŒ¿$⁼Q$?

其中<i>代表数字文字,i并且每行的i取值范围从1到都有不同的值n。(的值i实际上不必是这些特定的数字,它们只必须具有唯一的正值。)此程序不再n在行结构中使用。

怎么样?

  • Jelly不带任何争论就以开头0
  • ;1追加10或活动列表。
  • ⁼Q$是if语句(?)的条件monad,该语句检查列表的元素是否唯一。如果是,则上面的链接称为(Ç),并且另一个数字附加到列表中。如果它们不是唯一的,则意味着我们已经缠绕到第一个链接。从列表(Q)中删除重复的元素,并找到排列的索引(Œ¿)。请注意,0列表在何时开始时Œ¿有一个,但它不会影响输出,因为的值i均为正。

果冻新功能

使用新添加的Ƒ快捷方式,我们可以减少⁼Q$,节省一个字节。

每行10字节(用于一位数字)

;1ÇQŒ¿$QƑ?

在线尝试!


2

脑筋急转弯,3

(({}){})
({}())
(()(){([()()]{})()(){[()()](<{}>)}}{})

在线尝试!

我在较早的聊天中发布了此内容,但希望通过在此处发布它,人们可以在此基础上进行构建。

说明

我们从基本程序开始

(({}){})
({}())

它自己得分2。为了升级到下一个级别,我想添加一个新行。我开始的猜测是

(()(){[()()]{}(<()>)}{})

2会将TOS设置为零(否则为零)。这实际上是一个好的开始。使用其他两行,我们可以从1获得6除以外的所有数字4,因为有2多种输出方式2

({}())
(({}){})
(()(){[()()]{}(<()>)}{})

({}())
(()(){[()()]{}(<()>)}{})
(({}){})

为了解决这个问题,我们将行也设置24。这可以用

(()(){([()()]{})()(){[()()](<{}>)}}{})

为了清楚起见,这基本上实现了Haskell函数

f 0 = 2
f 2 = 4
f x = x

这解决了我们的问题,因为以前输出的程序之一2现在4无需更改其他程序就可以输出。


2

Java 7,得分:∞

public class DerangedRearrangements implements B{public void a(){System.out.println("0");}public static void main(String[]a)throws Exception{java.util.regex.Pattern p=java.util.regex.Pattern.compile("^(?:public )?class ([\\w]+).*");java.io.BufferedReader r=new java.io.BufferedReader(new java.io.FileReader("./DerangedRearrangements.java"));String line; while((line=r.readLine())!=null){java.util.regex.Matcher m=p.matcher(line);if(m.matches()){((B)Class.forName(m.group(1)).getDeclaredConstructor().newInstance()).a();}}}}interface B{void a();}
class b1 implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

在线尝试!

可以打印出0n!-1。其他行的格式如下(其中INDEX是从1n!-1的数字):

class b<INDEX> implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

此方法通过读取其自身的来源来工作,以确定其中列出的订单类别。不幸的是,由于Java如何进行JIT编译,因此我无法通过解析已编译文件或创建自定义ClassLoader来找到更酷的方法。我想我可以让每个其他类仅打印出一个静态定义的数字,但这似乎更有趣。这也可以做到,因此我可以删除B接口,但是计分不是基于字节的,因此我将其保留下来以供娱乐。

工作原理(高级):

逐行读取自己的源代码。由于每一行都声明了一个新类,因此我们使用反射来创建新类的实例并调用它的a方法,因为它实现了B接口。


1

红宝石,得分:∞

(a||=[])<<2;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<1;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<3;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))

在线尝试!

该程序每行有61个字节(n <10)。它的基本格式与dylnan解决方案相同;每行中的第一个数字将是1和之间的不同值n,而每行中的第二个数字将是n

我希望找到一种避免包含n在程序中的方法,但找不到。



0

05AB1E,得分:1,114,112

0ˆ¯JD{œsk
1ˆ¯JD{œsk
2ˆ¯JD{œsk

在线尝试!0索引。每行开头的es将不同的字符推入全局数组。除最后一行外,其余代码无用执行,在最后一行将值连接到字符串中,然后找到其置换索引。1,114,112是撰写本文时可能的Unicode字符的数量(当然,代码点48-57最容易演示)。

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.