画一条龙曲线


19

今天的任务:画一条龙曲线!

如果你不知道龙曲线是什么,这里是一个介绍ViHart视频(真的很酷,敬请收看!)

您的任务:绘制一条龙形曲线,重复至少9次。您不必显示迭代1到9,仅需要显示完成(至少)9次迭代后生成的最终曲线。曲线必须绘制为连接曲线上各点的直线;输出应与下面显示9次或更多次迭代(直到反射,旋转,缩放和线宽,线色和背景色的变化)的图像之一匹配。您的输出必须足够大,以使各个行和它们形成的“框”可以相互区分。如果两条线在曲线中不相交,则它们不应在输出中占据相同或相邻的像素(在它们之间至少应有一个可见的背景像素)。您可以在屏幕上显示图像,也可以将图像保存到文件中。输出必须是图形的-不能是ASCII文字。

以字节为单位的最短代码为准,但是不应在字节数中包含库的包含指令,如果图形库或其他库是在发布前编写的,则可以使用为您选择的语言编写的图形库或其他库。

请提供程序输出的图像。

在此处输入图片说明

如果您观看了视频,请跳过本段:对于那些决定不观看视频的人,下面显示了龙曲线的前12次迭代。就此任务而言,龙曲线是通过以下规则生成的曲线:取当前曲线的端点,创建围绕该端点旋转90度的第二条曲线,以使原始曲线的端点曲线是新曲线的起点,并将两条曲线合并为一条相交的曲线。在下面显示的图像中,每个新的迭代都是通过将前一个迭代绕端点每次顺时针旋转90度来生成的。当曲线显示在屏幕上时,哪个终点算作“终点”并不明显,但是当曲线存储为点数组时,很容易将“终点”定义为终点数组。

赞赏但不接受Ascii艺术:这是图形输出,而不是ascii艺术。


3
关于尺寸,着色等有任何规范吗?由于它的确切输出还不清楚。
Rɪᴋᴇʀ

3
致命

6
我删除了Dragon-curve标记,因为它似乎没有添加任何东西
Blue Blue


3
这不是重复的;解决该问题的编程技术大不相同(也许木炭除外)。大多数答案使用乌龟图形库,这些图形库根本无法在ASCII上下文中使用。

Answers:


2

x86,MSDOS,16字节

我前一阵子写了这本书,据我所知,这是产生龙形分形的最小例行程序。它不使用实际的迭代,而是直接在分形内部绘制每个包含的离散像素,以显示最终图像。它包含在此包中的许多其他小型产品中。16字节版本是我为使Dragon分数尽可能小而付出的努力的终点,从2014年开始以32字节的形式制作

十六进制

14 10 19 CA D1 FA 10 DE 01 D1 CD 10 B4 0C EB F0

S: 
adc al,0x10
sbb dx,cx       
sar dx,0x01 
adc dh,bl
add cx,dx
int 0x10
mov ah,0x0C
jmp short S

屏幕截图


1
至少可以这样说,这真是令人惊讶。我将如何运行它?
J. Antonio Perez '18

最快的方法是在线运行 DosBox,twt86.co?c = FBAZytH6EN4B0c0QtAzr8A%3D%3D您可以在此处复制源代码并在那里自己编译。经典方法是自己下载DosBox(0.74)并在其中运行。最真实的方法是获取MSDos或FreeDos引导程序(Rufus),然后将其实际运行#noemu;)
HellMood

9

蟒2/3,169 167 150 111 98 78字节

请注意,根据挑战规范,导入不包括在字节数中。

感谢@AlexHall保存39(!)个字节,而@ nedla2004保存另外13个字节

from turtle import*
o=[90]
for z in o*9:o+=[90]+[-x for x in o[::-1]]
fd(5)
for i in o:rt(i);fd(5)

首先生成一个列表,或者向右(90)和向左(-90)旋转,然后遍历列表并移动乌龟。

产生的输出: 在此处输入图片说明

编辑:如果太无聊了,请speed(0)在第一个之前添加fd(5)。它会以相同的方式运行,只不过乌龟的移动速度会更快。


一张照片会很不错:)
Kritixi Lithos's

您可以张贴输出的图片或屏幕截图吗?甚至还不清楚该代码在屏幕上没有显示任何内容
J. Antonio Perez

您的图片被截断
J. Antonio Perez

现在应该修复:)
Theo

@AlexHall谢谢!我知道一定有一种方法可以使该循环变得更短:)
Theo

8

徽标,43个字节

for[i 1 512][fd 9 lt :i/(bitand :i -:i)*90]

http://www.calormen.com/jslogo/#上尝试使用口译员

这使用了与我以前的ASCII艺术答案维基百科上的公式相同的原理,除了我改变了方向以匹配问题中的图像:

首先,以k*(2^m)k为奇数的形式表示n 。第n圈的方向由k mod 4决定,即k除以4时剩下的余数。如果k mod 4为1,则第n圈为R L;如果k mod 4为3,则第n圈为L R

bitand :i -:i找到的最低有效位i。我们i用这个除以i正确地舍入所需的数量,给出所需的奇数k。无需区分左转和右转;我们只是向左转弯,k*90并依靠旋转是模数360操作数来为我们执行模数这一事实。

输出量

使用ht,如果需要隐藏龟。

在此处输入图片说明

输出(已修改)

下面显示了曲线如何为单链。

bk 6 for[i 1 512][fd 6 rt :i/(bitand :i -:i)%4*45-90 fd 3 rt :i/(bitand :i -:i)%4*45-90]

在此处输入图片说明


4

LindenMASM,51字节

LindenMASM是我为挑战而创建的一种语言,它将永久存在于沙盒中。它利用Lindenmayer系统的概念来绘制诸如Dragon曲线,分形植物,Sierpinski三角形之类的东西。

源代码如下:

STT
AXI FX
INC 9
SET F 0
RPL X X+YF+
RPL Y -FX-Y
END

n = 6例如,要进行设置:

STT
AXI FX
INC 6
SET F 0
RPL X X+YF+
RPL Y -FX-Y
END

这将通过Python 3产生以下图像turtle

6代

迭代的编号可能略有不同,因为在Lindenmayer系统中,第一次迭代是单行。这是它的样子n = 10

10代

只是为了好玩,这是15代产品的外观(增加了一条指令MOV 2使其变得更小):

15代

最多使用20代(使用MOV 0.5)后,您将再也看不到线条了,创建过程需要很多步骤(成对+--+未优化)。这是您得到的:

20代

请注意,当前的解释器可能会出现较少一代的图形问题,即可能无法绘制到屏幕上。不幸的是,当创建该解释器时没有问题,Python 3的可能更改可能导致此问题,或者可能只是我的系统


4

欠载,196字节

()()(<svg width="99" height="147">)S(<g transform="translate):S((33,33)">)S((3,0)rotate)*a(*a(~*)*~("><path d="M0h3" stroke="#"/>)~*a(*)**:(-90)a~^~(90)a~^)*::*:**:*^S(</g>)(:*)::*:**:*^S(</svg>)S

我认为在低功率的esolang中尝试此挑战可能很有趣;对于命令数量如此少的语言,欠载性能相当好。

输出是一个带有大量嵌套标签的SVG文件,以及一些高尔夫球快捷方式。到目前为止,我还没有找到可以显示它的浏览器(Firefox试图加载它时挂了几分钟,而Firefox和Chromium都显示了一个空白屏幕)。大多数图像处理程序也无法加载(很难转换为另一种格式),但是我设法将其加载到图像查看器Eye of Gnome中(这是Ubuntu上默认安装的一部分)。因此,我对图像进行了截图,以便您可以看到它(实际图像具有透明背景,但是您实际上不能将屏幕截图透明):

Underload中的龙曲线的屏幕截图

我们需要明确指定图像大小。为图像选择合适的方向,以最小的合法尺寸绘制所有内容,并进行挑战指定的最小迭代次数,可以使我们得到的图像恰好适合99像素宽,节省了一个字节。这样工作就很好了。

用于绘制图像的一般算法是维护两个变量(Underload不命名变量,但我认为它们是xy),它们最初都是空的。然后,我们将(xy)分别替换为(x,左转并向前移动y)和(x,右转并向前移动y)。十次迭代后,xy都拥有九个迭代的龙曲线。

也有一些微优化和欠载特定的技巧。为了避免在每次循环迭代时都弄乱堆栈的顶部,我们首先将xy组合为函数“返回通过串联创建的字符串:x,turn指令,函数参数,move-前向指令,y。” 该函数仅占用堆栈上的一个空间,因此我们可以对其进行复制,将其-90作为参数调用,交换重复项下的返回值并将其90作为参数调用,以获取xy的新值。无需触及堆栈的前两个元素(这是迄今为止最常访问的元素)。此函数在运行时由代码生成。生成器本身也在运行时代码生成,以便允许其重用<g transform="translate也用于设置图像来源的字符串。我们首先生成所有打开标签,然后由于所有关闭标签都是just </g>,我们只需重复字符串即可输出1024个关闭标签,而不必担心将它们与打开标签匹配。(在Underload中有效地写数字本身就是一个有趣的问题;不过,(:*)::*:**:*它可能是写入1024的最有效方法,即转换为“ 2等于(1 + 2×2)×2的幂)”。

Underload没有任何图形库,因此我使用固定位置上的绘图线组合并围绕给定点旋转图像来生成SVG。而不是转动笔,我们转动纸。这个想法是通过绘制一条线,旋转整个图像,绘制另一条线,再次旋转图像等,我们可以有效地模拟乌龟图形,而无需执行任何算术运算或使用任何图形库,因为绘制了所有线条在同一位置。当然,这意味着我们有一些嵌套很深的“旋转图像”标签,这使许多SVG查看器感到困惑。

图像的样式将与字节数相对应,因此我需要提供显示图像所需的最小样式。结果是stroke="#",或多或少翻译为“线条需要是某种颜色”;这似乎已扩展为以黑色绘制。(通常将颜色指定为“#000”。)默认情况下,背景是透明的。我们没有指定笔触宽度,但是“侏儒之眼”选择的选项使所有内容可见。

许多Underload解释器都对此程序感到困扰,例如Online Try It崩溃,因为它在内部生成了一些非常大的字符串。不过,原始的在线Underload解释器可以运行。(有趣的是,第一个解释器是联机的,因此该语言在脱机使用之前就可以在线使用。)

让我有些不安的是,这里似乎只有1023个线段,而我们希望是1024。这可能是因为该算法未绘制最后的线段之一(而是在下一次迭代中绘制)。如果取消资格,则可以改编该程序,但最终可能会花费更长的时间。(这并不是说挑战赛无论如何都会赢得比赛;已经有几个较短的参赛作品了。)


4

MATL,26字节

0J1_h9:"tPJ*h]hYsXG15Y01ZG

如果在两个轴上接受不同的比例,则代码可以减少到19个字节:

0J1_h9:"tPJ*h]hYsXG

下图对应于等比例(26字节)版本。

上面的代码产生第9个(从0开始)迭代,即挑战中的第10个图像:

在此处输入图片说明

对于其他值,请更改9代码中的,或将其替换i为以数字作为用户输入。例如,结果为13

在此处输入图片说明

说明

这将使用循环逐步构建步长数组,然后在复杂平面中绘制曲线。例如,前两个步骤是1j(上)和-1(左)。

在每次迭代中,将复制到目前为止的步骤数组。阵列的副本被反转乘以通过1j(旋转90度),以及级联到原来。

循环之后,步骤的累加总和给出了实际点,然后将其绘制在复杂平面中。

0                          % Push 0
 J1_h                      % Push array [1j, -1]. This defines the first two steps
     9:                    % Push [1, 2, ..., 9]
       "                   % For each
        t                  %   Duplicate the array of steps so far
         P                 %   Reverse
          J*               %   Multiply by 1j
            h              %   Concatenate horizontally to previous steps
             ]             % End
              h            % Concatenate with the initial 0
               Ys          % Cumulative sum
                 XG        % Plot. Complex numbers are plotted with real and imag as x and y
                   15Y0    % Push string 'equal'
                       1ZG % Set equal scale in the two axes

您的回答令人印象深刻:)您介意提供代码说明吗?
J. Antonio Perez

@豪尔赫谢谢!完成
Luis Mendo

您提供的“ 19字节”和“ 26字节”版本相同。我认为这里存在复制粘贴错误?

@ ais523确实!现在已更正,感谢您的注意。顺便说一句,可以在这里看到它的实际效果(实验编译器;可能需要刷新页面)
Luis Mendo

3

Mathematica 86字节

{1,-1}
r=Reverse;Graphics@Line@Nest[Join[l=Last@#;h=#-l&/@#,r[r@#%&/@h]]&,{{0,0},%},9]

工作原理: {1,-1}输出{1,-1}。它基本上是“将其推送到堆栈”。可以使用调用此值%r=Reverse基本上只是重命名Reverse函数,因为我在代码中使用了两次。该Graphics@Line@只是需要点名单,并绘制连接它们的线。问题的真正实质发生在以下代码段中:Nest[Join[l=Last@#;h=#-l&/@#,r[r@#%&/@h]]&,{{0,0},%},9]。Lemme告诉您-该段很复杂,如f ****** ck。这是做什么的NestNest[f,x,9]输出call的结果f[f[f[f[f[f[f[f[f[x]]]]]]]]]

在我的代码中,第一个参数f为:Join[l=Last@#;h=#-l&/@#,r[r@#%&/@h]]&,第二个参数x{{0,0},%}(计算为{{0,0},{1,-1}}),第三个参数为n,其值为9(将第一个参数应用于第二个参数9次)。

最复杂的部分是第一个参数:Join[l=Last@#;h=#-l&/@#,r[r@#%&/@h]]&,它是几乎纯净的语法糖的巨大混乱。我确实在滥用mathematica的语法糖。该行代码代表mathematica的匿名函数版本,只是为了简化起见,我实际上在该匿名函数中定义了两个单独的匿名函数。是的,那是合法的,伙计们。让我们分解一下。

Join有两个参数。第一个是l=Last@#;h=#-l&/@#,第二个是r[r@#%&/@h]

Join的第一个参数:在“ main”匿名函数内部,#是曲线中当前迭代的所有点的列表。因此,l=Last@#;意思是“将要接收的点列表中的点取为输入,并将该点分配给变量l。下一段h=#-l&/@#稍微复杂一点。它的意思是“您有一个函数。此函数将一个点作为输入,l从中减去,然后返回结果。现在,将该函数应用于作为输入接收的点列表中的每个元素,以生成位移点列表,然后将该新列表分配给变量h

Join:的第二个参数 r[r@#%&/@h]实际上是我编写过的最复杂的语法。我不敢相信任何代码段都可以包含类似内容@#%&/@-看起来我在程序中间像个卡通人物一样在骂人!但是有可能将其分解。记住- r[x]获取点列表并以相反顺序返回该列表。r@#%&是一个匿名函数,它会反转其输入,然后将其乘以存储在中的值%(即{1,-1}),然后返回结果。基本上,它会将输入旋转90度,但是用我可能会写的那么短的代码。然后r@#%&/@h表示“输出一个新列表,该列表将每个点h旋转90度”。

因此,总体而言,这Join[l=Last@#;h=#-l&/@#,r[r@#*%&/@h]]&是一个函数,该函数将点列表作为输入,并在旋转90度的同一点列表上添加,以获取曲线的下一个迭代。重复9次以获得龙曲线。然后,将得到的点列表作为一条线绘制到屏幕上。并输出:

在此处输入图片说明


3
我刚刚发现了编写空向量的最奇怪的窍门:0{,}...之所以有效,0 x是因为它0适用于几乎所有函数,x并且{,}是的语法糖{Null,Null}
Martin Ender

3

Python 2,43个字节

这个答案是43个字节(不包括import语句),并且主要基于Level River St的Logo答案及其i/(i&-i)在代码中的使用。在trinket.io上在线尝试

from turtle import*
for i in range(1,513):fd(9);rt(90*i/(i&-i))

这是输出的图片。

在此处输入图片说明


据我所知,您需要将import语句中的字节数包括在总字节数中。
Theo

1
@Theo,仅引用挑战说明:The shortest code in bytes wins, however include directives for libraries shouldn't be included in the byte count, and you may use graphics libraries or other libraries written for your language of choice if they were written before the posting.
Sherlock9

3

Mathematica,56 55字节

Graphics@Line@AnglePath[Pi/2JacobiSymbol[-1,Range@512]]

在此处输入图片说明

说明:OEIS A034947

只是为了好玩,这里是第19次迭代的彩色版本。

在此处输入图片说明


2

Mathematica,63个字节

使用 AnglePath

Graphics@Line@AnglePath[Pi/2Nest[Join[#,{1},-Reverse@#]&,{},9]]

九次迭代


1

HTML + JavaScript,182

<canvas id=C></canvas><script>c=C.getContext("2d")
C.width=C.height=400
s=n=9
x=y=200
for(i=d=0;i<=1<<n;d+=++i/(i&-i))
c.lineTo(x,y),
d&1?y+=d&2?s:-s:x+=d&2?-s:s
c.stroke()</script>


0

Haskell +图表,179个字节

import Diagrams.Prelude
import Diagrams.Backend.SVG
d 1=hrule 1<>vrule 1
d n=d(n-1)<>d(n-1)#reverseTrail#rotateBy(1/4)
main=renderSVG"d"(mkWidth 99)$strokeT(d 9::Trail V2 Double)

输出是具有透明背景的99像素宽的svg文件(9像素宽的图像的笔触太粗,无法识别任何内容)。在这里,它被重新缩放并在白色背景上组成:

龙九号


0

tosh,518字节

tosh是Scratch,但是使用文本而不是块。答案为518字节,可能比Java还要差。

此答案使用与@Theo的Python答案相同的逻辑,但是使用字符串“ L”和“ R”而不是数字,因为Scratch(因此也就是tosh)的列表功能非常糟糕。

您可以在此处将其作为Scratch项目运行。(tosh编译为Scratch项目)

when flag clicked
set path to "R"
go to x: -50 y: 100
point in direction 90
pen down
set pen size to 2
clear
repeat 9
    set path copy to path
    set path to join (path) "R"
    set i to length of path copy
    repeat length of path copy
        if letter i of path copy = "R" then
            set path to join (path) "L"
        else
            set path to join (path) "R"
        end
        change i by -1
    end
end
set i to 0
repeat length of path
    change i by 1
    if letter i of path = "R" then
         turn cw 90 degrees
    else
         turn ccw 90 degrees
    end
    move 7 steps
end  

说明:

when flag clicked
set path to "R"
go to x: -50 y: 100
point in direction 90
pen down
set pen size to 2
clear

第一部分使单击绿色标志(when flag clicked)的程序运行,将路径变量设置为“ R”,并使精灵和舞台处于适当的状态以准备绘制。

repeat 9
    set path copy to path
    set path to join (path) "R"
    set i to length of path copy
    repeat length of path copy
        if letter i of path copy = "R" then
            set path to join (path) "L"
        else
            set path to join (path) "R"
        end
        change i by -1
    end
end

现在我们来看看路径生成代码。它使用与@Theo的Python答案相同的逻辑,不同之处在于使用字符串“ R”和“ L”而不是数字,并且我们使用嵌套循环而不是列表推导。

set i to 0
repeat length of path
    change i by 1
    if letter i of path = "R" then
         turn cw 90 degrees
    else
         turn ccw 90 degrees
    end
    move 7 steps
end  

最后,我们通过遍历path变量的每个字母并根据字母向左或向右旋转来绘制路径。

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.