Tantangan
Membangun Set Cantor N-Leveled .
Set terner Cantor dibuat dengan berulang kali menghapus pertiga tengah terbuka dari satu set segmen garis.
Program menerima satu parameter N
(angka integer) dan kemudian mencetak (dalam konsol atau dengan cara serupa) Cantor Set level N. Hasil cetak hanya dapat berisi karakter undescore ( _
) dan spasi. Parameter bisa positif atau negatif dan tanda menunjukkan orientasi konstruksi Cantor Set: Jika N > 0
Cantor Set dibangun ke bawah dan jika N < 0
Cantor Set dibangun ke atas. Jika N = 0
kemudian program mencetak satu baris ( _
).
Sebagai contoh:
N = 2
_________
___ ___
_ _ _ _
N = -2
_ _ _ _
___ ___
_________
N = 3
___________________________
_________ _________
___ ___ ___ ___
_ _ _ _ _ _ _ _
N = -3
_ _ _ _ _ _ _ _
___ ___ ___ ___
_________ _________
___________________________
Kriteria menang
Karena ini merupakan tantangan kode golf, kode terpendek menang.
Diedit: Ubah 0 input dengan saran ugoren.
_
(tapi cetak ke bawah saat mendapatkan -0).Jawaban:
GolfScript,
49 4240 karakterDengan terima kasih kepada hammar untuk 42-> 40.
Upaya terbaik saya pada pendekatan yang lebih banyak angka-teoretis sayangnya jauh lebih lama:
atau
dan saya menduga bahwa panjang
base
danzip
akan membuat tidak mungkin untuk mengejar ketinggalan.sumber
~.abs.@/\.3\?'_'*\{.3%..,' '*\++}*](%n*
39 karakter, tetapi macet saat input0
. :-(n/abs(n)
untuk mendapatkannyasignum(n)
.Python,
116 113 104103 karakterAlgoritma yang lebih lama mencapai 113 karakter
sumber
Ruby (97)
Berdasarkan versi python Steven Rumbalski:
Upaya sebelumnya, keduanya sama-sama panjang (112)
Buat garis dari bagian:
Mulai dengan satu baris, buat lubang di dalamnya:
sumber
Perl, 93 karakter
Saya pikir saya akan mencoba melihat seberapa baik solusi GolfScript Peter Taylor akan port ke Perl. Fitur-fitur penting termasuk penggunaan
sort
alih - alihreverse
untuk menyimpan tiga karakter, menggunakan fakta bahwa ruang seperti sebelumnya_
.sumber
Common Lisp,
217210 karakterDiperluas:
Saya pikir jika kode Lisp berhasil mengalahkan hitungan awal apa pun untuk bahasa lain (C, 219) Saya baik-baik saja :)
sumber
C (
163161 karakter)Pinjam beberapa trik dari jawaban ugoren , tetapi logika intinya sangat berbeda. Saya tidak bisa mengikuti jejaknya, jadi mungkin saja untuk melakukan hibridisasi dan menyimpan lebih banyak.
sumber
C,
219193179143136131 karakterMengikuti gagasan Petyer Taylor yang lain, ditambah peningkatan saya sendiri, menyelamatkan 6 lebih banyak.
Mengintegrasikan beberapa tips dari @PeterTaylor, ditambah menyalin fungsi utamanya, dengan sedikit perubahan, yang menyelamatkan karakter (apakah adil untuk menyalinnya? Karena kita berdua tidak akan memenangkan yang ini, saya kira itu tidak terlalu buruk).
Saya memikirkan peningkatan yang signifikan dalam cara rekursi saya bekerja, dan setelah melihat jawaban Peter Taylor, saya menerapkannya untuk mendapatkan kembali kepemimpinan. Ketika membaca jawabannya lagi, saya melihat bahwa saya melakukan hampir apa yang dia lakukan. Jadi ini sepertinya hibridisasi yang disarankannya.
Juga menyederhanakan loop
main
, menjaga panjang yang sama.Dan mengambil trik Peter untuk mencetak baris baru, bukannya
puts("")
- menyimpan karakter.Dihapus
int
dari deklarasi variabel - peringatan, tetapi menyimpan 4 karakter.Algoritma baru tidak menghitung 3 ^ x di muka, tetapi menggunakan satu loop untuk mencetak 3 ^ x karakter.
Dapat menyimpan satu lagi dengan mendefinisikan
int*v
, tetapi 64bit tidak akan berfungsi.Jumlah karakter tidak termasuk spasi putih (yang dapat dihapus).
Algoritma yang lebih lama, 219 karakter:
sumber
i
parameter, karena menggunakan global akan mengganggumain
.l--
akan menggangguo>=l
, dan saya harus menggantinya dengan>
(jadi mengapa saya menulisnya seolah itu hal yang buruk?) Saya juga bisa menyalin Andamain
, yang lebih sederhana dan lebih pendek dari milik saya.i
- Saya merindukan kenyataan bahwa saya benar-benar tidak lagi menggunakannya (saya pikir Anda maksud saya tidak lulus).p
Tampaknya saya cukup optimal sekarang, dan Andamain
lebih baik (saya tidak yakin itu optimal, tetapi tidak dapat memperbaikinya lebih lanjut). Jadi kecuali untuk struktur program baru yang cerdik, satu-satunya cara untuk pergi adalah salah satu dari kita menyalin kode yang lain.J,
44393837 byteGunakan iterasi untuk membangun set berikutnya dimulai dengan 1 (mewakili
_
) pada awalnya.Pemakaian
Penjelasan
sumber
@.
- mungkin, dikombinasikan dengan$:
, dapat bermanfaat di sini? Misalnya sesuatu seperti(zero case)`(positive case)`(negative case)@.*
, atau bahkan mungkin":@_:`(positive case)`(|."1@$:)@.*
.R ,
141 139137 byteCobalah online!
-15 byte terima kasih juga penggunaan Giuseppe
'('
sebagai fungsi identitas;write
alih-alihcat
mencetak hasil; penggunaan cerdas%x%
.-2 byte terima kasih kepada Kirill L. dengan menggunakan
c
alih-alih'('
sebagai fungsi identitas.sumber
%x%
? Mungkin ada beberapa masalah dengan mengambil baris bergantian mungkin ...kron
juga! Saya membayangkan ini harus bisa turun menjadi seperti 125 byte jika kita dapat menemukan pendekatan yang tepat.`(`
sebagai fungsi identitas sehingga Anda dapat menggunakanwrite
secara langsung alih-alihcat
dan satufor
lingkaran. 141 byte(
bisa digunakan dengan cara ini, atau yangif
dapat digunakan untuk memilih dari dua fungsi. Dan saya akan mulai menggunakan tulis ... menyimpan banyak "\ n".Python,
177164 karaktersumber
input
asint
. Dua baris terakhir Anda dapat disingkat menjadiprint"\n".join(r[::N>0 or-1])
Perl, 113 karakter
Diperluas:
sumber
JavaScript 121 byte
Fungsi rekursif dalam, kemudian urus output mundur jika diperlukan
Kurang golf
Uji
sumber
Batch,
265262242236235 byteSunting: Disimpan
1219 byte berkat @ l4m2. Disimpan 8 byte dengan menghapus%a%
variabel yang tidak perlu .sumber
set c=%n%,-1,0 [LF] if %n% lss 0 set c=0,1,%a% [LF] for /l %%i in (%c%)do call:l %%i
?JavaScript (Node.js) , 148 byte
Cobalah online!
sumber
Python 2 , 102 byte
Cobalah online!
sumber
Prolog (SWI) ,
265232213 byteCobalah online!
sumber
PowerShell , 111 byte
Cobalah online!
Kurang bermain golf:
sumber