Створіть MathJax для дробової фракції, що продовжується


17

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

PPCG щойно отримав MathJax ! Це означає, що тепер ми можемо легко включати добре відформатовані математичні формули в пости. ( Підручник MathJax Handy. )

Наприклад, ось золоте відношення, виражене у вигляді нескінченної тривалої дроби :

eq0

Код MathJax для цього рівняння є

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

Ви можете дізнатися це, клацнувши правою кнопкою миші формулу та слідуючи Показувати математику якTeX команди .
Це $$означає, що він відображається самостійно в центрі сторінки замість рядка. Використовуйте сингл $для 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. Можна сказати, що n представляє кількість ліній ділення в рівнянні.

Примітки

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

Оцінка балів

Виграє найменше подання в байтах. Tiereaker переходить до більш раннього подання.


Лише зауваження для тих, хто хоче запустити фрагмент стека: Як і багато (більшість?) Фрагментів стеків, це не працює в Safari.
Олексій А.

Фрагмент стека не працює, коли ви вводите матеріал ... він даєUncaught ReferenceError: textbox is not defined
soktinpk

@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

@orlp, і саме тому я відкотився, оскільки тут не було потенційної користі в тому рішенні.
Оптимізатор

10

Пітон, 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

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

(-3 байти завдяки @randomra)


Дві невеликі покращення на 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> f(0)
"$$\varphi=1+\dots$$"

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

Пропозиції вітаються як завжди!


Редагувати: Збережено 3 байти завдяки планнапусу!


"d"^(n>0)замість того, (n>0?"d":"")щоб зробити це коротшим.
планнапус

@plannapus: Я не розумію, що означає твоє ім'я, але ти геній! Я забув, що "string"^0це законно.
Олексій А.

Ласкаво просимо. Мій псевдонім - назва радіолярійного роду, будучи самим радіолярійним палеонтологом. Я думаю, що це перекладається як "
рівномірна

Я чекаю відповіді BF =)
недолік

@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 $$

+1 за використання елемента! Пора Element стати домашньою назвою!
Олексій А.

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 Перший ні, оскільки Рубі, очевидно, не може перетворити булеві числа в цілі числа. Останній працював хоч, тому дякую за це!
вві

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

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 так, як є, і збережіть 3 символи
edc65

@ edc65 дякую !!

pastebin.com/uU7tgFm9 ще декілька вдосконалень
edc65

Можна вкласти в 87 байтів так: pastebin.com/0Hkv9uft
Джордж Рейт


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

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

Пітона, 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+'}')

Edit: блін, прогледіли dotsзамість ddotsдля 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спеціального випадку (крапки замість 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"це мило, хоча!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.