pengantar
Ini sangat mudah. Kami akan menggambar ular di ascii. Ini terinspirasi oleh permainan ular tua di mana Anda harus mengumpulkan buah dan Anda terus tumbuh.
Definisi
Dengan bilangan bulat N positif yang mewakili panjang ular, gambarkan ular sehingga memiliki tubuh n plus kepala dan ekor.
Bagian:
- kepala:
<, >, ^, v
- ekor:
@
- vertikal:
|
- horizonal:
-
Semua sudut harus dipenuhi dengan \
atau /
masing - masing. Kecuali jika kepala berakhir di sudut dimana kepala <, >, ^, v
mengambil prioritas ke arah ular melengkung. yaitu untuk contoh panjang 1, itu diputar berlawanan arah jarum jam dan jadi kepala diputar seperti itu. Untuk solusi searah jarum jam itu akan ke kanan >
.
Ular harus mulai di tengah dengan ekornya, tetapi ia bisa keluar ke arah mana pun yang Anda pilih searah atau berlawanan arah jarum jam. Itu juga harus membungkus dirinya sendiri dengan kuat saat mengembang ke arah luar secara melingkar.
Contoh
/--\
|/\|
||@|
|\-/
\--->
Di mana @
ekor dan posisi awal. Seperti yang terlihat di atas, ekor dimulai di tengah, naik ke kiri dalam putaran berlawanan arah jarum jam ke arah luar.
Di sini panjangnya 19
ditambah ekor dan kepala.
Sebagai contoh lain, ini panjangnya 1
:
<\
@
Kemenangan
Ini adalah kode-golf sehingga jawaban yang dikirimkan dengan jumlah byte terkecil menang, dengan waktu untuk digunakan sebagai tie breaker.
Selamat bersenang-senang!
@---->
. Anda mungkin menginginkan kondisi yang lebih ketat tentang bentuk ular. Juga jelaskan seberapa banyak ruang putih diizinkan atau tidak diizinkan@
adalah tengah (mungkin tambahkan beberapa spasi untuk membuatnya jadi), nyatakan "ke kanan" sebagai arah dan buat kepala mengarah ke bawah dan nyatakan searah jarum jam. Istilah Anda mungkin tampak jelas bagi Anda, tetapi sebenarnya tidak jelas. Saya menyadari bahwa Anda mungkin memaksudkan ular melingkarJawaban:
MATL ,
8583 byteDan saya berpikir bahwa memiliki
spiral
builtin akan membuat kode pendek ...Cobalah online!
Penjelasan
Biarkan N menunjukkan input. Kami akan membuat vektor panjang
ceil(sqrt(N+2))^2
, yaitu, kuadrat sempurna terkecil yang sama dengan atau melebihi N +2. Vektor ini akan diisi dengan nilai numerik, digulung menjadi spiral (itu sebabnya panjangnya harus persegi sempurna), dan kemudian nilai numerik akan diganti oleh karakter.Biarkan n menunjukkan setiap langkah mulai dari 1 di pusat spiral. Langkah-langkah di mana ular berbelok diberikan oleh n 2 +1 (yaitu: 2, 5, 10, ...) untuk
\
simbol dan n 2 + n +1 (yaitu: 3, 7, 13, ...) untuk/
. Langkah-langkah antara a\
dan a/
harus-
, dan antara a/
dan a\
harus|
.Vektor dibuat sedemikian rupa sehingga berisi
1
pada titik belokan (2,3,5,7,10,13 ...) dan0
sisanya. Paritas dari jumlah kumulatif memberi tahu jika setiap entri harus a-
atau a|
. Menambahkan 1 ke hasil ini kita mendapatkan vektor yang berisi1
(untuk|
) atau2
(untuk-
). Tetapi ini membuat titik balik itu menjadi1
atau2
terlalu. Jadi titik balik, yang posisinya kita ketahui, ditimpa: posisi n 2 +1 diisi3
dan posisi n 2 + n +1 diisi4
. Ekor dan kepala juga merupakan kasus khusus: elemen pertama dari vektor (ekor) diatur ke5
, dan elemen dengan indeks N+2 (head) diatur ke6
. Akhirnya, elemen dengan indeks melebihi N +2 diatur ke0
.Mengambil input N = 19 sebagai contoh, kita sekarang memiliki vektor dengan panjang 25:
Kita perlu menggulung vektor ini menjadi spiral. Untuk ini kami menggunakan fungsi builtin yang menghasilkan matriks spiral, diikuti oleh refleksi dan transposisi untuk menghasilkan:
Mengindeks vektor dengan memberikan matriks
mana
0
bersesuaian dengan ruang,1
dapat disamakan dengan|
,2
untuk-
,3
untuk\
,4
untuk/
,5
untuk@
, dan6
kepala.Untuk mengetahui mana dari empat karakter
^
,<
,v
, atau>
kepala harus memiliki, kita menggunakan jumlah kumulatif gilirannya poin yang kami sebelumnya dihitung. Secara khusus, nilai kedua-terakhir dari jumlah kumulatif ini (yaitu nilai N + 1-th) modulo 4 memberi tahu kita karakter mana yang harus digunakan untuk kepala. Kami mengambil nilai kedua terakhir dari jumlah kumulatif, bukan yang terakhir, karena kebutuhan "jika kepala ujung di sudut kepala<
,>
,^
,v
menjadi prioritas dalam arah ular meringkuk". Untuk contoh N = 19 kepalanya adalah>
.Sekarang kita dapat membangun sebuah string yang berisi semua karakter ular, termasuk karakter yang sesuai untuk kepala di posisi keenam:
'|-\/@> '
. Kami kemudian mengindeks string ini dengan matriks di atas (pengindeksan adalah berbasis 1 dan modular, jadi ruang berjalan terakhir), yang memberikansumber
Python 2,
250233191 byterepl.it
Gambarkan ular dengan memutar seluruh ular 90º searah jarum jam dan menambahkan segmen bawah, dengan cara ini ular akan selalu berlawanan arah jarum jam.
Segmen baru akan selalu dimulai dengan
\
dan memiliki-
tubuh untuk sisi yang rata dan/
-
sisi yang aneh. Segmen ukuran (tanpa sudut) adalah0
,1
,1
,2
,2
,3
... yangfloor(side/2)
.Jika segmen adalah yang terakhir, itu menghapus karakter berlebih, tambahkan kepala dan lengkapi dengan spasi.
sumber
'\/'[m]
,'-|'[m]
dan'>v'[m]
print
dan''.join
JavaScript (ES6), 193
201 203 215 220 224 224Edit disimpan 4 byte thx @Arnauld
Edit2 mengubah logika, tidak menyimpan kenaikan saat ini untuk x dan y, hanya mendapatkannya dari arah saat ini
Edit3 setelah menyimpan beberapa byte, saya memutuskan untuk menggunakannya untuk pengelolaan ruang kosong yang lebih baik
Edit4 8 byte yang disimpan tidak mengikuti persis contoh tentang arah kepala - seperti jawaban lainnya
Versi saat ini berfungsi dengan Chrome, Firefox dan MS Edge
Jawaban ini memberikan beberapa spasi tambahan dan garis depan (dan garis kosong).Sedikit kurang golf
sumber
(' ')
dengan` `
dan('@')
dengan`@`
[ Array[1], Array[1] ]
, sementaraArray(2).fill(' ')
==>[' ',' ']
JavaScript (ES7), 200 byte
Versi ES6 untuk kemudahan pengujian:
sumber
Perl,
111110 byteTermasuk +1 untuk
-p
Berikan ukuran pada STDIN
snake.pl
:sumber
Batch, 563 byte
Penjelasan: Kasus khusus 1 sebagai sisa kode membutuhkan lebar ular setidaknya dua. Selanjutnya, hitung kuartal kuadrat terbesar (baik kuadrat tepat atau persegi panjang 1 lebih luas dari tinggi) yang luasnya kurang dari panjang ular. Ular akan digulung ke dalam persegi panjang ini mulai dari sudut kiri bawah dan berakhir dengan ekor di tengah, dan panjang yang tersisa akan berjalan di bawah bagian bawah persegi panjang. Persegi panjang sebenarnya dihasilkan dari penggantian string sederhana; sebagian besar waktu setiap garis dihasilkan dari garis sebelumnya dengan menggerakkan diagonal langkah 1, tetapi jelas ekornya juga harus ditangani, dan ada sedikit perbedaan tergantung pada apakah ketinggian persegi panjang itu genap atau ganjil.
sumber
Python 2.7, A BERHASIL 1230 byte
Saya baru mengenal python dan golf kode, tetapi saya merasa harus menjawab pertanyaan saya sendiri dan merajuk karena malu. Sangat menyenangkan mengerjakannya!
https://repl.it/Dpoy
sumber