三角法で私を助けて!


8

微積分学にご協力いただき、誠にありがとうございます。さて、今度の三角法テストについて少し助けが必要です。

テストでは、式を簡略化する必要があります。のような入力が与えられ4sin(x)/(2cos(x))、より単純ですが同等の式(など2tan(x))を生成する必要があります。角度はすべて度単位であり、ゼロによる除算や無効なドメインの問題はないものとします。(たとえば、tan(x + 1)cot(x + 1)sin(x)/ sin(x)は常に1であると仮定します。)

私は教授のオフィスに忍び込んで、テストにあるかもしれない100の問題のリストを得ました。それらをすべて解決するためのコードを教えてください。一部の問題はすでに可能な限り単純化されている可能性があります。もしそうなら、単に入力を返します。

式を簡略化する必要がありますが、教授が気付かないように短いプログラム(または関数)も必要です。プログラムの長さとすべてのソリューションの合計の長さの合計を最小化するようにしてください。

明確にするために、一部の式が変更されずに返されたり、同等の長い形式で返されたりしても問題ありません。また、プログラムは以下にリストされている式でのみ動作する必要があります。誤った結果が返されたり、他の入力で壊れたりすることもあります。

ご存知のように、すべての問題は同様の形式に従っています。xは使用される唯一の変数であり、スペースはなく、括弧は各関数名の後に続きます。(関数であるsincostanseccsc、およびtan。)そこには、ネストされた機能はありませんが、関数の内部のような式であってもよいです3x+4.5か、-2-.7x。指数は使用できますが、関数(などsin(x-.5)^7)でのみ使用でき、累乗は常に1より大きい整数です。乗算は連結によって示されます。

出力もこの形式にする必要があります。無効:sin xsin(x)/cos(x)tan(x)[正接が乗算または分割されている?]、cos(x[すべて閉じ括弧] 4*sin(x)sec(x)^1

組み込みの簡略化関数や式処理関数に依存しない限り、どのプログラミング言語でも使用できます。組み込みのトリガー関数は問題ありません。(テスト中には非常に基本的な関数電卓を用意します。)また、紙に書かれたプログラムを読むので、印刷可能なASCII文字(0x20から0x7E)と改行しか使用できません。

1/(sec(x))
4+sin(x)+3
(cos(7x+4)-sin(-3x))/(sin(-3x))
2sin(x)2tan(x).25cos(x)^3cos(x)+1+1
7cos(x)sec(x)/(14tan(x)csc(x))
sin(x)cos(x)/sec(x)
8sin(x)cos(x)sin(x)/tan(x)+8sin(x)
sin(x)^9cos(x)cot(x)sec(x)csc(x)sec(x)tan(x)/(cot(x)^2tan(x)cos(x)^4cot(x)sin(x))
tan(x)cos(x)csc(x)
tan(x+1)sin(x-1)cos(x+1)^3tan(x-1)^2sin(-x+1)csc(x+1)tan(-x+1)/(cos(x-1)cot(x+1))
(cos(2x)+cot(2x)-sin(2x)+csc(2x)^3)/(cot(2x)+sin(2x))
cos(90-x)cos(x)
sin(x+180)sec(450-x)
tan(-x)sin(x+90)sec(x-90)
tan(x+180)^2
cot(-x)cos(-x)
cot(180-x)^3cos(270-x)^2
sin(.1x-.2)sin(.1x-.2)sin(.1x-.2)sin(.2-.1x)sin(.2-.1x)
sin(x)
sin(90-x)sin(x)+cos(90-x)/sec(x)
tan(3x+2)cos(3x+2)/sin(3x+2)-1
cos(x)cos(x)cos(x)cos(x)cos(x)
sec(2x+1)sec(-1-2x)+sec(-2x-1)sec(2x+1)
cos(4x)cot(4x)tan(4x)sin(4x)csc(4x)
-cos(x)+cos(x)+sin(2x-4)-1/csc(2x-4)
sec(x)sec(x+2)cot(x)tan(x-2)tan(x+180)
tan(x)(tan(x))
3sin(x)sin(x)/(3)
cos(x)sin(x)
tan(x)sec(x)^2
tan(x)^2-sec(x)^2
7+sin(x)csc(x)csc(x)+cot(x)^2
sin(90)+cos(-90)+sec(180)
csc(1)+csc(10)-csc(30)-csc(60)+csc(90)
sin(36000001)
csc(800)+(cot(720+x)-sec(4x-720))
sin(-x)+sin(x)
csc(-x)+csc(x)
4sin(x)-sin(x)+tan(x)-2tan(x)
cot(x)+10cot(x+90)+99cot(x+180)+.01cot(x-90)
tan(x)tan(x+180)
sec(x)sin(x+180)tan(x-270)cot(x-450)csc(x+90)
sin(x)/cot(x)+sin(x)/cot(x)
sin(x)csc(x)+tan(x)cot(x)+cos(x)sec(x)
cot(x)
9tan(x+90)+90tan(x+9)
cos(x-9999)+tan(x+99999)
2tan(x)tan(x)/2
tan(x)/tan(x-360)+cos(x+180)/cos(x)
csc(4x)sec(270-4x)
cot(91+x)tan(x-449)
csc(2x)(csc(2x)-sin(2x))
csc(x+1)^2-cot(x+1)cot(x+1)
cot(x)cot(x)+1
tan(x)^2-sec(x)sec(x)
tan(x)/cot(x)+csc(x)/csc(x)
cot(x)sin(x)/cos(x)
csc(x)tan(x)cos(x)
csc(x)cot(x)cos(x)
csc(x+90)csc(-x+270)-1
cot(x)/cot(x)+tan(x)/cot(x)+cot(x)cot(x)
sec(x)sec(x)sec(x)sec(x+90)sec(x-90)sec(x+180)
1-cos(x)cos(x+180)+sin(x)^2
sec(x)sec(x)sec(x)sec(x)/cos(x)+cot(x)
cot(x+1)csc(x-1)sec(x+1)tan(x-1)sin(x+1)cos(x-1)
sin(x)-cos(x)+tan(x)-sec(x)+cos(x)-csc(x)
tan(x+23515)-sec(-.27x-23456)
sec(-.9x)
-tan(-x)-csc(360-x)
cos(-x)sec(x)sin(x)csc(-x)
tan(-x)^2-sin(-x)/sin(x)
tan(x)tan(x)+1
csc(x)^2-1
cot(2x)cot(2x)-csc(2x)/sin(2x)
2sec(x)/(6cos(x))
sec(0)+tan(30)cos(60)-csc(90)sin(120)cot(150)+tan(180)csc(210)sin(240)-cos(270)sec(300)+cot(330)
tan(x-1234567)sec(4781053+x)^2
tan(-1234567x)sec(4781053x)^2
sin(x)^9+cos(x)^7+csc(x)^5-cot(x)^3
cos(-33x-7.7)
sec(-.1-x)+tan(-2x-77)
tan(x)+sin(x)-cos(x)+tan(x)-sin(x)
cos(x)-sec(x)/tan(x)+tan(x)/sin(x)
cot(x)-cos(x)/sin(x)
3cos(x)+2/sec(x)-10sin(x)/(2tan(x))
tan(x+3)^11+sin(x+3)^8-cos(x+3)^5+5
sec(x)+sec(x)
csc(.1x)csc(-.1x)csc(x)
cot(x-7)cot(x-7)cot(x+173)cot(x-7)cot(x+173)cot(x-367)
cos(.0001x+1234567)
cot(45)+tan(225)-sin(210)+cos(-60)
sin(12345)cos(23456)tan(34567)sec(45678)csc(56789)cot(67890)
cos(1234x)+cot(1234)+tan(1234x)+sec(1234)+csc(1234)+sin(1234x)
sec(x)sec(x)sec(x)sec(x)sec(x)sec(x)
csc(x)cot(x)sec(x)csc(x)tan(x)sec(x)cot(x)csc(x)cot(x)cos(x)cos(x)cot(x)sin(x)sin(x)cot(x)
csc(2553273)+cot(1507348)-sec(5518930)+csc(5215523)+tan(3471985)-sec(4985147)
sin(20x)+cos(20x)-tan(20x)+sin(20x)-csc(20x)+cot(20x)-tan(20x)+csc(20x)
cot(100000)+cot(100000x)+cot(100000x)+cot(100000)
csc(5x+777)sin(5x+777)
csc(4.5x)

注:このシナリオは完全に架空のものです。実生活では、不正行為や他人の不正行為の支援は間違っており、決して行うべきではありません。


5
私はこれを単純化するために必要となる40以上の異なるアイデンティティと数学的公理を数えます。式の1つを解析して、それを何らかの構造化された内部形式に変換する場合でも、かなりのコードが必要になります。私にとっては金持ちです。しかし、おそらく、この種の課題を探している人がいるでしょう。
COTO 2014

@COTOあなたはそれを解析する必要はありません。あなたはそれがどの問題であるかを検出し、回答を圧縮形式でハードコーディングすることを試みることができます。解析よりも短い場合もあります。
IngoBürk、2014

3
プリンターが非ASCII文字を印刷できない場合は、より優れたプリンターが必要です。
John Dvorak

3
私はこの男がUPVOTESを得ただけでWTFを考えましたか?次に、それがmath.SEではないことに気づきました、soo ...コンテキストが重要です=)
flawr

1
@Ypnypnああ、わかりました。たとえば、次のように削減sin(36000001) することはできません.017452
Digital Trauma

回答:


8

Python、436 + 1909 = 2345

これは考えられる最も非効率的なソリューションの1つである必要があり、数学者は恐ろしいでしょうが、ハードコーディングなしで式の約半分を実際に簡略化するものを一緒に投げることができました。

from math import*
import exrex,re
d=lambda f:lambda x:f(x*pi/180)
sin,cos,tan=d(sin),d(cos),d(tan)
i=lambda f:lambda x:1/f(x)
sec,csc,cot=i(cos),i(sin),i(tan)
t=lambda s:[round(eval(re.sub('([\d\).])([\(a-z])','\\1*\\2',s).replace('^','**')+'+0')*1e9)for x in[1,44]]
def f(I):
 try:return min((s for s in exrex.generate('(-?\d|\(1/\d\.\))?([+-]?(sin|cos|tan|cot|sec|csc)\(x\)(\^\d)?){0,4}')if s and t(s)==t(I)),key=len)
 except:return I

100個のテストケースの出力は次のようになります(ここで、#マークされた式は簡略化されていません)。

cos(x)
7+sin(x)
#
2+tan(x)^2cos(x)^2
(1/2.)cos(x)
sin(x)cos(x)^2
#
sin(x)^2tan(x)^7
1
#
#
sin(x)cos(x)
-1
-1
tan(x)^2
-cot(x)cos(x)
-cot(x)cos(x)^2
#
sin(x)
2sin(x)cos(x)
0
cos(x)^5
#
#
#
#
tan(x)^2
sin(x)^2
sin(x)cos(x)
tan(x)sec(x)^2
-1
7+cot(x)^2+csc(x)
0
#
#
#
0
0
3sin(x)-tan(x)
#
tan(x)^2
-tan(x)sec(x)
2sin(x)tan(x)
3
cot(x)
#
#
tan(x)^2
0
#
1
#
1
csc(x)^2
-1
sec(x)^2
1
1
cot(x)^2
-1-sec(x)^2
cot(x)^2+sec(x)^2
sec(x)^4csc(x)^2
2
cot(x)+sec(x)^5
#
sin(x)+tan(x)-csc(x)-sec(x)
#
#
tan(x)+csc(x)
-1
sec(x)^2
sec(x)^2
cot(x)^2
-1
(1/3.)sec(x)^2
#
#
#
#
#
#
2tan(x)-cos(x)
cos(x)-csc(x)+sec(x)
0
0
#
2sec(x)
#
#
#
3
#
#
sec(x)^6
cot(x)^4csc(x)
#
#
#
1
#

アイデアは非常に簡単です。

  • 可能な表現を大量に生成する
  • 簡略化したい式と同じ結果が得られるものを選択し、いくつか(ここでは2つ)のx値について比較します。
  • 同等の式から最短の式を返します

問題は、チェックする可能性のある式がかなり多いため、サブセットに限定したことです。

正直なところ、私は上記のゴルフコードをテストするのに十分な忍耐力がありませんでした。(不正行為だと思われる場合は、教えてください。)代わりに、はるかに長く効率的なルールを使用して、希望するすべての簡略化が含まれている式のさらに小さなサブセットを生成しました。これを試したい場合は、コードの2行目から最後の行の正規表現を次のコードに置き換えてください(数分の計算時間に備えてください)。

'0|((-1|\(1/[23]\.\)|[1237])[+-]?)?(sin\(x\)(\^2)?)?-?(tan\(x\)(\^[27])?)?(cot\(x\)(\^[24])?)?[+-]?(cos\(x\)(\^[25])?)?(sec\(x\)(\^[2456])?)?(csc\(x\)(\^2)?)?'

このプログラムには、Pythonに数式を理解させるために必要なオーバーヘッドもかなり含まれています。これは

  • 再定義sincosおよびtan(私はOPが意図考えるものである)の代わりにradiens度で引数を取るように
  • 定義seccscおよびパッケージのcot一部ではないものmath
  • すべての暗黙の乗算記号を挿入する
  • べき乗演算子の置き換え

@Doorknob総当たりの表現と2つの値の比較は、他の「実際のソリューション」よりもどうですか?
IngoBürk2014年

@Emilあなたは `x 'の2つの異なる値しか比較しないので、単純化が実際に正しいことをどういうわけか保証しましたか?
IngoBürk2014年

ざっと見てみると、不正確な簡略化を見つけることはできませんが(印象的です)、私の理解1/3.sec(x)^2では有効な出力ではありません。
IngoBürk2014年

1
@IngoBürk、すべての答えは手作業で、またはWolframAlphaを使用して最初に計算され、後でこれらをプログラムの出力と比較しました。2つまたは3つのケースでは、プログラムは実際にWolframAlphaが出力しない簡略化を検出しましたが、これらも正しいことを確認できました。しかし、もちろん、あなたの言う通り、衝突が発生する可能性があります。問題の関数の性質上、使用された精度内で2つの異なるグラフが2つの点で交差する可能性は非常に低くなります。1つのポイントのみを使用する場合、または2つのポイントが近すぎる場合は、衝突が発生しました。
2014年

1
@エミル申し分なく。私はこのソリューションが本当に大好きです!
IngoBürk2014年

6

CJam、1 + 3000 = 3001

人々に打ち負かす何かを与えるための基本的なソリューションと同じように:

l

これにより、STDINがスタックに読み込まれ、その内容はプログラムの最後に出力されます。

これは打倒できると確信していますが、得られるであろうキャラクターに多くの最適化を実装できないことも確信しています。


スコアの計算方法はどこに記載されていましたか?私はあなたの方法が好きです。しかし、私は改行を考えていないので、基本スコアが3000になること
エミール

@Emil「プログラムの長さとすべてのソリューションの合計の長さの合計を最小化するようにしてください。」–私も何度か読んでいました。
IngoBürk2014

なぜマーティンはGolfscriptを使わなかったのかしら。ここで入力を明示的に読み取る必要はありません= D
IngoBürk'30 / 09/30

分からない。この答えと、三角法やその他について尋ねる質問に関連する以下の答えはどうですか
オプティマイザー

2
@IngoBürkGolfScriptがわからないため。:P
マーティンエンダー2014

5

Javascript(438 + 2498 = 2936)

中央のオブジェクトには、入力の長さと最初の文字に基づいて、オプションで簡略化された出力が含まれます。それ以外の場合、入力は変更されずに返されます。

s='sin(x)';(p=prompt)({
    352:s+"^2cos(x)^3+2",
    307:"cos(x)/2",
    348:s+"8(1+cos(x)^2)",
    "81s":s+"^2tan(x)^7",
    "55s":"-sin(0.2-0.1x)^5",
    "39s":"2sec(2x+1)^2",
    "35c":"cos(4x)",
    "36-":0,
    173:s+"^2",
    "25s":0,
    294:s+"3-tan(x)",
    "27s":s+"2/cot(x)",
    "40c":"1+tan(x)^2+cot(x)^2",
    "48c":1,
    "41s":s+"+tan(x)-csc(x)-sec(x)",
    "26c":-1,
    "24t":"1+tan(x)^2",
    "96s":"2.5+1/cos(30)",
    "34t":"2tan(x)-cos(x)",
    353:0,
    "36s":"6sec(x)",
    "90s":"cot(x)^4csc(x)"
}[(i=p()).length+i[0]]||i)

空白は装飾用であり、文字数には含まれません。

これらのソリューションをすべて追加しても数文字しか節約できなかったのは残念ですが、何もしないよりはましです。簡略化はwolframalphaによって行われました-私はそれを信頼します。

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