シーケンシャル乗算


12

あなたの目的は、入力を受け取り、時間を連鎖させたときにN「順次乗算」を実行するプログラムを作成することです。逐次乗算とは何ですか?このaように定義されたシードを持つシーケンスです:

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

だから、みましょうa = 5。このように、f(0) = 5f(1) = f(0)*(f(0)-1) = 5*4 = 20、とf(2) = f(1)*(f(1)-1) = 20*19 = 380

あなたのプログラムであった場合ABC、その後、ABC入力すべきであるaと出力をf(1)。プログラムABCABCf(2)などを出力する必要があります。プログラムシリーズは入力を1回のみ、出力を1回のみにする必要があります。

これはコードゴルフなので、バイト単位の最短プログラムが勝ちです。標準的な抜け穴は禁止されています。

回答:


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)

DennisのJelly answerのように、このプログラムを繰り返すnと、実行n時間が長くなります。これは、命令型スタックベース言語の多くの利点の1つです。

オンラインでお試しください!


4

MATL、3バイト

tq*

オンラインで試すことができます!基本的に真剣に答え、ゼリーの答えに似ています。まず、スタックの最上部を複製します(スタックが空のときに初めて入力を取得します)。スタックの最上部をデクリメントし、2つの要素を乗算して次の入力または結果を提供します。


4

Python 3、56バイト

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

出力を上書きするトリックを使用しないソリューションが必要でした。末尾に改行がないことが重要です。


その最初の行はすべて1の数字ですか?
シードラス

@Seadrusいいえ、構文ハイライターはPythonパーサーと一致しません。Pythonパーサーは、ifand にヒットすると数値の解析を停止しますelse
-xnor

これはPython 2では短くなります。
mbomb007

@ mbomb007それはまったく機能しません。印刷は適切に処理されず、少なくとも1回連結すると余分な出力が得られます。
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のための、有効な出力を検討
Seadrus

ああ!素晴らしい!!
コナーオブライエン

2
@Seadrus メタコンセンサス(どうやらそれは問題だとは思いませんでした)によれば、REPLベースの環境は、REPLであると指定されている限りは問題ありません。
アレックスA.

2

ルア、35 18バイト

これはLuaが一度だけ簡単にできることです!

編集:私はこれを行ってからLuaで多くのものを発見したので、更新しています:)

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

... パックされていないコマンドライン引数を含み、インライン化すると、この場合は最初の値が使用されます。 n*(n-1)


1

Y、7バイト

jzC:t*!

ここで試してみてください!

これは、その仕組みですj。数値入力を受け取ります。z暗黙的な印刷をアクティブにします。C新しいリンクを開始します。:スタック上の値を複製し、tデクリメントして、を残し[a a-1]ます。次に、から取得[a*a-a]*ます。!次のコマンドをスキップします。EOFでは、何もしません。連鎖すると、入力コマンドがスキップされ、プロセスが再開されます。




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

たぶんこれは適切な機能ではありません。あなたがnitpickingしている場合(*)=<<pred$id、14バイトで(<-最後にスペースがあります)で行くことができます。

編集:@Zgarbは関数モナドを使用して関数を書き換え、3バイトを保存しました。ありがとう!


(*)=<<pred$3バイト節約します。また、これは実際には関数を定義するものではなく、入力値はその直後に配置する必要があることに注意してください。
ズガルブ

@Zgarb:ありがとう!追加idすると、適切な機能になります。答えにメモを入れました。
nimi


1

TI-Basic、6 5バイト

TI-83 / 84計算機で実行

:Ans²-Ans

このプログラムは、通常のDoneテキストの代わりにプログラムの最終行の式が印刷されるという事実のために機能します。


1
5バイト::Ans²-Ans
リルトシアスト

1

Mathcad、39「バイト」

ここに画像の説明を入力してください

ユーザーの観点から見ると、Mathcadは事実上2Dホワイトボードであり、式は左から右、上から下に評価されます。Mathcadは従来の「テキスト」入力をサポートしていませんが、代わりにテキストと特別なキー/ツールバー/メニュー項目の組み合わせを使用して、式、テキスト、プロットまたはコンポーネントを挿入します。たとえば、「:」と入力して定義演算子を入力し(画面に「:=」と表示)、「[」と入力して配列インデックスを入力し、「ctl-]」と入力してwhileループ演算子を入力します(制御条件と1つのボディ式)。上の画像に表示されているのは、ユーザーインターフェイスに「入力済み」として表示されているものです。

ゴルフを目的とする場合、「バイト」カウントは、式を入力するために必要なキーボード操作と同等の数です。

(「バイト」等価性の観点から)私がさらに確信していないことの1つは、新しい領域の作成をカウントする方法です(たとえば、a:= 5またはk:= 0..n-1)。新しい領域への各移動は、改行と等しいため、1バイトであると見なしました(実際には、マウスを使用して領域が必要な場所をクリックします)。

コメントは含めずにアクティブなステートメントのみを含め、aとnの入力にはそれぞれ2バイトを含めましたが、値自体は含めません(例では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))$

説明:

単項は常に奇数であるため、最初のアプリケーションは10進数に変換されます。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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.