挑战
给定整数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的多项式时间内运行,因此您无法尝试所有排列并测试每个排列。
[[1,3],[0,2]]
是可接受的输出格式吗?
挑战
给定整数n≥4,输出整数[0,n-1]的置换,其属性是没有两个连续的整数(绝对差为1的整数)彼此相邻。
例子
您可以改为使用1索引(使用整数[1,n]代替[0,n-1])。
您的代码必须在n的多项式时间内运行,因此您无法尝试所有排列并测试每个排列。
[[1,3],[0,2]]
是可接受的输出格式吗?
Answers:
DJMcMayhem的Python答案和Dennis的Jelly答案的端口
ÝΣÉ
ÝΣÉ - implicitly take input onto stack e.g. 7
Ý - pop a and push range(a) [0,1,2,3,4,5,6]
Σ - sort by (stable):
É - is even? (x%2==0 ?) [1,3,5,0,2,4,6]
- implicit print of top of stack
4
不幸的是,两者都失败了;您可以通过更改u
为v
或o
来修复第一个õ
。
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的函数存在多少这样的置换。
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的排列数,没有连续的上升或下降。
[some text](the_link)
。特别是对于“在线试用”链接,由我们自己的@Dennis托管的https://tio.run/网站包含指向各种编程语言的链接。Wolfram语言(Mathematica)是其中之一。然后,您可以在顶部单击“播放”按钮以运行代码,或单击超链接按钮以复制“在线尝试”。(标记-)链接。您可以将代码拆分为实际的“代码”(提交),并带有一个可选的页眉/页脚,用于(漂亮地)打印一个或多个测试用例。
n=>(f=i=>i<n?[i,...f(i+2)]:i&1?[]:f(1))(0)
n=>(f=i=>i--?[n--*2%(N|1)+N%2,...f(i)]:[])(N=n)
这是官方的,未注释的提交: 在线尝试!
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
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
i./:2|1+i.
/: sort
i. the numbers in the range 0..n-1
2| according the remainder mod 2 of
1+i. the numbers in the range 1..n
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