给出一个排列,没有彼此相邻的两个连续整数


18

挑战

给定整数n≥4,输出整数[0,n-1]的置换,其属性是没有两个连续的整数(绝对差为1的整数)彼此相邻。

例子

  • 4[1、3、0、2]
  • 5[0,2,4,1,3]
  • 6[0,2,4,1,3,5]
  • 7[0,2,4,1,5,5,6]

您可以改为使用1索引(使用整数[1,n]代替[0,n-1])。

您的代码必须在n的多项式时间内运行,因此您无法尝试所有排列并测试每个排列。


当您说“输出排列”时,您的意思是作为列表?还是我们可以产生一个实现置换映射本身的函数?
xnor

@xnor应该以人类可读的形式输出。我不在乎怎么做。
阿努什

[[1,3],[0,2]]是可接受的输出格式吗?
粗野的

@Shaggy不好。是1,3,0,2吗?
阿努什

Answers:


31

果冻3 2字节

ḂÞ

[1,...,n]中的整数按其LSB 排序。

在线尝试!


哇!这是惊人的。
阿努什

2
“按LSB排序”是指其他每个都移到开头,但是Jelly的定义是否要求每半部分中的数字保持原始顺序?如果不是,则100(4)可能紧挨101(5)并仍“按LSB排序”。不会出错的代码,但是描述性注释可能不完整?
WGroleau '18

1
@WGroleau是的,Þ稳定排序,因为它是使用Python sorted函数实现的,保证可以保持稳定
user202729

3
与小巧的算法相比,该算法对我来说更令人印象深刻。我想,您还可以反转位顺序,排序并反转。
WGroleau '18

4
只能有65536个不同的两个字节的Jelly程序。令人惊奇的是,许多结果证明是ppcg挑战的答案。
阿努什




6

Haskell,22个字节

f是n的函数,它返回适当排序的列表。我正在使用1索引选项。

f n=[2,4..n]++[1,3..n]

6

八度,17字节

@(x)[2:2:x,1:2:x]

在线尝试!

这与许多其他方法使用相同的方法。连接两个向量,一个向量的所有偶数都在2到x的范围内,所有的奇数都在1到x的范围内。语法应该很明显,所以我不会解释。


1
不是32彼此相邻f(4)吗?
pajonk

糟糕...固定。相同的字节数。:-)
Stewie Griffin

5

JavaScript(ES6),40个字节

f=
n=>[...Array(i=n)].map(_=>(i+--i)%(n|1))
<input type=number min=4 oninput=o.textContent=f(+this.value).join`\n`><pre id=o>

编辑:由于@Arnauld,节省了1个字节。


5

盖亚 2字节

r∫

在线尝试!

这只是(稳定) ORTS该范围中的整数[1,输入]可以通过PA - [R ,两者均。


与对Jelly的评论相同:算法或语言的定义是否可以保证两个部分均保持原始顺序?
WGroleau

@WGroleau是的,在盖亚,排序元运算符很稳定。
Xcoder先生18年



4

Japt,4个字节

你也可以替换uv得到不同的顺序。

õ ñu

尝试一下

或者,如果我们可以输出2个数组的数组:

õ ó

尝试一下


从技术上讲,第二个输出由逗号分隔的数字列表;-) 4不幸的是,两者都失败了;您可以通过更改uvo来修复第一个õ
ETHproductions

3

Mathematica,50-> 47-> 42字节

p = Join[Range[2, #, 2], Range[1, #, 2]] &

在线尝试!

感谢user202729指出了Flatten []并使用纯函数的双重优化潜力Join []。

我想补充两点。

1)按照OP中的要求,对于n> = 4,构造没有下降或上升连续的特定排列是非常简单的。

它包含两个连续的列表。

对于偶数n来说是:
list1 =(2,4,...,n / 2)
list2 =(1,3,...,n / 2-1)

对于奇数n,我们有:
list1 =(2,4,...,Floor [n / 2])
list2 =(1,3,...,Floor [n / 2])

对于这种“算法”,只需做出一个决定(n个偶数或奇数),其余的只是写下n个数字。

顶部提供了可能的Mathematica解决方案。

2)一个相关的问题是作为n的函数存在多少这样的置换。

Mathematica,124个字节

a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]

在线尝试!

例:

a[#] & /@ Range[4, 12]

{2,14,90,646 5242,47622,479306,5296790,63779034}

计算这种排列的数量是一个标准问题。

对于n = 4,有2:{{2,4,1,3},{3,1,4,2}}

对于n = 5,有14个:{{1,3,5,2,4},{1,4,2,5,3},{2,4,1,3,5},{2,4, 1,5,3},{2,5,3,1,4},{3,1,4,2,5},{3,1,5,2,4},{3,5,1, 4,2},{3,5,2,4,1},{4,1,3,5,2},{4,2,5,1,3},{4,2,5,3, 1},{5,2,4,1,3},{5,3,1,4,2}}

这些排列的数量a(n)迅速增加:2、14、90、646、5242、47622、479306、5296790、63770934,...

对于较大的n,比率a(n)/ n!似乎接近极限1 / e ^ 2 = 0.135335 ...我没有严格的证据,但这只是来自数字证据的推测。您可以通过尝试在线运行程序来进行测试。

上面的程序(基于下面给出的参考)计算这些数字。

您可以在OEIS的相关顺序中找到更多信息:A002464。赫兹普朗的问题是:在n X n板上排列n个非攻击王的方法,每行和每列有1个。长度为n的排列数,没有连续的上升或下降。


@ Stewie Griffin我是新来者,请详细解释您的意思。在我的第一句话中,我提供了解决多项式时间问题的算法和代码。因此,应将其视为应对挑战的解决方案。第二部分扩展了有趣的问题。因此,应将其视为评论。
Wolfgang Hintze博士,

我随意修改您的提交内容,因此您的Mathematica代码位于顶部。面对代码高尔夫球挑战,必须提供实际代码(尽可能短)。我格式化它的方式成为了您可能想要的Mathematica答案,并且下面仍然有您的原始解释。如果您觉得缺少某些内容或我对初始答案的编辑有误,请随时自行对其进行修改。欢迎来到PPCG!:)
Kevin Cruijssen

@ Kevin Cruijssen非常感谢您的热烈欢迎和对我幼稚的论文的编辑。现在,我为第二句话添加了一个Mathematica程序。最有可能不是legis artis。最重要的是,我不知道如何创建漂亮的“在线尝试”链接。
Wolfgang Hintze博士,

可以使用创建任何链接[some text](the_link)。特别是对于“在线试用”链接,由我们自己的@Dennis托管的https://tio.run/网站包含指向各种编程语言的链接。Wolfram语言(Mathematica)是其中之一。然后,您可以在顶部单击“播放”按钮以运行代码,或单击超链接按钮以复制“在线尝试”。(标记-)链接。您可以将代码拆分为实际的“代码”(提交),并带有一个可选的页眉/页脚,用于(漂亮地)打印一个或多个测试用例。
凯文·克鲁伊森

抱歉,我的评论有些直率,此后也没有回复!答案出现在审阅队列中,由于格式问题,我没有注意到代码。新用户对挑战提出“有趣的观察”而未提供实际答案的情况并不少见。尽管它是真诚完成的,但这不是该网站的目的。我认为这是一个答案。我应该回复您的评论,但是我很着急,无法写新评论,所以我只是删除了旧评论。道歉!欢迎光临本站!我希望你能坚持下去!:)
Stewie Griffin



2

空格,161字节

这是官方的,未注释的提交: 在线尝试!

push_0   
read_n	
		push_0   
retreive_n			push_1  		
subtract	   dup_and_out[ 
 	
 	]label_s'
   
'push_2  		 
subtract	   dup[ 
 ]jump_next_if_neg:
		  
:dup_and_out[ 
 	
 	]else_jump_back:
 
 
:label_ss'
    
'push_0   
retreive_n			push_2  		 
subtract	   dup_and_out[ 
 	
 	]dup[ 
 ]jump_next:
 
    
:label_ssss'
      
'push_2  		 
subtract	   dup[ 
 ]jump_end_if_neg:
		   
:dup_and_out[ 
 	
 	]else_jump_back:
 
    
:label_sss'
     
'end



在线尝试!

我牺牲了一些字节,以便程序可以执行而不会出现任何错误,我相信我可能会丢失大约7-8个字节,并且仍然可以正确输出,但是也会输出错误消息,没有人希望这样做。

全字节说明:

[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][N][Tab][Tab][Tab][Tab]          Read input value and store in heap
[Space][Space][Space][N]                   Push a 0 on the stack again
[Tab][Tab][Tab]                            Retrieve the value from the heap
[Space][Space][Tab][Tab][N]                Push a -1 on the stack
[Tab][Space][Space][Space]                 Add -1 to value
[Space][N][Space]                          Duplicate 
[Tab][N][Space][Tab]                       Output
[N][Space][Space][Space][N]                Set First Label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][N]             If negative, jump to second label
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][N]                    Jump back to first label
[N][Space][Space][Space][Space][N]         Set Second Label
[Space][Space][Space][N]                   Push a 0 on the stack
[Tab][Tab][Tab]                            Retrieve input value from heap again
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 This time, Add a -2 to the value
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[Space][N][Space]                          Duplicate
[N][Space][N][Space][Tab][N]               Jump to third label
[N][Space][Space][Space][Tab][N]           Set third label
[Space][Space][Tab][Tab][Space][N]         Push a -2 on the stack
[Tab][Space][Space][Space]                 Subtract 2 from value
[Space][N][Space]                          Duplicate
[N][Tab][Tab][Space][Space][Space][N]      Jump to end if negative
[Space][N][Space]                          Duplicate
[Tab][N][Space][Tab]                       Output
[N][Space][N][Space][Tab][N]               Jump back to third label
[N][Space][Space][Space][Space][Space][N]  Set fourth label/end
[N][N][N]                                  Terminate

打高尔夫的一些事情:push_0, read_STDIN_as_int, push_0, retrieve可以push_0, duplicate_0, read_STDIN_as_int, retrieve节省一个字节。并且第一个标签可以是NSSN而不是的空标签NSSSN(然后,第二个标签可以是NSSSN;第三NSSTN和第四NSSSSN)。这也应节省8个字节。另外,您可以删除第一个,Jump_to_third_label因为您已经在其Set_third_label下方。总共:140个字节;(或带有注释:在线尝试。)-3字节(如果除去NNN出口)。
凯文·克鲁伊森


1

Gol> <>,14个字节

FL:2%Z}:3=?$|B

在线尝试!

完整程序示例及其工作方式

1AGIE;GDlR~
FL:2%Z}:3=?$|B

1AG          Register row 1 as function G
   IE;       Take number input; halt on EOF
      GD     Call G and print the stack
        lR~  Empty the stack
             Repeat indefinitely

F           |   Repeat n times...
 L              Push loop counter (0..n-1)
  :2%Z}         If even, move to bottom of the stack
       :3=?$    If top == 3, swap top two
                  This is activated only once to make [2 0 3 1]
             B  Return


1

Java 8,56字节

n->{for(int i=n;i>0;)System.out.println((i+--i)%(n|1));}

@Neil的JavaScript(ES6)Answer的端口。

在线尝试。


旧的66个字节的答案:

n->{String[]r={"",""};for(;n-->0;)r[n%2]+=n+" ";return r[0]+r[1];}

在线尝试。

说明:

n->{                  // Method with integer parameter and String return-type
  String[]r={"",""};  //  Result-Strings, both starting empty
  for(;n-->0;)        //  Loop in the range (n, 0]
    r[i%2]+=i+" ";    //   Append `i` and a space to one of the two result-Strings,
                      //   depending on if it is even (first) or odd (second)
  return r[0]+r[1];}  //  Return the two result-Strings appended to each other

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.