สร้าง TeX เพื่อเรียงชุด Sierpinski Triangle Fractal


30

ท้าทาย

เขียนโค้ดที่แสดงผลลัพธ์สมการทางคณิตศาสตร์ของ TeX (LaTeX) (ที่ระบุด้านล่าง) ที่จะเรียงเศษส่วน Sierpinski Triangle Fractal 5 ระดับ ที่สั้นที่สุดชนะรหัส

รายละเอียด

TeX (และเพื่อน ๆ เช่น LaTeX เป็นต้น) เป็นระบบเรียงพิมพ์ที่ซับซ้อน มันสามารถสร้างการแสดงออกที่ซับซ้อนซ้อนกันโดยพลการสำหรับสูตรทางคณิตศาสตร์ บังเอิญ "ซับซ้อนซ้อนกัน" นี้ยังเป็นคำอธิบายของ fractals ข้อมูลต่อไปนี้แสดงผลด้วย MathJaX

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

โดยโค้ดสมการคณิตศาสตร์ข้อความธรรมดาต่อไปนี้ซึ่งประกอบไปด้วย super-and sub-script ที่ซ้อนกัน:

{{{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}^{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}_{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}}^{{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}^{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}_{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}}_{{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}^{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}_{{{x^x_x}^{x^x_x}_{x^x_x}}^{{x^x_x}^{x^x_x}_{x^x_x}}_{{x^x_x}^{x^x_x}_{x^x_x}}}}}

โปรดทราบว่านี่เป็นเพียงการซ้อน 5 ระดับ คุณไม่จำเป็นต้องสร้าง$...$หรือ$$...$$หรือมาร์กอัปอื่น ๆ ที่จำเป็นสำหรับการเริ่มต้น / สิ้นสุดสมการทางคณิตศาสตร์ใน TeX & Co. คุณสามารถดูตัวอย่าง TeX ที่สร้างขึ้นในบรรณาธิการออนไลน์หลายคนเช่น: http://www.hostmath.comแต่คุณสามารถค้นหาได้มากมาย อื่น ๆ ด้วย คำถามนี้ได้รับแรงบันดาลใจจากการสนทนากับเพื่อน ๆ

ปรับปรุง

มีคำถามที่คล้ายกันแต่มันกว้างกว่านี้มากและจะให้คำตอบที่แตกต่างกัน ฉันต้องการเห็น kolmogorov ความซับซ้อนจริง ๆ สำหรับรหัสง่าย ๆ ที่คงที่ซึ่งในระบบหนึ่ง (TeX) นั้นชัดเจนอย่างสมบูรณ์ในขณะที่บีบอัดอีกระบบ นอกจากนี้ยังเน้นnความคิดเห็นแทน 5 ระดับ


2
สวัสดี; ฉันปิดคำถามของคุณซ้ำซ้อนเพราะฉันเชื่อว่าคำตอบสามารถแก้ไขได้เล็กน้อยจากคำถามอื่นเพื่อตอบคำถามนี้ อย่างไรก็ตามฉันชอบความคิดนี้และฉันคิดว่ามันดูเท่มาก! :)
HyperNeutrino

2
สำหรับสิ่งที่คุ้มค่าฉันเปิดคำถามนี้อีกครั้งเพราะฉันไม่เห็นรหัสว่าแก้ไขได้เล็กน้อยในการแปลจากที่หนึ่งไปยังอีกที่หนึ่ง
AdmBorkBork

4
นั่นคือไกลอย่างรวดเร็วเกินกว่าที่จะยอมรับการแก้ปัญหา!
ขนปุย

3
Meta ที่เกี่ยวข้อง: codegolf.meta.stackexchange.com/q/5056/32352
Sanchises

2
เมื่อฉันเห็นความท้าทายนี้คำตอบนี้อยู่ในใจของฉัน ... codegolf.stackexchange.com/a/6830/67961 และ ... มันเป็นของคุณ
J42161217

คำตอบ:




14

TeX ธรรมดา 29 ไบต์

\def~#1x{{#1x_#1x^#1x}}~~~~~x

นั่นคือสิ่งที่คนอื่นมีเอาท์พุท แต่ถ้าเราต้องการรหัสเพื่อคอมไพล์มันจะมีขนาด 6 ไบต์ขึ้นไป

\def~#1x{{#1x_#1x^#1x}}$~~~~~x$\bye

คำอธิบาย

~เป็นตัวละครที่ใช้งานใน TeX ดังนั้นเราจึงสามารถให้นิยาม (ใหม่)

\def~#1x{{#1x_#1x^#1x}}กำหนด~เป็นแมโครดังนั้นเมื่อ TeX เห็น~จะทำสิ่งต่อไปนี้:

  • อ่านทุกอย่างจนถึงขั้นถัดไปxและเรียกสิ่งนั้นว่า#1(การจับคู่รูปแบบ)
  • แทนที่สิ่งทั้งหมดด้วย {#1x_#1x^#1x}

ยกตัวอย่างเช่นจะได้รับการแทนที่ด้วย~ABCx{ABCx_ABCx^ABCx}

เมื่อ~~~~~xถูกนำมาใช้#1เป็นดังนั้นสิ่งที่ทั้งได้รับการแทนที่ด้วย~~~~ {~~~~x_~~~~x^~~~~x}และอื่น ๆ

Once we have the long string, we can print it out to terminal with \message (and ending with a \bye so TeX stops), so \message{~~~~~x}\bye. Or typeset the resulting expression (as a mathematical formula), by surrounding it in $s : so $~~~~~x$\bye.


Sorry if there's anything wrong, first answer here.
Manuel

For a big n (rather than 5) it could be more efficient to create a macro that outputs a list of n tildes ~ rather than writing ~~~~~. Plus it would look better if the whole expression is typeset under \scriptscriptstyle.
Manuel

Nice trick… can you add an explanation, or mind if I add one? This illustrates a nice feature of pattern-matching in TeX macros, which is not a feature common to many languages (that I know of).
ShreevatsaR

I will add it, but feel free to edit.
Manuel

อ๊ะไม่เห็นความคิดเห็นของคุณ…เพิ่มคำอธิบายที่คล้ายกันมาก อย่าลังเลที่จะปฏิเสธ +1 สำหรับคำตอบที่ดี!
ShreevatsaR

4

05AB1E , 17 ไบต์

'x5F'x¡"{x^x_x}"ý

ลองออนไลน์!

คำอธิบาย

'x                  # push "x"
  5F                # 5 times do
    'x¡             # split on "x"
       "{x^x_x}"ý   # join on "{x^x_x}"

โปรแกรมอื่น ๆ ที่มีจำนวนไบต์เดียวกันรวมถึง

"{x^x_x}"©4F'x¡®ý
'x5F'x"{x^x_x}".:

ฉันรู้สึกว่า"{x^x_x}"สามารถลดลงได้
Magic Octopus Urn

4

PowerShell ,  44  35 ไบต์

"'x'"+"-replace'x','{x^x_x}'"*5|iex

ลองออนไลน์!

ใช้การคูณสตริงเพื่อ-replace xes ซ้ำ ๆด้วยสคริปต์ย่อยและซุปเปอร์แล้วส่งออก

บันทึกแล้ว 9 ไบต์ขอบคุณ Joey


"'x'"+"-replace'x','{x^x_x}'"*5|iexง่ายกว่านี้นิดหน่อย
Joey

@ โจอ๋อนั่นเป็นวิธีที่ฉลาดในการทำมัน ขอบคุณ!
AdmBorkBork


2

JavaScript (ES6), 45 42 37 ไบต์

f=n=>n>4?'x':[...'{^_}'].join(f(-~n))

แก้ไข: บันทึกแล้ว3 2 ไบต์ขอบคุณ @Arnauld การระบุ 5 ยังคงมีค่าใช้จ่ายฉัน 2 ไบต์; รุ่น41 40 35- ไบต์นี้ใช้พารามิเตอร์แทน:

f=n=>n?[...'{^_}'].join(f(n-1)):'x'



2

Japt , 21 20 18 ไบต์

5Æ="\{^_}"¬qUª'xÃÌ

ทดสอบมัน


คำอธิบาย

5Æ             Ã

สร้างอาร์เรย์ที่มีความยาว 5 และทำแผนที่

"\{^_}"¬

แยกสตริงเป็นอาร์เรย์ของอักขระ

qUª'x

Rejoin ( q) เป็นสตริงที่ใช้ค่าปัจจุบันของUหรือ ( )ª"x"

=

Uกำหนดผลจากการที่ไป

Ì

รับองค์ประกอบสุดท้ายในอาร์เรย์


ทางเลือก 18 ไบต์

เหมือนกับด้านบน แต่ลดขนาดอาร์เรย์หลังจากที่สร้างขึ้น

5o r@"\{^_}"¬qX}'x

ทดสอบมัน

ตัวเลือกการเรียกซ้ำ

>4©'xª"\{^_}"¬qßUÄ

ทดสอบมัน


1

Java (OpenJDK 8) , 179 167 ไบต์

@ Neil พอร์ต

interface Y{static void main(String[]a){System.out.println(t.apply(1));}java.util.function.Function<Integer,String>t=N->N>0?Y.t.apply(N-1).replace("x","{x^x_x}"):"x";}

ลองออนไลน์!


ฉันคิดว่าคุณสั้นกว่าที่จะเขียนtในฐานะฟังก์ชั่นจริงแทนที่จะเป็นแลมบ์ดา
Roman Gräf

หากคุณใช้โปรแกรมทั้งหมดt.apply(1)ควรเป็นโปรแกรมt.apply(new Integer(a[0]))แทน แต่ทำไมไม่เพียงแค่โพสต์วิธีการ? String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";}และหากความต้องการของการท้าทายจะเป็นโปรแกรมเต็มรูปแบบ (ซึ่งไม่ใช่) การใช้วิธีเรียกซ้ำ Java 7 จะสั้นกว่าแลมบ์ดา:interface Y{static void main(String[]a){System.out.print(t(new Integer(a[0])));}static String t(int n){return n>0?t(n-1).replace("x","{x^x_x}"):"x";}}
Kevin Cruijssen

0

ภาษา Wolfram ( Mathematica ) - 40 ตัวอักษร

สรุป 3 คำตอบที่ดีที่สุดที่นี่ :

40 ไบต์:

Nest["{"<>#<>"_"<>#<>"^"<>#<>"}"&,"x",5]

41 ไบต์:

Nest[StringReplace["x"->"{x^x_x}"],"x",5]

44 ไบต์:

Last@SubstitutionSystem["x"->"{x^x_x}","x",5]

3
ไม่แนะนำให้ตอบคำถามของคุณเองโดยไม่ต้องออกจากคนอื่นสองสามวันก่อน
Mr. Xcoder

1
ข้อมูลโค้ดแรกของคุณไม่ต้องการขนาด 41 ไบต์หรือไม่
Jonathan Frech

@ Mr.Xcoder ขอโทษแบบฟอร์มแก้ไขแนะนำเป็นตัวเลือกในการโพสต์คำตอบของฉันเอง ฉันควรลบคำตอบของฉัน?
Vitaliy Kaurov

@VitaliyKaurov ฉันคิดว่าคุณควรผู้ใช้รายอื่นอาจได้รับสิ่งนี้ไม่ดี
Mr. Xcoder


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.