黄金比継続分数のMathJaxを生成する


17

MathJaxが一時的に無効になることを見越して、この質問でレンダリングされたMathJaxは画像に置き換えられました。回答を投稿することはできますが、レンダリングされたMathJaxを別のサイトで表示する必要があります。

PPCG MathJaxを入手しました!これは、適切にフォーマットされた数式を投稿に簡単に含めることができることを意味します。(便利なMathJaxチュートリアル。

たとえば、次の例は黄金比を無限連続分数として表したものです。

eq0

この方程式のMathJaxコードは

$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}}$$

これを見つけるには、数式を右クリックし、[ 数学を表示 ] →[ TeXコマンド ]をクリックします。手段は、それは代わりに、インラインのページの中央に、自身の上に表示されます。単一のインラインを使用します。
$$$

チャレンジ

非負の整数nを取り込んで、黄金比の継続分数の「ステップ」の多くの「ステップ」のMathJaxコードを出力するプログラムを作成します。

回答全体で物事を標準に保つには、次の正確な MathJax構文を使用する必要があります。

  • n = 0の場合、出力はでなければなりません$$\varphi=1+\dots$$
    次のようにレンダリングされます:

    eq1

  • n = 1の場合、出力はでなければなりません$$\varphi=1+\cfrac1{1+\ddots}$$
    次のようにレンダリングされます:

    eq2

  • n = 2の場合、出力はでなければなりません$$\varphi=1+\cfrac1{1+\cfrac1{1+\ddots}}$$
    次のようにレンダリングされます:

    eq3

  • n = 3の場合、出力はでなければなりません$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}$$
    次のようにレンダリングされます:

    eq4

このパターンは、nが大きくなると続きます。nは、方程式の分割線の数を表していると言えます。

ノート

  • \cfracより一般的なの代わりに使用され\fracます。
  • \dots\ddotsn = 0の代わりに使用されます。
  • stdinまたはコマンドラインから入力を取得します。
  • stdoutへの出力(オプションの末尾の改行付き)。
  • または、nを整数として受け取り、MathJaxコードを文字列として返す(または印刷する)関数を作成することもできます。

得点

バイト単位の最小の提出が勝ちです。Tiebreakerは以前の提出に進みます。


スタックスニペットを実行したい人への注意:多くの(ほとんどの?)スタックスニペットと同様に、これはSafariでは機能しません。
アレックスA.

スタックスニペットは、Uncaught ReferenceError: textbox is not defined
何か

@soktinpkそれは奇妙です、私は同じ問題を抱えています。しかし、ここのスニペットはまったく同じでも機能します... 場合に備えて外部バイトカウンターを示します。
カルビンの趣味

MathJaxはPPCGで再び有効になりました!
wastl

回答:


6

CJam、51 50バイト

$$\varphi=1+""\cfrac1{1+"ri:R*'\"ddots"R!>'}R*'$_

コードの説明:

"$$\varphi=1+"             "This is a static string";
  "\cfrac1{1+"ri:R*'\      "Repeat this string input number times. Put a \ at the end";
    "ddots"R!>             "If input is 0, remove 1st characters, else not";
      '}R*                 "Put the closing bracket R times";
        '$_                "The final $$";

いくつかの例:

N = 0

$$\varphi=1+\dots$$

N = 4

$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}}$$

N = 15

$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}}}}}}}}}}}}}$$

更新 -Sp3000のおかげで1バイト節約!

こちらからオンラインでお試しください


1
少しシャッフルすると50が得られます"$$\varphi=1+""\cfrac1{1+"ri:R*'\"ddots"R!>'}R*'$_
。– Sp3000

私はあなたの答えをまったく見ませんでした-ただ偶然。いずれにしても、49バイトのPythソリューションは実際には50バイトです。これは、にエスケープ\vする必要があるためです\\v
orlp

@orlpであり、そのため、ここに存在するソリューションにも潜在的な利点がなかったため、ロールバックしました。
オプティマイザー

10

Python、70 68 67バイト

lambda n:"$$\\varphi=1+\%sdots%s$$"%("cfrac1{1+\\"*n+"d"[:n],"}"*n)

これは、単純な文字列乗算と文字列フォーマットを使用する匿名関数を定義します。

(エスケープすること\\cはできないので\c、と書くことができることを指摘してくれた@xnorに感謝しcます。残念ながら\\v\vASCII 11 なので、これは当てはまりません。)

以前の試み:

lambda n:"$$\\varphi="+"1+\\cfrac1{"*n+"1+\\"+"ddots"[n<1:]+"}"*n+"$$"
lambda n:r"$$\varphi=%s1+\%s$$"%("1+\cfrac1{"*n,"ddots"[n<1:]+"}"*n)

あなたは私を14秒倒しました!また、70文字。
xnor

2
これは、cfracの前に二重の\を使用しなくても機能すると思います。
xnor

@xnorそれのようです、ありがとう!いつもPythonゴルフをしてすみません
...-Sp3000

いや、私はあなたから投稿するためにレースの私の公平な分け前を盗んだ。
xnor

4

> <>89 86 + 3 = 89バイト

:&"$$"{\l?!;o70.
}-1v!?:<{"}"
&:&\~"stod"&:&?:
{1->:?!v}"\+1{1carfc"
rav\$$"\~"\+1=ihp

-vフラグを指定して実行、たとえば

py -3 fish.py program.fish -v 3

驚いたことに、ここでは、繰り返しごとにデクリメントするカウンタを持つことで文字列の乗算を模倣できるため、> <>はそれほど悪くはありません。

:&"$$"{\                     Put n into the register and push "$$"
}-1v!?:<{"}"                 Push n "}"s
&:&\~"stod"&:&?:             Push "stod", and copy the final "d" if n != 0
{1->:?!v}"\+1{1carfc"        Push n "\+1{1carfc"s
rav\$$"\~"\+1=ihp            Push "\+1=ihprav\$$"
       \l?!;o70.             Keep printing chars until the stack is empty

(@randomraのおかげで3バイト)


:3バイト(1行目と3行目の終わりに)のために二つの小さな改善pastebin.com/wEbKhuUH
randomra

Hah

4

網膜、160 + 7 = 167バイト

;`.+
$$$$\varphi=1+\dots#$0$$$$

; + (\d*)#(?:(((((((((9)|8)|7)|6)|5)|4)|3)|2)|1)|0) $1$1$1$1$1$1$1$1$1$1$2$3$4$5$6$7$8$9$10# ;

;+`\\d?dots\d(\d*)
\cfrac1{1+\ddots$1}

各行は個別のソースファイルに格納されるため、最初のの後に各ファイルに1バイトを追加しました。しかし、便宜上、Retinaは-sコマンドラインフラグもサポートするようになりました。これにより、これらすべてを1つのファイルに入れることができます(この場合、改行はファイル区切り文字として扱われます)。

コードの最大部分(98バイト)は、入力を10進数から単項(ファイル3から6)に変換するために使用されます。コードの基本的な考え方は、入力を取り囲むようになる$$\varphi=1+\dots...$$その後、単項への入力を変換し、次に展開\dotsNまたは\ddotsN連分数の次のレベルに(ながら還元NしますN-1)。


4

ジュリア、76 73バイト

n->("\$\$\\varphi=1+"*"\\cfrac1{1+"^n*"\\"*"d"^(n>0)*"dots"*"}"^n*"\$\$")

これにより、入力として単一の整数を受け取り、MathJaxを文字列として返すラムダ関数が作成されます。呼び出すには、名前を付けf=n->...ます。

残念ながら、バックスラッシュとドル記号は両方とも特別な意味を持つため、ジュリア文字列ではエスケープする必要があります。文字列の連結はとを使用*して文字列の繰り返しを実行します^

例:

julia> f(0)
"$$\varphi=1+\dots$$"

julia> f(4)
"$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}}$$"

いつものように提案を歓迎します!


編集: plannapusのおかげで3バイトを節約しました!


"d"^(n>0)代わりに(n>0?"d":"")短くします。
プランナパス

@plannapus:あなたの名前の意味はわかりませんが、あなたは天才です!それ"string"^0が合法であることを忘れていました。
アレックスA.

どういたしまして。私の仮名は放散虫の属の名前で、私は放散虫の古生物学者です。それは私が思う「平らにされたカブ」に翻訳されます:)
plannapus

私はBF answer =)を待っています
flawr

@flawr:あなたが私を待っていないことを願っています...
アレックスA

3

エレメント、63文字

_+2:'\$\$\\varphi\=1\+`[\\cfrac1\{1\+`]?\\[d.]`"dots`[\}`]\$\$`

これは最も簡単なソリューションです。残念ながら、出力に大量のシンボルがあると、プログラムの長さが大幅に長くなります(プログラムに文字列を入力すると、シンボルが直接操作を実行します)。ゴルフの余地はあると思いますが、今はもう時間がありません。

この言語はまだ比較的知られていないため、Perlで書かれたインタープリターへのリンクがあります。

_+2:                     take input, add 0 to it to make it a number, and duplicate
'                        put one copy onto the control stack
\$\$\\varphi\=1\+        a "bare" string
`                        output the string
[                        start a for loop, based on the input from earlier
    \\cfrac1\{1\+        a bare string
    `                    output it
]                        end the for loop
?                        test the second copy of the input for non-zero-ness
\\                       a bare \
[d.]                     a "for" loop used as an if block, appends a "d"
`                        output it
dots`                    output dots
"                        get rid of the if condition result so the old result is on top
[                        another for loop, still using the input from earlier
    \}`                  output a }
]                        end for loop
\$\$`                    output $$

Elementを使用して+1!Elementが一般名になる時です!
アレックスA.

3

T-SQL、229 227 138

SQLの回答をしてからしばらく経ちましたが、いつものように非常に冗長です。 編集もちろん、私はそれを複雑にし、再帰的なクエリをまったく必要としませんでした。

CREATE FUNCTION A(@ INT)RETURNS TABLE RETURN SELECT'$$\varphi=1+\'+REPLICATE('cfrac1{1+\',@)+IIF(@>0,'d','')+'dots'+REPLICATE('}',@)+'$$'S

元の

CREATE FUNCTION A(@ INT)RETURNS TABLE RETURN WITH R AS(SELECT CAST('$$\varphi=1+\dots'AS VARCHAR(MAX))S,0N UNION ALL SELECT REPLACE(STUFF(S,14,0,'cfrac1{1+\'),'\do','\ddo')+'}',N+1FROM R WHERE N<=@)SELECT S+'$$'S FROM R WHERE N=@

これにより、再帰クエリを使用して、cfrac1{1+\反復ごとに追加を詰め込むインラインテーブル関数が作成されます。ドットをddotsに変更するのは高価でしたが、置換を取り除くカップルを節約しました:)。また、元の文字列を「VARCHAR(MAX)」としてキャストする必要があるため、少しコストがかかります。

次のように使用されますSQLFiddle

SELECT * 
FROM (SELECT N FROM(VALUES(0),(1),(2),(3),(4),(5))A(N)) N
    CROSS APPLY A(N.N)
N   S
--- ---------------------------------------------------------------------------
0   $$\varphi=1+\dots$$
1   $$\varphi=1+\cfrac1{1+\ddots}$$
2   $$\varphi=1+\cfrac1{1+\cfrac1{1+\ddots}}$$
3   $$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}$$
4   $$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}}$$
5   $$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}}}$$

3

ルビー、76 75 71 70バイト

これは疑わしいほど簡単だと感じているので、どこかで台無しになったら教えてください。

ちなみに、これは私がRubyで書いた最初のものです-乗算によって文字列の繰り返しをサポートする言語を探していましたが、Rubyがそのトリックをしているようです。

f=proc{|n|'$$\varphi=1+'+'\cfrac1{1+'*n+'\dd'[0,n+2]+'ots'+'}'*n+'$$'}

そのように適用するには:

f.call(0)
$$\varphi=1+\dots$$

f.call(3)
$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}$$

@ Sp3000前者はそうではありません。Rubyは明らかにブール値を整数に変換できないからです。後者は動作しましたので、ありがとうございます!
vvye

2

J、60バイト

(<;._2'$$\varphi=1+\ cfrac1{1+\ d dots } $$ ');@#~1,~5$1,],*

使用法:

   ((<;._2'$$\varphi=1+\ cfrac1{1+\ d dots } $$ ');@#~1,~5$1,],*) 0
$$\varphi=1+\dots$$

   ((<;._2'$$\varphi=1+\ cfrac1{1+\ d dots } $$ ');@#~1,~5$1,],*) 3
$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}$$

方法:

文字列'$$\varphi=1+\ cfrac1{1+\ d dots } $$ 'はスペースで切り取られ、パーツが繰り返されて1 n signum(n) 1 n 1から、これらのパーツが連結されます。

こちらからオンラインでお試しください。


2

R、93 90

他の回答とほぼ同じです。スキャンのヒントを提供してくれた@plannapusに感謝します。

cat('$$\\varphi=1+\\',rep('cfrac1{1+\\',n<-scan()),if(n)'d','dots',rep('}',n),'$$',sep='')

cat結果がで\\なくになるため、paste0ではなく使用され\ます。

使用中で

> > cat('$$\\varphi=1+\\',rep('cfrac1{1+\\',n<-scan()),if(n)'d','dots',rep('}',n),'$$',sep='')
1: 3
2: 
Read 1 item
$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}$$

1しかし、あなたは、ユーザーが入力した場合、代わりに機能することで、nその最初の発生時に標準入力として、あなたには、いくつかの文字を保存することができます:cat("$$\\varphi=1+\\",rep("cfrac1{1+\\",n<-scan()),if(n)"d","dots",rep("}",n),"$$",sep="")
plannapus

2

JavaScript、ジョージ・リースのおかげで114 109 106 85バイト

f=n=>'$$\\varphi=1+\\'+((x='cfrac1{1+\\'.repeat(n))&&x+'d')+'dots'+'}'.repeat(n)+'$$'

これはcodegolfコンテストの私の最初のエントリーです!改善方法を教えてください。

前のエントリ(106バイト):

w="$$\\varphi=";y=n=>{return a=!n?w+"1+\\dots$$":w+"1+\\cfrac1{".repeat(n)+"1+\\ddots"+"}".repeat(n)+"$$"}

前のエントリ(109バイト):

x="repeat",w="$$\\varphi=";y=n=>{return a=!n?w+"1+\\dots$$":w+"1+\\cfrac1{"[x](n)+"1+\\ddots"+"}"[x](n)+"$$"}

前のエントリ(114バイト):

x="repeat";y=n=>{return a=!n?"$$\\varphi=1+\\dots$$":"$$\\varphi="+"1+\\cfrac1{"[x](n)+"1+\\ddots"+"}"[x](n)+"$$"}

ブラウザコンソールに貼り付けてf(n)n、「ステップ」の数をます。

簡略化されたコード

function y(n) {
   if(n === 0) {
      return "$$\\varphi=1+\\dots$$";
   } else {
      return "$$\\varphi=" + "1+\\cfrac1{".repeat(n) + "1+\\ddots"+"}".repeat(n)+"$$";
   }

2
x = 'repeat'は長くならず短くなります。.repeatをそのまま使用し、3文字を保存します
edc65

@ edc65ありがとう!!

pastebin.com/uU7tgFm9いくつかのより多くの改善点
edc65

次のように87バイトにすることができます:pastebin.com/0Hkv9uft
ジョージリース


1

Pyth-52バイト

@ Sp3000のPythonソリューションから盗まれたPythのシンプルなアプローチ。文字列フォーマット演算子を使用します%

%"$$\\varphi=1+\%sdots%s$$"(+*"cfrac1{1+\\"Q<\dQ*\}Q

こちらからオンラインでお試しください

%                  String formatting
 "$$ . . . $$"     String to be formatted
 (                 Tuple (no need to close it)
  +                String concatenation
   *"..."Q         String repetition input times
   <\dQ            If Q>0 then d
  *                String repetition
   \}              The character "}"
   Q               Q times


1

JavaScript(ES6)、76 80

部分的に再帰的。シングル/ダブルdは最も厄介な部分です。

F=n=>"$$\\varphi=1+\\"+(R=d=>n--?"cfrac1{1+\\"+R("d")+"}":d+"dots")("")+"$$"

Firefox / FireBugコンソールでテストする

> for(i=0;i<5;i++)console.log(F(i))

$$\varphi=1+\dots$$
$$\varphi=1+\cfrac1{1+\ddots}$$
$$\varphi=1+\cfrac1{1+\cfrac1{1+\ddots}}$$
$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}$$
$$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}}$$

0

Python、90 116

最も効率的なソリューションはすでに複数回投稿されているため、代わりに文字列の置換を使用します

f=lambda n:'$$\\varphi=1+\ddots$$'if n==0 else f(n-1).replace('\ddots','\cfrac{1+\ddots}')
# or, with exactly the same length
x='\ddots';f=lambda n:'$$\\varphi=1+'x+'$$'if n==0 else f(n-1).replace(x,'\cfrac{1+'x+'}')

編集:いまいましい、for のdots代わりに見落とさddotsれてn=0、今では余分な節が付けられた再帰的なソリューションは競争するにはtooすぎます。

x='$$\\varphi=1+\d%sots$$';f=lambda n:x%''if n==0 else x%'d'if n==1 else f(n-1).replace('\ddots','\cfrac{1+\ddots}')

現在、これにはn=0特別なケースがありません(ddotsの代わりにドット)。
randomra

0

ハスケル、86

n%x=[1..n]>>x
f n="$$\\varphi=1+"++n%"\\cfrac1{1+"++'\\':drop(0^n)"ddots"++n%"}"++"$$"

ここのすべてのソリューションと本質的に同じアプローチ。drop(0^n)"ddots"でもかわいい!

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