Pure Regex Solution
perl -E'say for&{sub{"\U\x{fb01}\x{fb03}"=~/.{0,2}.{0,3}.{0,3}.{0,4}+(?{$_[++$#_]=rand})(*FAIL)/||pop;@_}}'
Double- /e
Regex Solution
Это:
($_=(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
в каждой замене, затем распечатайте то, что остается в строке оба раза.
Я уверен, что вы оцените комментарий. :)
Для рекурсивного решения добавление пробела может помочь little :
(*100 = sub { $_[0]
? ( rand, ( *{ --$_[0] } = *{ $_[0] } )->(@_) )
: ( )
}
)->( $= = 100 );
Необходимость передачи переменной в качестве аргумента обусловлена автоматическим декрементом, требующим lvalue. Я сделал это, потому что не хотел дважды произносить $_[0] - 1
или иметь какие-либо именованные временные переменные. Это означает, что вы можете сделать это:
$N = 100;
print for $N->($N);
А когда вы закончите, $N == 0
из-за семантики косвенных ссылок.
За небольшую повторяемость вы можете ослабить необходимость аргумента lvalue.
(*100 = sub { $_[0]
? ( rand, ( *{ $_[0] - 1 } = *{ $_[0] } )->( $_[0] - 1 ) )
: ( )
}
)->( 100 );
Теперь вам больше не нужен аргумент lvalue, поэтому вы можете написать:
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
(Извините за глупые цвета. Должно быть, ТАК ошибка).
Я верю, что все проясняется. ☺