我正在尝试使用惰性列表获取第一个 10 位素数。这是我根据(已经给出的)计算素数的代码得出的结论:
my @primes = 2,3,5, {first * %% none(@_), (@_[*-1] ... Inf)} ... -> $s {$s.chars == 10};
say @primes[@primes.elems-1];
Run Code Online (Sandbox Code Playgroud)
该代码的问题在于完成时间太长。
有没有什么快速的方法可以得到第一个 10 位质数?
我有许多不同长度的列表。每个列表都以一些数字开头,这些数字是多位数字,但以重复出现的一位数字结尾。例如:
my @d = <751932 512775 64440 59994 9992 3799 423 2 2 2 2>;
my @e = <3750 3177 4536 4545 686 3 3 3>;
Run Code Online (Sandbox Code Playgroud)
我想在不构建任何循环的情况下找到 1 位数字(@d7 和@e5)第一次出现的位置。理想情况下,lambda(或任何其他实用的东西)应该使用条件迭代列表,例如$_.chars == 1,一旦条件满足,它应该停止并返回位置。与其返回位置,不如返回列表直到一位数;欢迎更改和即兴创作。怎么做?
我正在尝试将数字重新排列为非英文字母顺序。
my @numDE = < null eins zwei drei vier fünf sechs sieben acht neun >;
# english < zero one two three four five six seven eight nine >;
my %numrank; # The lookup hash: number => its_alphabetical_order
for @numDE.sort.kv -> $k,$v {%numrank{%(@numDE.kv.reverse){"$v"}} = "$k"};
my %temp; # number => reassigned order value
%temp{"$_"}= %numrank{"$_"} for "2378".comb; # 2378 sample input
say %temp.sort(*.values); # this prints:
# (8 => 0 3 => 1 7 => 7 2 => 9) …Run Code Online (Sandbox Code Playgroud) my sub e($r) { printf("%d, ", $_) for 1..$r}
say e(5);
Run Code Online (Sandbox Code Playgroud)
返回1, 2, 3, 4, 5, Nil,即sub和/或say始终在末尾添加Nil。
我第一次尝试使用 rakudo 版本 2020.02。我现在尝试使用最新版本 2020.12.1 并且Nil仍然存在。如何摆脱它?
在一coin-change类问题中,我试图将递归函数重构为迭代。给定一组coin_types,该函数递归地coinr找到支付给定金额 的最小硬币数量sum。
# Any coin_type could be used more than once or it may not be used at all
sub coinr ($sum, @coin_types) { # As this is for learning basic programming
my $result = $sum; # No memoization (dynamic programming) is used
if $sum == @coin_types.any { return 1 }
else { for @coin_types.grep(* <= $sum) -> $coin_type {
my $current = 1 + coinr($sum - $coin_type, @coin_types);
$result = $current …Run Code Online (Sandbox Code Playgroud) 数学级数,例如以此处表示为数组的连续序列:
my @seq = my $a=0, {++$a} ... *;
for @seq[^10].kv {state $f=0; ($^k < 4 or $^k > 7) ?? say "a$^k = " ~ $^v !! (say "..." if $f ne 1; $f=1) };
Run Code Online (Sandbox Code Playgroud)
印刷品:
a0 = 0
a1 = 1
a2 = 2
...
a8 = 8
a9 = 9
Run Code Online (Sandbox Code Playgroud)
我的问题:1-是否有一种简单的方法可以只删除第一个元素,即a0 = 0从打印输出中删除?
2-可以使此代码更惯用吗?
谢谢。
my $coll=bag <1 2 2 3 2 4 4 2 2>;
say $coll; # => Bag(1, 2(5), 3, 4(2))
Run Code Online (Sandbox Code Playgroud)
如何2(5)从这个 Bag 集合中获取具有最大价值的项目(键)?
(可选)有没有办法告诉 Bag 只计算那些连续的元素而忽略所有不连续的元素,以便结果是Bag(2(4), 4(2))?
my @g = (1,2,3,4);
say reduce {is-prime}, @g; # ==> gives error
say reduce {is-prime *}, @g; #==> gives error
say reduce {is-prime}, (1,2,3,4); # ==> gives error
say so is-prime @g.all; # ==> gives error
Run Code Online (Sandbox Code Playgroud)
如何检查列表中的所有元素是否在 Raku 中都是素数?
my @products = (
(name => "samsung s6" , price => "600"),
(name => "samsung s7" , price => "700"));
# for @products -> $x { say $x{"name"} ~ ": USD" ~ $x{"price"} };
# Desired output:
#
# samsung s6: USD600
# samsung s7: USD700
# Real output: An error:
#
# "Type List does not support associative indexing."
Run Code Online (Sandbox Code Playgroud)
我还想使用该.kv方法进行迭代, $key并且$val像这样:
for @products -> $x.kv -> $key,$val { say $x{$key} ~ " " ~ …Run Code Online (Sandbox Code Playgroud) 我会记录一个字母在一个单词中出现的次数,例如“embeddedss”
my %x := {e => 3, m => 1, b => 1, d => 3, s => 2};
Run Code Online (Sandbox Code Playgroud)
我想通过像这样对它们的值进行分组来打印元素:
# e and d 3 times
# m and b 1 times
# s 2 times
Run Code Online (Sandbox Code Playgroud)
如何实际做到这一点,即不构建循环(如果有的话)?
可选在打印散列之前,我想将其转换并分配为临时数据结构,例如( <3 e d>, <1 m b>, <2 s> )然后打印它。最实用的数据结构和打印方式是什么?