У Haskell есть эта аккуратная (выглядящая) особенность, где вы можете дать ему три числа, и он может вывести из них арифметическую последовательность. Например, [1, 3..27]
эквивалентно [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27]
.
Это круто, и все, кроме арифметических последовательностей, довольно ограничены. Сложение, пффф . Умножение там, где оно есть. Разве не было бы круче, если бы геометрические последовательности вроде [1, 3..27]
возврата [1, 3, 9, 27]
?
Вызов
Напишите программу / функцию, которая принимает три натуральных числа a , b и c и выводит, где x - наибольшее целое число ≤ c, которое можно представить как где[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]
b × (b ÷ a)n
n - натуральное число.
То есть на выходе должно быть r , такое что:
r0 = a
r1 = b
rn = b × (b ÷ a)n-1
rlast = greatest integer ≤ c that can be represented as b × (b ÷ a)n
where n is a positive integer
Характеристики
- Применяются стандартные правила ввода / вывода .
- Стандартные лазейки будут запрещены .
- б всегда будет делиться на а .
- a < b ≤ c
- Эта задача заключается не в том, чтобы найти кратчайший подход на всех языках, а в том, чтобы найти кратчайший подход на каждом языке .
- Ваш код будет оцениваться в байтах , обычно в кодировке UTF-8, если не указано иное.
- Разрешены встроенные функции (Mathematica может иметь одну: P), которые вычисляют эту последовательность, но приветствуется включение решения, не основанного на встроенных функциях .
- Пояснения, даже для «практических» языков, приветствуются .
Контрольные примеры
a b c r
1 2 11 [1, 2, 4, 8]
2 6 100 [2, 6, 18, 54]
3 12 57 [3, 12, 48]
4 20 253 [4, 20, 100]
5 25 625 [5, 25, 125, 625]
6 42 42 [6, 42]
В нескольких лучших форматах:
1 2 11
2 6 100
3 12 57
4 20 253
5 25 625
6 42 42
1, 2, 11
2, 6, 100
3, 12, 57
4, 20, 253
5, 25, 625
6, 42, 42
Ответы:
Шелуха , 8 байт
Ввод в порядке b, c, a . Попробуйте онлайн!
объяснение
Поток управления в этой программе немного сложен для отслеживания. Сначала b подается в крайнее правое положение
/
, создавая функцию,/b
которая делится на b . Далее,~
разбивает оставшуюся программу на три части:~(↑)(≤)(Ṡ¡o//b)
. Это передает c to≤
и a toṠ¡o//b
и объединяет результаты с↑
. Результатом≤c
является функция, которая проверяет, является ли ее аргумент не более с , и↑≤c
принимает самый длинный префикс элементов, для которых это имеет место.Осталось показать, как
(Ṡ¡o//b)a
оценивается желаемый бесконечный список. Часть в скобках разделена наṠ(¡)(o//b)
. ЗатемṠ
каналы к , подает результат , а затем дает для второго аргумента. Выражение дает функцию, которая принимает число, делит его на a / b и повторяет эту функцию по второму аргументу, который является a .o//b
¡
(o//b)a
¡
Вот серия преобразований, которые визуализируют объяснение:
Альтернативное решение с использованием явных переменных в порядке a, b, c :
источник
Python 2 , 42 байта
Попробуйте онлайн!
Рекурсивный подход,
4241 байт-1 байт благодаря овсу
Попробуйте онлайн!
источник
Протон , 35 байт
Попробуйте онлайн!
источник
JavaScript (ES6),
4137 байтСохранено 4 байта благодаря @Neil
Принимает вход как
(b,c)(a)
.Контрольные примеры
Показать фрагмент кода
комментарии
источник
(b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)]
.Pari / GP , 38 байт
Попробуйте онлайн!
источник
Wolfram Language (Mathematica) , 22 байта
Попробуйте онлайн!
источник
Python 3,
93907473 байтаПопробуйте онлайн
Спасибо Роду и пользователю 202729 за помощь в уменьшении количества байтов!
источник
def + return -> lambda
, Советы по Python.import*
.while i<=c:i++
(вместо списка понимания + журнал), чтобы сохранить много байтовОктава ,
3835 байтПопробуйте онлайн!
Оказывается, подход @LuisMendo MATL также экономит 3 байта в октаве, несмотря на повторение
log
три раза.источник
Perl 6 ,
2624 байтаПопробуйте онлайн!
Оператор последовательности Perl 6
...
может выводить геометрические ряды изначально.Обновление: ... Может , но в этой ситуации не выводя это немного короче.
источник
05AB1E , 12 байтов
Ввод в порядке
c,b,a
Попробуйте онлайн!
объяснение
источник
MATL , 17 байт
Попробуйте онлайн!
Просто чтобы мяч катился в MATL. Я не могу себе представить, что нет более подробного способа решения этой проблемы.
источник
Haskell, 35 байт
Попробуйте онлайн!
источник
exp<$>[...]
)MATL , 12 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
a
иc
(у меня много неудачных попыток, начиная сy/i
), но используя этот метод, вы аккуратно держите все вместе.Perl, 38 байт
Включить
+3
для-n
(use 5.10.0
разблокировка Perl 5.10 бесплатна)Затем запустите как:
источник
Красный , 50 байт
Попробуйте онлайн!
источник
Japt , 14 байт
Попытайся
объяснение
источник
Чисто , 63 байта
Попробуйте онлайн!
источник
TI-BASIC, 31 байт
Принимает ввод от пользователя и выводит в
Ans
. Я решил для n в c = b n / a n-1 , получив n = 1 + ln (c / b) / ln (b / a). Это то же самое, что n = 1 + log b / a (c / b). В целях игры в гольф я начинаю свою последовательность с -1 и заканчиваю ее с n-1, а не с 0 до n.источник
APL (Dyalog Unicode) , 38 байт
Попробуйте онлайн!
Префикс Dfn. Принимает ввод по порядку
a b c
и использует⎕IO←0
( I ndex O rigin)Спасибо @ErikTheOutgolfer за то, что он убрал 6 байтов до того, как я их опубликовал.
Как?
источник
Stax , 14 байтов CP437
16 байт при распаковке,
Запускать и отлаживать онлайн!
Принимает вход в виде
[b, a, c]
.Уверен, у @recursive есть лучшие решения.
объяснение
источник
СИЛОС , 73 байта
Попробуйте онлайн!
Мы читаем три числа. Рассчитайте общее соотношение по второму числу / первому. Затем мы пробегаем серию, пока не превысим верхнюю границу.
источник
C (gcc), 82 байта
Попробуйте онлайн!
Рассчитывает и печатает
r_n = b^n/a^(n-1)
доr_n > c
.Должен быть скомпилирован с
-lm
!источник
n;f(a,b,c){for(float r=n=0;r=pow(b/a,n++)*a,r<=c&&printf("%f ",r););}
APL (Dyalog) , 23 байта ( SBCS )
Это принимает аргументы ab слева и c справа,
Попробуйте онлайн!
Вероятно, есть более короткий путь, но я подумал, что
÷\
это мило.Разъяснение:
{...}
Автономная функция ⍺ естьa b
,⍵
естьc
. Допустимa b c = 2 6 100
⌽⍺
Обратное⍺
:6 2
⍵⍴
Повторите⍵
раз:6 2 6 2 6 2 6 2 ...
÷\
Уменьшить делением на префиксы:6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..
⍺,
Prepend⍺
:2 6 6 3 18 9 54 27 162 81 ...
⊣/⍵2⍴
Получить все остальные элементы (плюс несколько повторяющихся повторов):⍵2⍴
Сделай⍵
ряд,2
матрицу столбца из2 6 6 3 18 9 54 ...
⊣/
Получить первый столбец⊆⊢
Разбить массив на блоки, где⍵∘≥
⍵
больше или равно всем элементам⊃
Возьми первый такой блокисточник