我试图在一个数字中找到一组重复的数字,例如12334555611变成(1 2 33 4 555 6 11).
这有效:
$n.comb(/ 0+ | 1+ | 2+ | 3+ | 4+ | 5+ | 6+ | 7+ | 8+ | 9+ /)
Run Code Online (Sandbox Code Playgroud)
但不是很优雅。
有一个更好的方法吗?
无限懒惰列表真棒!
> my @fibo = 0, 1, *+* ... *;
> say @fibo[1000];
43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
Run Code Online (Sandbox Code Playgroud)
它们会自动缓存它们的值,这在大多数情况下都很方便.但是当使用巨大的Fibonacci数字(例子)时,这可能会导致内存问题.
不幸的是,我无法弄清楚如何创建非缓存Fibonacci序列.任何人?
假设我有一个大数组,@stuff和a $thing,我想知道是否$thing在@stuff.Perl 6中最好的方法是什么?而"最好"的意思是:惯用,可读,高效; 不一定按顺序排列.
实际上有两个独立的案例.一个是你必须为不同的$things 做很多检查的地方,另一个是你只做一次或几次的地方.
让我们先来看第一个案例.我想我知道(或者)正确答案.
my $set-of-stuff = set @stuff;
for @whatever -> $thing {
do-something-with($thing) if $thing ? $set of stuff;
}
Run Code Online (Sandbox Code Playgroud)
实际上你可以跳过第一行并简单地说... if $thing ? @stuff,但是几乎肯定会有更差的性能,因为每次都会创建一个集合.
但现在第二种情况,我只有一个$thing要检查.当然,上面的解决方案是有效的,但创建集合只是为了检查一次,似乎需要很多开销.捷径
do-something-with($thing) if $thing ? @stuff;
Run Code Online (Sandbox Code Playgroud)
这里更有意义,因为我们只称它一次.但是,我们仍然需要为一次使用创建一个集合.
更传统的是:
do-something-with($thing) if @stuff.grep($thing);
Run Code Online (Sandbox Code Playgroud)
或者可能更快:
do-something-with($thing) if @stuff.first($thing);
Run Code Online (Sandbox Code Playgroud)
但这似乎不那么惯用,当然第二个不太可读$thing ? @stuff.
我认为没有智能匹配解决方案,对吧?当然这不起作用:
do-something-with($thing) if $thing ~~ @stuff;
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
在Perl 6中生成素数列表非常容易:
my @primes = (^?).grep: *.is-prime;
Run Code Online (Sandbox Code Playgroud)
如果你需要相对较少数量的素数,这种方法就足够了,但对于大数字来说效率非常低,因为每个数字都是独立检查的.
有没有办法访问Perl 6的内置主要检查逻辑,以有效地创建素数列表?否则我需要自己建一个筛子.很容易,但我担心高级Perl 6代码中的筛子几乎和我开始使用的代码一样低效.
我正在做第9天的代码:
你坐了一会儿,记录了一部分流(你的拼图输入).字符代表组 - 以开头
{和结尾的序列}.在一个组中,有零个或多个其他东西,用逗号分隔:另一个组或垃圾.由于组可以包含其他组,因此}只关闭最近打开的未关闭组 - 也就是说,它们是可嵌套的.您的拼图输入表示一个单独的大组,其本身包含许多较小的组.有时候,你会发现垃圾,而不是一个团体.垃圾开始于
<和结束>.在这些尖括号之间,几乎可以出现任何字符,包括{和}.在垃圾中,<没有特别的意义.在徒劳地尝试清理垃圾时,一些程序已经取消了其中的一些字符
!:内部垃圾,后面的任何字符都!应该被忽略,包括<,>甚至是另一个!.
当然,这对于Perl 6 Grammar来说是尖叫......
grammar Stream
{
rule TOP { ^ <group> $ }
rule group { '{' [ <group> || <garbage> ]* % ',' '}' }
rule garbage { '<' [ <garbchar> | <garbignore> ]* '>' }
token garbignore { '!' . }
token …Run Code Online (Sandbox Code Playgroud) 看起来maxpairs不喜欢在具有未定义值的列表上调用:
> my @foo; @foo[2] = 4; say @foo.maxpairs;
Use of uninitialized value of type Any in string context.
Methods .^name, .perl, .gist, or .say can be used to stringify it to something meaningful.
in block <unit> at <unknown file> line 1
(2 => 4)
Run Code Online (Sandbox Code Playgroud)
max 没有相同的问题,似乎只是忽略未定义的值:
> my @foo; @foo[2] = 4; say @foo.max;
4
Run Code Online (Sandbox Code Playgroud)
发生同样的错误:
> my @foo; @foo[2] = 4; say @foo.pairs.max(*.value)
Use of uninitialized value of type Any in string context.
Methods .^name, .perl, …Run Code Online (Sandbox Code Playgroud) 根据文档,sort比较使用infix:<cmp>.
但:
class Point
{
has Int $.x;
has Int $.y;
method Str { "($!x,$!y)" }
method gist { self.Str }
}
multi sub infix:<cmp>(Point $a, Point $b) { $a.y cmp $b.y || $a.x cmp $b.x }
my @p = Point.new(:3x, :2y), Point.new(:2x, :4y), Point.new(:1x, :1y);
say @p.sort;
Run Code Online (Sandbox Code Playgroud)
给出输出:
((1,1) (2,4) (3,2))
Run Code Online (Sandbox Code Playgroud)
我用的时候:
say @p.sort(&infix:<cmp>);
Run Code Online (Sandbox Code Playgroud)
它确实提供了正确的输出:
((1,1) (3,2) (2,4))
Run Code Online (Sandbox Code Playgroud)
这是文档中的错误,功能还是缺陷?有没有一种方法可以.sort()在一个Points 的列表上使用自定义排序顺序而不指定例程?
以下 Raku 脚本:
#!/usr/bin/env raku
use v6.d;
grammar MyGrammar
{
rule TOP { <keyword> '=' <value> }
token keyword { \w+ }
token value { <strvalue> | <numvalue> }
token strvalue { '"' <( <-["]>* )> '"' }
token numvalue { '-'? \d+ [ '.' \d* ]? }
}
say MyGrammar.parse('foo = 42');
say MyGrammar.parse('bar = "Hello, World!"');
Run Code Online (Sandbox Code Playgroud)
有以下输出:
?foo = 42?
keyword => ?foo?
value => ?42?
numvalue => ?42?
?bar = "Hello, World!"?
keyword => ?bar?
value => …Run Code Online (Sandbox Code Playgroud) 我有以下琐碎的脚本:
#!/usr/bin/env perl6
use v6.c;
sub MAIN($x)
{
say "$x squared is { $x*$x }";
}
Run Code Online (Sandbox Code Playgroud)
当用实数调用它时,这种方法非常好,但我也希望将它传递给复数.当我按原样尝试时,会发生以下情况:
% ./square i
Cannot convert string to number: base-10 number must begin with valid digits or '.' in '?i' (indicated by ?)
in sub MAIN at ./square line 7
in block <unit> at ./square line 5
Actually thrown at:
in sub MAIN at ./square line 7
in block <unit> at ./square line 5
Run Code Online (Sandbox Code Playgroud)
当我将脚本更改为
#!/usr/bin/env perl6
use v6.c;
sub MAIN(Complex $x)
{
say …Run Code Online (Sandbox Code Playgroud) 我有以下XML:
<Product>
...
<TitleDetail>
<TitleType>01</TitleType>
<TitleElement>
<TitleElementLevel>01</TitleElementLevel>
<TitleText>This is the title I'm looking for</TitleText>
</TitleElement>
</TitleDetail>
...
</Product>
Run Code Online (Sandbox Code Playgroud)
(如果你很好奇,那就是ONIX.)
我想提取01类型的标题.我试过:
say $dom->at('TitleDetail[TitleType="01"] > TitleElement > TitleText')
Run Code Online (Sandbox Code Playgroud)
但这不起作用.看起来tag[attr=value]语法真的只适用于属性.
有一种简单的方法可以做我想要的吗?