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 ...
Гм, я бачу схему, яку вивів Перл. Після 4, щоб отримати наступне значення, ви просто додасте 3.
1,2,4,*+3...*
Що зберігає один символ, роблячи код, щоб отримати нескінченний перелік чисел у послідовності Stöhr довжиною 13 символів.
Цей код є лише корисним у REPL, оскільки він друкує суть результату для нас. Щоб домогтися друку в іншому випадку, вам доведеться прямо сказати Perl, щоб роздрукувати результати.
$ perl6 -e 'say 1,2,4,*+3...*'
( * + 3
це просто спосіб отримати посилання на код, який повертає 3, доданий до цього лише аргументу. Інші способи його написання були б { $_ + 3 }
, або -> $i { $i + 3 }
, або { $^i + 3 }
або sub ($i){ $i + 3 }
)
Найкоротший шлях , щоб створити що - то може бути відкликаним генерувати перші п елементи, щоб отримати зріз елементів.
{(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