Tulis blok teks persegi panjang yang bila disusun menjadi karpet Sierpinski , menggunakan blok ruang berukuran sama untuk bagian yang kosong, buat program yang menampilkan jumlah iterasi karpet.
Misalnya, jika blok teks Anda
TXT
BLK
kemudian jalankan program
TXTTXTTXT
BLKBLKBLK
TXT TXT
BLK BLK
TXTTXTTXT
BLKBLKBLK
harus dikeluarkan 1
karena bentuk program mewakili iterasi pertama karpet Sierpinski.
Begitu pula berlari
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXT TXT TXT TXT
BLK BLK BLK BLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
harus menampilkan 2 karena ini adalah bentuk iterasi karpet Sierpinski kedua.
Menjalankan blok teks apa adanya
TXT
BLK
harus dikeluarkan 0
karena dapat dianggap iterasi nol.
Ini harus bekerja untuk semua iterasi lebih lanjut. (Setidaknya secara teoritis, anggap komputer memiliki memori dan semuanya.)
Detail
- Program mungkin tidak membaca atau mengakses informasi tentang kode sumbernya. Perlakukan ini seperti tantangan quine yang ketat.
- Output menuju ke stdout atau alternatif serupa. Hanya menampilkan nomor dan baris tambahan opsional. Tidak ada input.
- Blok teks dapat berisi karakter apa pun yang tidak dianggap sebagai terminator garis . Blok teks dapat berisi spasi.
- "Ruang kosong" di karpet harus seluruhnya terdiri dari karakter ruang .
- Anda dapat mengasumsikan bahwa semua program memiliki baris tambahan.
Anda dapat menggunakan potongan tumpukan ini untuk menghasilkan karpet untuk blok teks yang diberikan di setiap iterasi:
<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>
Mencetak gol
Kiriman yang blok teks awalnya terkecil menurut area (lebar kali tinggi) adalah pemenangnya. The TXT\nBLK
contoh adalah 3 oleh 2 untuk skor 6. (Pada dasarnya menang kode terpendek, maka tag kode-golf.)
Tiebreaker pergi ke kiriman yang menggunakan karakter berbeda paling sedikit dalam blok teks mereka. Jika masih terikat, jawab diposting kemenangan pertama.
sumber
Perl, 30 (15 × 2)
Pertama-tama, saya akan mengklaim bahwa 10 iterasi adalah batas yang masuk akal, bukan 2 32 . Setelah 10 iterasi, sebuah program yang terdiri dari N byte akan diperluas ke ( N × 3 20 ) byte (plus jeda baris), yang lebih dari 3 gigabita bahkan untuk N = 1. Arsitektur 32-bit benar-benar tidak dapat menangani 11 iterasi. (Dan jelas tidak ada cukup partikel di alam semesta selama 2 32 iterasi).
Jadi, inilah solusi saya:
Ini bekerja dengan menambah variabel
$n
pada baris pertama dan menghitung logaritma pada setiap langkah. Baris kedua mencetak bagian integer dari logaritma ini dan berhenti.Logaritma sederhana ke basis e (2,718 ..) cukup dekat untuk memberikan hasil yang benar untuk 10 iterasi pertama.
sumber
Golfscript, 9 * 2 = 18
(Perhatikan bahwa baris pertama memiliki spasi tambahan untuk membuatnya persegi panjang)
Saya tidak dapat menemukan fungsi log untuk Golfscript, jadi
base
harus saya lakukan.Golfscript dimulai dengan string kosong, jadi
0+
hanya menambah panjang string sebesar 1 (dengan koersi). Pada saat baris pertama selesai, tumpukan akan memiliki string panjang3^n
, yang kita ambil basis log 3 sebelum kita super komentar.n
kemudian dicetak secara otomatis.sumber
,
di baris kedua. Baris pertama:0or)
; baris kedua3base,(}
. Target jelas lainnya adalah(
pada baris kedua. Ini rumit, tetapi juga dapat dihapus dengan mengganti baris pertama dengan1+~abs(
untuk persegi panjang 7 * 2.C, 12x8 = 96
Terinspirasi oleh @ciamej, saya telah menguranginya. Menggunakan membagi itu dengan 3 trik, ditambah kesadaran bahwa karpet secara efektif mengubah if menjadi loop sementara.
Kode diuji pada gcc / Ubuntu untuk iterasi hingga 3.
Solusi Sebelumnya: C, 11x12
Bukan pemenang ukuran, tapi hei, ini C.
Ia menemukan log2 dari blockcount dengan bitshifting, kemudian menggunakan beberapa angka ajaib dan pemotongan int untuk memperkirakan log3. Matematika harus bekerja hingga 26 iterasi (angka 42 bit).
sumber
CJam, 9 byte
Gagasan menggunakan
]
berasal dari Pengoptimal, tetapi menggunakan metode yang sangat berbeda untuk menghitung.Cobalah online
Bagaimana itu bekerja:
Dua solusi 9 byte lainnya
sumber
Python 2, 15 * 3 = 45
Implementasi lain dari ide count-first-row-then-log-three-and-exit. Mungkin masih bisa bermain golf sedikit lebih adil.
sumber
bc, 2 * 16 + 1 = 33
+1 ekstra dalam skor adalah karena
-l
opsi bc diperlukan:sumber
Golfscript, 7 * 2 = 14
Ini terinspirasi oleh jawaban Sp3000 , dan khususnya oleh keinginan untuk mengoptimalkan baris kedua yang panjang.
3base,
adalah sesingkat logaritma basis-3 akan masuk GS, dan super-komentar}
jelas optimal.Apa yang diperlukan untuk baris pertama adalah memetakan string kosong
''
dari stdin awal ke 0, dan kemudian memetakan setiap integer non-negatif ke penggantinya. Dengan cara ini kita mengakhiri baris pertama dengan3^n - 1
di stack, dan3base,
tidak memerlukan pengurangan.sumber
C, 13x8
sumber
Perl, 76
Saya tahu mungkin tidak ada gunanya memposting ini karena sudah dipukuli sepenuhnya, tapi ini solusi saya saat ini.
sumber
> <> (Ikan), 12 * 3 = 36
Solusi yang lebih mudah> <>:
Kami pertama kali menjalankan baris atas dari blok teratas.
'v'00p
menempatkanv
pada posisi paling pertama dari seluruh program mengarahkan pointer program ke bawah ketika kembali ke awal setelah mencapai akhir baris. Sebelum itu setiap blok mendorong 0 dan panjang tumpukan +1 ke atasnya. (tumpukan akan0 2 0 4 0 6 ...
)Pada paruh pertama dari kedua dan ketiga kita menghitung berapa kali kita dapat membagi elemen tumpukan atas sebelum kita mendapatkan 2 (kita menyimpan ini di elemen kedua ke atas).
Pada akhirnya kami menampilkan elemen kedua ke atas tumpukan.
sumber
Lua, 3 * 17 = 51
Strategi yang sama seperti kebanyakan orang:
sumber
PHP, 22 × 2 = 44
27 × 2 = 54Just another take pada count-log3-out. Tidak terlalu kecil, tapi golf pertama saya;)
sumber