Membuat printer integer serba guna bagus dan semuanya, tetapi menulis kode tunggal yang mencetak banyak angka berbeda merupakan hal yang rumit. Bukankah lebih mudah membuat skrip yang menghasilkan angka, tetapi juga memberi Anda skrip baru untuk mendapatkan nomor berikutnya?
Tantangan:
Tulis kode yang menampilkan bilangan bulat tunggal N
dan kode yang dapat dieksekusi. Kode selanjutnya harus di-output N+1
dan kode yang bisa di-output N+2
. Lanjutkan jalur ini sampai Anda mencapai N = 15
. (Nomor yang dicetak terakhir harus 15).
Aturan:
- Tidak ada input (anggap input kosong).
- Program atau fungsi lengkap atau format lain yang nyaman diizinkan.
- Kode pertama harus ditampilkan
1
. - Anda tidak dapat menampilkan nol di depan. Yaitu Anda tidak dapat mencetak
01
untuk1
. - Output harus dalam format
N, Code_for_N+1
. Perhatikan bahwa output dipisahkan oleh koma dan spasi tunggal. Kode untukN+1
tidak memiliki tanda kutip di sekitarnya.N , Code_for_N+1
tidak diterima (spasi di depan koma). Mengejar baris baru tidak masalah. - Karakter pertama dari output harus berupa angka. (Tidak ada spasi, atau
ans = N
). - Nomor yang dicetak tidak boleh menjadi bagian dari kode berikutnya (kode dapat berisi nomor ini, tetapi Anda tidak dapat mengambil nomor output sebagai bagian dari kode)
- Contoh: Output untuk
N=2
dapat:2, printer 2
. Dalam hal ini,printer 2
adalah kode untukN=3
. Anda tidak dapat menggunakan seluruh output:2, printer 2
sebagai kode untukN=3
.
- Contoh: Output untuk
- Skrip mungkin dalam berbagai bahasa
- Tipe data tidak relevan (angka dapat berupa string), tetapi tidak dapat dikelilingi oleh apa pun (tanda kutip, tanda kurung dll).
- Jika ada kode yang di-output
N=15
maka ia harus mencetakSTOP!
(lihat bonus), atau tidak mencetak apa pun (bahkan spasi atau baris baru).- Kode untuk
N=15
tidak bisa crash (tetapi keluaran ke STDERR tidak masalah). - Anda didiskualifikasi jika kode output untuk
N=15
dicetak16
atau apa pun (kecuali kotak bonus).
- Kode untuk
- Operator quine bawaan tidak diizinkan.
- Mengakses file sumber melalui sistem file tidak diperbolehkan.
Bonus:
-10 byte jika kode yang mencetak 15 juga menghasilkan kode yang mencetak " STOP!
"
Contoh menggunakan sintaks Python: (jelas, ini hanya akan bekerja untuk bilangan bulat yang dipilih, bukan dari 1 hingga 15.)
N = 1
print "1, print 2"
1, print 2
---
N = 15
print 15
15
---
N = 15 (Qualifies for the -10 bytes bonus)
print "15, print 'STOP!'"
15, print 'STOP!'
print 'STOP!'
STOP!
----
N = 15 (Qualifies for the -10 bytes bonus)
print "15, disp('STOP!')"
15, disp('STOP!') (disp('STOP!') outputs STOP! in MATLAB)
----
N = 15 (This one is not OK. The submission is disqualified)
print "15, print 16"
15, print 16
Aturan main golf standar berlaku! Kode terkecil (untuk N = 1) dalam byte menang!
f=>f+""
apakah tidak valid? (f+""
mengembalikan kode konstruksi fungsi.)14, print(14+1)
atau tidak?Jawaban:
Pyth + ///, 15 byte - 10 = 5
Ini mencetak
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!
dalam Pyth, dengan mengambilrange(1,15+1)
dan melepaskan tanda kurung mulai dan akhir, dan mencetaknya segera diikuti oleh ", BERHENTI!".Empat belas program berikutnya berada di ///, yang secara langsung menampilkan semua program yang tidak mengandung
/
atau\
. Jadi program keduamemberi
2
dan program ketiga3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
. Program kedua dari belakang15, STOP!
,, mencetak15, STOP!
, jadi program terakhir itu adilSTOP!
.sumber
cat
dihitung sebagai bahasa?cat
tidak melakukan tes primality, jadi tidak.JavaScript, 131238 - 10 = 131228 byte
Pendekatan naif ternyata lebih buruk dari yang diharapkan. Kalau dipikir-pikir, saya seharusnya mengharapkannya. Tapi saya pikir saya tetap akan membagikannya. Kode lengkap di sini.
Ide: Iteratif melarikan diri dan menambahkan
N-1, ...
sumber
CJam,
262524 byteCobalah online.
Program-program selanjutnya hanya menambah nomor pertama. Ini menjalankan program 16 kali.
Atau dengan bonus untuk skor yang sama:
Cobalah online.
Program-program selanjutnya hanya menambah nomor pertama. Ini menjalankan program 16 kali.
Solusi alternatif untuk bonus:
sumber
</selfpromotion>
JavaScript (ES6),
6261 byte - 10 bonus = skor 51Penjelasan
Sebuah solusi yang tidak membaca kode sumbernya sendiri dan juga tidak terlalu panjang.
Program pertama membangun semua 15 program lain dan menyatukannya di dalam satu sama lain menggunakan fungsi rekursif. Saya menyiasati masalah backslash dengan bersarang fungsi sendiri (yang kemudian dilemparkan ke string selama output) daripada string.
Uji
Tampilkan cuplikan kode
sumber
"" + (n=>m)
tidak dihitung sebagai mendapatkan tubuh fungsin=>m
?Matlab,
226212 - 10 = 202 byteTerima kasih kepada @StewieGriffin untuk beberapa byte =)
Bagian pertama adalah string yang mewakili baris kedua (di bawah), kode aktual (baru digeser oleh 9). Dalam Matlab, string adalah matriks yang diisi dengan karakter, sehingga Anda dapat dengan mudah melakukan perubahan hanya dengan menambahkan / mengurangi skalar. Jadi program hanya mencetak string yang sama * lagi, ditambah string yang sama tetapi bergeser yang menghasilkan kode.
* Tidak cukup: Byte pertama adalah penghitung yang perlu ditingkatkan di setiap iterasi.
Trik sulap dengan tali dicuri dari sini tanpa malu-malu .
Di sini beberapa baris terakhir dari urutan disalin dari konsol:
sumber
JavaScript,
5047444244 * byteIni adalah fungsi yang mengekstrak tubuhnya sendiri (hanya
a
) dan membuat penggantian di dalamnya. Mendapatkan fungsi fungsi fitur bawaan JavaScript, meskipun tidak secara eksplisit operator quine (jika tidak valid, akan menghapus jawabannya).Seandainya itu tidak berfungsi dengan baik tertanam di sana (karena bagi saya itu tidak), Anda dapat melihat contoh di sana .
* - sepertinya cuplikan menghasilkan hasil tanpa
a=
, membuat panggilan lebih lanjut menjadi tidak mungkinsumber
.replace(x++,x)
?a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)
bekerja?Python 2.7.10,
19692 - 10 = 82 byteWah !!! Ini sangat menyenangkan. Jauh lebih pendek sekarang. : P
Penjelasan:
Saya mulai dengan ini:
Itu hanya quine sederhana. Ini adalah bahwa dengan penghitung ditambahkan:
n
adalah variabel penghitung yang dicetak di awal. Kemudian ketika yang mencetakn=
bagian, ia menggantinyan+1
untuk%d
. Jadi dari sini ia akan dihitung hingga tak terbatas.Dan ini adalah versi finalnya. Ini menambahkan jika klausa berhenti pada 15, dan mencetak "BERHENTI!" demikian juga.
Kode lama:
Tidak akan pernah menang, tetapi menyenangkan. : PJauh lebih pendek sekarang, meskipun saya masih tidak punya kesempatan. : Psumber
else
s.PowerShell,
(215-10) = 205197167106104103 byte(Jika satu-satunya alat Anda adalah PowerShell, setiap masalah terlihat seperti paku. Tunggu ...)
Pada dasarnya, kita mulai dengan pengaturan
$d
yang sama dengan string besar-ole-panjang dari hampir- Quine dari kode asli. Ini output1
dan kemudian$d
dengan operator Format-f
untuk benar mengisi{0}
,{1}
,{2}
berdiri-in, incrementing{2}
nomor di,1*{2}
bagian per satu setiap kali.The
,x*y
operasi pada PowerShell menciptakan array baru dariy
item, yang masing-masing sama denganx
. Misalnya,,2*3
setara dengan@(2,2,2)
.Ini berarti, output pertama akan
1, $c=(,1*2).length;$d=(etc...)
, jadi ketika kode kedua dieksekusi,$c
akan sama dengan jumlah array@(1,1)
, atau2
, dll. Catatan yang$c
tidak digunakan sebagai variabel dalam kode asli, hanya dalam menjalankan selanjutnya.Berhenti ketika mencetak 15 dengan hanya menghitung apakah
$c
sama15
dan kemudian mengindeks ke dalam array, elemen 0 adalah$c, $d
seperti yang dijelaskan di atas, yang lain adalah adil15
. Jadi, ketika$c
berusia 15 tahun, itu akan keluar15
dan tidak ada yang lain. Tidak memenuhi syarat untuk bonus, karena"15, {0}STOP!{0}"
5 karakter terlalu lama untuk -10 menjadi berharga.Membutuhkan terminal PowerShell dengan lebar> ~ 150. Atau bagi Anda untuk secara manual menghapus linebreak tambahan (bahwa terminal membantu memasukkan bungkus keluaran) saat menyalin-menempelkan kode. Atau bagi Anda untuk menangkap output menjadi variabel dan kemudian jalankan kembali variabel itu. Dll
Sunting 1 - Menyimpan beberapa byte dengan menghapus "STOP!" susunan kata.
Sunting 2 - Durr, jangan gunakan. Panjang setiap kali, cukup panggil sekali
Sunting 3 - Tidak perlu quine, jadi proses awal bisa jauh lebih singkat
Sunting 4 - Berubah dari menggunakan string ke array untuk menghitung
$c
, yang menyimpan dua byte. Saya cukup yakin ini hampir optimal untuk pendekatan ini.Sunting 5 - Disimpan byte lain dengan langsung menghitung kesetaraan daripada modding
sumber
JavaScript, 79 - 10 = 69 byte
Tanpa menggunakan
Function.prototype.toString
cara apa pun.sumber
Befunge, 57 - 10 = 47 byte
Yang ini luar biasa. Coba di sini .
sumber
STOP!
Batch, 73 + 5 - 10 = 68 byte
Membutuhkan
CMD /V:ON
jadi saya menambahkan 5 byte untuk itu.sumber
Python 2.7, 107 karakter
Dengan menggunakan rekursi dan tidak menulis quine, saya pikir saya bisa menghemat banyak, itu benar, tetapi tidak cukup baik. Meski bukan pemenang, saya pikir pendekatan ini menyenangkan untuk dibagikan.
Saya mulai dengan membuat string untuk N = 4, melarikan diri
\
dan"
karakter.Kemudian saya membuat fungsi lambda yang membuat string ini, berdasarkan indeks awal dan indeks berhenti, menggunakan rekursi. Ini dia:
Gunakan seperti ini:
Output: [32902 karakter, terlalu lama untuk ditangani]
Jadi, tampaknya pendekatan kompleksitas kolmogorov saya tidak begitu berhasil ;-)
sumber
SMBF , 28 byte
\x10
mewakili byte literal (nilai desimal 16). Integer adalah output sebagai integer (byte). Jadi keluaran karakter pertama adalah\x01
. Program kemudian mencetak ",". Saat mencetak sumbernya sendiri, ia mencetak ekstra+
di awal.Penjelasan:
Perhatikan bahwa Anda tidak dapat menjalankan ini dalam juru bahasa standar karena membutuhkan hex literal dalam input. Anda juga memerlukan terminal khusus agar output hex berfungsi dengan baik.
sumber
Bash,
787473 - 10 = 63 byte (Contoh, tidak dapat menang)Datang terlambat, tetapi melihat bash belum dicoba jadi cobalah. Tantangan jurang pertama dan teka-teki seperti quine. Mereka menyenangkan!
Penjelasan:
Ini berfungsi karena
a
langkah dari 1 hingga 15 dan kemudianunset
diikutip
. Script (disimpan dalamp
) mencetak keduanya jika merekaset
dan "BERHENTI!" jika tidak. Awalnyaunset
a
adalahset
0 karena muncul dalam ekspansi aritmatika.sumber
𝔼𝕊𝕄𝕚𝕟, 30 karakter / 47 byte (tidak kompetitif)
Try it here (Firefox only).
Akhirnya menemukan quine sejati yang bagus untuk 𝔼𝕊𝕄𝕚𝕟.
Penjelasan
Inilah quine sebenarnya yang saya gunakan:
⟮ⒸⅩ222+ᶈ0
Anda melihatnya dalam jawaban saya? Semoga kalian bisa berkembang dari sana.
sumber
Keg + PHP, 19-10 = 10 byte
Dihitung dari 1 hingga 15 dan kemudian berhenti. TIO
Tong, 13 byte
sumber