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 X
karakter.
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 X
karakter. 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.......
(c%b+b)%b
? Apakah Anda berharapc
menjadi negatif?c=0
dand=0
dapat disingkat menjadi adilc
dand
.int
jenis yang didefinisikan di tingkat kelas diinisialisasi secara otomatis ke 0.Haskell, 182 byte
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
X
s secara langsung dalam array, saya menyimpan daftar posisi di mana mereka berada. Selain itu saya tidak membungkus2^N
tetapi terus meningkatkan posisi menuju tak terbatas (misalnya untuk N = 2 denganX
di depan, daftar posisi terlihat seperti[0,4,8,12,16,20,…]
). Saya mengambil elemen ke-3 dan ke-4 (c
dand
), menghitung posisi baru(c+d)/2
, menyimpannya untuk daftar output, menggabungkan daftar posisi lama dari posisi 4 (yangd
) aktif dengan yang baru dimulai dengan(c+d)/2
dan berulang. Saya berhenti ketika(c+d)/2
samac
. Akhirnya saya menambahkan0
ke daftar output dan mencetakX
di posisi yang diberikan dan di.
tempat lain.sumber
Mathematica,
110102112108sumber