批处理之家's Archiver

happy886rr 发表于 2017-4-7 21:08

字符串全排列

[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]

CrLf 发表于 2017-4-7 22:13

每次看到这话题,总想安利一下 plp626 那神一样的纯批解:
[url]http://bbs.bathome.net/redirect.php?goto=findpost&ptid=11959&pid=76175[/url]

happy886rr 发表于 2017-4-7 23:10

[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]感觉他是在写诗。

codegay 发表于 2017-4-7 23:28

[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]

codegay 发表于 2017-4-7 23:29

:lol 没有内置类库我大约不会写。

happy886rr 发表于 2017-4-7 23:41

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198037&ptid=43749]5#[/url] [i]codegay[/i] [/b]
非常短,这次代码数你的最短,最好。因为题目不限语言。你几乎胜了。

flashercs 发表于 2017-4-8 00:50

[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]

a20150604 发表于 2017-4-8 01:13

[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]

a20150604 发表于 2017-4-8 01:52

[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]

codegay 发表于 2017-4-8 04:42

:lol 最近论坛新来的几个ID技术都很不错啊。

flashercs 发表于 2017-4-8 06:59

[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]

happy886rr 发表于 2017-4-8 08:57

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198043&ptid=43749]10#[/url] [i]codegay[/i] [/b]
藏龙卧虎啊,你不出点题,他们怎能显山露水。

pcl_test 发表于 2017-4-8 09:16

[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]

flashercs 发表于 2017-4-8 11:01

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198029&ptid=43749]1#[/url] [i]happy886rr[/i] [/b]


    为什么你这算法的数组操作35ms完成,而我字符串操作7ms完成,为什么数组会慢 这么多?不合理啊!!

523066680 发表于 2017-4-8 11:20

[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]

flashercs 发表于 2017-4-8 11:24

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198049&ptid=43749]14#[/url] [i]flashercs[/i] [/b]


    我明白了,性能差主要是函数调用次数太多,那种算法调用了7的阶乘次函数,而用循环来实现会快很多。我那个调用7次函数,所以快一些,但是应该可以只用循环实现的,就是三个嵌套循环。

523066680 发表于 2017-4-8 13:02

[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》里面有更有趣的思路,午休,有空再更

happy886rr 发表于 2017-4-8 14:52

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198051&ptid=43749]16#[/url] [i]flashercs[/i] [/b]

你的速度确实蛮快,但是那个批处理版就很慢了。

523066680 发表于 2017-4-8 15:34

[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 里面提到的算法,该书还未出版。

待会儿再更

a20150604 发表于 2017-4-8 15:54

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]

a20150604 发表于 2017-4-8 16:35

http://www.cs.utsa.edu/~wagner/knuth/

Donald E. Knuth  
  The Art of Computer
Programming
Volume 4,
Combinatorial Algorithms

523066680 发表于 2017-4-8 17:54

[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

taofan712 发表于 2017-4-10 10:50

[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]

523066680 发表于 2017-4-10 18:31

[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]

523066680 发表于 2017-4-26 14:13

模式计算-迭代法

[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]

CrLf 发表于 2017-4-26 20:43

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=198043&ptid=43749]10#[/url] [i]codegay[/i] [/b]


    何止是不错...我刷完贴只能灰溜溜逃了好吗

523066680 发表于 2017-5-15 12:00

[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]

老刘1号 发表于 2019-3-29 23:33

填坑,汇编递归版[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]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.