Poin Fraktal pada Garis

12

Terkadang, ketika saya benar-benar bosan ( sangat bosan), saya suka menggambar segmen garis dan menggambar poin di atasnya.

Pertama, saya menggambar segmen garis dengan ukuran tertentu, yaitu 2 ^ N untuk beberapa nilai N. Baris akan diwakili oleh serangkaian .karakter.

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

Kemudian, saya merencanakan titik di ujung kiri. Poin akan diwakili oleh Xkarakter.

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

Lalu, saya mengikuti sebuah pola. Mulai dari titik diplot terakhir (yang saya sebut A), saya maju ke titik diplot berikutnya (B) di telepon (membungkus seperlunya). Kemudian, saya maju ke titik diplot berikutnya pada baris (C). Kemudian, saya memplot titik baru setengah jalan di antara titik ketiga ini (C) dan titik yang sudah diplot berikutnya (D).

Setiap kali Anda membungkus garis, "tengah" ditentukan dengan cara membungkus. Titik yang baru diplot selalu di sebelah kanan C.

Katakanlah baris berikut adalah baris saya saat ini. Inilah cara saya merencanakan dua poin berikutnya. Untuk contoh ini, saya akan memberi label setiap poin penting dengan huruf.

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.
  ^

Kembali ke contoh sebelumnya, titik berikutnya akan diplot di tengah garis.

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

Ini mungkin sedikit kasus khusus: maju ke titik berikutnya hanya membuat Anda di mana Anda mulai. Satu-satunya titik setengah yang berguna adalah titik setengah "siklik" (titik setengah pada garis), berlawanan dengan merencanakan titik pada bagian atas dirinya sendiri.

Di bawah ini adalah serangkaian poin yang akan saya plot pada garis dari sini sampai akhir.

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...

Tidak ada lagi ruang untuk plot titik berikutnya, karena harus terjepit di antara dua titik yang berdekatan, jadi saya telah mencapai kedalaman maksimum untuk nilai yang diberikan N = 4. Baris terakhir dalam daftar di atas adalah "lengkap . "

Tantangan

Tujuannya adalah untuk menulis fungsi program / nama terpendek yang akan mencetak / mengembalikan garis yang telah diselesaikan untuk nilai N. yang diberikan. Yang di atas menunjukkan N = 4.

Memasukkan

Input akan berupa bilangan bulat non-negatif tunggal N. Panjang garis yang dihasilkan akan menjadi 2 ^ N.

Keluaran

Output akan berupa garis panjang 2 ^ N, yang dibentuk oleh .dan Xkarakter. Baris baru yang tertinggal tidak masalah.

Contoh 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.......
PhiNotPi
sumber

Jawaban:

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])

Cukup mudah.

Pyth, 49

Lebih atau kurang terjemahan. Perbedaan utama adalah bahwa saya tidak menggunakan daftar yang mewakili baris, saya menggunakan string.

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

Cobalah online .

                         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
Jakube
sumber
4

Klip , 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}
Ypnypn
sumber
3

GolfScript (61 byte)

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

Jumlah iterasi loop yang diperlukan tampaknya A061419 , tetapi do-loop lebih pendek daripada menghitung itu. Divmod akan menyimpan char di dalam do loop. Bagian yang terasa paling boros adalah konversi keluaran, tapi saya tidak melihat cara memperbaikinya.

Peter Taylor
sumber
3

CJam, 55 53 51 50 byte

2ri#:N'.*0aN{):U+__Nf++$_U#))>2<1bNe|2/N%|}*{'Xt}/

Sesuatu untuk memulai.

Cobalah online di sini

Pengoptimal
sumber
2

Java, 209 207 195 191 byte

Saya terkejut saya bisa mendapatkannya sesingkat ini. Mungkin masih ada ruang untuk perbaikan. Seperti biasa, saran akan dihargai :)

Ini mengembalikan a char[]. Panggilan menggunakan 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;}

Bertakuk:

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 byte terima kasih kepada Peter :)
4 byte terima kasih kepada TNT;)

Jumlahnya
sumber
(c%b+b)%b? Apakah Anda berharap cmenjadi negatif?
Peter Taylor
c=0dan d=0dapat disingkat menjadi adil cdan d. intjenis yang didefinisikan di tingkat kelas diinisialisasi secara otomatis ke 0.
TNT
1

Haskell, 182 byte

(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

Penggunaan: f 5. Output: X.X.X...X...X...X.XXX.XXX........

Sayangnya Haskell tidak memiliki fungsi penggabungan di perpustakaan standar, jadi saya harus menyediakan sendiri (-> %). Untungnya saya harus menggabungkan hanya daftar yang tidak terbatas, jadi saya tidak perlu membahas kasus dasar, yaitu daftar kosong. Masih biaya 40 byte.

Cara kerjanya: alih-alih mengatur Xs secara langsung dalam array, saya menyimpan daftar posisi di mana mereka berada. Selain itu saya tidak membungkus 2^Ntetapi terus meningkatkan posisi menuju tak terbatas (misalnya untuk N = 2 dengan Xdi depan, daftar posisi terlihat seperti [0,4,8,12,16,20,…]). Saya mengambil elemen ke-3 dan ke-4 ( cdan d), menghitung posisi baru (c+d)/2, menyimpannya untuk daftar output, menggabungkan daftar posisi lama dari posisi 4 (yang d) aktif dengan yang baru dimulai dengan (c+d)/2dan berulang. Saya berhenti ketika (c+d)/2sama c. Akhirnya saya menambahkan 0ke daftar output dan mencetak Xdi posisi yang diberikan dan di .tempat lain.

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 
nimi
sumber
1

Mathematica, 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
alephalpha
sumber