Sebuah Arus Ular, juga dikenal sebagai kurva Gosper , adalah kurva fraktal, tumbuh secara eksponensial dalam ukuran dengan setiap pesanan / iterasi dari proses yang sederhana. Di bawah ini adalah detail tentang konstruksi dan beberapa contoh untuk berbagai pesanan:
Pesanan 1 Alur Ular :
____
\__ \
__/
Pesanan 2 Flow Snake :
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \
/ __ \__ \ \/
\ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
Pesanan 3 Flow Snake :
____
____ \__ \
\__ \__/ / __
__/ ____ \ \ \ ____
/ __ \__ \ \/ / __ \__ \
____ \ \ \__/ / __ \/ / __/ / __
____ \__ \ \/ ____ \/ / __/ / __ \ \ \
\__ \__/ / __ \__ \__/ / __ \ \ \ \/
__/ ____ \ \ \__/ ____ \ \ \ \/ / __
/ __ \__ \ \/ ____ \__ \ \/ / __ \/ /
\ \ \__/ / __ \__ \__/ / __ \ \ \__/
\/ ____ \/ / __/ ____ \ \ \ \/ ____
\__ \__/ / __ \__ \ \/ / __ \__ \
__/ ____ \ \ \__/ / __ \/ / __/ / __
/ __ \__ \ \/ ____ \/ / __/ / __ \/ /
\/ / __/ / __ \__ \__/ / __ \/ / __/
__/ / __ \ \ \__/ ____ \ \ \__/ / __
/ __ \ \ \ \/ ____ \__ \ \/ ____ \/ /
\ \ \ \/ / __ \__ \__/ / __ \__ \__/
\/ / __ \/ / __/ ____ \ \ \__/
\ \ \__/ / __ \__ \ \/
\/ \ \ \__/ / __
\/ ____ \/ /
\__ \__/
__/
Konstruksi
Pertimbangkan urutan 1 Alur Ular yang akan dibangun dari jalur yang berisi 7 tepi dan 8 simpul (berlabel di bawah. Diperbesar untuk kelayakan):
4____5____6
\ \
3\____2 7\
/
0____1/
Sekarang untuk setiap pesanan berikutnya, Anda cukup mengganti tepi dengan versi yang diputar dari pola pesanan 1 asli ini. Gunakan 3 aturan berikut untuk mengganti tepi:
1 Untuk tepi horizontal, gantikan dengan bentuk aslinya seperti:
________
\ \
\____ \
/
____/
2 Untuk /
tepi ( 12
dalam konstruksi di atas), ganti dengan versi yang dirotasi berikut:
/
/ ____
\ / /
\/ /
/
____/
3 Untuk \
tepi ( 34
dan di 67
atas), ganti dengan versi yang dirotasi berikut:
/
/ ____
\ \ \
\ \ \
\ /
\/
Jadi misalnya, urutan 2 dengan simpul dari urutan 1 berlabel akan terlihat seperti
________
\ \
________ \____ \6
\ \ / /
\____ \5___/ / ____
/ \ \ \
4___/ ________ \ \ \7
/ \ \ \ /
/ ____ \____ \2 \/
\ \ \ / /
\ \ \3___/ / ____
\ / \ / /
\/ ________ \/ /
\ \ /
\____ \1___/
/
0___/
Sekarang untuk urutan yang lebih tinggi, Anda cukup memecah level saat ini menjadi tepi dengan panjang 1 /
, 1 \
atau 2 _
dan ulangi prosesnya. Perhatikan bahwa bahkan setelah penggantian, simpul umum antara dua tepi berurutan masih bertepatan.
Tantangan
- Anda harus menulis fungsi dari program penuh yang menerima integer tunggal
N
melalui argumen fungsi STDIN / ARGV / atau yang setara terdekat dan mencetak urutanN
Snake Flow pada STDOUT. - Bilangan bulat input selalu lebih besar dari
0
. - Seharusnya tidak ada ruang utama yang bukan bagian dari pola.
- Seharusnya tidak ada ruang trailing atau ruang trailing yang cukup untuk membentuk pola untuk mengisi persegi panjang batas minimum sepenuhnya.
- Mengejar baris baru adalah opsional.
Fakta menyenangkan
- Flow Snakes adalah permainan kata Snow Flakes, yang menyerupai pola ini untuk urutan 2 dan di atasnya
- Aliran dan Ular benar-benar memainkan bagian dalam pola karena polanya terdiri dari jalur tunggal yang mengalir di seluruh.
- Jika Anda perhatikan dengan seksama, pola urutan 2 (dan lebih tinggi juga) terdiri dari rotasi pola urutan 1 yang diputar pada simpul umum arus dan tepi sebelumnya.
- Ada varian Non ASCII dari Flow Snakes yang dapat ditemukan di sini dan di beberapa lokasi lain.
Ini adalah kode-golf sehingga kode terpendek dalam byte menang!
Papan peringkat
Posting pertama dari seri menghasilkan leaderboard.
Untuk memastikan jawaban Anda muncul, mulailah setiap jawaban dengan tajuk utama, menggunakan templat Penurunan harga berikut:
# Language Name, N bytes
di mana N
ukuran kiriman Anda. Jika Anda meningkatkan skor Anda, Anda dapat menyimpan skor lama di headline, dengan mencoretnya. Contohnya:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jawaban:
CJam, 144 byte
Baris baru ditambahkan untuk menghindari pengguliran. Cobalah online
Program ini bekerja dalam beberapa langkah:
sumber
Python 2,
428411388 byteYang ini cukup rumit. Pola tidak mempertahankan rasio mereka setelah setiap langkah yang berarti sangat sulit untuk secara prosedural menghasilkan gambar dari pendahulunya. Apa yang dilakukan kode ini, meskipun tidak terbaca setelah beberapa matematika matematika yang intens, sebenarnya menarik garis dari awal sampai selesai menggunakan
D
fungsi yang didefinisikan secara rekursif .Ukurannya juga menjadi masalah, dan saya akhirnya baru mulai di tengah-tengah kotak
5*3**n
sisi dan memotong hal-hal setelahnya, meskipun jika saya bisa memikirkan cara yang lebih baik untuk menghitung ukuran saya mungkin mengubahnya.sumber
r=[s*[" "]for i in range(s)]
->r=[[" "]*s]*s]
akan mencukur beberapa byte*
mengulangi objek yang bisa berubah .l
, beralihprint'\n'.join()
ke mencetak di dalam for for loop, menggunakanreturn[...][t]+x,
, dan menghapus tanda kurung(t%2)
. Juga, Anda dapat menggunakanmin(c.find('\\')%s for c in S)
jika Anda mengubah nama daftarS
sehingga tidak menimpa nilai awals
.JavaScript ( ES6 ), 356
362 370Itu yang sulit ...
Setiap bentuk disimpan sebagai jalur. Ada 6 blok bangunan dasar (3 + 3 mundur)
0
diagonal ke kiri ke kanan bawah (4
mundur)1
bawah diagonal kiri ke atas (5
ke belakang)2
horizontal kiri ke kanan (6
mundur)Untuk masing-masing, ada langkah penggantian yang diterapkan ketika meningkatkan pesanan:
0
->0645001
(mundur4
->5441024
)1
->2116501
(mundur5
->5412556
)2
->2160224
(mundur6
->0664256
)nilai prefilled dalam
h
array, bahkan jika elemen 4..6 dapat diperoleh dari 0..2 menggunakanUntuk mendapatkan bentuk untuk urutan yang diberikan, jalur dibangun dalam variabel p yang menerapkan penggantian berulang kali. Kemudian loop utama iterates pada variabel p dan menggambar bentuk di dalam array g [], di mana setiap elemen adalah baris.
Mulai dari posisi (0,0), setiap indeks dapat menjadi negatif (indeks y pada pesanan tinggi). Saya menghindari indeks y negatif menggeser semua array g setiap kali saya menemukan nilai y negatif. Saya tidak peduli jika indeks x menjadi negatif, karena di JS indeks negatif diizinkan, hanya sedikit lebih sulit untuk dikelola.
Pada langkah terakhir, saya memindai array utama menggunakan .map, tetapi untuk setiap baris saya perlu menggunakan loop eksplisit untuk (;;) menggunakan
b
variabel yang menahan indeks x paling sedikit (yaitu <0).Dalam
console.log
versi ada baris baru yang berguna, yang dapat dengan mudah dibuat baris baru bertukar 2 baris, seperti dalam versi potongan.Cuplikan berguna untuk menguji (di Firefox):
sumber
Haskell, 265 byte
(Catatan: pada GHC sebelum jam 7.10, Anda perlu menambah
import Control.Applicative
atau menggantiabs<$>
denganmap abs$
.)Jalankan online di Ideone.com
f n :: Int -> IO ()
menggambar leveln
flownake. Gambar dikomputasi dalam urutan bitmap daripada sepanjang kurva, yang memungkinkan algoritma untuk berjalan di ruang O (n) (yaitu, logaritmik dalam ukuran gambar). Hampir setengah dari byte saya digunakan untuk menghitung persegi panjang untuk menggambar!sumber
Perl,
334 316309Parameter diambil pada input standar. Ujilah aku .
sumber
Haskell,
469419390385365 bytefungsi f :: Int-> IO () mengambil bilangan bulat sebagai input dan mencetak ular aliran
sumber
$
definisik
, dan mengganti(!!)a
dengan(a!!)
yang dapat menghilangkan beberapa tanda kurung. Selain itu, Anda tampaknya tahu banyak trik sendiri. NiceC,
479474468427 byteSaya rasa tidak ada yang mengalahkan Perl dan Haskell, tapi karena belum ada pengiriman C di sini:
Untuk menghemat ruang pada panggilan atoi (), jumlah argumen yang diteruskan ke program digunakan untuk level tersebut.
Program berjalan dalam O (n ^ 3) atau lebih buruk; pertama jalur dihitung sekali untuk menemukan koordinat min / maks, kemudian untuk setiap pasangan (x, y) dihitung sekali untuk menemukan karakter pada lokasi tertentu. Sangat lambat, tetapi menghemat administrasi memori.
Contoh dijalankan di http://codepad.org/ZGc648Xi
sumber
X,Y,K,L,M,N,i,j,c;
sebagai gantiint X,Y,K,L,M,N,i,j,c;
danmain(l)
bukannyavoid main(int l)
Python 2,
523502475473467450437 bytePffft, menghabiskan biaya 3 jam, tapi menyenangkan untuk dilakukan!
Idenya adalah untuk membagi tugas dalam beberapa langkah:
Berikut adalah kode dalam bentuk ungolfed:
Sunting: Saya mengubah bahasa menjadi python 2, agar kompatibel dengan jawaban saya untuk # 3 (dan juga menghemat 6 byte lebih banyak)
sumber
l.extend(x)
menjadil+=x
. Anda juga mungkin dapat menggunakan codegolf.stackexchange.com/questions/54/... alih-alih yang.split()
Anda gunakan (saya melakukan sesuatu yang serupa dalam jawaban saya)extend
Pari / GP, 395
Melompati posisi karakter x, y, dan menghitung karakter apa yang akan dicetak. Upaya moderat untuk meminimalkan, mencetak dengan spasi putih dan komentar dilucuti.
Setiap arang adalah sel pertama atau kedua dari sel segi enam. Lokasi sel adalah bilangan kompleks z yang dipecah menjadi basis b = 2 + w dengan digit 0, 1, w ^ 2, ..., w ^ 5, di mana w = e ^ (2pi / 6) akar keenam akar persatuan. Digit-digit tersebut dipertahankan hanya sebagai pembeda 1 sampai 7 kemudian diambil tinggi ke rendah melalui tabel keadaan untuk rotasi net. Ini dalam gaya kode flownake oleh Ed Shouten (
xytoi
) tetapi hanya untuk rotasi bersih, tidak membuat angka menjadi indeks "N" di sepanjang jalan. Luasnya relatif terhadap asal 0 di tengah bentuk. Selama batas bukanlah titik akhir, ini adalah tengah dari segi enam 2 karakter dan hanya 1 karakter yang diperlukan. Tetapi ketika ular mulai dan / atau akhir adalah batas X 2 karakter diperlukan, yaitu k = 0 mulai dan k <3 akhir. Pari memiliki "paha depan" seperti sqrt (-3) builtin tetapi hal yang sama dapat dilakukan dengan bagian nyata dan imajiner secara terpisah.sumber