Tulis sebuah program yang mengambil bilangan bulat N melalui stdin atau baris perintah.
Jika N adalah 0, satu huruf O
harus dicetak ke stdout.
Jika N positif , heliks ganda seni ASCII horizontal ini , yang digambar dengan lebar N segmen, harus dicetak.
Jika N adalah 1, outputnya adalah:
/\
O O
\/
Jika N adalah 2, outputnya adalah:
/\ /\
O / O
\/ \/
Jika N adalah 3, outputnya adalah:
/\ /\ /\
O / / O
\/ \/ \/
Jika N adalah 4, outputnya adalah:
/\ /\ /\ /\
O / / / O
\/ \/ \/ \/
Pola berlanjut dengan cara yang sama persis untuk N. yang lebih besar. Perhatikan bahwa garis miring ( /
) harus digunakan di semua tempat heliks bersilangan, kecuali untuk O
ujungnya.
Jika N negatif , heliks ganda art ASCII vertikal ini , ditarik -N segmen tinggi, harus dicetak.
Jika N adalah -1, outputnya adalah:
O
/ \
\ /
O
Jika N adalah -2, outputnya adalah:
O
/ \
\ /
\
/ \
\ /
O
Jika N adalah -3, outputnya adalah:
O
/ \
\ /
\
/ \
\ /
\
/ \
\ /
O
Jika N adalah -4, outputnya adalah:
O
/ \
\ /
\
/ \
\ /
\
/ \
\ /
\
/ \
\ /
O
Pola berlanjut dengan cara yang sama persis untuk N. yang lebih kecil. Perhatikan bahwa garis miring ( \
) harus digunakan di semua tempat heliks bersilangan, kecuali untuk O
ujungnya.
Detail
- Alih-alih sebuah program, Anda dapat menulis fungsi yang mengambil N sebagai integer dan mencetak hasilnya secara normal atau mengembalikannya sebagai string.
- Output untuk N apa pun secara opsional dapat memuat baris tambahan.
- Garis output apa pun untuk N apa pun dapat secara opsional mengandung 4 atau lebih sedikit ruang tambahan.
- Seharusnya tidak pernah ada ruang utama yang bukan bagian dari pola yang ditentukan.
- Kode terpendek dalam byte menang.
sumber
<spc>O<spc>
atau\nO\n
. Apakah spasi putih terkemuka yang tidak perlu diizinkan?print "."
Perbesar untuk melihat helix. * nodnod *Jawaban:
CJam,
56 55 53 5250 byteLihatlah ukuran itu! Penyebab utama adalah
N = 0
kasus khusus dan\
bukan/
pada helix vertikal.Inilah cara kerjanya:
Kode ini dibagi menjadi tiga bagian:
X0>"\/"=" / \\\ / "+
memberikan salah satu"/ / \\\ / "
atau"\ / \\\ / "
yang penting karena heliks hanya terdiri dari alternatif"/ \"
dan"\ /"
bergabung dengan salah satu" / "
atau" \ "
. Misalnya, jika Anda menganggap input sebagai2
, maka string terakhir yang diulang Anda akan"/ / \\ / / / \\ / "
(tanpa melarikan diri). Ini jelas memiliki ekstra/
di awal dan ruang tambahan di akhir.2
, string akhir yang diinginkan tanpa baris baru adalah" O / \\\ / / / \\\ / O"
, tetapi setelah titik di atas, kita hanya punya"/ / \\\ / / / \\\ / "
. Jadi kami menghapus karakter pertama, tambahkan spasi dan'O
di awal dan yang lain'O
di akhir. Lalu kami akhirnya membaginya menjadi 3 bagian'O
(untuk input 0 huruf)Cobalah online di sini
sumber
JavaScript (ES6), 126
132 133Menggunakan string templated, baris baru dihitung.
Lebih mudah dibaca
sumber
n=>(
dilakukan? Saya belum pernah melihat atau menggunakan operator itu sebelumnya.Pyth, 52 byte
Demonstrasi.
Penjelasan:
Bagian pertama
M[Jj"/\\"*hGdjP*G+*2dH*2\O_J)
,, mendefinisikan fungsig
,, yang mengambil dua input. Input pertamaG
,, adalah jumlah pengulangan yang digunakan. Ini adalah nilai absolut dari input. Input keduaH
,, adalah karakter untuk ditempatkan di pusat spiral.Fungsi mengembalikan daftar 3 elemen, yang terdiri dari 3 baris spiral positif, dan 3 kolom spiral negatif.
Elemen pertama didefinisikan oleh
Jj"/\\"*hGd
.*hGd
adalah stringG+1
spasi.j"/\\"*hGd
bergabung dengan string itu dengan"/\"
sebagai delimeter. DiJ
awal menyimpan nilai yang dihasilkan untuk digunakan di masa depan.Elemen kedua adalah
jP*G+*2dH*2\O
. Kita mulai dengan+*2dH
. Ini adalah dua spasi diikuti oleh karakter input. Kemudian, kami ulangi stringG
kali dengan*G
. Kemudian, kami menghapus karakter terakhirnya denganP
. Akhirnya, kami mengelilingi string ini dengan duaO
karakter, denganj ... *2\O
.Elemen ketiga dihasilkan dengan
_J
. Ini hanyalah kebalikan dari baris pertama.Bagian terakhir,
?jb?gQ\/>Q0msdCg_Q\\Q\O
memilih antara tiga kemungkinan yang berbeda, positif, negatif dan nol. Kondisi if-then pertama aktifQ
, input. Kondisi kedua aktif>Q0
, apakah inputnya positif.Jika
Q
nol,,\O
karakterO
, dicetak.Jika
Q
bukan nol, kami bergabung dengan hasil terner kedua pada baris baru dan mencetaknya, denganjb
. JikaQ
positif, daftar bergabung dan dicetakgQ\/
,g(Q,"/")
.Jika
Q
negatif, daftar yang bergabung dan dicetak adalahmsdCg_Q\\
. Kita mulai dengang_Q\\
, yaitug(-Q,"\")
. Lalu kami memindahkan baris dan kolom denganC
.msd
mengubah tupel karakter yang dihasilkan menjadi string, siap untuk bergabung pada baris baru dan dicetak.sumber
Python 2, 118
Buat double helix vertikal dari daftar string dan transpos untuk mendapatkan yang horizontal. Saya yakin itu bisa diperbaiki.
sumber
Java,
500488 byteCoba pertama saya, dan sayangnya itu 10 * lebih lama dari pemimpin saat ini :(. Adakah yang punya tips (selain menggunakan bahasa yang berbeda)?
sumber
import System.*
menghemat sesuatu atau menulisSystem
setiap kali?import static java.lang.System.*;
atau dia bisa menyimpan aliran output standar sebagai variabel (meskipun, saya tidak tahu apakah itu akan menyimpan atau menghalangi dalam kasus ini, belum diperiksa).sc
variabel karena hanya dipanggil sekali. Memotong 14 byte.class M{public static void main(String[]a){int n=new Integer(new java.util.Scanner(System.in).next()),i=n;if(n>0){for(;i-->0;)o(" /\\");o("\no");for(i=n;i-->1;)o(" /");o(" o\n");for(i=0;i++<n;)o(" \\/");}else if(n<0){o(" o \n");for(i=0;i++<~n;)o("/ \\\n\\ /\n \\ \n");o("/ \\\n\\ /\n o \n");}else o("o\n");}static<T>void o(T s){System.out.print(s);}}
( 352 bytes ) Cobalah secara online.n->{int i=n;if(n>0){for(;i-->0;)o(" /\\");o("\no");for(i=n;i-->1;)o(" /");o(" o\n");for(i=0;i++<n;)o(" \\/");}else if(n<0){o(" o \n");for(i=0;i++<~n;)o("/ \\\n\\ /\n \\ \n");o("/ \\\n\\ /\n o \n");}else o("o\n");};<T>void o(T s){System.out.print(s);}
Coba online.Haskell, 156 byte
Anda kemudian dapat menuliskannya sebagai:
sumber
1<2
atau sesuatu seperti itu alih-alihTrue
, dan menyimpan satu byte.C #,
242241238230222219 BytesDidorong oleh komentar Martin , inilah upaya pertama saya untuk sesuatu seperti ini:
Lebih mudah dibaca:
sumber
C #
199197196 byteVersi tidak disatukan:
Idenya adalah untuk membangun tampilan horizontal dari tampilan vertikal dengan merender matriks karakter yang ditransposisikan.
sumber
for(;m>0;--m)
kefor(;m-->0;)
dalam kedua loop"\n/ \\\n\\ /\n "
juga dapat dipersingkat sesuai metode dalam jawaban saya - yaitu penggunaan@"..."
, di mana setiap "\\" menjadi "\" dan setiap "\ n" menjadi baris baru yang sebenarnyabool u
untukvar u
seluruh byte lain :)Python 3, 118 byte
Pengajuan kode golf pertama saya, jadi mungkin tidak mengesankan sama sekali.
Hanya menggunakan Python ... jika ... yang lain ... operator ternary untuk memisahkan tiga skenario. Itu memberikan string yang terbuat dari pengulangan beberapa string kecil beberapa kali untuk dicetak.
sumber
Julia, 229 byte
Oh man, ini adalah cara, cara terlalu besar. Ini adalah jawaban terpanjang sejauh ini dengan selisih yang besar. Saya mungkin bisa menghemat banyak dengan mengembalikan string daripada mencetaknya, atau dengan menghindari pendekatan matriks sama sekali. Saya akan bereksperimen dengan itu nanti.
Ini menciptakan fungsi lambda yang mengambil integer tunggal dan mencetak heliks ganda yang diformat dengan tepat. Untuk menyebutnya, berikan nama, mis
f=n->(...)
.Penjelasan + tidak dikumpulkan:
Beberapa contoh:
sumber
Python 3, 135 byte
Cobalah online di sini
sumber
Perl, 91
97Transposing terbukti terlalu mahal pada akhirnya.
Solusi sebelumnya:
Ujilah aku .
sumber
/^0/?O:etc
dengan$_?etc:O
$".="\23"^"\\ / \\ \\ / "x abs."O ";print/-/?$":/^0/?O:map{reverse$/,$"=~/(.).{$_}$/mg}0..2
Skema, 379 byte
Upaya pertama saya di golf kode dan, sayangnya, salah satu yang terpanjang. :(
Tidak Diunggulkan:
sumber
Jawa, 282
Pendekatan pertama saya, dengan nama variabel yang sangat bagus:
Saya tidak tahu mengapa saya melakukan ini. Pasti ada rekreasi.
sumber
Jawa, 317
Upaya golf kode pertama saya.
sumber
Python 3, 165 byte
Cobalah online di sini .
sumber
Perl,
193197187180166163B1 byte penalti untuk -n commandline switch. Jalankan dengan
echo 1|perl -M5.10.0 -n scratch.pl
:Dengan spasi putih:
sumber
-M5.10.0
tidak berkontribusi terhadap jumlah byte Anda?say
adalah berguna untuk kode golf ...PHP, 341
Versi tidak disatukan
sumber
JAWA 377
384bytesumber
C ++
269262258sumber
R,
228201Upaya pertama saya di kode golf. Saya pikir itu berhasil tetapi tidak halus.
sumber
Groovy,
142134129125120 120118Akhirnya diikat dengan python 2!
sumber
Arang ,
282422 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Cetak bagian atas
O
, dan biarkan kursor satu spasi ke bawah dan ke kiri.Cetak string
/
,\
dan\
dan ulangi untuk nilai angka absolut dari input.Pindah kembali dari yang terakhir
\
.Refleksikan untuk membuat sisi kanan helix. Saya melakukan ini di sini karena kalau tidak,
↗
tidak akan parse jelas.Timpa yang terakhir
\
denganO
.Jika input positif maka putar kanvas.
sumber
Kanvas ,
333230 byteCoba di sini!
Penjelasan:
sumber
C ++, 352
Sama sekali tidak jawaban terpendek, tetapi yang pertama di C ++ sejauh ini :)
Ini dia di C ++ Shell dengan spasi untuk menguji
sumber
perl 156
Usaha ke depan yang cukup lurus, golf kedua saya. Saya pikir baris baru dihitung sebagai 1 byte, kan?
Sekarang untuk mencari tahu bagaimana cara menggabungkan semua terner itu bersama-sama .. Saya punya banyak ruang untuk perbaikan dengan yang ada di
:'';
mana - mana.sumber
C, 189 byte
Dengan spasi putih dan baris baru:
Beberapa catatan tentang pendekatan:
sumber
Perl, 184 byte
Saya pikir ini akan menjadi jauh lebih pendek! Mungkin ada beberapa hal sederhana yang bisa saya lakukan untuk menghemat beberapa byte. Sudah lima tahun sejak saya memprogram dengan serius di Perl!
sumber
PHP, 155
sumber
J ,
67 59 5551 byteCobalah online!
sumber