Pertimbangkan kuadrat karakter ASCII yang dapat dicetak (titik kode 0x20 hingga 0x7E) untuk panjang sisi N , seperti yang berikut (di sini, N = 6 ):
=\
g \
7
m+y "g
L ~
e> PHq
Kami juga mengharuskan setiap baris dan setiap kolom mengandung setidaknya 1 spasi dan 1 karakter non-spasi . (Contoh di atas memuaskan ini.)
Kami mendefinisikan negatif dari persegi seperti itu, menjadi persegi dengan ukuran yang sama, di mana setiap ruang diganti dengan non-ruang dan sebaliknya. Misalnya, berikut ini akan menjadi negatif yang valid dari contoh di atas:
1234
a b cd
ZYXWV
!
{} [ ]
?
Pilihan karakter non-spasi tidak relevan (asalkan karakter tersebut berasal dari rentang ASCII yang dapat dicetak).
Tantangan
Anda harus menulis sebuah program, dengan kode sumber kuadrat dengan panjang sisi N> 1 , yang mencetak negatif dari dirinya sendiri ke STDOUT. Ruang - ruang tambahan harus dicetak. Anda mungkin atau mungkin tidak mencetak satu baris baru.
Aturan quine yang biasa juga berlaku, jadi Anda tidak boleh membaca kode sumber Anda sendiri, secara langsung atau tidak langsung. Demikian juga, Anda tidak boleh menganggap lingkungan REPL, yang secara otomatis mencetak nilai dari setiap ekspresi yang dimasukkan.
Pemenangnya adalah program dengan termurah panjang sisi N . Dalam hal seri, pengajuan dengan karakter non-spasi paling sedikit dalam kode sumber menang. Jika masih ada seri, jawaban paling awal menang.
sumber
Jawaban:
CJam, 4 x 4 (8 tanpa spasi)
Cobalah online di juru bahasa CJam .
Keluaran
Bagaimana itu bekerja
L
mendorong array kosong dan_
mendorong salinannya.Blok
mendorong blok itu di tumpukan.
_
mendorong salinan blok kode danp
mencetaknya, diikuti oleh umpan baris.Akhirnya, interpreter mencetak semua item yang tersisa di stack: dua array kosong yang tidak mempengaruhi output, dan blok kode asli.
Versi alternatif
Cobalah online di juru bahasa CJam .
Keluaran
Bagaimana itu bekerja
L
mendorong array kosong dan~
membuangnya. Tumpukan kosong lagi.Blok
mendorong blok itu di tumpukan.
_
mendorong salinan blok dan~
menjalankan salinan.Bagian
_
dalam salinan blok akan mendorong salinan blok asli, yangp
akan dicetak, diikuti oleh umpan baris.Akhirnya, penerjemah mencetak item yang tersisa di tumpukan: blok kode asli.
sumber
Perl, 7 × 7 (42 non-spasi)
Keluaran:
sumber
7
terbuat dari7
. :)CJam, 4X4 (
1210 spasi)Keluaran:
Versi sebelumnya dengan 12 non-spasi:
Dan hasilnya
Seperti yang ditunjukkan oleh Martin, versi ini memiliki
*
,4
,4
sebagai output;)
Cobalah online di sini
sumber
Marbelous - 16x16
Uji di sini! Spasi sebagai kosong, papan silindris, dan termasuk perpustakaan semua harus diperiksa.
Keluaran
Penjelasan
Ada dua papan di sini: papan utama (ditunjukkan di bawah), dan
ss
papan, yang tidak mengambil input dan output dua spasi (0x20) ke STDOUT.Sel kosong sama dengan a
..
, dan apa pun setelah a#
adalah komentar.Setiap centang,
ss
menghasilkan dua spasi untuk STDOUT.Jalur hijau adalah loop sederhana yang menampilkan baris baru (0x0A) pada akhir setiap centang ke-7.
Jalur biru akan menampilkan angka-angka (
Hp
mencetak marmer sebagai dua digit hex) yang ada di output, pada akhir setiap centang ke-6.Setelah kita mencetak
01
sekali, loop berakhir, dan bergerak menyusuri jalan merah, yang menduplikasi marmer ini.Satu duplikat dicetak (yang kedua
01
), dan yang lainnya dikirim ke jalur hitam, yang mengakhiri papan di!!
sel. Karena lokasi yangHp
digunakan dalam cetakan terakhir ini,01
muncul sebelum dua spasi kutu yang sama, bukan setelah, perilaku setiapHp
panggilan lainnya .sumber
Python - 11x11
Keluaran
Ini solusi yang cukup berantakan dan membosankan, tapi saya hanya berpikir saya akan menunjukkan bahwa ...
Solusi ini mengambil keuntungan dari kenyataan bahwa, jika Anda berada dalam sepasang tanda kurung dengan Python, maka Anda dapat membagi kode Anda menjadi beberapa baris dan menambahkan ruang secara sewenang-wenang tanpa mendapatkan
IndentationError
. Cara lain untuk melakukan sesuatu seperti ini adalah dengan mengakhiri garis dengan garis miring terbalik.sumber
Python - 7x7 (37 non-spasi)
Keluaran
Menggunakan
%
operator pemformatan string lama Python untuk melakukan pekerjaan:+7
dan-7
menjaga pembenaran kanan / kiri, dan ruang terakhir yang cocok dengan tanda kurung penutup untukprint
khususnya. Dalam menyiapkan format string, kami juga punyasumber
JavaScript (9x9)
Keluaran
Catatan
Saya membuat dan bermain golf (dengan kemampuan terbaik saya) kode untuk kotak dengan diagonal dari berbagai ukuran n:
mengganti nomor *** asdf *** dengan konstanta tergantung pada panjang sisi n, misalnya untuk n = 6:
Tapi, meskipun kode itu panjang 46, saya tidak bisa mendapatkan ruang konstan untuk sejajar dengan spasi di diagonal kode sampai sebesar 9x9, dengan garis terbuang (yang ke-5)
Sunting: Diubah untuk menambahkan lansiran (). Sebelum:
sumber
CJam, 5x5, 12 tanpa spasi
Bukan pemenang, tetapi saya ingin menambahkan kiriman yang agak kecil dan jarang , karena sebagian besar jawaban hanya mencetak diagonal.
cetakan
Uji di sini.
Dua karakter terakhir dari kode, tidak melakukan apa-apa, jadi sebenarnya hanya memiliki 10 byte kode nyata. Untuk grid yang lebih kecil, saya bahkan bisa menguranginya dengan dua byte menjadi 8, tapi itu tidak sesuai pada 3x3, dan kode ini tidak berfungsi untuk ukuran grid yang genap.
Bagaimana itu bekerja:
sumber
Befunge , 9x9
Saya tidak tahu mengapa saya melakukan ini. Butuh cara terlalu lama. Saya sakit kepala hebat sekarang.
Keluaran:
Beberapa penjelasan
Kode ini digunakan
g
untuk membaca@
karakter dari grid "on the fly" (dan juga ruang terakhir, yaitu@ / 2
), danp
untuk memodifikasi loop untuk menulis baris output terakhir.Setiap karakter tunggal pada kode digunakan di beberapa titik, baik sebagai kode atau sebagai data (
9
dan@
pada dua baris terakhir).Saya pada dasarnya harus melakukan banyak solusi untuk membuat kode berfungsi. Penunjuk instruksi melakukan banyak persimpangan selama eksekusi, di mana beberapa dilompati. (Saya tidak bisa menggunakan instruksi apa pun di sana untuk arah yang berbeda karena mereka akan mengganggu. Tidak ada NOP.) Di tempat lain saya menggunakan kembali karakter yang sama atau hanya melepaskannya (lihat
$:
di tengah).Saya juga melakukan beberapa pekerjaan kreatif di stack:
n,0
. Saya kemudian harus mengurangin
. Solusi yang jelas adalah$1-
, tetapi saya berhasil mempersingkat dengan menggunakan!-
.0
. Saya kemudian mengatur pengubah kode (20g46p7g46\p
) untuk menggunakannya0
, alih-alih membuang 2 karakter$0
.sumber
!-
; itu sesuatu yang akan saya lakukan. Fakta menyenangkan: Di Funge-98,z
adalah NOP.z
tidak terdaftar di wiki dan saya menggunakan ini untuk pengkodean, yang berarti tidak ada perintah yang membalik arah IP. Cukup banyak harus refactor 70% dari kode karena satu tempat yang seharusnya NOP.Python 3, 8x8
Ada 50 karakter tanpa spasi dan 14 spasi. Baris terakhir memiliki satu karakter yang tidak berguna, tetapi yang lainnya diperlukan.
Keluaran:
sumber
(a,*b,c)="12345"
... tugas yangRuby, 8x8
Keluaran:
sumber
CJam, 5X5
Dan hasilnya
Saya sudah sedekat ini dengan solusi 4X4.Lihat jawaban saya yang lain<sigh>
Cobalah online di sini
sumber
C ++, 12x12
Sunting: Jadi, saya menjadi sedikit terobsesi dengan tantangan ini dan berhasil menurunkannya dari 17x17 menjadi 12x12. Butuh beberapa saat bagi saya untuk menyadari bahwa saya dapat menggunakan
/**/
sebagai pembatas token. Kode ini mengambil keuntungan dari fakta bahwa sambungan baris masih berfungsi di Dentang dengan spasi setelahnya, meskipun itu memberikan peringatan dan merusak pewarnaan kode Xcode.Keluaran:
sumber
Befunge-98 , 8x8 (56 non-spasi [11 nops])
Catatan: Demi kepentingan orang-olah-raga yang baik, ini membaca sumbernya sendiri melalui
'
, menjadikannya cheat-quine bagi sebagian orang. Baca perdebatan di sini .Program
Keluaran
Penjelasan
Versi un-golfed
(non-ruang dan ruang diganti dengan 'n dan untuk dibaca.)
Solusi ini didasarkan pada fakta bahwa menggunakan indeks [0, lebar ^ 2) mod, lebar kuadrat dapat memberi tahu Anda jika Anda berada di ujung baris atau di diagonal. Karena semua ruang ditempatkan di sepanjang diagonal, mudah untuk mengetahui kapan harus mencetak non-spasi!
Dalam Pseudocode
Diskusi
Saya sangat bangga akan hal itu, meskipun saya berharap bisa membuat setiap non-ruang juga non-nop. Saya juga bangga bahwa saya tidak menggunakan standar Befunge get-increment-put! Ini mencetak simbol yang berbeda untuk non-ruang karena saya punya ruang untuk itu dan tidak ingin membosankan.
Cobalah di Windows dengan BefungeSharp !
sumber
CJam, 4 x 4 (8 tanpa spasi)
Cobalah online di juru bahasa CJam .
Keluaran
Bagaimana itu bekerja
N
mendorong linefeed sebagai string tunggal.a
membungkus string itu dalam sebuah array.`
memeriksa hasilnya, yaitu, ia mendorong representasi string dari array.Ini hasilnya:
S*
bergabung dengan string yang dihasilkan (array karakter), memisahkan elemen-elemennya menggunakan spasi. Dengan kata lain, itu menempatkan karakter spasi di antara semua pasangan karakter yang berdekatan dari string.Ini hasilnya:
N
mendorong linefeed lain.X$
menyalin item tumpukan pada indeks 1 (menghitung dari atas), yaitu string multi-line.Akhirnya, interpreter mencetak semua item pada stack: string multi-line asli, linefeed dan salinan string multi-line.
sumber
SOGL V0.12 , 2x2 (2 tanpa spasi)
Coba Di Sini!
Keluaran
Penjelasan
Dalam SOGL semua baris kecuali yang terakhir menggantikan baris - ini menggantikan di mana saja dalam kode yang melanjutkan karakter terakhir dari baris dengan semuanya sebelumnya. SO baris pertama di sini adalah
replace space with 2 in the next line
.Kemudian baris berikutnya -
2╚
dijalankan:2
mendorong 2, dan╚
menciptakan diagonal ukuran 2.sumber
CBM BASIC v2.0 (8 × 8)
Peningkatan atas jawaban saya sebelumnya , menggunakan pendekatan yang sama sekali berbeda:
Keluaran:
sumber
Ruby,
8x87x7Keluaran:
Versi sebelumnya, 8x8 dengan 20 spasi:
Keluaran:
sumber
Pushy , persegi 4x4
Non-bersaing karena bahasa memposting tantangan:
Kode:
Output:
Cobalah online!
Karena spasi tidak relevan dalam Pushy, kode mudah diatur untuk mencocokkan negatif dari outputnya. Program sebenarnya terlihat seperti ini:
Garis miring terbalik memulai komentar, jadi jejaknya
\o/
hanya ada untuk menyelesaikan yang negatif, dan terlihat keren.Atau, untuk skor yang sama, kami dapat memiliki solusi berikut:
sumber
Haskell, 10 × 10
Menentukan fungsi pembantu
a ! b
yang mencetak garis formulirbbbbbbbbba
, dan fungsi rekursifn & c
yang mencetakn
garis-garis formulirccccccccc␣
diikuti oleh satu baris formulir␣␣␣␣␣␣␣␣␣c
.Menggunakan
<$
(fmap const
, lagi) pada rentang untuk mengulangi karakter. Perhatikan bahwa<$
hanya tersedia tanpa impor sejak GHC 7.10, yang memposting tanggal tantangan ini.Saya tidak sepenuhnya yakin apakah ini membuat pengiriman ini tidak bersaing.Tidak ada yang benar-benar menarik dengan pilihan tata letak atau algoritma di sini; Saya tidak punya banyak byte untuk cadangan dan hanya beruntung orang bisa mendapatkan garis istirahat terjadi di sekitar
putStrLn
cara mereka melakukannya.sumber
05AB1E , 3x3 (6 byte tanpa spasi )
Keluaran:
Cobalah online.
Penjelasan:
sumber
Perl, 6x6 (26 non-spasi)
Saya menghabiskan whlie melihat melalui ini dan yakin akan ada solusi Perl lebih kecil dari 7x7 entah bagaimana ... Tantangan yang sangat menyenangkan! Solusi ini membutuhkan
-E
.Pemakaian:
Keluaran:
sumber
CBM BASIC v2.0 (9 × 9)
Keluaran:
sumber
C (gcc) ,
7x78x8EDIT: Versi sebelumnya memiliki perilaku yang salah.
Cobalah online!
sumber
Jelly , 4 x 4 (12 tanpa spasi)
Cobalah online!
Keluaran:
Ini sangat menyenangkan.
Bagaimana itu bekerja
Bagian yang mudah: Jelly mengabaikan spasi putih (selama hanya satu byte builtin yang digunakan).
Bagian tersulit: Setiap baris dalam Jelly adalah tautan (atau fungsi) terpisah, jadi tidak terlalu pendek untuk menyebarkan pernyataan konstan dalam beberapa baris. Menggunakan string literal adalah kandidat yang baik, tetapi tidak tahu bagaimana menghasilkan yang negatif.
sumber