Tugas Anda adalah menulis program dengan panjang genap , yang mencetak kotak ASCII-art (dijelaskan di bawah), yang menambah panjang sisinya sebesar 1 unit setiap kali kode sumber asli disisipkan di tengah kode saat ini.
Cukup sulit bagi saya untuk mendefinisikan tugas ini dengan sangat baik, jadi saya akan memberi Anda sebuah contoh:
Katakanlah kode awal Anda sudah
CODE
dan sudah dicetak:0
Kemudian, masukkan
CODE
di tengah: kode Anda menjadiCOCODEDE
dan itu harus dicetak:00 00
Masukkan kembali
CODE
di tengah: kode Anda menjadiCOCOCODEDEDE
dan harus dicetak:000 000 000
Dan seterusnya. Jawaban Anda secara teoritis harus bekerja setelah sejumlah iterasi, tetapi saya mengerti jika, karena keterbatasan kinerja bahasa, itu tidak dapat berjalan secara wajar di atas ambang batas tertentu.
Beberapa peraturan:
Anda dapat menggunakan ASCII yang dapat dicetak (32-127) sebagai karakter yang akan digunakan untuk kotak Anda. Pilihan Anda harus konstan (Anda harus menggunakan karakter yang sama untuk setiap iterasi).
Kuadrat keluaran awal harus memiliki panjang sisi 1 .
Kotak ascii-art didefinisikan sebagai string dengan garis N (dipisahkan oleh baris - baris N-1 / baris baru), dan dengan setiap baris yang berisi salinan N dari karakter yang dipilih.
Output Anda tidak diizinkan mengandung spasi kosong apa pun, selain baris tambahan tambahan.
Anda dapat menggunakan default untuk input dan output (program atau fungsi diizinkan, tetapi snippet tidak).
Bagian tengah kode Anda didefinisikan sebagai titik di mana kode sumber dapat dibagi menjadi dua bagian sehingga keduanya sama.
Jawaban Anda akan dinilai berdasarkan lama program asli Anda , dalam byte. Hitungan byte terendah menang. Jika ada seri, jawaban yang diajukan sebelumnya menang.
Anda dapat menggunakan program ini untuk menerapkan sisipan tanpa harus melakukannya dengan tangan.
Jawaban:
Pyth , 2 byte
Cobalah online! Juga Cobalah dua kali lipat , tiga kali lipat !
Bagaimana cara kerjanya?
\n
adalah perintah yang mencetak argumennya dengan baris baru, sambil mengembalikannya secara bersamaan. Jadi, setiap kali Anda membuat penyisipan, Anda mengubah bilangan bulat 5 menjadi angka yang mengandung N salinan dari 5 bersambung, dan baris baru terkemuka pada dasarnya memastikan itu dicetak beberapa kali, sehingga menjaganya tetap persegi.sumber
JavaScript (ES6),
423230 byteIterasi kedua:
Ini berfungsi dengan menambahkan a
0
kes
setiap kali paruh pertama kode dijalankan, dan mencetaks
sendiri setiap kali babak kedua dijalankan. Mengambil keuntungan dari empat kebiasaan JavaScript:this
. Hal ini memungkinkan kita untuk melakukanthis.s
di tempats
.undefined
.[1,2,3] + 4 === "1,2,34"
undefined
dikonversi ke string kosong, yang artinya[undefined] + 0 === "0"
.Disatukan, ini berarti bahwa kita dapat mengekspresikan babak pertama (menghasilkan string nol) hanya dalam 13 byte. Jika menggunakan
alert
alih-alihconsole.log
diizinkan, kami dapat menyimpan 4 byte lebih banyak dengan memperpendek paruh kedua.sumber
05AB1E , 2 byte
Cobalah online!
Port jawaban Pyth saya .
sumber
Python 2 ,
423828 byteCobalah online! . Anda juga dapat mencoba iterasi ke - 2 dan ke - 3
sumber
Python 2 , 22 byte
Cobalah online!
Dua kali lipat:
Perhatikan bahwa babak kedua dimulai dengan karakter baris baru.
sumber
C (gcc) ,
17016896807270 byteVersi yang jauh lebih pendek. Masih berharap saya bisa menemukan solusi tanpa preprocessor.
Cobalah online!
Versi lama 168 byte:
Cobalah online!
sumber
Python 2 , 30 byte
Cobalah online! , Ke - 2 dan ke - 3 Iterasi
Ini memanfaatkan fakta bahwa bools di Python pada dasarnya adalah ints dan nama-nama
False
danTrue
dipindahkan di Python 2.Python 1 , 32 byte
Cobalah online! , Ke - 2 dan ke - 3 Iterasi
Dalam Python 1 string bawaan
exit
danquit
ada untuk memberi tahu pengguna shell interaktif cara keluar. Nilai standarnya adalah"Use Ctrl-D (i.e. EOF) to exit."
.sumber
n=False+=1;print'*'*n;
, tapi saya selalu lupa bahwa itu bukan fitur Python ...Arang , 6 byte
Cobalah online! Penjelasan:
υ
berakhir dengan jumlah pengulangan yang panjang.sumber
Haskell , 68 byte
Cobalah online sekali , dua kali atau tiga kali .
Karena kemalasan Haskell ekspresi seperti yang di atas dianggap sebagai fungsi yang tidak mengambil argumen, sesuai pertanyaan Meta ini .
sumber
brainfuck ,
4434 bytedicoret 44 masih teratur 44; (
Cobalah online!
Coba dua kali lipat , tiga kali lipat . Lihat, tidak ada bantalan!
Mencetak kotak
U
. Itu terbelah di tengah-tengah 10+
s.sumber
Ruby, 18 byte
Cobalah online! Dua kali lipat! Tiga kali lipat!
sumber
Brain-Flak , 74 byte
Cobalah online!
Coba dua kali lipat dan tiga kali lipat .
Penjelasan
Titik istirahat ada di tengah
<>
di bagian "tekan 10". Memecah ini akan meninggalkan 5 pada tumpukan ketiga sampai kita mencapai babak kedua yang sesuai, di mana titik mendorong 10 akan melanjutkan tepat di tempat ia tinggalkan.Meskipun dimungkinkan untuk mendorong nilai ASCII yang dapat dicetak (spasi) dalam 22 byte, ini akan membuat pusat
<>
dieksekusi setelah mendorong5
. Dengan menambahkan dua byte lagi, saya dapat memindahkan<>
sehingga semua kemajuan menuju mendorong10
berada di tumpukan ketiga. Sebagai bonus, ini juga membuat kuadrat yang dihasilkan lebih estetis.sumber
tinylisp , 112 byte
Cobalah online! Juga dua kali lipat dan lima kali lipat .
Pendekatan "bangun string di babak pertama, cetak di babak kedua" yang diambil banyak bahasa tidak akan berfungsi di tinylisp, karena tidak ada variabel yang dapat berubah. Sebagai gantinya, kami melakukan beberapa kode serius bersarang.
Ketika salinan kedua kode dimasukkan, ia ditempatkan di dalam
(q())
, yang membungkusnya dalam daftar. Kemudian(h(t(t(h(t(...))))))
pelajari daftar itu untuk bagian selanjutnya(d N
.(v(...))
mengevaluasinya; kemudian kita meneruskannya ke fungsi yang tidak disebutkan namanya(q((x)(i x(inc x)1)))
, yang menambah nilai yang dihasilkan jika itu angka dan mengembalikan 1 jika itu daftar kosong. Hasil akhir di versi kode bersarang terluar ditugaskan untukN
. Intinya, kami telah membuat semacam rekursi aneh yang menghitung jumlah level bersarang.Bagian kedua dari kode kemudian membuat string
N
tanda bintang, kemudian daftarN
string tersebut, kemudian bergabung dengan daftar di baris baru. Hasilnya ditampilkan dengan baris baru tambahan.sumber
R , 44 byte
Cobalah online!
Mencetak dengan baris baru yang tertinggal. The
T=TRUE*TRUE+12
hanya untuk pad panjang.Coba dua kali lipat dan coba tiga kali lipat .
sumber
F=F+1;T=TRUE*TRUE+12#
<newline>write(strrep(1,F),"")
Julia 0,6 , 29 byte
Semua ide saya lebih lama dari mengadaptasi solusi python pintar xnor.
Menjadi
Cobalah online!
sumber
SNOBOL4 (CSNOBOL4) ,
13068 byteSekarang tanpa komentar! Lihat riwayat edit untuk penjelasan tentang algoritma lama.
Cobalah online!
Coba dua kali lipat dan tiga kali lipat
Penjelasan:
Karena
END
label diperlukan dan apa pun setelahEND
label pertama diabaikan, kami mendapatkan dua keuntungan untuk tantangan ini:X
kali untukX
pengulanganIni menunjukkan bahwa kita menggunakan pengulangan untuk paruh pertama, dan kemudian kita dapat menggunakan pendekatan pelabelan yang lebih "konvensional" untuk mengulangi waktu keluaran
X
.Paruh pertama adalah
yang, ketika diulangi, menambah
X
jumlah kali yang tepat, dan membuatARRAY
A
indeks dengan dari1
keX
dan di mana setiap elemenA
adalah string yang1
diulangX
kali.Maka tidak peduli berapa kali program itu diulang, penerjemah hanya melihat:
yang merupakan program SNOBOL khas yang mencetak elemen
A
satu per satu sampai indeks keluar dari batas, kemudian menghentikan program.;
adalah terminator jalur opsional yang biasanya disediakan untuk satu barisEVAL
atauCODE
pernyataan yang cukup rapi sehingga jumlah byte menjadi 68 dan menandai titik setengahnya, memungkinkan kode ditambahkan di sana.sumber
shortC ,
5644 byte-12 byte: tunggu ya saya menggunakan shortC mengapa tidak menggunakan beberapa hal C disingkat
Saya akan menggunakan standar C, tetapi itu membutuhkan
}
di akhir yang mengacaukan replikasi. shortC menyisipkannya di EOF secara implisit.sumber
Perl 5 , 25 byte
24 byte kode +1 untuk
-p
.Menghargai bahwa Anda mungkin tidak ingin mengizinkan bendera commandline, beri tahu saya jika ini tidak valid.
Cobalah online!
sumber
Zsh , 10 byte
Coba suite tes lengkap secara online!
... ya, ini sedikit lebih baik. Tambahkan ke string N kali, lalu cetak N kali. Ternyata
<<<foo<<<foo
bekerja dengan baik.Zsh , 64 byte
Karakter yang digunakan:
(spasi).
Coba suite tes lengkap secara online!
Titik tengah berada di antara baris kedua
E
dan baris baru yang mengikutinya. Sebuah heredoc akan berakhir ketika adaE
on-line dengan sendirinya, yang terjadi tepat di tengah-tengah kode.sumber
s+=0;<<<$s