如何使用随机值生成数组,而不使用循环?

问题描述 投票:24回答:24

如何使用100个随机值在Perl中生成数组,而不使用循环?

我必须避免所有类型的循环,例如“for”,foreach“,while。这是我的练习,来自我的实验室。我找不到解决方法,因为我是Perl的新手。

在C中,生成这个数组非常容易,但我不知道如何在Perl中实现它。

perl
24个回答
31
投票
my @rand = map { rand } ( 1..100 );

但地图只是一个花式装饰的循环。

如果你需要做100次,你需要使用某种迭代结构。


5
投票

虽然copy'n'paste示例是新颖的,并且还提到了map / foreach替代方案,但我认为尚未讨论的一种方法是recursion。使用递归(一个隐式循环)需要方法调用和一个简单的'if'语句:/ grep / map / etc。它可能是副作用或副作用。

由于这是家庭作业,我将把实施留给海报。

快乐的编码。

BTW:还没有人发布正则表达式解决方案;-)

很高兴看到一些更具创新性的解决方案! :-)


5
投票

使用匿名子和递归:

use strict;
use warnings;

my @foo;
my $random;
($random = sub {
        push @{$_[0]}, rand;
        return if @{$_[0]} == $_[1];
        goto \&$random;
})->(\@foo, 100);

print "@foo\n";
print scalar @foo, "\n";

使用计算goto,对所有fortran粉丝:

use strict;
use warnings;

sub randoms {
        my $num = shift;
        my $foo;
        CARRYON:
                push @$foo, rand;
                # goto $#{$foo} < 99 ? 'CARRYON' : 'STOP';
                goto ( ('CARRYON') x 99, 'STOP' )[$#$foo];
        STOP:
                return @$foo;
}

my @foo = randoms(100);
print "@foo\n";
print scalar(@foo)."\n";

2个匿名子和一个arrayref:

use strict;
use warnings;

my @bar = sub {  return &{$_[0]} }->
(
        sub {
                push @{$_[1]}, rand;
                goto \&{$_[0]}
                        unless scalar(@{$_[1]}) == $_[2];
                return @{$_[1]};
        },
        [],
        100
);

print "@bar\n";
print scalar(@bar), "\n";

5
投票
#!/usr/bin/perl

use strict;
use warnings;

my $x = 99;
my @rands = (rand,(*x=sub{rand,(map{*x->($x,sub{*x})}($x)x!!--$x)})->($x,*x));

use feature 'say';
say for @rands;

4
投票
    push @array, rand;
    push @array, rand;
    # ... repeat 98 more times

4
投票

没有perl循环:

#!/usr/bin/perl
use strict;
use warnings;

@ARGV=q!echo 'int rand(void); int printf(const char *format, ...); int main(void) { int i; for(i=0;i<100;++i)printf("%d\\\\n",rand()); return 0; }' | gcc -x c - && ./a.out |!;
chomp(my @array=<>);

4
投票

Someone要求一个纯正的正则表达式解决方案。怎么样

#!/usr/bin/perl
open my $slf, $0;
undef $/;
(my $s = <$slf>) =~ s/./rand()." "/eggs;
$s .= rand();

4
投票

另一个愚蠢的方法,如何使用返回随机值的绑定数组?

use strict;
use warnings;

package Tie::RandArray;
use Tie::Array;
our @ISA = ('Tie::StdArray');
sub FETCH  { rand; }

package main;
my @rand;
my $object = tie @rand, 'Tie::RandArray';
$#rand=100;
my @a= @somearray;
warn "@a";

当然,绑定的数组可以缓存值,因此不需要第二个数组来获得稳定的值。


3
投票

递归:

sub fill_rand {
 my ($array, $count) = @_;
   if ($count >= 1) {
   unshift @$array, rand();
   fill_rand ($array, --$count);
 }
}

my @array;
fill_rand (\@array, 100);

“尾调优化”版本:

sub fill_rand {
    my $array = shift;
    my $count = shift;
    unshift @$array, rand();
    if ($count > 1) {
       $count--;
       @_ = ($array, $count);
       goto &fill_rand;
    }
}

my @array;
fill_rand(\@array, 100);

使用eval:

my @array;
eval("\@array = (" . ("rand(), " x 100) . ");");

如果你假设我的perl是随机的(不是无根据的假设),你可以使用perl文件本身作为随机数据的来源:

open FILE, __FILE__ or die "Can't open " . __FILE__ . "\n";
my $string;
read FILE, $string, 100;
close FILE;
my @array = map { ord } split //, $string;

当然,每次都会得到相同的结果,但这对测试很有用。


3
投票

它的丑陋,但它的工作原理。 foreach只是为了表明它确实如此。

#!/usr/bin/perl

rand1();

$idx = 1;

foreach $item (@array) {
    print "$idx - $item\n";
    $idx++;
}

exit;



sub rand1() {
    rand2();
    rand2();
    rand2();
    rand2();
}

sub rand2() {
    rand3();
    rand3();
    rand3();
    rand3();
    rand3();
}

sub rand3() {
    push @array, rand;
    push @array, rand;
    push @array, rand;
    push @array, rand;
    push @array, rand;
}

2
投票
@foo = (rand(), rand(), rand(), ... rand());

61
投票

为了娱乐价值:

A method that works on systems where EOL is a single character:

#!/usr/bin/perl

use strict;
use warnings;

$/ = \1;

open 0;
my @r = map rand,<0>;

print "@r\n";

A possibly nondeterministic method that does not use for, while, until:

#!/usr/bin/perl
use strict; use warnings;

my @rand;

NOTLOOP:
push @rand, rand;
sleep 1;
goto NOTLOOP if 100 > time - $^T;

print 0 + @rand, "\n";

Using regular expressions:

#!/usr/bin/perl
use strict; use warnings;

my $s = '-' x 100;
$s =~ s/(-)/rand() . $1/eg;
my @rand = $s=~ m/([^-]+)/g;

Copying and pasting 100 rand invocations by hand is really passé:

#!/usr/bin/perl
use strict; use warnings;

my $s = '(' . 'rand,' x 100 . ')';
my @rand = eval $s;

A file I/O based solution that does not require /dev/random:

#!/usr/bin/perl
use strict; use warnings;

$/ = \1;

my @rand;

seek \*DATA, 0, 0;

NOTLOOP:
scalar <DATA>;
push @rand, rand;
goto NOTLOOP if $. < 100;
__DATA__

No reason to use recursion with Perl's goto

#!/usr/bin/perl
use strict; use warnings;
use autodie;

$/ = \1;

open my $F, '<', \( 1 x 100 . 0 );

my @rand or &notloop;

sub notloop {
    my $t = <$F>;
    $t or return;
    push @rand, rand;
    goto \&notloop;
}

Here is a recursive string eval version:

#!/usr/bin/perl
use strict; use warnings; use autodie;

local $/ = \1;
open my $F, '<', \( 1 x 100 . 0 );

my @rand;

eval <<'NOLOOP'
my $self = (caller(0))[6];
<$F> or die;
push @rand, rand;
eval $self;
NOLOOP
;

当然,所有这些实际上都包含循环,但它们不使用您禁止使用的关键字。

注意:这个问题带来了我的怪话,但我必须承认它很有趣。


2
投票

生成数据:

my @array = map { rand() } (0..99);

打印数据以显示您的结果正确:

print "$_\n" foreach (@array);

生成循环是隐藏的(没有循环关键字可见 - 只是一个函数/运算符)。


2
投票
my $u;

open(URAND, "/dev/urandom") || die $!;

read(URAND, $u, 100);

close URAND;

my @array = split(/ */, $u);

1
投票

根据听众的请求,非纯正则表达式解决方案:

$s="D" x 100; 
$s=~s/D/rand()." "/ge; 
@s=split(/ /,$s);

1
投票

递归:

#!/usr/bin/perl
use warnings; use strict;

my @rands;
my $i=1;

sub push_rand {
    return if $#rands>=99;
    push @rands, rand;
    push_rand();
}

push_rand();

for (@rands) { print "$i: $_\n"; $i++; }

0
投票

问题是:在不使用循环的情况下做一些事情(有些事情恰好是调用rand())。隐含的是,而不仅仅重复源。上述答案都没有实际回答这个问题。它们要么重复源,要么隐藏循环。这是一种减轻重复并且不隐藏循环的一般方法(通过使用计算的goto,正则表达式或递归等实现它)。我把这种方法称为“管理重复”。

100有四个素因子:2 * 2 * 5 * 5 == 100.所以我们需要两个重复管理器,五个和两个:

sub two{ my $y=shift; ($y->(), $y->()) }
sub five{my $y=shift; ($y->(), $y->(), $y->(), $y->(), $y->()) } 

然后调用它们 - 我们没有递归,因为递归退化情况构成了一个循环测试 - 只是调用它们:

my @array = five(sub{five(sub{two(sub{two(sub{rand()})})})});

在那里,你是一种通常的方式,在不使用循环的情况下调用预定次数的东西,而是通过以有效和受控的方式委派重复。

讨论问题:五个和两个人应该在哪个顺序?为什么?


48
投票

没有比这更简单了!

my @rands = (rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand, rand, rand, rand, rand, rand, rand, rand, rand, rand,
  rand, rand);

37
投票

纯正则表达式解决方案

perl -E'say for&{sub{"\U\x{fb01}\x{fb03}"=~/.{0,2}.{0,3}.{0,3}.{0,4}+(?{$_[++$#_]=rand})(*FAIL)/||pop;@_}}'

Double-/e正则表达式解决方案

这个:

($_=(120.44.32)x(2+2*2**2)**2)=~s/\170/114.97.110.100/gee;
s/(.*)/64.95.61.40.$1.41.35.89.65.78.69.84.85.84/ee;
print "@_\n";

无环地产生这个:

0.636939813223766 0.349175195300148 0.692949079946754 0.230945990743699 0.61873698433654 0.940179094890468 0.435165707624346 0.721205126535175 0.0322560847184015 0.91310500801842 0.31596325316222 0.788125484008084 0.802964232426337 0.417745170032291 0.155032810595454 0.146835982654117 0.181850358582611 0.932543988687968 0.143043972615896 0.415793094159206 0.576503681784647 0.996621492832261 0.382576007897708 0.090130958455255 0.39637315568709 0.928066985272665 0.190092542303415 0.518855656633185 0.797714758118492 0.130660731025571 0.534763929837762 0.136503767441518 0.346381958112605 0.391661401050982 0.498108766062398 0.478789295276393 0.882380841033143 0.852353540653993 0.90519922056134 0.197466335156797 0.820753004050889 0.732284103461893 0.738124358455405 0.250301496672911 0.88874926709342 0.0647566487704268 0.733226696403218 0.186469206795884 0.837423290530243 0.578047704593843 0.776140208497122 0.375268613243982 0.0128391627800006 0.872438613450569 0.636808174464274 0.676851978312946 0.192308731231467 0.401619465269903 0.977516959116411 0.358315250197542 0.726835710856381 0.688046044314845 0.870742340556202 0.58832098735666 0.552752229159754 0.170767637182252 0.683588677743852 0.0603160539059857 0.892022266162105 0.10206962926371 0.728253338154527 0.800910562860132 0.628613236438159 0.742591620029089 0.602839705915397 0.00926448179027517 0.182584549347883 0.53561587562946 0.416667072500555 0.479173194613729 0.78711818598828 0.017823873107119 0.824805088282755 0.302367196288522 0.0677539595682397 0.509467036447674 0.906839536492864 0.804383046648944 0.716848992363769 0.450693083312729 0.786925293921154 0.078886787987166 0.417139859647296 0.9574382550514 0.581196777508975 0.75882630076142 0.391754631502298 0.370189654004974 0.80290625532508 0.38016959549288

递归数值函数解

事实上,如果你打印数组,这样做:

@_=(*100=sub{$_[0]?(rand,(*{--$_[0]}=*{$_[0]})->(@_)):()})->($==100);

第二种解决方案现在可以很容易地获得不同数量的随机数,因为按照上面的分配,你可以做到这样的细节:

 print for @42=42->($==42);

是的,这确实是一个名为42()的函数。之前对@_的分配与其他一百个数字命名函数一起创建了它。


说明

第一个正则表达式解决方案依赖于Unicode匹配的两个字符的棘手外壳。通过添加空格和注释可以(或可能不)更容易理解它:

use 5.010;

say for &{

    sub  { "\U\x{fb01}\x{fb03}" =~ m((?mix-poop)

#include <stdlib.h>
#include <unistd.h>
#include <regex.h>
#include "perl.h"
#include "utf8.h"

#ifndef BROKEN_UNICODE_CHARCLASS_MAPPINGS

                        .{0,2}

                .{0,3}          .{0,3}

                        .{0,4}

#define rand() (random()<<UTF_ACCUMULATION_SHIFT^random()&UTF_CONTINUATION_MASK)
       +(?{ $_  [++$#_] = rand() || rand() || UTF8_TWO_BYTE_LO (*PERL_UNICODE)
#else                                                          (*PRUNE)
#define FAIL                                                   (*ACCEPT)
          })                                                   (*FAIL)
#endif                                                         (*COMMIT)
    )poop || pop                                            @{ (*_{ARRAY})     }
    ;#;                                                     @{ (*SKIP:REGEX)   }
                                                            @{ (*_{ARRAY})     }
    }
}

了解第二个正则表达式解决方案如何工作的方法是:

  • 首先,将编译时常量表达式缩减为更常用的形式,以便您可以更轻松地读取文字。例如,\170是“x”。
  • 其次,在每个替换中将双e减少到单个e,然后打印出两次在字符串中留下的内容。

我相信你会很感激评论。 :)


对于递归解决方案,添加空格可能有点帮助:

(*100 = sub { $_[0]
                ? ( rand, ( *{ --$_[0] } = *{ $_[0] } )->(@_) )
                : ( )
            }
)->( $= = 100 );

将变量作为参数传递的需要是由于需要左值的自动递减。我这样做是因为我不想两次说$_[0] - 1,或者有任何命名的临时变量。这意味着你可以这样做:

$N = 100;
print for $N->($N);

当你完成时,$N == 0,因为传递隐式引用语义。

对于一些重复的成本,您可以放松对左值参数的需求。

(*100 = sub { $_[0]
                 ? ( rand, ( *{ $_[0] - 1 } = *{ $_[0] } )->( $_[0] - 1 ) )
                 : ( )
            }
)->( 100 );

现在你不再需要左值参数了,所以你可以写:

print for 100->(100);

得到所有100个随机数。当然,您还有其他一百个数字函数,因此您可以通过以下任何方式获取随机数列表:

@vi = 6->(6); 
@vi = &6( 6);

$dozen = 12;

@dozen         =  $dozen->($dozen);
@baker's_dozen = &$dozen(++$dozen);

@_ = 100;
print &0;  # still a hundred of 'em

(对不起'傻傻的颜色。一定很大。)

我相信这可以解决所有问题。 ☺


27
投票
# I rolled a die, honestly!
my @random = (5, 2, 1, 3, 4, 3, 3, 4, 1, 6,
              3, 2, 4, 2, 1, 1, 1, 1, 4, 1,
              3, 6, 4, 6, 2, 6, 6, 1, 4, 5,
              1, 1, 5, 6, 6, 5, 1, 4, 1, 2,
              3, 1, 2, 2, 6, 6, 6, 5, 3, 3,
              6, 3, 4, 3, 1, 2, 1, 2, 3, 3,
              3, 4, 4, 1, 5, 5, 5, 1, 1, 5,
              6, 3, 2, 2, 1, 1, 5, 2, 5, 3,
              3, 3, 5, 5, 1, 6, 5, 6, 3, 2,
              6, 3, 5, 6, 1, 4, 3, 5, 1, 2);

24
投票

太糟糕的大多数解决方案都集中在非循环部分而忽略了随机数部分:

use LWP::Simple;

my @numbers = split /\s+/, #/ Stackoverflow syntax highlighting bug 
    get( 'http://www.random.org/integers/?num=100&min=1&max=100&col=1&base=10&format=plain&rnd=new' );

这是汤姆等待看到的精神错乱,但我让它更疯狂。此解决方案将问题减少到:

my @numbers = rand( undef, 100 ); # fetch 100 numbers

正常的rand通常需要0或1个参数。我给它一个新的原型,允许第二个参数记录要返回多少个数字。

请注意与真正的rand有些差异。这不是连续的,因此可用数量少得多,并且它包含在上限。此外,由于这个有两个参数,它与期望真实的程序不兼容,因为这样的语句会在每个语句中进行不同的解析:

 my @array = rand 5, 5;

然而,这里没有什么特别关于CORE::GLOBAL::rand()。您不必替换内置的。你可以有点不舒服。

我在那里留下了一些print声明,所以你可以看它工作:

BEGIN {
    my @buffer;

    my $add_to_buffer = sub {
        my $fetch = shift;
        $fetch ||= 100;
        $fetch = 100 if $fetch < 100;
        require LWP::Simple;
        push @buffer, split /\s+/, #/ Stackoverflow syntax highlighting bug
          LWP::Simple::get(
            "http://www.random.org/integers/?num=$fetch&min=1&max=100&col=1&base=10&format=plain&rnd=new"
            );
        };

    my $many = sub ($) {
        print "Fetching $_[0] numbers\n";
        $add_to_buffer->($_[0]) if @buffer < $_[0];
        my @fetched = splice @buffer, 0, $_[0], ();
        my $count = @fetched;
        print "Fetched [$count] @fetched\n";
        @fetched
        };

    *CORE::GLOBAL::rand = sub (;$$) {
        my $max = $_[0] || 1; # even 0 is 1, just like in the real one
        my $fetch = $_[1] || ( wantarray ? 10 : 1 );
        my @fetched = map { $max * $_ / 100 } $many->( $fetch );
        wantarray ? @fetched : $fetched[-1];
        };
    }

my @rand = rand(undef, 5);
print "Numbers are @rand\n\n";

@rand = rand(87);
print "Numbers are @rand\n\n";

$rand = rand(undef, 4);
print "Numbers are $rand\n\n";

$rand = rand();
print "Numbers are $rand\n\n";

$rand = rand(undef, 200);
print "Numbers are $rand\n\n";

我的随机数源并不重要。如果您愿意,可以从/ dev / random或/ dev / urandom读取以填充缓冲区。


14
投票
sub f {
    my $n = shift;
    if( $n == 0 ) {
        return @_;
    }
    else {
        return f( $n-1, rand, @_ );
    }
}

my @random_array = f(100);

7
投票

map在这里用作单个值的局部化器,免除循环状态:

my @rand = map&$_($_),sub{@_<=100&&goto&{push@_,rand;$_[0]};shift;@_};

或者有两个潜艇:

my @rand = sub{&{$_[0]}}->(sub{@_<=100&&goto&{(@_=(rand,@_))[-1]};pop;@_});

这两个都是Y-combinator风格的自传子,通过迭代构建列表,但一个明显比另一个快。

你可以用s'g[^}]+'goto&{unshift@_,rand;$_[-1]'来解决效率低下的问题但是它会变得有点长。

或者回避调用堆栈:

my @rand = do{local*_=sub{(push@_,rand)<100?goto&_:@_};&_};

或者使用eval,没有变量赋值,没有外部状态,一个anon sub:

my @rand = eval'sub{@_<100?eval((caller 1)[6]):@_}->(@_,rand)';

但最简洁的是:

my @rand = map&$_,sub{(100^push@_,rand)?goto&$_:@_};

7
投票

由于任务似乎要么让你使用递归或学习如何以一种不那么简单的形式编写一个简单的循环,所以我谦虚地提交了以下完全可执行的Perl程序:

Camel:

#!/usr/bin/perl
                                      ''=~('('.'?'
           .'{'.(                   '`'|'%').("\["^
        '-').('`'|                '!').('`'|',').'"'
 .'\\'.'$'.  ("\`"|              ',').('`'|')').('`'|
'-').'='.('^'^("\`"|            '/')).('^'^('`'|'.')).
('^'^('`'|'.')).';'.(          '!'^'+').('`'|'&').('`'
  |'/').('['^')').'('        .'\\'.'$'.'='.'='.(('^')^(
       '`'|'/')).';'.      '\\'.'$'.'='.'<'.'='.'\\'.'$'
      .('`'|(',')).(     '`'|')').('`'|'-').';'.'+'."\+".
     '\\'.'$'.('=').   ')'.'\\'.'{'.('['^'+').('['^"\.").(
    '['^'(').("\`"|   '(').('{'^'[').'\\'.'@'.'='.','.("\{"^
    '[').('['^')').  ('`'|'!').('`'|'.').('`'|'$').'\\'.'}'.(
    '!'^'+').'\\'.  '$'.'='.'='.('^'^('`'|'/')).';'.('!'^'+')
    .('`'|('&')).(  '`'|'/').('['^')').('{'^'[').'('.'\\'.'@'.
    '='.')'.('{'^'[').'\\'.'{'.('!'^'+').('*'^'#').('['^'+').(
    '['^')').('`'|')').('`'|'.').('['^'/').('{'^'[').'\\'.'"'.(
     '['^')').('`'|'!').('`'|'.').('`'|'$').('{'^'[').'\\'.'$'.
     '='.('{'^'[').('`'|'/').('`'|'&').('{'^'[').'\\'.'$'.("\`"|
      ',').('`'|')').('`'|'-').'='.'\\'.'$'.'_'.'\\'.'\\'.(('`')|
       '.').'\\'.'"'.';'.('!'^'+').('*'^'#').'\\'.'$'.'='.'+'.'+'
        .';'.('!'^'+').('*'^'#').'\\'.'}'.'"'.'}'.')');$:='.' ^((
         '~'));$~='@'|'(';$^=')'^'[';$/='`'|'.';$,='('^"\}";  $\=
          '`'|'!';$:=')'^'}';$~='*'|'`';$^='+'^'_'; $/="\&"|  '@'
            ;$,='['&'~';$\=','^'|';$:='.'^"\~";$~=  '@'|'('   ;$^
             =')'^ '[';$/='`'|'.';$,='('^"\}";$\=   '`'|'!'   ;$:
                   =')'^'}';$~='*'|'`';$^=('+')^    '_';$/=   '&'
                   |'@';$,=    '['&'~';$\ ="\,"^     '|';$:   =(
                   ('.'))^     "\~";$~=   ('@')|     '(';$^  =(
                   (')'))^     "\[";$/=   "\`"|       "\.";  (
                   ($,))=      '('^'}';   ($\)         ='`'
                   |"\!";     $:=(')')^   '}';         ($~)
                    ='*'|     "\`";$^=    '+'^         '_';
                    ($/)=     '&'|'@'     ;$,=         '['&
                    '~';     $\=','       ^'|'         ;$:=
                    '.'^     '~'          ;$~=         '@'|
                    '(';      $^=         ')'          ^((
                    '['        ));       $/=           '`'
                    |((         '.'     ));            $,=
                    '('          ^((   '}'              ))
                    ;(             ($\))=               ((
                    ((              '`'))               ))
                    |+             "\!";$:=             ((
                   ')'            ))^+ "\}";            $~
                  =((           '*'))|  '`';           $^=
                 '+'^         "\_";$/=   '&'          |'@'
               ;($,)=                                ('[')&
             "\~";$\=                               ','^'|'

Martini:

#!/usr/bin/perl
                                                  ''=~('(?{'.
                                                  ('`'|'%').(
                                                  '['^"\-").(
                                                  '`'|"\!").(
                                                  '`'|(',')).
                                                  '"\\$'.('`'
                                                    |',').(
                                                    '`'|')'
                                                    ).('`'|
                                                    ('-')).
                                                    ('=').(
                                                   '^'^('`'|
                                                   ('/'))).(
                                                   '^'^('`'|
                                                   ('.'))).(
                                                  '^'^(('`')|
                                                  '.')).';'.(
                                                 '!'^'+').('`'
                                                 |'&').(('`')|
                                                '/').('['^')').
                                                '(\\$=='.('^'^(
                                               '`'|'/')).';\\$='
                                              .'<=\\$'.('`'|',').
                                             ('`'|')').('`'|"\-").
                                            ';++\\$=)\\{'.('['^'+')
                                           .('['^'.').('['^'(').('`'
                                          |'(').('{'^'[').'\\@'.('`'|
                                          '!').('['^')').('['^"\)").(
                                          '`'|'!').('['^'"').','.('{'
                                          ^'[').('['^')').('`'|'!').(
                                          '`'|'.').('`'|"\$").'\\}'.(
'!'^'+').'\\$'.('`'|')').'='.("\^"^(      '`'|'/')).';'.('!'^('+')).(
 '`'|'&').('`'|'/').('['^')').('{'^       '[').'(\\@'.('`'|'!').('['^
   ')').('['^')').('`'|'!').('['^         '"').')'.('{'^"\[").'\\{'.(
    '!'^'+').('*'^'#').('['^'+')          .('['^')').('`'|')').("\`"|
      '.').('['^'/').('{'^'[')            .'\\"'.('['^')').('`'|'!').
       ('`'|'.').('`'|"\$").(             '{'^'[').'\\$'.('`'|"\)").(
         '{'^'[').('`'|'/')               .('`'|'&').('{'^'[').'\\$'.
          ('`'|',').("\`"|                ')').('`'|'-').'=\\$_\\\\'.
            ('`'|('.')).                  '\\";'.('!'^'+').('*'^'#').
             '\\$'.('`'                   |')').'++;'.('!'^'+').('*'^
               "\#").                     '\\}"})');$:='.'^'~';$~='@'
                |'('                      ;$^=')'^'[';$/='`'|"\.";$,=
                '('^                      '}';$\='`'|'!';$:=')'^"\}";
                ($~)                      ='*'|'`';$^='+'^'_';$/='&'|
                '@';                      $,='['&'~';$\=','^('|');$:=
                '.'^                      '~';$~='@'|'(';$^=')'^"\[";
                ($/)                      ='`'|'.';$,='('^'}';$\='`'|
                '!';                      $:=')'^'}';$~='*'|('`');$^=
                '+'^                      '_';$/='&'|'@';$,='['&"\~";
                ($\)                      =','^'|';$:='.'^'~';$~='@'|
                '(';                      $^=')'^'[';$/='`'|('.');$,=
                '('^                      '}';$\='`'|'!';$:=')'^"\}";
                ($~)                      ='*'|'`';$^='+'^'_';$/='&'|
'@';$,='['&'~';$\=','^'|';$:='.'^'~'      ;$~='@'|'(';$^=')'^"\[";$/=
'`'|'.';$,='('^'}';$\='`'|'!';$:=')'      ^'}';$~='*'|'`';$^='+'^'_';

For the Holidays, snowflakes with recursion rather than iteration inside:

#!/usr/bin/perl
           '?'                          =~(
         '('.'?'                      ."\{".(
        '`'   |'%'  ).('['^"\-").(  '`'|   '!'
         ).('`'|',').    '"'.    '\\'.('$').(
         '`'|(',')).(    '`'|    ')').(('`')|
        ((  '-')   )).    +(    '`'   |')'  ).
       (((    '['   ))^+  ((  '/')   )).    '='
      .('^'^   ('`'|'/')) .( '^'^("\`"|   '.')).
     +(     '^'^('`'|'.')).';'.('!'^"\+").     ((
 '\\')).'$'.('`'|'#').('`'|'/').('['^'.').('`'|'.').(
'['^  '/').'='.  (('^')^(    '`'|'/')  ).(';').(  '!'^
'+'    ).('['^    '(').(      ('[')^    "\.").(    '`'
|'"'  ).(('{')^  ('[')).(    '['^'+')  .('['^'.'  ).+(
 '['^'(').('`'|'(').'_'.('['^')').('`'|'!').('`'|'.')
     .(     '`'|'$').('{'^'[').'\\'."\{".(     ((
      '!'))^   '+').('{'^ (( ('[')))).(   ('{')^
       '['    ).(   '{'^  ((  '[')   )).    (((
        ((  '{')   )))    ^+    '['   ).+(  ((
         '['))^')').(    '`'|    '%').(('[')^
         '/').(('[')^    '.')    .('['^')').(
        '`'   |'.'  ).('{'^"\[").(  '`'|   ')'
         ).('`'|                      "\&").(
           '{'                          ^((
           '['                          )))
         .'\\'.+                      '$'.'#'
        .+(   '`'|  '!').('['^')')  .''.   (((
         '['))^')').(    '`'|    '!').(('[')^
         '"').('_').(    '`'|    '/').(('`')|
        ((  '&')   )).    ((    '_'   )).(  ((
       '['    ))^   ')')  .(  '`'|   '!'    ).(
      ('`')|   '.').('`'| (( ('$')))).(   ('[')^
     ((     '('))).'>'.'\\'.'$'.('`'|',').     +(
 '`'|')').('`'|'-').('`'|')').('['^'/').';'.('!'^'+')
.''.  ('{'^'[')  .(('{')^    ('[')).(  '{'^'[').  ('{'
^((    '['))).    ("\["^      '+').(    '['^'.'    ).(
'['^  '(').('`'  |"\(").(    '{'^'[')  .'\\'.'@'  .''.
 ('`'|'!').('['^')').('['^')').('`'|'!').('['^('"')).
     ((     '_')).('`'|'/').('`'|'&').'_'.     +(
      ('[')^   ')').('`'| (( ('!')))).(   ('`')|
       '.'    ).(   '`'|  ((  '$')   )).    (((
        ((  '[')   )))    ^+    '('   ).((  ((
         ',')))).('{'    ^'['    ).('['^')').
         ('`'|"\!").(    '`'|    '.').(('`')|
        '$'   ).((  ';')).('!'^'+'  ).+(   '{'
         ^'[').(                      '{'^'['
           ).(                          '{'
           ^((                          '['
         ))).''.                      (('{')^
        '['   ).+(  '['^'+').('['^  '.')   .+(
         '['^('(')).(    '`'|    '(').('_').(
         '['^(')')).(    '`'|    '!').(('`')|
        ((  '.')   )).    +(    '`'   |'$'  ).
       '('    .((   ')')  ).  ';'.   (((    '!'
      ))^'+'   ).'\\'.'}' .( '!'^'+').(   ('!')^
     ((     '+'))).('!'^'+').('['^('(')).(     ((
 '['))^'.').('`'|'"').('{'^'[').('['^'+').('['^')').(
'`'|  ')').('`'  |"\.").(    '['^'/')  .'_'.('['  ^')'
).(    '`'|'%'    ).('`'      |'#').    (('[')^    '.'
).+(  '['^')').  ('['^'('    ).("\`"|  ')').('['  ^'-'
 ).('`'|'%').('{'^'[').'\\'.'{'.('!'^'+').('{'^'[').(
     ((     '{'))^'[').('{'^'[').('{'^'[')     .+
      '\\'.+   '$'.("\["^ (( '/'))).'='   .('['^
       '+'    ).(   '`'|  ((  '/')   )).    (((
        ((  '[')   )))    ^+    '+'   ).+(  ((
         '{'))^"\[").    '\\'    .'@'.'_'.';'
         .('!'^'+').(    '*'^    '#').(('[')^
        '+'   ).+(  '['^')').('`'|  ')')   .+(
         '`'|'.'                      ).('['^
           '/'                          ).(
           '{'                          ^((
         '['))).                      ('\\').
        '"'   .''.  ('['^')').('`'  |'!'   ).(
         '`'|('.')).(    '`'|    '$').(('{')^
         '[').('\\').    '$'.    ('`'|"\#").(
        ((  '`')   )|+    ((    '/'   ))).  +(
       '['    ^((   '.')  ))  .''.   (((    '`'
      ))|'.'   ).('['^'/' ). ('{'^'[').   ("\`"|
     ((     '/'))).('`'|'&').('{'^'[').''.     ((
 '\\')).'$'.('`'|',').('`'|')').('`'|'-').('`'|')').(
'['^  '/').'='.  '\\'.'$'    .(('[')^  '/').'\\'  .''.
(((    '\\')))    .('`'|      "\.").    ('\\').    '"'
.';'  .('!'^'+'  ).("\*"^    '#').''.  '\\'.'$'.  ('`'
 |'#').('`'|'/').('['^'.').('`'|'.').('['^'/').('+').
     ((     '+')).';'.('!'^'+').('*'^'#').     +(
      ('[')^   '+').('['^ (( (')')))).(   ('`')|
       ')'    ).(   '`'|  ((  '.')   )).    (((
        ((  '[')   )))    ^+    '/'   ).((  ((
         '_')))).('['    ^')'    ).('`'|'%').
         ('`'|"\#").(    '['^    '.').(('[')^
        ')'   ).+(  '['^'(').('`'|  ')')   .+(
         '['^'-'                      ).('`'|
           '%'                          ).+
           '('                          .((
         '\\')).                      '@'.'_'
        .((   ')')  ).('{'^"\[").(  '`'|   ')'
         ).('`'|'&').    ('{'    ^'[').('(').
         '\\'.'@'.'_'    .')'    .';'.(('!')^
        ((  '+')   )).    ((    (((   '\\'  ))
       )))    .((   '}')  ).  ('!'   ^((    '+'
      ))).+(   '!'^'+').( (( '['))^'+')   .('['^
     ((     '.'))).('['^'(').('`'|'(').'_'     .(
 '['^')').('`'|'!').('`'|'.').('`'|'$').'('.')'.';'.(
'['^  '+').('['  ^"\)").(    '`'|')')  .('`'|'.'  ).+(
'['    ^"\/").    "\_".(      ('[')^    "\)").(    '`'
|'%'  ).(('`')|  ('#')).(    '['^'.')  .('['^')'  ).+(
 '['^'(').('`'|')').('['^'-').('`'|'%').'('.'\\'.'@'.
     +(     '`'|'!').('['^')').('['^')').(     ((
      '`'))|   '!').('['^ (( '"'))).'_'   .('`'|
       '/'    ).(   '`'|  ((  '&')   )).    '_'
        .(  '['^   ')'    ).    (((   '`')  )|
         '!').(('`')|    '.')    .('`'|'$').(
         '['^'(').')'    .';'    .'"'.'}'.')'
        );(   $:)=  '.'^'~';$~='@'  |'('   ;$^
         =(')')^                      '[';#;#
           ;#;                          #;#

在每种情况下,输出都是这样的:

rand 1 of 100=0.625268682212667
rand 2 of 100=0.30160434879096
...
rand 100 of 100=0.584811321826528

如果你想看到嵌入的循环或递归,你可以使用perl -MO=Deparse martini.plperl -MO=Deparse camel.pl等。

只有Perl,对吗???

如果你想生成这些可爱的东西 - 请查看Acme::Eyedrops

© www.soinside.com 2019 - 2024. All rights reserved.