Последовательное Умножение

12

Ваша цель состоит в том, чтобы написать программу, которая принимает входные данные и, когда они объединены воедино N, выполняет «последовательное умножение». Вы можете спросить, что такое последовательное умножение? Это последовательность с начальным числом, aопределенным следующим образом:

f(0) = a
f(n+1) = f(n)*(f(n)-1)

Итак, давай a = 5. Таким образом, f(0) = 5, f(1) = f(0)*(f(0)-1) = 5*4 = 20и f(2) = f(1)*(f(1)-1) = 20*19 = 380.

Если ваша программа была ABC, то ABCдолжны брать ввод aи вывод f(1). Программа ABCABCдолжна выводить f(2)и т. Д. Ваша серия программ должна вводить только один раз и выводить только один раз.

Это код-гольф, поэтому выигрывает самая короткая программа в байтах. Стандартные лазейки запрещены.

Seadrus
источник

Ответы:

13

Желе, 3 байта

×’$

Попробуйте онлайн!

Как это устроено

×’$    Main link (or part thereof). Argument (initially input): n

 ’     Compute n - 1.
×      Multiply n by (n - 1).
  $    Combine the previous two atoms into a monadic quicklink.

Повторение фрагмента n раз выполнит его n раз, что приведет к желаемому результату.

Деннис
источник
4

Серьезно, 4 байта

,;D*

Объяснение:

,;D*
,     push input (NOP once input is exhausted)
 ;D   dupe and push n-1
   *  multiply
      (implicit output at EOF)

Как и в ответе Дениса на Jelly , повторение этой программы nприведет к ее продолжительности n. Это одно из многих преимуществ императивных языков на основе стека.

Попробуйте онлайн!

Mego
источник
4

MATL, 3 байта

tq*

Вы можете попробовать это онлайн! В основном похоже на Серьезно и Желе ответы. Во-первых, он дублирует вершину стека (ввод вводится впервые, когда стек пуст). Уменьшает вершину стека и умножает два элемента для получения следующего ввода или результата.

Дэвид
источник
4

Python 3, 56 байт

+1if 0else 0
try:n
except:n=int(input())
n*=n-1
print(n)

Просто хотел решения без хитрости перезаписи вывода. Отсутствие завершающей новой строки важно.

Sp3000
источник
это первая строка всего 1 номер?
Seadrus
@ Seadrus Нет, подсветка синтаксиса не соответствует парсеру Python, который останавливает синтаксический анализ чисел при попадании в ifи else.
xnor
Это будет короче в Python 2 .
mbomb007
@ mbomb007 Это не совсем работает, печать не обрабатывается должным образом, и вы получаете дополнительный вывод, когда объединяете хотя бы один раз.
FryAmTheEggman
Ах, вот что это за дополнительный вывод.
mbomb007
3

CJam, 5 байтов

r~_(*

Попробуйте онлайн!

Как это устроено

r     e# Read a whitespace-separated token from STDIN.
      e# This pushes the input (when called for the first time) or an empty string.
 ~    e# Evaluate.
      e# This turns the input into an integer or discards an empty string.
  _   e# Copy the top of the stack.
   (  e# Decrement.
    * e# Multiply.
Деннис
источник
3

pl, 5 байт

_▼•=_

Попробуйте онлайн.

Было бы 4 байта, если бы я не был ленивым и не реализовал "назначить на _" ...

объяснение

_▼•=_

_       push _ (input var)
 ▼      decrement last used var (_)
  •     multiply, since it is off by one it auto-adds _ to the arg list
   =_   assign result to _
спагетто
источник
2

GolfScript, 5 байт

~.(*`

Попробуйте онлайн.

Де-гольф и прокомментировал:

~    # Eval the input to turn it from a string into a number.
.    # Duplicate the number.
(    # Decrement one of the copies by one.
*    # Multiply the copies together.
`    # Un-eval the number, turning it back into a string.

Интерпретатор GolfScript автоматически считывает ввод и помещает его в стек, но не в виде числа, а в виде строки. Таким образом, нам нужно превратить входные данные в число с ~, а затем снова преобразовать их в строку `. В конце интерпретатор автоматически распечатает строковый номер в стеке.

(Теперь, если бы задача состояла в том, чтобы повторить f(n+1) = f(n)*(-f(n)-1), я мог бы сделать это в 4 байта с ~.~*. Выяснение, как и почему это работает, оставлено в качестве упражнения. :)

Илмари Каронен
источник
2

JavaScript REPL, 25 20 байт

a=prompt();
a*=a-1//

Будет работать над устранением REPL

Конор О'Брайен
источник
Как это производит продукцию?
Деннис
В консоли. Мне нужно это исправить.
Конор О'Брайен
нет, консоль в порядке, я считаю, что правильный вывод для
JS
Ой! Фантастический!!
Конор О'Брайен
2
@Seadrus По-видимому, согласно мета-консенсусу (который я не осознавал, что это вещь), среды на основе REPL хороши, если указано, что это REPL.
Алекс А.
2

Луа, 35 18 байт

Это то, что Lua может сделать довольно легко за один раз!

Редактировать: я обнаружил много вещей в Lua, так как я сделал это, поэтому я обновляю это :)

print(...*(...-1))

...содержит распакованный аргумент командной строки, в котором он будет использовать первое значение в этом случае, так как ему не будет позволено тратить деньги, что приведет к простой печати n*(n-1).

Katenkyo
источник
1

Y 7 байт

jzC:t*!

Попробуй это здесь!

Вот как это работает: jпринимает числовой ввод. zактивирует неявную печать. Cначинается новая ссылка. :дублирует значение в стеке и tуменьшает его, оставляя нас с [a a-1]. Затем мы получаем [a*a-a]от *. !пропускает следующую команду; на EOF это ничего не делает. При объединении он пропускает команду ввода, и процесс начинается снова.

Конор О'Брайен
источник
1

𝔼𝕊𝕄𝕚𝕟, 5 символов / 7 байтов

ïׇï;

Try it here (Firefox only).

Должен ли я действительно объяснить это? О, хорошо, здесь идет ...

объяснение

Это в основном оценивается input*=--input;в JS.

Mama Fun Roll
источник
1

Perl, 23 байта

l;$_|=<>;$_*=~-$_;print

Альтернативная версия, 10 байт

$_*=~-$_;

Это требует -pпереключения. Я не уверен, является ли это честной игрой в вопросе .

Деннис
источник
1

Haskell, 14 11 байтов

(*)=<<pred$

Пример использования

Prelude> (*)=<<pred$5
20
Prelude> (*)=<<pred$(*)=<<pred$5
380
Prelude> (*)=<<pred$(*)=<<pred$(*)=<<pred$5
144020

Может быть, это не правильная функция. Если вы придирчивы, вы можете использовать с (*)=<<pred$id(<-это пробел в конце) для 14 байтов.

Редактировать: @Zgarb переписал функцию, используя функцию монады и сохранил 3 байта. Благодарность!

Ними
источник
(*)=<<pred$экономит 3 байта. Кроме того, следует отметить, что это на самом деле не определяет функцию, и входное значение должно быть помещено непосредственно после него.
Згарб
@Zgarb: Спасибо! Добавление idделает это правильной функцией. Я поставил записку в своем ответе.
Ними
1

Pure Bash (без коммунальных услуг), 40

((a=a?a:$1,a*=a-1))
trap 'echo $a' exit
Цифровая травма
источник
1

TI-Basic, 6 5 байтов

Работает на калькуляторах ТИ-83/84

:Ans²-Ans

Эта программа работает из-за того, что выражение в последней строке программы печатается вместо обычного Doneтекста.

Timtech
источник
1
5 байт::Ans²-Ans
lirtosiast
1

Mathcad, 39 "байтов"

введите описание изображения здесь

С точки зрения пользователя, Mathcad - это фактически двухмерная доска с выражениями, вычисляемыми слева направо и сверху вниз. Mathcad не поддерживает обычный ввод текста, но вместо этого использует комбинацию текста и специальных клавиш / панели инструментов / пунктов меню для вставки выражения, текста, графика или компонента. Например, введите «:», чтобы ввести оператор определения (отображается на экране как «: =»), «[», чтобы ввести индекс массива, или «ctl-]», чтобы ввести оператор цикла while (включая заполнители для контролирующее состояние и одно выражение тела). На изображении выше вы видите именно то, что отображается в пользовательском интерфейсе и как «напечатано» в.

В целях игры в гольф число байтов - это эквивалентное количество операций клавиатуры, необходимых для ввода выражения.

Одна вещь, в которой я еще менее уверен (с точки зрения «байтовой» эквивалентности), - как считать создание новой области (например, a: = 5 или k: = 0..n-1). Я приравнял каждое перемещение к новой области как равное новой строке и, следовательно, 1 байт (на практике я использую мышь, чтобы щелкнуть там, где я хочу область).

Я включил только активные операторы, а не комментарии, и я включил 2 байта каждый для входов a и n, но не сами значения (5 и 7 в примере).

Стюарт Бруфф
источник
0

Haskell, 72 байта

Эта задача неприемлема для Haskell. Однако, если ввод выполняется в унарном формате, а код выполняется в GHCI:

(\x->if odd x then let y=until((>x).(10^))(+1)0 in y*(y-1)else x*(x-1))$

Объяснение:

Унарное всегда странно, поэтому первое приложение преобразуется в десятичное. x*(x-1)всегда четный, так что в противном случае возвращается x*(x-1), где xввод. Поскольку Haskell строго типизирован и «специальные» символы нельзя назвать похожими &1, я считаю, что это практически единственный способ завершить это в Haskell, если только не используются глобальные переменные или форма ввода с четным коэффициентом.

Майкл Кляйн
источник
0

C ++ (gcc) , 173/176 байт

Обе версии имеют решающий символ новой строки в конце.

Макро версия, 173 байта

#ifndef M
#define M(a,b)a##b
#define W(z,x)M(z,x)
#define B int W(m,__LINE__)=x++
#include<iostream>
int x,n;int main(){for(std::cin>>n;x--;)n*=n-1;std::cout<<n;}
#endif
B;

Попробуйте онлайн!

Версия шаблона, 176 байт

Несколько больше C ++ ish:

#ifndef B
#define B template
#include<iostream>
int x,n;B<int N>struct A{static int i;};int main(){for(std::cin>>n;x--;)n*=n-1;std::cout<<n;}
#endif
B<>int A<__LINE__>::i=x++;

Попробуйте онлайн!

gastropner
источник
0

Бурлеск - 5 байтов

J?d?*

blsq ) 5 J?d?*
20
blsq ) 5 J?d?* J?d?*
380
blsq ) 5 J?d?* J?d?* J?d?*
144020
mroman
источник