Wygeneruj MathJax dla frakcji ciągłej Golden Ratio


17

W oczekiwaniu na tymczasowe wyłączenie MathJax, renderowany MathJax w tym pytaniu został zastąpiony obrazami. Nadal możesz publikować odpowiedzi, ale musisz wyświetlić renderowany MathJax na innej stronie .

PPCG właśnie dostało MathJax ! Oznacza to, że możemy teraz łatwo włączać dobrze sformatowane formuły matematyczne do postów. ( Poręczny samouczek MathJax. )

Na przykład tutaj jest złoty stosunek wyrażony jako nieskończona ciągła część :

eq0

Kod MathJax dla tego równania to

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

Można to znaleźć, klikając prawym przyciskiem myszy formułę i postępując zgodnie z poleceniami Pokaż matematykę jako → TeX .
Te $$środki to jest wyświetlane na własną rękę w środku strony zamiast inline. Użyj singla $do wstawiania.

Wyzwanie

Napisz program, który przyjmuje nieujemną liczbę całkowitą n i wyprowadza kod MathJax dla tylu „kroków” ciągłego ułamka dla złotego podziału.

Aby zachować standard dla wszystkich odpowiedzi, musisz użyć tej dokładnej składni MathJax:

  • Dla n = 0 wynikiem musi być $$\varphi=1+\dots$$.
    Który jest renderowany jako:

    eq1

  • Dla n = 1 wynikiem musi być $$\varphi=1+\cfrac1{1+\ddots}$$.
    Który jest renderowany jako:

    eq2

  • Dla n = 2 wyjściem musi być $$\varphi=1+\cfrac1{1+\cfrac1{1+\ddots}}$$.
    Który jest renderowany jako:

    eq3

  • Dla n = 3 wyjściem musi być $$\varphi=1+\cfrac1{1+\cfrac1{1+\cfrac1{1+\ddots}}}$$.
    Który jest renderowany jako:

    eq4

Ten wzór trwa dla większej liczby n. Można powiedzieć, że n reprezentuje liczbę linii podziału w równaniu.

Notatki

  • \cfracjest używany zamiast bardziej powszechnego \frac.
  • \dotsjest używany zamiast \ddotsdla n = 0.
  • Weź dane wejściowe ze standardowego wejścia lub wiersza poleceń.
  • Wyjście na standardowe wyjście (z opcjonalnym końcowym znakiem nowej linii).
  • Alternatywnie możesz napisać funkcję, która przyjmuje n jako liczbę całkowitą i zwraca kod MathJax jako ciąg znaków (lub nadal go drukuje).

Punktacja

Najmniejsze przesłanie w bajtach wygrywa. Tiebreaker przechodzi do wcześniejszego zgłoszenia.


Uwaga dla tych, którzy chcą uruchomić fragment stosu: Podobnie jak wiele (większość?) Fragmentów stosu, to nie działa w Safari.
— Alex A.,

Fragment Uncaught ReferenceError: textbox is not defined
— kodu

@soktinpk To dziwne, mam ten sam problem. Ale fragment kodu tutaj działa, nawet jeśli jest dokładnie taki sam ... Oto zewnętrzny licznik bajtów na wszelki wypadek.
— Calvin's Hobbies

MathJax został ponownie włączony dla PPCG!
— wastl

Odpowiedzi:


6

CJam, 51 50 bajtów

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

Objaśnienie kodu:

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

Kilka przykładów:

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

AKTUALIZACJA - 1 bajt zapisany dzięki Sp3000!

Wypróbuj online tutaj


1
Trochę tasowania daje 50:"$$\varphi=1+""\cfrac1{1+"ri:R*'\"ddots"R!>'}R*'$_
— Sp3000

W ogóle nie spojrzałem na twoją odpowiedź - po prostu zbieg okoliczności. Tak czy inaczej, Twoje rozwiązanie Pyth 49 bajtów 50 bajtów w rzeczywistości, bo trzeba się uciec \vdo \\v.
— orlp

@orlp i dlatego wycofałem się, ponieważ nie było też potencjalnych korzyści z tego rozwiązania.
— Optymalizator

10

Python, 70 68 67 bajtów

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

Definiuje to anonimową funkcję, która po prostu wykorzystuje proste mnożenie i formatowanie łańcucha.

(Dzięki @xnor za wskazanie, że \\cmożna to po prostu zapisać jako \c, ponieważ cnie można go uniknąć. Niestety nie jest to prawdą \\v, ponieważ \vjest to ASCII 11.)

Poprzednie próby:

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

Pokonałeś mnie o 14 sekund! Również 70 znaków.
— xor

2
Myślę, że to działa bez użycia double \ przed cfrac.
— xor

@xnor Wygląda na to, dzięki! I przepraszam, że cały czas
— bierzemy

Nie, ukradłem moją uczciwą część wyścigów, aby opublikować od ciebie wiadomość.
— xor

4

> <> , 89 86 + 3 = 89 bajtów

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

Uruchom z -vflagą, np

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

Zaskakujące jest to, że> <> nie robi się tutaj zbyt źle, ponieważ możemy naśladować mnożenie ciągów, mając licznik, który zmniejszamy przy każdej iteracji.

:&"$$"{\                     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 bajty dzięki @randomra)


Dwie małe poprawki dla 3 bajtów (na końcu linii 1 i linii 3): pastebin.com/wEbKhuUH
— randomra

Hah zwierciadła pierwszego i ostatniego wiersza pasują do siebie, nie zauważyłem: P
— Sp3000,

4

Siatkówka , 160 + 7 = 167 bajtów

;`.+
$$$$\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}

Każda linia przechodzi do osobnego pliku źródłowego, więc dodałem 1 bajt do każdego pliku po pierwszym . Jednak dla wygody Retina obsługuje teraz także -sflagę wiersza poleceń, która pozwala umieścić to wszystko w jednym pliku (w takim przypadku znaki nowej linii są traktowane jako separatory plików).

Największa część kodu (98 bajtów) służy do konwersji danych wejściowych z dziesiętnego na jednoargumentowy (pliki od 3 do 6). Podstawową ideą kodu jest otaczanie danych wejściowych $$\varphi=1+\dots...$$, następnie przekształcanie danych wejściowych na jednoargumentowe, a następnie rozwijanie \dotsNlub \ddotsNprzechodzenie do następnego poziomu ciągłego ułamka (redukując Ndo N-1).


4

Julia, 76 73 bajtów

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

To tworzy funkcję lambda, która przyjmuje jedną liczbę całkowitą jako dane wejściowe i zwraca MathJax jako ciąg znaków. Aby to nazwać, nadaj mu nazwę, np f=n->....

Niestety, zarówno odwrotne ukośniki, jak i znaki dolara muszą zostać usunięte w ciągach Julii, ponieważ oba mają specjalne znaczenie. Łączenie łańcuchów odbywa się za pomocą *i powtarzania łańcuchów za pomocą ^.

Przykłady:

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

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

Sugestie są jak zawsze mile widziane!


Edycja: Zapisano 3 bajty dzięki plannapus!


"d"^(n>0)zamiast (n>0?"d":"")uczynić go krótszym.
— plannapus

@plannapus: Nie rozumiem, co znaczy twoje imię, ale jesteś geniuszem! Zapomniałem, że "string"^0to uzasadnione.
— Alex A.,

nie ma za co. Mój pseudonim to nazwa rodzaju radiolariańskiego, ponieważ jestem paleontologiem radiolariańskim. To przekłada się na „spłaszczoną rzepę” - tak myślę :)
— plannapus,

Czekam na odpowiedź BF =)
— błąd

@flawr: Mam nadzieję, że na mnie nie czekasz ...
— Alex A.,

3

Element, 63 znaki

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

To najprostsze rozwiązanie. Niestety duża liczba symboli na wyjściu powoduje znaczny wzrost długości programu (umieszczenie ciągów w programie bezpośrednio powoduje, że symbole wykonują operacje). Jestem pewien, że jest miejsce na grę w golfa, ale nie mam teraz więcej czasu.

Ponieważ ten język jest nadal stosunkowo nieznany, oto link do tłumacza napisanego w Perlu.

_+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 za użycie elementu! Nadszedł czas, aby Element stał się popularną marką!
— Alex A.,

3

T-SQL, 229 227 138

Minęło trochę czasu, odkąd zrobiłem odpowiedź SQL i jak zawsze jest to bardzo szczegółowe. Edytuj Oczywiście skomplikowałem to i nie potrzebowałem w ogóle zapytania rekurencyjnego.

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

Oryginalny

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

Spowoduje to utworzenie wbudowanej funkcji tabeli, która korzysta z zapytania rekurencyjnego w celu umieszczenia dodatkowej dla cfrac1{1+\każdej iteracji. Zmiana kropek na kropki była kosztowna, ale uratowała parę pozbywających się zamiany :). Trzeba też rzucić oryginalny ciąg jako „VARCHAR (MAX)”.

Jest używany w następujący sposób 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

Rubinowy, 76 75 71 70 bajtów

Wydaje się to podejrzanie proste, więc proszę dać mi znać, jeśli gdzieś coś pomieszałem.

Nawiasem mówiąc, jest to pierwsza rzecz, jaką kiedykolwiek napisałem w Ruby - szukałem języka, który wspiera powtarzanie ciągów przez mnożenie, a Ruby chyba to zrobiła.

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

Do zastosowania w ten sposób:

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

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

@ Sp3000 Ten pierwszy nie, ponieważ Ruby najwyraźniej nie może przekonwertować booleanów na liczby całkowite. Ten ostatni działał, ale dzięki za to!
— vvye

2

J, 60 bajtów

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

Stosowanie:

   ((<;._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}}}$$

Metoda:

Sznurek '$$\varphi=1+\ cfrac1{1+\ d dots } $$ 'jest cięty w odstępach, a części są powtarzane 1 n signum(n) 1 n 1razy, a następnie te części są łączone.

Wypróbuj online tutaj.


2

R, 93 90

Podobnie jak inne odpowiedzi. Dzięki @plannapus za wskazówkę dotyczącą skanowania.

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

catużyte zamiast wklej0, ponieważ wynik byłby \\raczej wynikiem niż \.

W użyciu

> > 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, ale zamiast uczynić go funkcją, jeśli nprzy pierwszym wystąpieniu użytkownik wpisze jako standard, możesz zapisać niektóre znaki:cat("$$\\varphi=1+\\",rep("cfrac1{1+\\",n<-scan()),if(n)"d","dots",rep("}",n),"$$",sep="")
— plannapus

2

JavaScript, 114 109 106 85 bajtów dzięki George'owi Reithowi

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

To mój pierwszy wpis w konkursie codegolf! Powiedz mi, jak poprawić.

Poprzedni wpis (106 bajtów):

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

Poprzedni wpis (109 bajtów):

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

Poprzedni wpis (114 bajtów):

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

Wklej do konsoli przeglądarki i zadzwoń, f(n)gdzie njest liczba „kroków”.

Kod uproszczony :

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

2
x = „powtarzanie” powoduje, że jest on dłuższy, a nie krótszy: użyj .repeat jak jest i zapisz 3 znaki
— edc65

@ edc65 dzięki !!

pastebin.com/uU7tgFm9 kilka innych ulepszeń
— edc65

Może być podzielony na 87 bajtów: pastebin.com/0Hkv9uft
— George Reith


1

Pyth - 52 bajty

Proste podejście w Pyth, prawie skradzione z rozwiązania Python @ Sp3000. Używa operatora formatowania łańcucha %.

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

Wypróbuj online tutaj .

%                  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

Częściowo rekurencyjne. Single / double d jest najbardziej denerwującą częścią.

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

Przetestuj w konsoli 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

ponieważ najskuteczniejsze rozwiązanie zostało już opublikowane wiele razy, zamiast tego wybieram zamianę łańcucha

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: cholera, darowany dotszamiast ddotsza n=0, teraz rekurencyjne rozwiązanie z dodatkową klauzulą zaatakowana na to zbyt brzydki konkurować.

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

W tej chwili brakuje tego n=0specjalnego przypadku (kropki zamiast kropek).
— randomra

0

Haskell, 86

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

Zasadniczo takie samo podejście jak wszystkie rozwiązania tutaj. drop(0^n)"ddots"jest jednak słodki!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.