为黄金分割率连续分数生成MathJax


17

考虑到暂时禁用 MathJax,此问题中渲染的MathJax已替换为图像。仍然欢迎您发布答案,但是您必须在另一个站点上查看渲染的MathJax 。

PPCG 刚得到 MathJax!这意味着我们现在可以轻松地将格式正确的数学公式包含在帖子中。(便捷的MathJax教程。

例如,这是用无限连续分数表示的黄金比例

等式0

该公式的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。
  • 从标准输入或命令行输入。
  • 输出到标准输出(带有可选的尾随换行符)。
  • 或者,您可以编写一个函数,将n作为整数,然后将MathJax代码作为字符串返回(或仍然打印出来)。

计分

以字节为单位的最小提交数将获胜。抢七局(Tiebreaker)转到了较早的提交。


只是对那些想要运行堆栈代码片段的提示:与许多(大多数?)堆栈代码片段一样,这在Safari中不起作用。
Alex A.

当您键入内容时,堆栈代码段不起作用...它给出了Uncaught ReferenceError: textbox is not defined
soktinpk

@soktinpk奇怪,我遇到了同样的问题。但是,即使是完全相同的代码,这里的代码片段也可以工作... 这是一个外部字节计数器,以防万一。
卡尔文的爱好2015年

MathJax已为PPCG重新启用!
wastl

Answers:


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 2015年

@orlp,这就是为什么我回滚的原因,因为该解决方案也没有潜在的好处。
Optimizer

10

Python,70 68 67字节

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

这定义了一个仅使用简单字符串乘法和字符串格式的匿名函数。

(感谢@xnor指出\\c可以将其写为\c,因为c无法转义。不幸的是\\v\v对于ASCII 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 2015年

2
我认为这无需在cfrac前使用双\即可。
xnor 2015年

@xnor似乎喜欢,谢谢!很抱歉一直参加Python高尔夫活动
Sp3000 2015年

不,我偷走了我要分配给你的比赛。
xnor 2015年

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

(-3个字节感谢@randomra)


3个字节的两个小改进(在第1行和第3行的末尾):pastebin.com/wEbKhuUH
randomra 2015年

哈,第一排和最后一排后视镜匹配,没注意到:P
Sp3000

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命令行标志,该标志允许您将所有这些标志放入单个文件中(在这种情况下,换行符被视为文件分隔符)。

代码的最大部分(98字节)用于将输入从十进制转换为一进制(文件3至6)。该代码的基本思想是$$\varphi=1+\dots...$$将输入括在中,然后将输入转换为一元,然后扩展\dotsN或扩展\ddotsN到连续分数的下一个级别(同时减小NN-1)。


4

朱莉娅76 73字节

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

这将创建一个lambda函数,该函数将单个整数作为输入,并将MathJax返回为字符串。要给它起个名字,例如f=n->...

不幸的是,反斜杠和美元符号都必须在Julia字符串中转义,因为它们都有特殊的含义。字符串连接使用进行*,字符串重复使用进行^

例子:

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 2015年

@plannapus:我不明白你的名字的意思,但是你是个天才!我忘了那"string"^0是合法的。
Alex A.

别客气。我的化名是放射虫属的名字,我自己是放射虫古生物学家。我认为它可以翻译为“扁平萝卜” :)
plannapus 2015年

我正在等待BF answer =)
骗子2015年

@flawr:我希望你不要在等待我……
Alex 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 $$

+1使用元素!是时候让Element成为家喻户晓的名字了!
Alex 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+\每次迭代中填充其他内容。将点更改为点是很昂贵的,但是节省了一些摆脱替换:)的工作。还必须将原始字符串转换为“ 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

Ruby,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 2015年

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在第一次出现时以stdin输入,则可以保存一些字符:cat("$$\\varphi=1+\\",rep("cfrac1{1+\\",n<-scan()),if(n)"d","dots",rep("}",n),"$$",sep="")
plannapus 2015年

2

JavaScript,114 109 106 85字节,感谢George Reith

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

这是我第一次参加代码高尔夫比赛!请告诉我如何改善。

上一个条目(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
George Reith,


1

Pyth-52个字节

Pyth中的简单方法几乎是从@ Sp3000的Python解决方案中窃取的。使用字符串格式运算符%

%"$$\\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

Pyth,50个字节

s["$$\\varphi=1+"*Q"\cfrac1{1+"\\<\dQ"dots"*Q\}"$$

1
查看我的编辑历史记录:)
Optimizer

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+'}')

编辑:该死,忽略了dots而不是ddotsfor n=0,现在加上附加子句的递归解决方案太难看了,无法竞争。

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特殊情况(用点代替ddot)。
randomra 2015年

0

哈斯克尔,86

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

本质上与此处的所有解决方案相同。drop(0^n)"ddots"不过很可爱!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.