Послідовне множення


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)і т. Д. Ваші програми програми повинні приймати дані лише один раз і лише один раз.

Це кодовий гольф, тому виграє найкоротша програма в байтах. Стандартні лазівки заборонені.

Відповіді:


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. Це одна з багатьох переваг імперативних мов на основі стека.

Спробуйте в Інтернеті!


4

MATL, 3 байти

tq*

Ви можете спробувати онлайн! В основному схожий на відповіді Серйозно і Желе. По-перше, він дублює верхню частину стека (введіть перший раз, коли стек порожній). Зменшує верхню частину стека і множить два елементи, щоб дати наступний вклад або результат.


4

Python 3, 56 байт

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

Просто хотілося рішення без витівки, що перезаписує вихід. Важливим є відсутність нової лінії.


це перший рядок усіх 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

пл, 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


Як це дає результат?
Денніс

У консолі. Мені потрібно це виправити.
Conor O'Brien

жодна консоль не в порядку, я вважаю, що дійсний вихід для js
Seadrus

Ой! Фантастичний !!
Conor O'Brien

2
@Seadrus Мабуть, згідно з мета-консенсусом (який я не усвідомлював, що це річ), середовище, засноване на REPL, добре, доки не вказано, що це відповідь.
Олексій А.

2

Луа, 35 18 байт

Це щось, що Lua може зробити досить легко за один раз!

Редагувати: з мого часу я відкрив у Луї багато речей, тому я її оновлюю :)

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

...містить аргумент командного рядка розпакований, вкладений він буде використовувати в цьому випадку перше значення, оскільки його не буде дозволено витрачати, в результаті чого просто надрукується n*(n-1).


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.



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

TI-Basic, 6 5 байт

Працює на калькуляторах TI-83/84

:Ans²-Ans

Ця програма працює завдяки тому, що вираз у останньому рядку програми друкується замість звичайного Doneтексту.


1
5 байт::Ans²-Ans
lirtosiast

1

Mathcad, 39 "байт"

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

З точки зору користувача, Mathcad фактично є двовимірною дошкою, вирази оцінюються зліва направо, зверху вниз. Mathcad не підтримує звичайне введення тексту, але замість цього використовується комбінація тексту та спеціальних клавіш / панелі інструментів / елементів меню, щоб вставити вираз, текст, графік або компонент. Наприклад, введіть ":" для введення оператора визначення (відображається на екрані як ": ="), "[" для введення індексу масиву, або "ctl-]" для введення оператора циклу "час" (включаючи заповнювачів для контроль стану та одного вираження тіла). Те, що ви бачите на зображенні вище, саме те, що відображається в інтерфейсі користувача та як "набрано".

Для цілей гольфу кількість байтів - це еквівалентна кількість операцій на клавіатурі, необхідних для введення виразу.

Одне, в чому я навіть менш впевнений (з точки зору еквівалентності "байт"), - це як рахувати створення нової області (наприклад, 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++;

Спробуйте в Інтернеті!


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.