... setidaknya untuk beberapa definisi "modifikasi diri".
Tugas
Dalam tantangan ini, tugas Anda adalah menulis tiga string A
, B
dan C
itu memenuhi properti berikut.
String
B
memiliki panjang setidaknya 1.Untuk setiap
n ≥ 0
, string adalah program yang valid (artinya program runnable penuh atau definisi fungsi) dalam bahasa pemrograman pilihan Anda. Menunjukan superscript pengulangan, jadi ini berarti string , , , dll Setiap program mengambil satu string sebagai masukan, dan kembali satu string sebagai output.ABnC
AC
ABC
ABBC
ABBBC
Untuk apa pun
m, n ≥ 0
, jika program dijalankan dengan input , ia kembali . Untuk input yang bukan dari formulir ini, program dapat melakukan apa saja, termasuk crash.ABmC
ABnC
ABm*n+1C
Beberapa contoh dalam format program(input) -> output
:
AC(AC) -> ABC
ABC(AC) -> ABC
ABBBBBC(AC) -> ABC
AC(ABC) -> ABC
AC(ABBBBC) -> ABC
ABC(ABC) -> ABBC
ABBC(ABC) -> ABBBC
ABBBBC(ABBBC) -> ABBBBBBBBBBBBBC
ABBBC(ABBBBBBC) -> ABBBBBBBBBBBBBBBBBBBC
Aturan dan Penilaian
Skor Anda adalah total panjang A
danC
, skor yang lebih rendah lebih baik. Perhatikan bahwa sementara B
tidak dihitung ke arah skor, itu harus dihasilkan oleh A
dan C
seperti pada contoh pertama.
Celah standar tidak diijinkan. Program-program tidak diperbolehkan untuk secara langsung atau tidak langsung mengakses kode sumber mereka sendiri (kecuali ketika mereka diberikan sebagai input). Anda diminta untuk mengidentifikasi string A
, B
dan C
dalam jawaban Anda dalam beberapa cara, dan didorong untuk menjelaskan solusi Anda.
sumber
Pyth, 10
Kami membagi sumber menjadi dua baris. Baris pertama adalah A, baris kedua adalah B. Karena A ada di baris pertama, yang pertama
w
dicetak A - mudah, selesai.Dalam Pyth nol nol adalah token yang terpisah, jadi
[00)
sebenarnya adalah[0, 0]
. Perhatikan bahwa baris pertama berakhirl[
, dan baris kedua terdiri dari0000...
. Jadil[
sebenarnya menghitung jumlah B dalam program ini.w
Bunyi kedua berbunyi di baris kedua input - ini adalah jumlah B dari input. Dari sini ini adalah perkalian sederhana, kenaikan dan keluaran yang banyak nol.sumber
Retina ,
2519 byteABC
Kode contoh :Kode memiliki dua langkah pengganti:
ubah input
AB^mC
menjadiAB^(m*n)C
dengan mengubah setiapB
menjadiB^n
:]\]
cocok setiapB
di input dan tidak ada yang lain berkat lolos di garis pola]]...]]
aku sB^n
ubah
B^(m*n)
keB^(m*n+1)
denganm`^]*$
hanya mengambil garis]
's]$0]
menambahkan pasangan ekstra]]
untuk itu dengan cara yang baris ini tidak cocok dengan regex pertamaSaya telah menambahkan 3 byte ke skor untuk
-s
bendera multi-baris yang diperlukan agar seluruh kode Retina bisa dalam satu file.2 byte disimpan berkat @ MartinBüttner.
sumber
Python 3, 51 byte
Contoh penggunaan:
Fungsi menghitung
n*m+1
dengan di(1+len("xxx")*(len(s)-51))
mana adam
x
dalam string (xxx
bagiannya adalahB^m
). Mengalikan string"x"
dengan angka ini memberiB^(n*m+1)
dan fungsi mengambilA
danC
keluar dari input dan menggabungkan semua ini untuk mendapatkanAB^(n*m+1)C
.Pendekatan yang sama dalam J:
J, 35 byte
sumber
CJam, 22
Contoh dijalankan:
yang diterjemahkan menjadi
dengan input sebagai
yang memberikan output berikut:
Bagaimana itu bekerja :
Mari kita lihat program apa
AC
danABC
terlihat seperti:Kami perhatikan itu
C
=B_~
Mari kita lihat apa yang
B
sedang dilakukan:Sekarang mari kita lihat apa yang berjalan
AC
tanpa input akan dilakukan:Wow, hasilnya
ABC
.Kami pada dasarnya menghitung berapa banyak yang
B
ada dalam kode. Lalu berapa banyak yang di input (menggunakan panjang). Lipat gandakan, tambah dua kali (karenaC
juga sudahB
) dan tambahkan_~
untuk dapatkanC
Cobalah online di sini
sumber
Haskell , 50 byte
f
adalah fungsi mengambil dan mengembalikan aString
.String B hanya satu ruang tunggal, sedangkan C dimulai dengan satu.
Cobalah online!
_:b=" "
menugaskan semua kecuali yang pertama dari spasi dalam string literal keb
, menjadikannya sama dengan m program salinan B.s
adalah string input.a:c<-words s
membaginya menjadi kata-kata yang dipisahkan oleh ruang, sehinggaa
menjadi A danc
menjadi daftar kata-kata yang terdiri dari C. Salinan B diabaikan karenawords
meremas beberapa spasi (yang tidak dapat dilakukan oleh sisa program).drop 50s
adalah string dengan panjang sama dengan jumlah n salinan B dalam input.drop 50s>>b
menyatukan bahwa banyak salinanb
, memberikan mn ruang .unwords$a:(drop 50s>>b):c
bergabung dengan semua string kembali bersama dengan spasi. Karena ada "kata" tambahan yang(drop 50s>>b)
dimasukkan dalam daftar, ada juga ruang penggabung tambahan, yang secara otomatis menambahkan +1 ke perkalian.sumber
Matlab, 85
Pertama kali bagi saya untuk melakukan tantangan abstrak, jadi bagi saya itu lebih merupakan tantangan pengkodean daripada tantangan kode-golf!
Tiga string adalah, tanpa tanda kutip:
Cara kerjanya: Saya membagi argumen input pada spasi, sehingga
n
dapat ditentukan dari jumlah bagian string. B berfungsi sebagai semacam penghitung untuk didapatkanm
. Untuk merekonstruksi jawaban saya menggunakan A dan C dari split, ulangi B m * n + 1 kali dan saya memasukkan spasi dengan menggunakan nilai ASCII mereka, sehingga tidak ada pemisahan yang tidak diinginkan terjadi dalam C.EDIT: ups, tidak sengaja menghitung A + B
sumber
C (gcc) , 81 byte
Persyaratan untuk mengidentifikasi string tampaknya bertentangan dengan perilaku diizinkan kita yang sewenang-wenang untuk input ilegal, kecuali kita memiliki standar yang agak longgar tentang apa yang memerlukan identifikasi. Secara alami, saya mengambil interpretasi yang paling banyak menghilangkan byte.
Cobalah online!
sumber
TI-Basic (83 series), 65 byte
Segmen A (33 byte):
Segmen B:
Segmen C (32 byte):
Saya sangat senang menemukan tantangan seperti ini! Kebanyakan quines tidak bekerja di TI-Basic tanpa setidaknya sedikit kecurangan, karena tidak ada cara untuk melarikan diri dari
"
simbol. (Dalam kedua arti kata "melarikan diri".) Tapi di sini, kita mendapatkan string input melaluiInput
perintah, dan mengetikkan"
sana baik-baik saja.Masih ada sejumlah kekonyolan TI-Basic untuk bekerja di sini: string kosong tidak valid, sehingga solusi naif memasukkan string ke
"XXX...XX"
dalam sebuah loop tidak akan berfungsi ketika n = 0. Sebagai gantinya, kami menghitung nilai mn + 1 secara manual, dan menyisipkan string"X"
itu berkali-kali.Konstanta sihir
27
dan28
dalam program ini adalah sedikit off dari jumlah byte 33 dan 32, karenaStr1
,sub(
, danlength(
dua-byte token yang hanya berkontribusi 1 dengan panjang string.Jika kita menggunakan baris baru alih-alih
:
, sepertinya kapan dapat menyimpan beberapa byte dengan meninggalkan tanda kutip berakhir, tetapi ini sebenarnya tidak berhasil. Pertama-tama, Anda memerlukan hex editor sebelum Anda dapat menambahkan karakter baris baru ke dalam string: Anda tidak bisa mengetikkannya, karena jika Anda menekan ENTER saatInput
perintah, ia mengirimkan input. Ketika saya mencoba pendekatan hex editor, saya akhirnya mendapatkan kesalahan buffer overflow aneh yang mengubah isi program saya, jadi jangan coba ini di rumah dengan kalkulator mahal Anda.sumber
Java 11,
13565 + 26 = 91 byteSEBUAH
B
C
Cobalah online sini (TIO belum memiliki Java 11, jadi ini bergantung pada metode penolong alih-alih
String::repeat()
).Tidak Disatukan:
sumber