すでに短い数式を短くする


15

かつて、私はいくつかの実際の作業を行い、古いコードを更新し、古き良き時代の数学でπx+ e xとして書かれたものと同等の式にぶつかりました。私が使用している言語(APL)で書かれているよりも短く書くことが可能であると思ったため、この非常に簡単な課題を提示します。

(任意の手段によって)は、(任意の手段によって)、ゼロ以上の数字、およびリターンを受け入れることについての上記式の結果を関数またはプログラムを書くX = 所与の数値の各各結果のために少なくとも3桁の有効数字を有します。

言語にπeがない場合は、値3.142および2.718を使用します。

スコアリングはバイト数であるため、答えの先頭にを付け# LanguageName, 00 bytesます。

標準のループ穴は許可されていません。


編集:今、私が思いついた解決策は、○+*発見されました。元のコードは(○x)+*xです。


5
入力はどのドメインから取得されますか?整数、実数、複素数?
マーティンエンダー

1
@MartinBüttner出力が整数に制限されていない限り、好きなものは何でも。
アダム

回答:


21

Dyalog APL、3文字

暗黙のフレーズとして。

○+*

モナドはその引数にπを掛け*ますexp。モナドは指数関数です。○+*はに(○+*)ω等しい列車(○ω)+(*ω)です。これはAPLであるため、この句は任意の形状の引数に対して機能します。g。任意の長さのベクトルを渡すことができます。

Jではo.+^o.being および^being と同じソリューションが可能*です。


:-) OPの「編集:」を参照してください。
アダム

それで、私はあなたを間違って投票しましたが、ただ気づきました。それを変更できるように、いくつかのマイナーな編集を心がけますか?
ankh-morpork

@ dohaqatar7このように?
FUZxxl

30

Emotinomicon、48バイト/ 13文字

短いからではなく、楽しいからです。 ここで試してみてください。コピーしてテキストボックスに貼り付ける必要があります。

😼⏪🆙😦✖😎😿➕😨😼🆙😄⏩

説明:

😼  ⏪   🆙  😦  ✖   😎  😿  ➕   😼  🆙  😄  ⏩   explanation
😼                                              take numeric input
    ⏪                                           open loop
        🆙                                      duplicate top of stack
            😦                                  push pi
                ✖                               multiply top two elements on stack
                    😎                          reverse stack
                        😿                      pop N, push e^N
                            ➕                   add top two elements on stack
                                😼              take numeric input
                                    🆙          duplicate top of stack
                                        😄      pop N, push N+1
                                            ⏩   close loop

以下は、ネイティブ環境である携帯電話のプログラムです。 the image


1
間違いなく最も面白い表現。
アダム

7
笑、猫cat
geokavel

3
この言語が欲しい。
ファラズマスロア

2
彼は部分を使用していると言えるでしょう。(•_•)(•_•)>⌐■-■(⌐■_■)
アディソンクランプ

9

R、25 24バイト

cat(exp(x<-scan())+pi*x)    

これでしょうか?ユーザーからの入力を取得し、割り当てますx、、その指数関数的乗算を計算しpi、最終的cat()に結果を出力します。

編集:アレックスAのおかげで1バイト節約


1
私にぴったりです。
アダム

2
24バイト:cat(exp(x<-scan())+pi*x)
アレックスA.

この場合、変数を割り当てるのではなく、引数を設定するためで<-はなく、提案で使用したように使用する必要があります。新しいセッションでは、現在のコードは失敗します。=xexpx
アレックスA.

7

JavaScript(ES6)、39 34バイト

@ edc65のおかげで5バイト節約

a=>a.map(x=>x*Math.PI+Math.exp(x))

入力を数値の配列として受け取り、同じ形式で出力します。

削減のおかげで、3つの同等の45バイトプログラムがあり、すべてがES5に準拠しています。

for(;x=prompt();)alert(x*Math.PI+Math.exp(x))
for(M=Math;x=prompt();)alert(x*M.PI+M.exp(x))
with(Math)for(;x=prompt();)alert(x*PI+exp(x))

入力は一度に1つずつ入力する必要があります。何も入力せずに[OK]を押して終了します。

3つ目は、JSの興味深い機能であるwithステートメントです。使用するのが安全でない場合があるため(厳密モードでは無効)、オブジェクトにアクセスする必要があるたびにオブジェクト名とピリオドを入力する手間を省くことができます。たとえば、これを行うことができます:

x=[];with(x)for(i=0;i<5;i++)push(length);

pushそしてlength、その後の特性として使用されるxとなり、xです[0,1,2,3,4]

上のこの作品の任意のオブジェクト、でも非変数は、そう例えば、あなたはこれを行うことができます。

with("0123456789ABCDEF")for(i=0;i<length;i++)alert("0x"+charAt(i)-0);

charAtそしてlength、文字列のプロパティとして呼び出されます。16進値から数値に"0x"+x-0変換xするため、これalertは0〜15の数値です。


1
M.pow(M.E,x)あるM.exp(x)定義によって
edc65

@ edc65私は私のことを学ぶべきMathです;)ありがとう!
ETHproductions

with廃止されるとは知りませんでした。
コナーオブライエン

@CᴏɴᴏʀO'Bʀɪᴇɴ私の悪い; 非推奨ではありませんが、回避することを強くお勧めします。
ETHproductions

それは私が読んだことを覚えているものです。^ _ ^とにかく<canvas>レンダリングと(もちろん)ゴルフで使用します。
コナーオブライエン

6

Mathematica、11 10バイト

N@Pi#+E^#&

LegionMammal978のおかげで1バイトが節約されました。


現在、これは機能しません。ただし、10バイトの場合:1.Pi#+E^#&
LegionMammal978

#との間にスペースがありませんPi。これはのPi#代わりに使用することで解決し#Piます。また、式全体ではなく、Nのみに適用する必要がありますPi#
DavidC

6

Pyth、11 13

VQ+*N.n0^.n1N

今かかる xリストとして、例えば[1.25, 2.38, 25]

前(11バイト): +*Q.n0^.n1Q

VQ            +       * N .n0            ^ .n1 N
For each      Add     List Item * Pi     e ^ List Item
input item

オンライン通訳でこれを試すと、1つの番号でしか機能しません。または、入力形式は何ですか?仕様では、入力は「ゼロ以上の数字」であり、「与えられたそれぞれの数字」について式を評価する必要があるとされています。
レトコラディ

@RetoKoradiは、「テストスイートに切り替える」ボックスをチェックすることにより、複数の番号で(別々の行で)実行できます。あなたが言及した今、それが許可されているかどうかはわかりません。
ムース

5

真剣に、10バイト

,`;e(╦*+`M

六角ダンプ:

2c603b6528cb2a2b604d

オンラインで試す

入力をリストとして受け取ります(リンクを参照してください)。

説明:

,                               Get input list
 `      `M                      Map this function over it
  ;                             Copy the input value.
   e                            exponentiate
    (                           dig up the other copy
     ╦*                         multiply by pi
       +                        add


5

TI-BASIC、5バイト

πAns+e^(Ans

:これらのそれぞれは、1計算はバイトとして格納されているので、TI-BASICは、ASCIIバイトを使用していないπAns+e^(、とAns。前の式が入力であると仮定します(など{1,2,3})。


5

Python 2、38バイト(52 49バイト、数学付き)

lambda l:[3.142*x+2.718**x for x in l]

数学モジュールを使用する必要がある場合:

from math import*
lambda l:[pi*x+e**x for x in l]

入力は数字のリストでなければなりません

f([1,2,3,4,5])

> [5.8599999999999994, 13.671524, 29.505290232, 67.143510850576007, 164.04623849186558]

2
If your language does not have π and/or e, use the values 3.142 and 2.718.... Pythonはありpiかつeにおけるmathモジュール。
ザックゲイツ

@ZachGates数学モジュール付きのバージョンを追加しました。
TFeld

mathソリューションを使用すると、3バイトを節約できます。from math import*
wnnmaw

@wnnmawありがとう!
TFeld

また、使用して別のオフ剃ることができfor x in l:lambda l:pi*x+e**x、両方の解答で理解するのではなく
wnnmaw

4

MATL、9バイト

この回答では、現在のバージョンの言語(3.1.0)を使用していますが、これはチャレンジよりも前のバージョンです。

itYP*wZe+

入力は、次のようなすべての数値(角括弧で囲まれ、スペースで区切られたリスト、セミコロンのコンマ)を含むベクトルです。 [5.3 -7 3+2j]です。複雑な値が許可されます。出力の有効数字は15です。

>> matl itYP*wZe+
> [1 2 3]
5.859874482048839 13.67224140611024 29.51031488395705

説明

簡単な操作:

i       % input  
t       % duplicate 
YP      % pi   
*       % multiplication
w       % swap elements in stack                           
Ze      % exponential                                      
+       % addition 

4

MATLAB:70バイト

@(x)num2str(arrayfun(@(x)(round(pi*x+exp(x),2-floor(log10(pi*x+exp(x))))),x))

テスト:

ans(1:10)
5.86            13.7            29.5            67.2             164             422            1120            3010            8130           22100

説明:数値のフォーマットにはいくつかの問題がありました。

まず、質問には3つのsig-figsが必要です。Matlabにはsig-figs(小数点以下のみ)による丸めのための組み込み関数がないため、次の回避策が必要でした。

floor(log10(pi*x+exp(x)))) 最大有効数字を計算します。

@(x)(round(pi*x+exp(x),2-floor(log10(pi*x+exp(x))))),x))入力を受け取りx、有効数字3桁に丸めます。

別の要件は、複数の入力を処理することでした。上記のコードは、単一の番号でのみ機能します。これを軽減するためにarrayfun、各ベクトル要素の関数を評価するために使用します。

最後の問題、Matlabはarrayfunの結果を独自の丸めで表示し1.0e+04 * 0.0006、3 sig-fig要件に違反するような出力につながります。したがって、num2str配列をcharフォーマットに変換するために使用されました。

Matlabは数値解析には適していますが、率直に言って、細かい数値のフォーマットに関しては面倒です

UPD:まあ、それは私が混乱したことを恥ずかしいです

有効数字が3桁以上

有効数字3桁

とにかく、15バイトのMatlabソリューションは@costromによって既に提供されているため、このフォームに回答を残します。


2
何?!なんでそんなことするの?
アダム

4
これはコードボウリングですか?
スティーヴィーグリフィン

答えの説明を追加します
brainkz

1
それだけで言う最小あなたはその指定した場合は3本のSIGのイチジクのではなく、正確に3 format longgのコードを実行する前に必要だった、あなたはここに3/4の長さをドロップしたい
costrom

@costromはい、あなたは正しいです、そして私はあなたが勝ったことを認めます:)
brainkz

4

ジュリア、12バイト

x->π*x+e.^x

これは、配列を受け取り、floatの配列を返す匿名関数です。それを呼び出すには、名前を付けます、例えばf=x->...ます。

ジュリアには組み込みの定数がπありe、それぞれ、πとeに推測されます。.^オペレータは、べき乗をベクトル化されます。


3

Japt、12バイト

N®*M.P+M.EpZ

スペースで区切られた数値として入力を受け取ります。オンラインでお試しください!

使い方

N®   *M.P+M.EpZ
NmZ{Z*M.P+M.EpZ

        // Implicit: N = array of inputs, M = Math object
NmZ{    // Map each item Z in N to:
Z*M.P+  //  Z times PI, plus
M.EpZ   //  E to the power of Z.
        // Implicit: output last expression

あなたが5,554人の担当者にいるとき、私はあなたを賛成するのが嫌いでした。
コナーオブライエン

3

J、4バイト

o.+^

APL ○+*と同じですが、Jのpi times関数が呼び出されo.ます。これは1バイト長くなります。



2

パー、8バイト

✶[″℗↔π*+

入力を受け入れます (1 2 3)

説明

               ## [implicit: read line]
✶              ## Parse input as array of numbers
[              ## Map
 ″             ## Duplicate
 ℗             ## e to the power
 ↔             ## Swap
 π*            ## Multiply by π
 +             ## Add

2

ラケット、27バイト

map(λ(x)(+(* pi x)(exp x)))

式の関数位置に置かれた場合:

(map(λ(x)(+(* pi x)(exp x))) '(1 2 3 4))

> '(5.859874482048838 13.672241406110237 29.510314883957047 67.16452064750341)

2

CJam、13バイト

q~{_P*\me+}%p

入力をスペースで区切られた配列として受け取ります(例:)[1 2 3]オンラインでお試しください。

説明

q~    e# Read the input and evaluate it as an array
{     e# Do this for each number x in the array...
  _P* e# Multiply x by pi
  \me e# Take the exponential of x (same as e^x)
  +   e# Add the two results together
}%
p     e# Pretty print the final array with spaces

@NBZ完了、明確化してくれてありがとう。
NinjaBearMonkey

1

Reng v.3.3、53バイト

挑戦を後回しにしているため競合しないが、簡潔さのために賞を獲得していない。:P ここで試してみてください!

2²5³*:"G"(%3+i#II*ZA*9+(%2+#E1II0e1+ø
1-)E*(:0eø
$+n~

行0

行0のスタックのビューを次に示します。

Sequence read | Stack
2²            | 4
5³            | 4 125
*             | 500
:             | 500 500
"G"           | 500 500 71
(             | 500 71 500
%             | 500 0.142
3+            | 500 3.142
i             | 500 3.142 <i>
#I            | 500 3.142     ; I <- i
I             | 500 3.142 <i>
*             | 500 3.142*<i>
ZA            | 500 3.142*<i> 35 10
*             | 500 3.142*<i> 350
9+            | 500 3.142*<i> 359
(             | 3.142*<i> 359 500
%             | 3.142*<i> 0.718
2+            | 3.142*<i> 2.718
#E            | 3.142*<i>     ; E <- 2.718
1II0          | 3.142*<i> 1 <i> <i> 0
e             | 3.142*<i> 1 <i> <i>==0
1+            | 3.142*<i> 1 <i> (<i>==0)+1

øその後、次のN行目に移動します。ときに0入力され、これは直線2に行くには、そうでなければ、我々はライン1に行きます。

ライン1

1-)E*(:0eø

これはE i倍になりますe^i。カウンターをデクリメントし(最初はI)、STOS(実行e電力)にEを掛け、カウンターに戻り、これを行います(i'現在のカウンターです):

Sequence read | Stack (partial)
              | i'
:             | i' i'
0             | i' i' 0
e             | i' i'==0

øその後、2つのことのいずれかを行います。カウンターが0でない場合、「次の」0番目の行、つまり現在の行の先頭に移動します。ゼロの場合、0e 1が得られ、次の行に進みます。

2行目

$+n~

$カウンターを落とします(床の上に!)。+上位2つの結果を追加し、nその数値を出力して~、プログラムを終了します。

ケース1:入力は0です。TOSは1( "e ^ 0")で、STOSは0(pi * 0)です。それらを追加すると、正しい結果が得られます。

ケース2:入力は0ではありません。結果は予想どおりです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.