线上的分形点


12

有时候,当我真的无聊时,我喜欢画线段并在其上画点。

首先,我绘制一个特定大小的线段,对于某些N值,该线段为2 ^ N。该线将由一系列.字符表示。

................

然后,在左端绘制一个点。点将用X字符表示。

X...............

然后,我遵循一个模式。从最近绘制的点(我将其称为A)开始,前进到直线上的下一个绘制的点(B)(必要时环绕)。然后,我前进到线(C)上的下一个绘制点。然后,我在第三个点(C)和下一个已经绘制的点(D)之间绘制了一个新点。

每当绕线时,“中间”都是以绕线方式确定的。新绘制的点始终在C的右侧。

假设下一行是我的当前行。这是我如何绘制接下来的两点。在此示例中,我将用字母标记每个重要点。

X...A...X.X...X.
    ^

X...A...B.X...X.
        ^

X...A...B.C...X.
          ^

X...A...B.C...D.
            ^

X...X...X.X.A.X.
            ^

X...X...X.X.A.B.
              ^

C...X...X.X.A.B.
^

C...D...X.X.A.B.
  ^

X.A.X...X.X.X.X.
  ^

返回上一个示例,下一点将绘制在该线的中间。

X.......X.......

这可能是一个特例:前进到下一个点只会使您离开起点。唯一有用的中点是“循环”中点(直线上的中点),与在其顶部绘制点相反。

以下是我从此处到末端在线上绘制的一系列点。

X.......X.......
X.......X...X...
X.......X.X.X...
X...X...X.X.X...
X...X...X.XXX...
X.X.X...X.XXX...
X.X.X...XXXXX...

不再有绘制下一个点的空间,因为它必须被楔入两个相邻点之间,因此对于给定的N = 4,我已经达到了最大深度。上面列表中的最后一行是“完成。”

挑战

目的是编写最短的程序/命名函数,以给定值N打印/返回完成的行。上面显示N = 4。

输入值

输入将是单个非负整数N。然后,生成的行的长度将为2 ^ N。

输出量

输出将是由.X字符组成的长度为2 ^ N的完整行。尾随换行符无关紧要。

示例I / O

0
X

1
XX

2
X.XX

3
X.X.XXX.

4
X.X.X...XXXXX...

5
X.X.X...X...X...X.XXX.XXX.......

Answers:


4

Python 2,137

n=input()
l=[0]*2**n;i=0
while~i%2:i=i/2%2**n;l[i]=1;i=sum([k for k,v in enumerate(l*4)if(k>i)*v][1:3])
print''.join(['.X'[x]for x in l])

非常简单。

佩斯,49

或多或少的翻译。主要区别在于,我不使用代表行的列表,而是使用字符串。

J*\.^2QW!%Z2K%/Z2lJ=JXJK\X=Zs<tf&q\X@JT>TKU*4J2)J

在线尝试。

                         Q=input(); Z=0 #implicit
J*\.^2Q                  J = "."*(2^Q)
W!%Z2                    while !(Z%2):
  K%/Z2lJ                  K=(Z/2)%(len(J))
  =JXJK\X                  change J, the point at index K is changed to a "X"
       f          U*4J     filter all elements T in [0, 1, 2, ..., 4*len(J)-1]:
        &q\X@JT>TK           where J[T]=='X' and T>K
     <t               2    only us the second and third element
  =Zs                      and store the sum to Z
)J                       end while and print J

4

夹子,95

[z?zF#2(z*2*:(#2(z'.'X]'X]]n[Fa[b[q[j[r?=rirFrsrb'X]b]][t[u+*<ut*Blb/+tu2]]g+2jqg+3jq]#qa]%b'X}

3

GolfScript(61字节)

~2\?,[]0{.@|$4*.@?2+1$>2<.+~<!4$,*++.2/\1&!}do;`{&!'X.'1/=}+%

所需的循环迭代次数似乎是A061419,但do-loop比计算循环要短。divmod将在char循环中保存一个char。感觉最浪费的部分是输出转换,但是我看不出如何改进它。



2

Java中,209个 207 195 191字节

我很惊讶我能这么短地得到它。可能仍有改进的空间。和往常一样,建议将不胜感激:)

这将返回char[]。使用拨打电话a(n)

char[]a;int b,c,d,e=2;char[]a(int f){java.util.Arrays.fill(a=new char[b=1<<f],'.');for(a[0]=88;d+1<e;c=(d+e)/2,a[c%b]=88)e=b(d=b(b(c)));return a;}int b(int f){for(;;)if(a[++f%b]>87)return f;}

缩进:

char[] a;
int b, c, d, e = 2;

char[] a(int f){
    java.util.Arrays.fill(
            a = new char[
                    b = 1 << f
                    ]
            , '.'
    );
    for(
            a[0] = 88;
            d + 1 < e;
                c = (d + e) / 2,
                a[c % b] = 88
        )
        e = b(
                d = b(
                        b(c)
                )
        );
    return a;
}

int b(int f){
    for (;;)
        if (a[++f % b] > 87)
            return f;
}

感谢彼得12个字节:)
感谢TNT 4个字节;)


(c%b+b)%b?您期望c负面吗?
彼得·泰勒

c=0并且d=0可以缩短为just cdint在类级定义的类型被自动初始化为0。
TNT

1

Haskell,182字节

(a:b)%(c:d)|a<c=a:b%(c:d)|1<2=c:(a:b)%d
f i=putStr$map(!(0:g[0,n..]))[0..n-1]where n=2^i;e!l|e`elem`l='X'|1<2='.';g(_:_:c:d:r)|m==c=[]|1<2=mod m n:g((d:r)%[m,m+n..])where m=div(c+d)2

用法:f 5。输出:X.X.X...X...X...X.XXX.XXX.......

不幸的是,Haskell在标准库中没有合并功能,因此我必须提供自己的(-> %)。幸运的是,我仅需合并无限列表,因此不必涵盖基本情况,即空列表。它仍然花费40个字节。

工作原理:X我保留了位置列表,而不是直接在数组中设置。此外,我不会在处回绕,2^N而是继续将位置增加到无穷大(例如,对于N = 2,并且X在前面的位置,位置列表看起来像[0,4,8,12,16,20,…])。我采用第3个和第4个元素(cd),计算新位置(c+d)/2,将其保留在输出列表中,将位置4(the d)上的旧位置列表与新的位置列表合并,并从此处开始(c+d)/2并递归。(c+d)/2平等时我停下来c。最后,我将a添加0到输出列表中,并X在给定位置和.其他位置打印。

step by step example, N=2

step  position list       (c+d)/2  output     lists to merge (pos. list for next round)
                                   list       old list from d on / new list from (c+d)/2

  #1  [0,4,8,12,16,…]       10     [10]          [12,16,20,24,…] / [10,14,18,22,…]
  #2  [10,12,14,16,18,…]    15     [10,15]       [16,18,20,22,…] / [15,19,23,27,…]
  #3  [15,16,18,19,20,…]    18

stop here, because c equals (c+d)/2

add 0 to the output list: [0,10,15]
take all elements modulo 2^N: [0,2,3]
print X at position 0, 2 and 3 

1

数学,110 102 112 108

a=Array["."&,n=2^Input[]];a[[Mod[Round@{n/2,n}//.{x_,y_,z___}/;y-x>1:>{z,x+n,(x+y)/2+n,y+n},n]+1]]="X";""<>a
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.