Perl6 22/30
Я собираюсь посмотреть, сможет ли Perl6 определить последовательность для меня.
Для этого я использовал REPL, встроенный в Perl6
$ perl6
> 1,2,4,7...*
Unable to deduce arithmetic or geometric sequence from 2,4,7 (or did you really mean '..'?)
> 1,2,4,7,10...*
1 2 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 64 67 70 ...
Хм, я вижу образец, который вывел Perl. После 4, чтобы получить следующее значение, вы просто добавляете 3.
1,2,4,*+3...*
Который сохраняет один символ, создавая код, чтобы получить бесконечный список чисел в последовательности Штера длиной 13 символов.
Этот код только делает что-то полезное в REPL, так как он выводит суть результата для нас. Чтобы заставить его печатать иначе, вы должны явно указать Perl распечатать результаты.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
это просто способ получить ссылку на код, который возвращает 3, добавленный к его единственному аргументу. Другие способы записать это будут { $_ + 3 }
или -> $i { $i + 3 }
, или, или, { $^i + 3 }
или sub ($i){ $i + 3 }
)
Кратчайший способ создать что-то Callable для генерации первых n элементов - это получить часть элементов.
{(1,2,4,*+3...*)[^$_]} # 22
В пустом контексте, который будет генерировать первые $_
значения, а затем быстро выбрасывать их.
В любом другом месте, кроме пустого контекста, он создает блок анонимного кода (базовая подпрограмма без имени), который принимает один аргумент.
# store it in a scalar variable
my $sub = {(1,2,4,*+3...*)[^$_]};
say $sub.(5);
# 1 2 4 7 10
# use it immediately
say {(1,2,4,*+3...*)[^$_]}.(5);
# 1 2 4 7 10
# pretend it always had a name
my &Stöhr-first = {(1,2,4,*+3...*)[^$_]};
say Stöhr-first 5;
Если вы действительно думаете, что у него должно быть имя, которое может считаться действительным для этой задачи, вы, вероятно, сделаете это:
sub s(\n){(1,2,4,*+3...*)[^n]} # 30
Хотя, так s
как также используется для оператора подстановки, вызывать это не обязательно. (Вы могли бы дать ему другое имя, я полагаю)
say s(5);
# 1 2 4 7 10