Buat kuadrat ukuran yang meningkat dengan mereplikasi kode awal


45

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 CODEdan sudah dicetak:

    0
    
  • Kemudian, masukkan CODEdi tengah: kode Anda menjadi COCODEDEdan itu harus dicetak:

    00
    00
    
  • Masukkan kembali CODEdi tengah: kode Anda menjadi COCOCODEDEDE 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.


1
Saya harus mengakui bahwa saya terinspirasi oleh pertanyaan quine yang diposting sebelumnya . Jika orang berpikir itu terlalu dekat, saya dengan senang hati akan menghapus ini. Maaf juga jika saya melakukan kesalahan, saya masih belum terlalu berpengalaman dengan aturan di sini. :)

2
Selamat datang di PPCG! Saya sarankan menggunakan Sandbox untuk tantangan masa depan Anda.
user202729

7
Selamat datang di situs ini! Penggunaan luar biasa dari tantangan lain untuk inspirasi tanpa jatuh ke dalam perangkap dupe :)
Shaggy

Program pembantu Anda tidak berfungsi untuk program dengan banyak baris. Bagaimana dengan versi modifikasi ini dari pertanyaan lain?
Jo King

1
@ user77954 Tapi kode brainfuck saya lebih pendek dari python Anda :( (adakah yang pernah mengatakan itu sebelumnya?)
Jo King

Jawaban:


41

Pyth , 2 byte


5

Cobalah online! Juga Cobalah dua kali lipat , tiga kali lipat !

Bagaimana cara kerjanya?

\nadalah 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.


6
Sialan, itu pendek ...
ETHproduksi

Bukti optimalitas (: P): Karena jumlah byte harus genap, dan tidak boleh negatif, jumlah byte minimum yang mungkin adalah 0 byte. Tepat ada 1 program 0 byte, yang tidak memenuhi tugas. Oleh karena itu, 2 byte optimal.
Tn. Xcoder

10
Semua orang (terutama pemilih HNQ), ikut serta memilih jawaban lain dan hindari efek FGITW.
user202729

25

JavaScript (ES6), 42 32 30 byte

s=[this.s]+0;  console.log(s);

Iterasi kedua:

s=[this.s]+0;  s=[this.s]+0;  console.log(s);console.log(s);

Ini berfungsi dengan menambahkan a 0ke ssetiap kali paruh pertama kode dijalankan, dan mencetak ssendiri setiap kali babak kedua dijalankan. Mengambil keuntungan dari empat kebiasaan JavaScript:

  1. Lingkungan saat ini dapat disebut dengan this. Hal ini memungkinkan kita untuk melakukan this.sdi tempat s.
  2. Saat mengakses properti yang belum didefinisikan pada objek, alih-alih melempar kesalahan, JavaScript kembali undefined.
  3. Array plus angka mengembalikan sebuah string. [1,2,3] + 4 === "1,2,34"
  4. Ketika meringkas array, undefineddikonversi 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 alertalih-alih console.logdiizinkan, kami dapat menyimpan 4 byte lebih banyak dengan memperpendek paruh kedua.


Selamat, lulus ujian yang telah saya buat!

1
... Cerdik! :)
Shaggy



13

Python 2 , 22 byte

i=0;i+=1; i
print'*'*i

Cobalah online!

Dua kali lipat:

i=0;i+=1; ii=0;i+=1; i
print'*'*i
print'*'*i

Perhatikan bahwa babak kedua dimulai dengan karakter baris baru.


9

C (gcc) , 170 168 96 80 72 70 byte

Versi yang jauh lebih pendek. Masih berharap saya bisa menemukan solusi tanpa preprocessor.

i;main(n){for(;i++<n;)printf
#if 0

#endif
(" %*c",n=__LINE__/4, 10);}

Cobalah online!

Versi lama 168 byte:

#ifndef A
#define A p(c){putchar(c);}j,n;main(i){for(
#else
#define A n++,
#endif
A



#ifndef B
#define B i=++n;i--;p(10))for(j=n;j--;)p(64);}
#else
#define B
#endif
B

Cobalah online!



@ user202729 ah, ya. Pikir saya memperbaiki kesalahan ketik tetapi memperkenalkan bug. Mengembalikan.
gastropner

8

Python 2 , 30 byte

False+=1      ;print'*'*False;

Cobalah online! , Ke - 2 dan ke - 3 Iterasi

Ini memanfaatkan fakta bahwa bools di Python pada dasarnya adalah ints dan nama-nama Falsedan Truedipindahkan di Python 2.

Python 1 , 32 byte

exit=exit+'*'  ;print exit[30:];

Cobalah online! , Ke - 2 dan ke - 3 Iterasi

Dalam Python 1 string bawaan exitdan quitada untuk memberi tahu pengguna shell interaktif cara keluar. Nilai standarnya adalah "Use Ctrl-D (i.e. EOF) to exit.".


1
Saya akan menyarankan n=False+=1;print'*'*n;, tapi saya selalu lupa bahwa itu bukan fitur Python ...
ETHproduksi

6

Arang , 6 byte

⊞υωLυ⸿

Cobalah online! Penjelasan:

  ω     Predefined empty string (any variable would do here)
 υ      Predefined initially empty list
⊞       Push

υ berakhir dengan jumlah pengulangan yang panjang.

    υ   List
   L    Length
        Implicitly print as a row of `-`s
     ⸿  Move to start of next line




5

Brain-Flak , 74 byte

(((((()()()){}){}){}){})((()()()()()<>){})<>([]){({}[()]<(({})<>)<>>)}{}<>

Cobalah online!

Coba dua kali lipat dan tiga kali lipat .

Penjelasan

(((((()()()){}){}){}){}) # push 48 ("0") onto first stack
((()()()()()<>){})       # push 10 (\n) onto second stack
<>([]){({}[()]<          # a number of times equal to the height of the first stack:
  (({})<>)<>             #   copy the top of the first stack to the second stack
>)}{}<>                  # cleanup and return to second stack

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 mendorong 5. Dengan menambahkan dua byte lagi, saya dapat memindahkan <>sehingga semua kemajuan menuju mendorong 10berada di tumpukan ketiga. Sebagai bonus, ini juga membuat kuadrat yang dihasilkan lebih estetis.



4

tinylisp , 112 byte

(load library) (d N((q((x)(i x(inc x)1)))(v(h(t(t(h(t(q())))))))))(join(repeat-val(string(repeat-val 42 N))N)nl)

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 Ntanda bintang, kemudian daftar Nstring tersebut, kemudian bergabung dengan daftar di baris baru. Hasilnya ditampilkan dengan baris baru tambahan.


3

R , 44 byte

F=F+1;T=TRUE*TRUE+12;
write(strrep(1,F),"");

Cobalah online!

Mencetak dengan baris baru yang tertinggal. The T=TRUE*TRUE+12hanya untuk pad panjang.

Coba dua kali lipat dan coba tiga kali lipat .


Anda dapat menghilangkan 2 byte dengan menghapus titik koma. Saya kira ada ruang di akhir baris pertama, yang dapat Anda ganti dengan #: F=F+1;T=TRUE*TRUE+12#<newline>write(strrep(1,F),"")
Andreï Kostyrka

@ AndreïKostyrka itu akan menjadi 43 byte yang bahkan tidak, sayangnya.
Giuseppe

3

Julia 0,6 , 29 byte

Semua ide saya lebih lama dari mengadaptasi solusi python pintar xnor.

i=0;i+=1;    i
println("0"^i)

Menjadi

i=0;i+=1;    ii=0;i+=1;    i
println("0"^i)
println("0"^i)

Cobalah online!


3

SNOBOL4 (CSNOBOL4) , 130 68 byte

Sekarang tanpa komentar! Lihat riwayat edit untuk penjelasan tentang algoritma lama.

	X =X + 1
	A =ARRAY(X,DUPL(1,X));
I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

Cobalah online!

Coba dua kali lipat dan tiga kali lipat

Penjelasan:

	X =X + 1		;* increment X
	A =ARRAY(X,DUPL(1,X));	;* create an x-length array with 1 repeated x times for each element
I	I =I + 1		;* for i < x
	OUTPUT =A<I>	:S(I)	;* output a[i]
END

Karena ENDlabel diperlukan dan apa pun setelah ENDlabel pertama diabaikan, kami mendapatkan dua keuntungan untuk tantangan ini:

  • operasi di paruh pertama program diulangi Xkali untuk Xpengulangan
  • hanya akan ada (untuk penerjemah) satu salinan dari babak kedua, termasuk label .

Ini 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

	X =X + 1
	A =ARRAY(X,DUPL(1,X));

yang, ketika diulangi, menambah Xjumlah kali yang tepat, dan membuat ARRAY Aindeks dengan dari 1ke Xdan di mana setiap elemen Aadalah string yang 1diulang Xkali.

Maka tidak peduli berapa kali program itu diulang, penerjemah hanya melihat:

I	I =I + 1
	OUTPUT =A<I>	:S(I)
END

yang merupakan program SNOBOL khas yang mencetak elemen Asatu per satu sampai indeks keluar dari batas, kemudian menghentikan program.

;adalah terminator jalur opsional yang biasanya disediakan untuk satu baris EVALatau CODEpernyataan yang cukup rapi sehingga jumlah byte menjadi 68 dan menandai titik setengahnya, memungkinkan kode ditambahkan di sana.




1

Zsh , 10 byte

s+=0
<<<$s

Coba suite tes lengkap secara online!

... ya, ini sedikit lebih baik. Tambahkan ke string N kali, lalu cetak N kali. Ternyata <<<foo<<<foobekerja dengan baik.


Zsh , 64 byte

Karakter yang digunakan: (spasi).

f(){printf '%*s\n' $1}
:<<'E'

E
repeat $[i=LINENO/3];f $i
exit

Coba suite tes lengkap secara online!

Titik tengah berada di antara baris kedua Edan baris baru yang mengikutinya. Sebuah heredoc akan berakhir ketika ada Eon-line dengan sendirinya, yang terjadi tepat di tengah-tengah kode.


lol @ "sedikit" peningkatan. bisa juga mengekspresikannya sebagais+=0;<<<$s
roblogic
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.