Ada 95 karakter ASCII yang dapat dicetak :
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Dalam font Consolas (default kode blok Stack Exchange), beberapa karakter memiliki mirror di sekitar sumbu simetri vertikal:
- Pasangan karakter ini adalah cerminan satu sama lain:
()
[]
{}
<>
/\
- Karakter-karakter ini adalah cermin dari dirinya sendiri:
! "'*+-.8:=AHIMOTUVWXY^_ovwx|
(Perhatikan bahwa ruang adalah satu.) - Ini tidak memiliki cermin:
#$%&,012345679;?@BCDEFGJKLNPQRSZ`abcdefghijklmnpqrstuyz~
( i
, l
, 0
, #
, Dan mungkin karakter lain adalah cermin mereka sendiri dalam beberapa font tapi kami akan tetap berpegang pada bentuk Consolas.)
Sebuah string dikatakan sebagai cermin dari dirinya sendiri jika dibuat hanya dengan 39 karakter cermin , disusun sedemikian rupa sehingga string tersebut memiliki garis simetri vertikal tengah. Begitu ](A--A)[
juga cermin dari dirinya sendiri tetapi ](A--A(]
tidak.
Tulis program satu garis panjang rata yang merupakan cerminan dari dirinya sendiri. Ketika N salinan bagian kirinya telah ditambahkan sebelumnya dan N salinan bagian kanannya telah ditambahkan padanya, ia akan menghasilkan N + 1. N adalah bilangan bulat non-negatif.
Misalnya, jika programnya adalah ](A--A)[
(setengah kiri:, setengah ](A-
kanan:) -A)[
, maka:
- Menjalankan
](A--A)[
harus menampilkan1
. (N = 0) - Menjalankan
](A-](A--A)[-A)[
harus menampilkan2
. (N = 1) - Menjalankan
](A-](A-](A--A)[-A)[-A)[
harus menampilkan3
. (N = 2) - Menjalankan
](A-](A-](A-](A--A)[-A)[-A)[-A)[
harus menampilkan4
. (N = 3) - . . .
- Menjalankan
](A-](A-](A-](A-](A-](A-](A-](A-](A-](A--A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[-A)[
harus menampilkan10
. (N = 9) - dll.
Aturan
- Output ke stdout atau alternatif terdekat bahasa Anda. Mungkin ada trailing newline opsional. Tidak ada input yang harus diambil.
- Secara teori proses ini harus bekerja untuk N hingga 2 15 -1 atau lebih, mengingat memori dan daya komputasi yang cukup.
- Diperlukan program lengkap, bukan hanya perintah REPL .
Program awal terpendek (N = 0 case) dalam bytes menang.
sumber
#
adalah relection sendiri juga, tetapi, Anda benar, bukan di konsol.Jawaban:
Pip,
1284 byteSekarang dengan 66% lebih sedikit byte!
x
adalah variabel, diinisialisasi ke""
. Dalam konteks numerik, ini menjadi0
.+
, membuat ekspresi bentukx+x+...+x
. Ini adalah pernyataan yang valid yang tidak melakukan apa-apa.+
dari babak pertama, membuat ekspresi bentuk++x+x+...+x
.++x
bertahapx
untuk1
, dan sisanya menambahkan ke itu sendiri N kali. Karena ekspresi dievaluasi dari kiri ke kanan di Pip, peningkatan dijamin terjadi terlebih dahulu, dan hasilnya sama dengan jumlah tingkat cermin.Sayangnya, Pip tidak memproses dengan baik ekspresi besar: solusi ini menyebabkan
maximum recursion depth exceeded
kesalahan untuk N di atas 500 atau lebih. Inilah solusi sebelumnya yang tidak, untuk 8 byte :Lebih lanjut tentang Pip
sumber
Fatal error: maximum recursion depth exceeded while calling a Python object
.x+x+...+x
menghasilkan kedalaman rekursi O (N). Mungkin itu membatalkan jawaban ini. Saya akan menambahkan catatan.GolfScript, 10 byte
Cobalah online dengan Web Golfscript: N = 0 , N = 1 , N = 2 , N = 3 , N = 41
Web GolfScript memiliki batas 1024 karakter, tetapi interpreter Ruby menangani N = 32767 dengan sempurna:
Bagaimana itu bekerja
Tanpa input apa pun, GolfScript awalnya memiliki string kosong di tumpukan.
Di babak kiri pertama, berikut ini terjadi:
!
berlaku TIDAK logis untuk string kosong. Ini mendorong1
.:{
menyimpan integer pada stack dalam variabel{
.Ya, itu adalah pengidentifikasi yang valid, meskipun tidak ada cara untuk mengambil nilai yang disimpan.
)
menambah bilangan bulat pada tumpukan.:
adalah instruksi yang tidak lengkap.Bagian kiri berikutnya, yang berikut terjadi:
:!
(Di mana:
adalah sisa dari sebelumnya) menyimpan integer pada stack dalam variabel!
.Ya, itu juga merupakan pengidentifikasi yang valid. Ini melanggar
!
perintah, tapi kami tidak menggunakannya lagi.:{
,)
dan:
bekerja seperti sebelumnya.Di babak kanan pertama, berikut ini terjadi:
::
(Di mana:
adalah sisa dari sebelumnya) menyimpan integer pada stack dalam variabel:
.Ya, bahkan itu adalah pengidentifikasi yang valid. Seperti halnya
{
, tidak ada cara untuk mengambil nilai yang disimpan.(
mengurangi integer pada stack, menghasilkan jumlah belahan kiri.}
, karena tidak cocok dan mengakhiri eksekusi segera.Ini adalah fitur tidak berdokumen. Saya menyebutnya supercomments .
Kode yang tersisa diabaikan begitu saja.
sumber
}
kode yang tidak tertandingi di paruh ke-2 Anda dalam kompetisi mirror."\""/"
, kuotasi ganda keempat tidak akan tertandingi juga karena yang kedua telah lolos.Kode Mesin Z80,
86 byte *<8ww8>
* Mengasumsikan kondisi tertentu dengan memasukkan dari Amstrad BASICA
awalnya 0 ketika dimasukkan dari BASIC. Ini menambahA
n kali, lalu menulisnya n kali ke lokasi memori yang sama (yang diatur ke lokasi yang sedikit acak oleh BASIC)! OperasiJR
Jump Relative tidak pernah melakukan apa-apa karenaC
flag selalu tidak disetel, sehingga digunakan untuk "mengomentari" byte berikut! Versi ini sedikit curang dengan mengasumsikan kondisi entri tertentu, yaitu masuk dari jaminan BASIC yangA
selalu 0. Lokasi(HL)
tidak dijamin aman, dan mungkin merupakan lokasi berbahaya. Kode di bawah ini jauh lebih kuat dan karena itu jauh lebih lama.Kode Mesin Z80, 30 byte
Sebagai ASCII:
o!.ww.!>A=o>{))((}<o=A<!.ww.!o
Pada dasarnya, babak pertama menjamin penciptaan nilai nol dan babak kedua menambahkannya dan menulisnya ke memori. Dalam versi yang diperluas di bawah ini
##
menunjukkan kode yang tidak memiliki tujuan di bagian cerminnya.Rincian instruksi yang diizinkan:
Dari 39 instruksi yang diizinkan, 28 adalah operasi pemuatan (blok dari 0x40 hingga 0x7F adalah semua
LD
instruksi byte tunggal ), yang sebagian besar tidak membantu di sini! Satu-satunya instruksi memuat ke memori masih diperbolehkan adalahLD (HL), A
yang berarti saya harus menyimpan nilaiA
. KarenaA
hanya register yang tersisa denganINC
instruksi yang diizinkan, ini sebenarnya cukup berguna!Saya tidak dapat memuat
A
dengan 0x00 untuk memulainya karena ASCII 0x00 bukan karakter yang diizinkan! Semua nilai yang tersedia jauh dari 0 dan semua instruksi matematika dan logis telah dianulir! Kecuali ... saya masih bisa melakukannyaADD HL, HL
, tambahkan 16-bitHL
ke dirinya sendiri! Terlepas dari memuat nilai secara langsung (tidak digunakan di sini!), MenambahA
dan MenurunkanA
,L
atauHL
ini adalah satu-satunya cara saya mengubah nilai register! Sebenarnya ada satu instruksi khusus yang bisa membantu di babak pertama tetapi menyusahkan untuk mengerjakan di babak kedua, dan instruksi satu-pelengkap yang hampir tidak berguna di sini dan hanya akan mengambil ruang.Jadi, saya menemukan nilai terdekat dengan 0 saya bisa: 0x41. Bagaimana itu mendekati 0? Dalam biner itu 0x01000001. Jadi saya mengurangi, memuatnya
L
dan melakukanADD HL, HL
dua kali!L
sekarang nol, yang saya masukkan kembali keA
! Sayangnya, kode ASCII untukADD HL, HL
ini)
sehingga saya sekarang harus menggunakan(
dua kali. Untungnya,(
iniJR Z, e
, di manae
adalah byte berikutnya. Jadi itu memakan byte kedua dan saya hanya perlu memastikan itu tidak melakukan apa-apa dengan berhati-hati denganZ
bendera! Instruksi terakhir untuk mempengaruhiZ
flag adalahDEC A
(kontra-intuitif,ADD HL, HL
tidak mengubahnya) dan karena saya tahuA
itu 0x40 pada saat itu dijaminZ
tidak diatur.Instruksi pertama di babak kedua
JR Z, #28
tidak akan melakukan apa-apa 255 kali pertama karena bendera Z hanya dapat diatur jika A telah meluap dari 255 ke 0. Setelah itu output akan salah, namun karena itu hanya menyimpan nilai 8-bit tetap saja bahwa seharusnya tidak masalah. Kode tidak boleh diperluas lebih dari 255 kali.Kode harus dieksekusi sebagai potongan karena semua cara yang tersedia untuk kembali dengan bersih telah dianulir. Semua instruksi RETurn di atas 0x80 dan beberapa operasi Jump diizinkan hanya dapat melompat ke offset positif, karena semua nilai negatif 8-bit telah dianulir juga!
sumber
A
mendaftar selalu 8 bit, jika prosesor tidak akan kompatibel dengan Z80. Saya akan mengatakan bahwa memori yang diberikan cukup dan daya komputasi telah ditutup di sini!A
register selain 8 bit? Mengubahnya menjadi 16-bit akan memecah kode mengandalkan 255 + 1 = 0 misalnya. Anda harus menciptakan CPU, sebut saja Z160, yang menggunakan register 16-bit default tetapi masih menggunakan instruksi 8-bit yang sama dari Z80. Aneh!J,
1614 bytePenggunaan:
Penjelasan:
J mengevaluasi dari kanan ke kiri.
(_=_)
adalahinf equals inf
yang benar, memiliki nilai1
, sehingga ungkapan menjadi1+]...[+1
. ((8=8)
juga berfungsi tetapi ini terlihat lebih keren. :))[
dan]
kembalikan argumen kiri dan kanan mereka masing-masing jika ada 2 argumen. Jika hanya mendapat 1, mereka mengembalikannya.+
menambahkan 2 argumen. Jika hanya mendapat 1, mengembalikannya.Sekarang mari kita evaluasi ekspresi level 3 (dari kanan ke kiri):
Seperti yang kita lihat separuh kanan
1
ditambahkan dan sisi kiri1
dihapus yang menghasilkan bilangan bulat yang diinginkanN
, tingkat cermin.Cobalah online di sini.
sumber
Haskell, 42 byte
Untungnya komentar baris di Haskell (->
--
) dapat dicerminkan dan setengahnya (->-
) adalah fungsi yang valid. Sisanya adalah beberapa matematika untuk mendapatkan angka0
dan1
. Pada dasarnya kami memiliki(0)-(-1)
dengan komentar untukN=0
dan prepend(0)-(-1)-
dalam setiap langkah.Jika angka floating point diizinkan untuk diproduksi, kita dapat membangun
1
dari8/8
dan bertahan dengan 26 byte:Haskell, 26 byte
Output
1.0
,2.0
dllsumber
program.hs
dan kemudian jalankan$ runhaskell program.hs
dari baris perintah dan lihat hasilnya. Saya tidak tahu Haskell jadi saya tidak bisa mengatakan dengan tepat apa yang perlu diubah.runhaskell
adalah skrip shell yang mengatur beberapa lingkungan dan akhirnya memanggilghc
, kompilator Haskell. Anda dapat menjalankan kode saya langsung denganghc
:ghc -e "(8-8)-(-8/8)--(8\8-)-(8-8)"
. Peluncuran inighc
yang mengevaluasi kode yang disediakan sebagai argumen, mencetak hasil dan keluar. Tidak ada REPL, tidak ada interaksi. Tentu saja ini akan menambahkan +1 ke jumlah byte-e
.-e
tidak berkontribusi pada skor dalam kasus ini. Kami tidak menghitung byteperl -E
ataugcc -std=c99
salah satunya.CJam, 14 byte
Cobalah online di juru bahasa CJam: N = 0 , N = 1 , N = 2 , N = 3 , N = 41
Perhatikan bahwa kode ini selesai dengan pesan kesalahan. Menggunakan penerjemah Java, pesan kesalahan itu dapat ditekan dengan menutup atau mengarahkan STDERR. 1
Bagaimana itu bekerja
Di bagian kiri, berikut ini terjadi:
]
membungkus seluruh tumpukan dalam sebuah array.X
ditambahkan1
ke array itu.:+
menghitung jumlah semua elemen array.Oo
mencetak isi array kosong (mis., tidak ada).Di babak kanan pertama, berikut ini terjadi:
o
mencetak bilangan bulat pada tumpukan, yang merupakan output yang diinginkan.O+
mencoba untuk menambahkan array kosong ke item paling atas dari tumpukan.Namun, tumpukan itu kosong sebelum mendorong
O
. Ini gagal dan menghentikan eksekusi program.Kode yang tersisa diabaikan begitu saja.
1 Menurut jajak pendapat meta Haruskah pengajuan diizinkan untuk keluar dengan kesalahan? , ini diizinkan.
sumber