字符串全排列
[i=s] 本帖最后由 happy886rr 于 2017-4-8 09:38 编辑 [/i]字符串 def 的全排列为:def、dfe、edf、efd、fde、fed。那么字符串bathome的全排列是?
(不限编程语言,能输出正确的全排列即可,代码越少越好。)
示例代码: C[code]#include <stdio.h>
#include <string.h>
void swap(char *a, char *b)
{
char tmp = *a;
*a = *b;
*b = tmp;
}
void arrange(char *str, int start, int end)
{
int i;
if(start == end)
{
printf("%s\n",str);
}else{
for(i = start; i < end; i++)
{
swap(str+start,str+i);
arrange(str,start+1,end);
swap(str+start,str+i);
}
}
}
int main(void)
{
char str[10]="bathome";
int len = strlen(str);
arrange(str,0,len);
return 0;
}[/code]示例代码: js混编[code]1>1/* :
@echo off
cscript -nologo -e:jscript "%~f0" %*
pause&exit /b
*/
permutations('bathome'.split(''));
function permutations(arr)
{
(function exfn(source, result)
{
if(source.length == 0){
WSH.echo(result.join(''));
}else{
for (var i=0; i<source.length; i++){
exfn(source.slice(0, i).concat(source.slice(i+1)), result.concat(source[i]));
}
}
})(arr, []);
}
[/code] 每次看到这话题,总想安利一下 plp626 那神一样的纯批解:
[url]http://bbs.bathome.net/redirect.php?goto=findpost&ptid=11959&pid=76175[/url] [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198031&ptid=43749]2#[/url] [i]CrLf[/i] [/b]
plp这个也太牛了吧,骨瘦如柴啊。[code]setlocal&set "s=%~1 "&if "!s: =!" == "" (echo %~2)else for %%b in (%~1)do call:perm "!s:%%b =!" "%~2 %%b"[/code]感觉他是在写诗。 [i=s] 本帖最后由 codegay 于 2017-4-7 23:40 编辑 [/i]
:lol 我只知道这么写:
python3[code]from itertools import permutations as pm
for r in pm("bathome"):
print(''.join(r))[/code] :lol 没有内置类库我大约不会写。 [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198037&ptid=43749]5#[/url] [i]codegay[/i] [/b]
非常短,这次代码数你的最短,最好。因为题目不限语言。你几乎胜了。 [code]function arrange(str) {
str = str + '';
if (str.length <= 1) {
return [str];
}
var aStrRest = arrange(str.slice(1));
var sFirst = str.charAt(0);
var item;
var aReturn = [];
for (var i = 0, l = aStrRest.length; i < l; i++) {
item = aStrRest[i];
for (var j = 0, litem = item.length; j <= litem; j++) {
aReturn.push(item.slice(0, j) + sFirst + item.slice(j));
}
}
return aReturn;
}
console.log(arrange('bathome').join('\n'));[/code] [i=s] 本帖最后由 a20150604 于 2017-4-8 02:27 编辑 [/i]
追求高效的纯批置换算法: 从生成一个元素的全排列, 逐次进阶扩展到 2, 3, .... 个元素, 排除命令行窗口显示耗时, 仅数据生成时间 < 1秒 (i3 处理器)[code]@echo off & setlocal enabledelayedexpansion & mode 160, 1000
set z=1;
set z
for /L %%j in (2 1 6) do (
set /a k=%%j-1
set x=
for /L %%i in (1 1 !k!) do (
set t=!z:%%i=%%j!
set x=!x!!t:;=%%i;!
)
set z=!z:;=%%j;!!x!
set z
)
echo;complete 6
REM 7个元素的全排列用带分隔符的单变量存储超出批处理变量存储极限, 只能另行处理
REM 数字形式
REM echo;!z:;=7;!
REM for /L %%i in (1 1 6) do (
REM set t=!z:%%i=7!
REM echo;!t:;=%%i;!
REM )
set t7=!z:;=e;!
for /L %%i in (1 1 6) do (
set t%%i=!z:%%i=e!
set t%%i=!t%%i:;=%%i;!
)
for /L %%i in (1 1 7) do (
for %%Q in (1:b 2:a 3:t 4:h 5:o 6:m) do for /f "tokens=1-2 delims=:" %%W in ("%%Q") do set t%%i=!t%%i:%%W=%%X!
echo;!t%%i:;= !
)
echo;complete 7
pause
exit
[/code] [i=s] 本帖最后由 a20150604 于 2017-4-8 02:56 编辑 [/i]
Wolfram 语言[code]Permutations[{b,a,t,h,o,m,e}][/code]格式处理一下[code]StringJoin /@ Permutations[Characters["bathome"]][/code] :lol 最近论坛新来的几个ID技术都很不错啊。 [code]@echo off
REM %str%为要排列的字符串,但不能含"^
set "str=|&<>bat"
call :arrange "%str%"
pause
exit /b
:arrange
setlocal
set "s=%~1"
if not defined s (
call :escape "%~2"
call echo,%%r%%
goto end
)
set /a "n=0"
:loop
set /a "m=n+1"
call set "pre=%%s:~%n%,1%%"
call set "rest=%%s:~,%n%%%%%s:~%m%%%"
if not defined pre goto end
call :arrange "%rest%" "%~2%pre%"
set /a "n+=1"
goto loop
:end
endlocal
exit /b
:escape
set "r=%~1"
set "r=%r:^=^^%"
set "r=%r:&=^&%"
set "r=%r:|=^|%"
set "r=%r:<=^<%"
set "r=%r:>=^>%"
set "r=%r:"=^"%"
exit /b
[/code] [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198043&ptid=43749]10#[/url] [i]codegay[/i] [/b]
藏龙卧虎啊,你不出点题,他们怎能显山露水。 [i=s] 本帖最后由 pcl_test 于 2017-4-8 09:30 编辑 [/i]
[code]
@echo off
powershell ^
function perm($str, $t){^
$len=$str.length;^
if($len -le 1){$t+''+$str}else{^
for($i=0; $i -lt $len; ++$i)^
{^
perm ($str.Substring(0, $i)+''+$str.Substring($i+1, $len-$i-1)) ($t+''+$str[$i]);^
}}^
}^
perm 'bathome';
pause
[/code] [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198029&ptid=43749]1#[/url] [i]happy886rr[/i] [/b]
为什么你这算法的数组操作35ms完成,而我字符串操作7ms完成,为什么数组会慢 这么多?不合理啊!! [i=s] 本帖最后由 523066680 于 2017-4-8 11:24 编辑 [/i]
挖坟
[url]http://bbs.bathome.net/viewthread.php?tid=1701&extra=&page=1[/url]
[url]http://bbs.bathome.net/viewthread.php?tid=11959[/url]
[url]http://bbs.bathome.net/viewthread.php?tid=8747[/url]
以及 plp 的那段代码 可以不要 setlocal enabledelayedexpansion
[url=http://bbs.bathome.net/redirect.php?goto=findpost&ptid=25423&pid=134729]http://bbs.bathome.net/redirect.php?goto=findpost&ptid=25423&pid=134729[/url] [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198049&ptid=43749]14#[/url] [i]flashercs[/i] [/b]
我明白了,性能差主要是函数调用次数太多,那种算法调用了7的阶乘次函数,而用循环来实现会快很多。我那个调用7次函数,所以快一些,但是应该可以只用循环实现的,就是三个嵌套循环。 [i=s] 本帖最后由 523066680 于 2017-4-8 13:20 编辑 [/i]
C语言已忘光,代码毫无新意[code]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void f(char *oldstr, char *newstr, int len, int lv)
{
char *ostr = (char *)malloc( len * sizeof(char) );
for (int i = 0; i < len; i++)
{
strcpy( ostr, oldstr );
newstr[lv] = ostr[i];
newstr[lv+1] = '\0';
if (len == 1)
printf("%s \n", newstr);
for (int j = i; j < (len-1); j++)
ostr[j] = ostr[j+1];
if ( len > 0 )
f( ostr, newstr, len-1, lv+1 );
}
}
int main(int argc, char *argv[])
{
char oldstr[] = "bathome";
char *newstr = (char *)malloc( (strlen(oldstr)+1) * sizeof(char) );
f(oldstr, newstr, strlen(oldstr), 0);
return 0;
}
[/code]Perl (不借用外部模块)[code]my @cup;
my @nums;
our $len;
@nums = (split("", "bathome"));
$len = $#nums+1;
&func(\@cup, \@nums);
sub func
{
my ($a, $b) = (shift, shift);
my @ar;
my @br;
print join(",", @{$a}),"\n" if ( scalar(@{$a}) == $len );
for my $i ( 0 .. $#{$b} )
{
@ar = (@{$a}, $b->[$i]);
@br = @{$b}[0..$i-1, $i+1..$#{$b}];
&func(\@ar, \@br);
}
}[/code]以下拷贝自《High-Order Perl》[code]sub permute
{
my @items = @{ $_[0] };
my @perms = @{ $_[1] };
unless (@items)
{
print join("", @perms) ,"\n";
}
else
{
my(@newitems,@newperms,$i);
for $i (0 .. $#items)
{
@newitems = @items;
@newperms = @perms;
unshift(@newperms, splice(@newitems, $i, 1));
permute([@newitems], [@newperms]);
}
}
}
# sample call:
permute([qw(b a t h o m e)], []);[/code]《High-Order Perl》里面有更有趣的思路,午休,有空再更 [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198051&ptid=43749]16#[/url] [i]flashercs[/i] [/b]
你的速度确实蛮快,但是那个批处理版就很慢了。 [i=s] 本帖最后由 523066680 于 2017-4-8 16:50 编辑 [/i]
Here's a little program that generates all permutations of all the words
on each line of input. The algorithm embodied in the "permute()"
function is discussed in Volume 4 (still unpublished) of Knuth's *The
Art of Computer Programming* and will work on any list:[code]#!/usr/bin/perl -n
# Fischer-Krause ordered permutation generator
sub permute (&@) {
my $code = shift;
my @idx = 0..$#_;
while ( $code->(@_[@idx]) ) {
my $p = $#idx;
--$p while $idx[$p-1] > $idx[$p];
my $q = $p or return;
push @idx, reverse splice @idx, $p;
++$q while $idx[$p-1] > $idx[$q];
@idx[$p-1,$q]=@idx[$q,$p-1];
}
}
permute { print "@_\n" } split;[/code]来自 perldoc -q permute, 调用示例:echo a b c | permute.pl
刚开始真没看懂,蜜汁语法 ……
只看出来说是 knuth 在 计算机程序设计艺术 卷4 里面提到的算法,该书还未出版。
待会儿再更 8 楼置换算法的 JS 和 VBS 版
JS[code]Z = "1;";
for( j = 2; j <= 7; j++ ) {
t = Z;
Z = Z.replace(/;/g, j + ";")
for ( i = 1; i <= j - 1; i++ ) Z = Z + t.replace(RegExp(i, "g"), j).replace(/;/g, i + ";");
}
for( i = 1; i <= 7; i++ ) Z = Z.replace(RegExp(i, "g"), "bathome".substr(i - 1, 1));
console.log(Z);[/code]VBS[code]Z = "1;"
For j = 2 To 7
t = Z
Z = Replace(Z, ";", j & ";")
For i = 1 To j - 1
Z = Z & Replace(Replace(t, i, j), ";", i & ";")
Next
Next
For i = 1 To 7
Z = Replace(Z, i, Mid("bathome", i, 1))
Next
WScript.Echo Z[/code] http://www.cs.utsa.edu/~wagner/knuth/
Donald E. Knuth
The Art of Computer
Programming
Volume 4,
Combinatorial Algorithms [i=s] 本帖最后由 523066680 于 2017-4-8 20:28 编辑 [/i]
解读和代码转C,主要是有一个数字调换的规律[code]
/* Translate by 523066680@163.com */
#include <stdio.h>
void splice_and_reverse( int *arr, int p, int ubound )
{
int t;
for (int i = p; i <= (ubound+p)/2 ; i++ )
{
t = arr[i];
arr[i] = arr[ubound - i + p];
arr[ubound - i + p] = t;
}
}
void exchange(int *arr, int a, int b)
{
int t;
t = arr[a];
arr[a] = arr[b];
arr[b] = t;
}
void print_array(int *arr, int ubound)
{
for (int i = 0; i <= ubound; i++)
printf("%d", arr[i]);
printf("\n");
}
int main(int argc, char *argv[] )
{
int arr[] = {0, 1, 2, 3};
int ubound = sizeof(arr) / sizeof(arr[0]) - 1;
int p, q;
while (1)
{
p = ubound;
//p 递减,直到 当前元素 > 上一个元素 ,上一个元素记为 N
while ( arr[p-1] > arr[p] ) p--;
if ( p <= 0 ) break;
q = p;
//反转 从 p 至 末尾的元素
splice_and_reverse( arr, p, ubound );
//q 递增,直到当前元素 > N
while ( arr[p-1] > arr[q] ) q++;
//交换
exchange(arr, p-1, q);
//打印结果
print_array(arr, ubound);
}
return 0;
}
[/code]有了这一个规则,我们可以 通过某个中间的排列得出下一个结果:
举一个 6 位的
arr[] = 5 3 4 2 1 0
[list]
[*]init p = 5, 当 arr[p-1] > arr[p], p递减, p = 2; 记住 arr[p-1] = 3
[*]反转后面 2,3,4,5 位, arr[] = 5 3 [b]0 1 2 4[/b];
[*]之后的计算依据 5 3 0 1 2 4
[*]init q = p = 2; 当 3 > arr[q], q递增, q = 5;
从 [b]5 3 0 1 2 4[/b] 调换 arr[1] arr[5] 得
[/list]
arr[] = 5 4 0 1 2 3 [code]
@echo off & setlocal enabledelayedexpansion
set "str[0]= b a t h o m e"
set tm1=%time%
for %%a in (%str[0]%) do (
set /a n+=1
set /a odr[!n!]=n-1
set var[!n!]=%%~a
)
::FOR的嵌套递归,借鉴了http://bbs.bathome.net/viewthread.php?tid=1701&extra=&page=2中22楼CrLf的答案。
for /l %%a in (1, 1, %n%) do if not "%%~a"=="%n%" (
set "for=!for!for %%!var[%%~a]! in (^!str[!odr[%%~a]!]^!) do ( set "str[%%~a]=^^^!str[!odr[%%~a]!]: %%~!var[%%~a]!=^^^!" & "
) else (
set "for=!for!for %%!var[%%~a]! in (^!str[!odr[%%~a]!]^!) do ( "
)
set "for=!for!echo;!str[0]: = %%~!"
for /l %%a in (1, 1, %n%) do set "for=!for!) "
%for%
echo; 始于%tm1% ^
终于%time%
pause
[/code] [b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=198043&ptid=43749]10#[/url] [i]codegay[/i] [/b]
我可是在知乎给论坛打了广告哇 [url]https://www.zhihu.com/question/57102581/answer/152543345[/url]
模式计算-迭代法
[i=s] 本帖最后由 523066680 于 2017-5-15 12:35 编辑 [/i]编辑/整理:523066680@163.com
日期:2017-05
[size=2][b]序[/b][/size][list][list]
通过迭代方式获得排列的方案,参考自《Higher-Order Perl》
[/list][/list][size=2][b]概念[/b][/size][list][list]
假设有4个元素: @arr = (a, b, c, d),下标为 0 1 2 3,每提取一个元素,
数组重新定义,下标从0开始。排列和下标的提取关系:
a b c d -> 0 0 0 0
a b d b -> 0 0 1 0
a c b d -> 0 1 0 0
a c d b -> 0 1 1 0
a d b c -> 0 2 0 0
...
注意这里数字的变化和进制换算、递增非常相似,区别在于,每一位的进制是不同的:
末位始终为0,
倒数第二位最大为1(0,1),
倒数第三位最大为2(0,1,2),
倒数第四位最大为3(0,1,2,3)
一共能产生 4[i]3[/i]2*1 种模式(pattern) (刚好对应24种排列情况)
[/list][/list][size=2][b]不同模式的生成和换算[/b][/size][list][list]
先设计一种换算函数,对于传入的任意数字,计算出对应的模式:
[list][list][table=60%,#f8f8f8]
[tr][td][font=consolas][size=2][font=consolas][size=3][color=#b00040]my[/color] [color=#b00040]@elements[/color] [color=#555555]=[/color] qw[color=#555555]/a b c d/[/color][color=#555555];[/color] [color=#408080][i]#元素[/i][/color]
[color=#b00040]my[/color] [color=#b00040]$seats[/color] [color=#555555]=[/color] [color=#b00040]$#elements[/color] [color=#555555]+[/color] [color=#666666]1[/color][color=#555555];[/color] [color=#408080][i]#数量[/i][/color]
[color=#b00040]my[/color] [color=#b00040]@order[/color] [color=#555555]= ([/color][color=#666666]0[/color][color=#555555])[/color] x [color=#b00040]$seats[/color][color=#555555];[/color] [color=#408080][i]#初始模板[/i][/color]
to_pattern[color=#555555]([/color][color=#666666]5[/color][color=#555555],[/color] [color=#b00040]$seats[/color][color=#555555],[/color] \[color=#b00040]@order[/color][color=#555555]);[/color]
[color=#b00040]print join[/color][color=#555555]([/color][color=#ba2121]","[/color][color=#555555],[/color] [color=#b00040]@order[/color][color=#555555]);[/color]
[color=#008000][b]sub[/b][/color] to_pattern [color=#408080][i]#转换器[/i][/color]
[color=#555555]{[/color]
[color=#b00040]my[/color] [color=#555555]([/color][color=#b00040]$num[/color][color=#555555],[/color] [color=#b00040]$seats[/color][color=#555555],[/color] [color=#b00040]$o_ref[/color][color=#555555]) =[/color] [color=#b00040]@_[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]$mod[/color][color=#555555];[/color]
[color=#008000][b]for[/b][/color] [color=#b00040]my[/color] [color=#b00040]$div[/color] [color=#555555]([/color] [color=#666666]1[/color] [color=#555555]..[/color] [color=#b00040]$seats[/color] [color=#555555])[/color]
[color=#555555]{[/color]
[color=#b00040]$mod[/color] [color=#555555]=[/color] [color=#b00040]$num[/color] [color=#555555]%[/color] [color=#b00040]$div[/color][color=#555555];[/color]
[color=#b00040]$num[/color] [color=#555555]=[/color] [color=#b00040]int[/color][color=#555555]([/color][color=#b00040]$num[/color] [color=#555555]/[/color] [color=#b00040]$div[/color][color=#555555]);[/color]
[color=#b00040]$o_ref[/color][color=#555555]->[-[/color][color=#b00040]$div[/color][color=#555555]] =[/color] [color=#b00040]$mod[/color][color=#555555];[/color] [color=#408080][i]#倒序填入[/i][/color]
[color=#555555]}[/color]
[color=#555555]}[/color][/size][/font][/size][/font][/td][/tr]
[/table][/list][/list]
输出: 0,2,1,0
[/list][/list][size=2][b]将模式应用到排列顺序[/b][/size][list][list]
再写一个函数将 模式应用于顺序地提取数组元素
[list][list][table=60%,#f8f8f8]
[tr][td][font=consolas][size=2][font=consolas][size=3][color=#b00040]my[/color] [color=#b00040]@elements[/color] [color=#555555]=[/color] qw[color=#555555]/a b c d/[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]$seats[/color] [color=#555555]=[/color] [color=#b00040]$#elements[/color] [color=#555555]+[/color] [color=#666666]1[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]@order[/color] [color=#555555]= ([/color][color=#666666]0[/color][color=#555555],[/color] [color=#666666]2[/color][color=#555555],[/color] [color=#666666]1[/color][color=#555555],[/color] [color=#666666]0[/color][color=#555555]);[/color]
apply[color=#555555]([/color]\[color=#b00040]@elements[/color][color=#555555],[/color] \[color=#b00040]@order[/color][color=#555555]);[/color]
[color=#008000][b]sub[/b][/color] apply
[color=#555555]{[/color]
[color=#b00040]my[/color] [color=#555555]([/color][color=#b00040]$e_ref[/color][color=#555555],[/color] [color=#b00040]$o_ref[/color][color=#555555]) =[/color] [color=#b00040]@_[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]@temp[/color] [color=#555555]=[/color] @[color=#b00040]$e_ref[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]@final[/color][color=#555555];[/color]
[color=#008000][b]for[/b][/color] [color=#b00040]my[/color] [color=#b00040]$idx[/color] [color=#555555]([/color] @[color=#b00040]$o_ref[/color] [color=#555555])[/color]
[color=#555555]{[/color]
[color=#b00040]push[/color] [color=#b00040]@final[/color][color=#555555],[/color] [color=#b00040]splice[/color][color=#555555]([/color] [color=#b00040]@temp[/color][color=#555555],[/color] [color=#b00040]$idx[/color][color=#555555],[/color] [color=#666666]1[/color] [color=#555555]);[/color]
[color=#555555]}[/color]
[color=#b00040]print join[/color][color=#555555]([/color][color=#ba2121]","[/color][color=#555555],[/color] [color=#b00040]@final[/color][color=#555555]),[/color][color=#ba2121]"[/color][color=#ba2121]\n[/color][color=#ba2121]"[/color][color=#555555];[/color]
[color=#555555]}[/color][/size][/font][/size][/font][/td][/tr]
[/table][/list][/list]
输出:a,d,c,b
这样,不管想要哪一个序列,只要通过类似进制换算的方法算出模式,按模式提取即可
[/list][/list][size=2][b]枚举所有情况的代码:[/b][/size][list][list]
[list][list][table=60%,#f8f8f8]
[tr][td][font=consolas][size=2][font=consolas][size=3][color=#008000][b]use[/b][/color] strict[color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]@elements[/color] [color=#555555]=[/color] qw[color=#555555]/a b c d e/[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]$seats[/color] [color=#555555]=[/color] [color=#b00040]$#elements[/color] [color=#555555]+[/color] [color=#666666]1[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]@order[/color] [color=#555555]= ([/color][color=#666666]0[/color][color=#555555])[/color] x [color=#b00040]$seats[/color][color=#555555];[/color]
[color=#008000][b]for[/b][/color] [color=#b00040]my[/color] [color=#b00040]$n[/color] [color=#555555]([/color] [color=#666666]0[/color] [color=#555555]..[/color] factorial[color=#555555]([/color][color=#b00040]$seats[/color][color=#555555])-[/color][color=#666666]1[/color] [color=#555555])[/color]
[color=#555555]{[/color]
[color=#b00040]my[/color] [color=#b00040]@result[/color][color=#555555];[/color]
to_pattern[color=#555555]([/color][color=#b00040]$n[/color][color=#555555],[/color] [color=#b00040]$seats[/color][color=#555555],[/color] \[color=#b00040]@order[/color][color=#555555]);[/color]
apply[color=#555555]([/color] \[color=#b00040]@elements[/color][color=#555555],[/color] \[color=#b00040]@order[/color][color=#555555],[/color] \[color=#b00040]@result[/color] [color=#555555]);[/color]
[color=#b00040]print join[/color][color=#555555]([/color][color=#ba2121]","[/color][color=#555555],[/color] [color=#b00040]@result[/color][color=#555555]),[/color] [color=#ba2121]"[/color][color=#ba2121]\n[/color][color=#ba2121]"[/color][color=#555555];[/color]
[color=#555555]}[/color]
[color=#008000][b]sub[/b][/color] to_pattern
[color=#555555]{[/color]
[color=#b00040]my[/color] [color=#555555]([/color][color=#b00040]$n[/color][color=#555555],[/color] [color=#b00040]$seats[/color][color=#555555],[/color] [color=#b00040]$o_ref[/color] [color=#555555]) =[/color] [color=#b00040]@_[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]$mod[/color][color=#555555];[/color]
[color=#008000][b]for[/b][/color] [color=#b00040]my[/color] [color=#b00040]$div[/color] [color=#555555]([/color] [color=#666666]1[/color] [color=#555555]..[/color] [color=#b00040]$seats[/color] [color=#555555])[/color]
[color=#555555]{[/color]
[color=#b00040]$mod[/color] [color=#555555]=[/color] [color=#b00040]$n[/color] [color=#555555]%[/color] [color=#b00040]$div[/color][color=#555555];[/color]
[color=#b00040]$n[/color] [color=#555555]=[/color] [color=#b00040]int[/color][color=#555555]([/color][color=#b00040]$n[/color] [color=#555555]/[/color] [color=#b00040]$div[/color][color=#555555]);[/color]
[color=#b00040]$o_ref[/color][color=#555555]->[-[/color][color=#b00040]$div[/color][color=#555555]] =[/color] [color=#b00040]$mod[/color][color=#555555];[/color] [color=#408080][i]#从右边向左填入[/i][/color]
[color=#555555]}[/color]
[color=#555555]}[/color]
[color=#008000][b]sub[/b][/color] apply
[color=#555555]{[/color]
[color=#b00040]my[/color] [color=#555555]([/color][color=#b00040]$e_ref[/color][color=#555555],[/color] [color=#b00040]$o_ref[/color][color=#555555],[/color] [color=#b00040]$result[/color][color=#555555]) =[/color] [color=#b00040]@_[/color][color=#555555];[/color]
[color=#b00040]my[/color] [color=#b00040]@temp[/color] [color=#555555]=[/color] @[color=#b00040]$e_ref[/color][color=#555555];[/color]
[color=#008000][b]for[/b][/color] [color=#b00040]my[/color] [color=#b00040]$idx[/color] [color=#555555]([/color] @[color=#b00040]$o_ref[/color] [color=#555555])[/color]
[color=#555555]{[/color]
[color=#b00040]push[/color] @[color=#b00040]$result[/color][color=#555555],[/color] [color=#b00040]splice[/color][color=#555555]([/color] [color=#b00040]@temp[/color][color=#555555],[/color] [color=#b00040]$idx[/color][color=#555555],[/color] [color=#666666]1[/color] [color=#555555]);[/color]
[color=#555555]}[/color]
[color=#555555]}[/color]
[color=#008000][b]sub[/b][/color] factorial
[color=#555555]{[/color]
[color=#b00040]my[/color] [color=#b00040]$v[/color] [color=#555555]=[/color] [color=#b00040]shift[/color][color=#555555];[/color]
[color=#008000][b]return[/b][/color] [color=#555555]([/color][color=#b00040]$v[/color] [color=#555555]>[/color] [color=#666666]1[/color][color=#555555])[/color] ? [color=#b00040]$v[/color][color=#555555]*[/color]factorial[color=#555555]([/color][color=#b00040]$v[/color][color=#555555]-[/color][color=#666666]1[/color][color=#555555]) :[/color] [color=#666666]1[/color][color=#555555];[/color]
[color=#555555]}[/color][/size][/font][/size][/font][/td][/tr]
[/table][/list][/list]
[/list][/list][Finished in 0.9s] [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198043&ptid=43749]10#[/url] [i]codegay[/i] [/b]
何止是不错...我刷完贴只能灰溜溜逃了好吗 [i=s] 本帖最后由 523066680 于 2017-5-15 12:41 编辑 [/i]
[size=2][b]Perl 6 (这也太梦幻了)[/b][/size][list][list]
Works with: rakudo version 2014-1-24
First, you can just use the built-in method on any list type.
[list][list][table=60%,#f8f8f8]
[tr][td][font=consolas][size=2][font=consolas][size=3][color=#555555].[/color][color=#b00040]say[/color] [color=#008000][b]for[/b][/color] [color=#555555]<[/color]a b c[color=#555555]>.[/color]permutations[/size][/font][/size][/font][/td][/tr]
[/table][/list][/list]
Output:
a b c
a c b
b a c
b c a
c a b
c b a
[/list][/list]
[size=2][b]python[/b][/size][list][list]
Standard library function
Works with: Python version 2.6+
[list][list][table=60%,#f8f8f8]
[tr][td][font=consolas][size=2][font=consolas][size=3][color=#008000][b]import[/b][/color] itertools
[color=#008000][b]for[/b][/color] values [color=#008000][b]in[/b][/color] itertools[color=#555555].[/color][color=#555555]permutations[/color][color=#555555]([[/color][color=#666666]1[/color][color=#555555],[/color][color=#666666]2[/color][color=#555555],[/color][color=#666666]3[/color][color=#555555]]):[/color]
[color=#008000][b]print[/b][/color] [color=#555555]([/color]values[color=#555555])[/color][/size][/font][/size][/font][/td][/tr]
[/table][/list][/list]
[/list][/list][size=2][b]Ruby (也是挺梦幻的)[/b][/size][list][list]
[list][list][table=60%,#f8f8f8]
[tr][td][font=consolas][size=2][font=consolas][size=3][color=#555555][[/color][color=#666666]1[/color][color=#555555],[/color][color=#666666]2[/color][color=#555555],[/color][color=#666666]3[/color][color=#555555]].[/color]permutation[color=#555555].[/color]to_a[/size][/font][/size][/font][/td][/tr]
[/table][/list][/list]
[/list][/list][Finished in 0.2s] 填坑,汇编递归版[code]Include masm32rt.inc
.const
CrLf db 0DH,0AH,0
.data?
Input db 20 dup (?)
.code
recursion Proc Uses Ebx Eax Ecx lpStr:dword
Mov Ebx,lpStr
.If Byte Ptr [Ebx+1] != NULL
Mov Al,Byte Ptr [Ebx]
Xor Ecx,Ecx
.Repeat
XChg Al,[Ebx+Ecx]
Mov Byte Ptr [Ebx],Al
Inc Ebx
Invoke recursion,Ebx
Dec Ebx
XChg Al,[Ebx+Ecx]
Mov Byte Ptr [Ebx],Al
Inc Ecx
.Until Byte Ptr [Ebx+Ecx] == NULL
.Else
Invoke StdOut,Offset Input
Invoke StdOut,Offset CrLf
.EndIf
Ret
recursion Endp
Start:
Invoke ArgClC,1,Offset Input
Invoke recursion,Offset Input
Invoke ExitProcess,NULL
End Start
End[/code]
页:
[1]