Генерируйте MathJax для продолжения фракции «Золотое сечение»

17

В ожидании временного отключения MathJax отображенный MathJax в этом вопросе был заменен изображениями. Вы все еще можете публиковать ответы, но вам придется просматривать отображенный MathJax на другом сайте .

PPCG только что получил MathJax ! Это означает, что теперь мы можем легко включать хорошо отформатированные математические формулы в сообщения. ( Handy MathJax учебник. )

Например, вот золотое сечение, выраженное в виде бесконечной непрерывной дроби :

Eq0

Код MathJax для этого уравнения

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

Вы можете найти это, щелкнув правой кнопкой по формуле и следуя Show Math AsTeX Commands .
На $$средства он отображается на его собственный в центре страницы вместо встроенного. Используйте сингл $для inline.

Вызов

Напишите программу, которая принимает неотрицательное целое число 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 представляет количество линий деления в уравнении.

Примечания

  • \cfracиспользуется вместо более распространенного \frac.
  • \dotsиспользуется вместо \ddotsдля n = 0.
  • Возьмите ввод из стандартного ввода или командной строки.
  • Вывод в стандартный вывод (с необязательным завершающим переводом строки).
  • В качестве альтернативы вы можете написать функцию, которая принимает n как целое число и возвращает код MathJax в виде строки (или все еще печатает ее).

счет

Наименьшая подача в байтах побеждает. Tiebreaker переходит к более раннему представлению.

Кальвин Хобби
источник
Просто примечание для тех, кто хочет запустить фрагмент стека: Как и многие (большинство?) Фрагментов стека, в Safari это не работает.
Алекс А.
Фрагмент стека не работает, когда вы 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}}}}}}}}}}}}}}}$$

ОБНОВЛЕНИЕ - 1 байт сохранен благодаря Sp3000!

Попробуйте это онлайн здесь

оптимизатор
источник
1
Немного перетасовки дает 50:"$$\varphi=1+""\cfrac1{1+"ri:R*'\"ddots"R!>'}R*'$_
Sp3000
Я вообще не смотрел на твой ответ - просто совпадение. В любом случае, ваши 49 байт решение Pyth 50 байт в действительности, потому что вы должны бежать \vк \\v.
Орл
@orlp, и именно поэтому я откатился назад, поскольку в этом решении не было никакой потенциальной выгоды от этого решения.
Оптимизатор
10

Python, 70 68 67 байт

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

Это определяет анонимную функцию, которая просто использует умножение строк и форматирование строк.

(Спасибо @xnor за указание, что это \\cможет быть записано как \c, поскольку 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)
Sp3000
источник
Вы победили меня на 14 секунд! Также 70 символов.
xnor
2
Я думаю, что это работает без использования двойного \ перед Cfrac.
xnor
@xnor Кажется, спасибо! И извините за постоянное участие в
гольфе
Нет, я украл мою честную долю гонок, чтобы отправлять тебе сообщения.
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

(-3 байта благодаря @randomra)

Sp3000
источник
Два небольших улучшения для 3 байтов (в конце строки 1 и строки 3): pastebin.com/wEbKhuUH
randomra
Ха, первая и последняя строки зеркал совпадают, не заметили: 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перейти к следующему уровню непрерывной дроби (при уменьшении Nдо N-1).

Мартин Эндер
источник
4

Юлия, 76 73 байта

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

Это создает лямбда-функцию, которая принимает одно целое число в качестве входных данных и возвращает MathJax в виде строки. Чтобы назвать его, дайте ему имя, например f=n->....

К сожалению, в строках Julia необходимо избегать обратной косой черты и знака доллара, поскольку они оба имеют особое значение. Конкатенация строк выполняется с использованием *и повторения строк с ^.

Примеры:

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

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

Предложения приветствуются как всегда!


Изменить: Сохранено 3 байта благодаря plannapus!

Алекс А.
источник
"d"^(n>0)вместо того, (n>0?"d":"")чтобы сделать его короче.
plannapus
@plannapus: Я не понимаю, что означает твое имя, но ты гений! Я забыл, что "string"^0это законно.
Алекс А.
пожалуйста. Мой псевдоним - это имя радиолярного рода, поскольку я сам являюсь радиолярным палеонтологом. Это переводится как «сплющенная репа», я думаю :)
plannapus
Я жду ответа BF =)
flawr
@flawr: Надеюсь, ты не ждешь меня от этого ...
Алекс А.
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 $$
PhiNotPi
источник
+1 за использование Элемента! Пришло время для Элемента стать именем нарицательным!
Алекс А.
3

T-SQL, 229 227 138

Прошло некоторое время с тех пор, как я сделал ответ на SQL, и, как всегда, он очень многословен. Edit Конечно , я более сложное это и не нужен рекурсивный запрос вообще.

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}}}}}$$
MickyT
источник
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}}}$$
vvye
источник
@ 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}}}$$
MickyT
источник
+1, но вместо того, чтобы сделать его функцией, если у вас есть пользователь, который вводит nкак stdin при первом появлении, вы можете сохранить некоторые символы: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)+'$$'

Это моя первая запись в соревновании по кеглю! Пожалуйста, скажите мне, как улучшить.

Предыдущая запись (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 спасибо !!
pastebin.com/uU7tgFm9 еще несколько улучшений
edc65
Может быть преобразован в 87 байтов, например: pastebin.com/0Hkv9uft
Джордж Райт,
Или 85 байт pastebin.com/k90Fyr2m
Джордж Райт,
1

Pyth - 52 байта

Простой подход в Pyth, в значительной степени украденный из решения Python @ Sp3000. Использует оператор форматирования строки %.

%"$$\\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
Maltysen
источник
1

Pyth, 50 байтов

s["$$\\varphi=1+"*Q"\cfrac1{1+"\\<\dQ"dots"*Q\}"$$
orlp
источник
1
Смотрите мою историю изменений :)
Оптимизатор
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}}}}$$
edc65
источник
0

Питон, 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}')
DenDenDo
источник
В настоящее время отсутствует 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"это мило, хотя!

Линн
источник