Cetak 1 hingga 15, menggunakan printer yang berbeda


22

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 Ndan kode yang dapat dieksekusi. Kode selanjutnya harus di-output N+1dan 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 01untuk 1.
  • Output harus dalam format N, Code_for_N+1. Perhatikan bahwa output dipisahkan oleh koma dan spasi tunggal. Kode untuk N+1tidak memiliki tanda kutip di sekitarnya. N , Code_for_N+1tidak 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=2dapat: 2, printer 2. Dalam hal ini, printer 2adalah kode untuk N=3. Anda tidak dapat menggunakan seluruh output: 2, printer 2sebagai kode untuk N=3.
  • 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=15maka ia harus mencetak STOP!(lihat bonus), atau tidak mencetak apa pun (bahkan spasi atau baris baru).
    • Kode untuk N=15tidak bisa crash (tetapi keluaran ke STDERR tidak masalah).
    • Anda didiskualifikasi jika kode output untuk N=15dicetak 16atau apa pun (kecuali kotak bonus).
  • 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!


Jadi, katakanlah, f=>f+""apakah tidak valid? ( f+""mengembalikan kode konstruksi fungsi.)
Conor O'Brien

@CᴏɴᴏʀO'Bʀɪᴇɴ tanpa itu, apakah mungkin untuk mencapai tugas ...
nicael

@nicael Sudah dilakukan, setidaknya dalam jawaban js
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ ... dengan cara yang layak: D
nicael

Peraturannya membingungkan, dapatkah saya mengeluarkan sesuatu seperti 14, print(14+1)atau tidak?
nyuszika7h

Jawaban:


39

Pyth + ///, 15 byte - 10 = 5

pPt`S15", STOP!

Ini mencetak 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, STOP!dalam Pyth, dengan mengambil range(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 kedua

2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15

memberi 2dan program ketiga 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15. Program kedua dari belakang 15, STOP!,, mencetak 15, STOP!, jadi program terakhir itu adil STOP!.


3
Bermuka tebal. Saya suka itu. :)
Martin Ender

Apakah catdihitung sebagai bahasa?
user253751

@immibis cattidak melakukan tes primality, jadi tidak.
user48538

1
Program # 2 ke atas juga berfungsi dalam PHP. :)
Ilmari Karonen

31

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, ...

alert("14,alert(\"15, alert(\\\"STOP!\\\")\")")

7
Saya pikir ini adalah backslash terbanyak dalam setiap jawaban PPCG.
lirtosiast

1
Saya akui telah menggunakan NP ++ dan regex untuk ini =)
flawr

19
Haha, ini -10 banyak membantu: D
nicael

2
Saya telah menciptakan solusi 87573-byte yang sedikit kurang naif .
LegionMammal978

Anda dapat menyimpan beberapa byte tanpa bonus.
R

8

CJam, 26 25 24 byte

1{", "2$)@"_~"](_F<@*}_~

Cobalah online.

Program-program selanjutnya hanya menambah nomor pertama. Ini menjalankan program 16 kali.


Atau dengan bonus untuk skor yang sama:

1{", "\2$)_G<\@`+"_~"+"STOP!"`?}_~

Cobalah online.

Program-program selanjutnya hanya menambah nomor pertama. Ini menjalankan program 16 kali.

Solusi alternatif untuk bonus:

1{", "\2$)Gmd@`+"_~"+"STOP!"`\?}_~

2
@FryAmTheEggman cjam.tryitonline.net/... menggunakan Base64 untuk menyandikan program, yang membuat posting permalink dalam komentar sedikit lebih mudah. </selfpromotion>
Dennis

@ Dennis Terima kasih, itu agak sakit kepala: P Sepertinya martin yang menulis sendiri.
FryAmTheEggman

@FryAmTheEggman Hanya setelah saya melihat tautan Anda, jadi terima kasih atas sarannya. ;)
Martin Ender

7

JavaScript (ES6), 62 61 byte - 10 bonus = skor 51

_=>"1, "+(f=n=>`_=>"`+(n<16?n+`, "+(${f(n+1)})`:`STOP!"`))(2)

Penjelasan

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.

_=>
  "1, "                // print the first number
  +(f=n=>`_=>"`+(      // f = recursive function for printing program N
    n<16?              // for programs 2 - 15:
      n+`, "+(${       // add N to the output of the nested function
        f(n+1)         // nest the code of program N + 1
      })`
    :`STOP!"`          // program 16 just outputs "STOP!" for the bonus
  ))(2)                // start from program 2

Uji


1
+1 karena tidak menggunakan fitur bawaan JavaScript untuk mendapatkan tubuh fungsi (area abu-abu untuk quining)
A

2
@Callodacity Bagaimana "" + (n=>m)tidak dihitung sebagai mendapatkan tubuh fungsi n=>m?
Neil

@Neil Sebenarnya Anda benar itu masuk
akal

Kemana semua backslash pergi !?
Noodle9

5

Matlab, 226 212 - 10 = 202 byte

Terima kasih kepada @StewieGriffin untuk beberapa byte =)

'awFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)

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 .

'awFjw|Dro)w1:26B?G:>DwF0\}xy*0Dnu|nDwFdw~v;|}{1w1:26B?2505)05<B5w1:24:5w1;Cnwm25<B5>B5w1;Cnwm26B500fDnwmDmr|y1w2';
n=ans;if n(1)-96>15;n='Stop!';else;n=[num2str(n(1)-96),', ',39,n(1)+1,n(2:end),39,59,n(2:end)-9,''];end;disp(n)

Di sini beberapa baris terakhir dari urutan disalin dari konsol:

>> 'mwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
13, 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'nwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
14, 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'owFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
15, 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
>> 'pwFjw|DWFw1:2DVFw1;Cnwm2Dro)WG:::DwF0\]XY*0Dnu|nDwFdw~v;|}{1W6B?2505)05<B5W4:5V5<B5>B5V6B500fDnwmDmr|y1w2';n=ans;N=n(1);M=n(2:end);if N>111;n='STOP!';else;n=[num2str(N-96),', ',39,N+1,M,39,59,M-9,''];end;disp(n)
STOP!

5

JavaScript, 50 47 44 42 44 * byte

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1)

Ini 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).

a=_=>(x=1)+(x<15?", a="+a:"").replace(x,x+1);
alert(a());

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 mungkin


1
Bagaimana "fitur bawaan untuk mendapatkan fungsi tubuh" tidak sama dengan operator quine? Saya tidak mengatakan itu tidak valid, saya hanya ingin tahu apa bedanya?
Stewie Griffin

Saya hanya mengerjakan satu. o_o Tidak bisakah kamu melakukannya .replace(x++,x)?
Conor O'Brien

3
@StewieGriffin Ones dibuat untuk quining, yang lainnya adalah fitur yang sah.
Conor O'Brien

@Stewie Tetapi "operator quine" seharusnya mengembalikan seluruh program, sementara dalam contoh saya ini mengambil fungsi, tanpa tujuan untuk membuat quine (tidak ada built-in untuk mengembalikan seluruh kode program). Karena Anda sudah mengizinkan fungsinya, bisa jadi mirip, karena itu saya bertanya-tanya.
nicael

Apakah a=_=>(x=1)+(x<15?`, ${a}`:"").replace(x,x+1)bekerja?
Conor O'Brien

5

Python 2.7.10, 196 92 - 10 = 82 byte

Wah !!! Ini sangat menyenangkan. Jauh lebih pendek sekarang. : P

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

Penjelasan:

Saya mulai dengan ini:

a='a=%r;print a%%a';print a%a

Itu hanya quine sederhana. Ini adalah bahwa dengan penghitung ditambahkan:

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)';print n,a%(n+1,a)

nadalah variabel penghitung yang dicetak di awal. Kemudian ketika yang mencetak n=bagian, ia menggantinya n+1untuk %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.

n=1;a='n=%d;a=%r;print n,a%%(n+1,a)if n!=15else"STOP!"';print n,a%(n+1,a)if n!=15else"STOP!"

Kode lama:

a= ['if num==15:print"STOP!!!";exit()','print num','print"a=",a','print"num=",num+1', 'for s in a:print s']
num= 1
print num
if num==15:print"STOP!!!";exit()
print"a=",a
print"num=",num+1
for s in a:print s

Tidak akan pernah menang, tetapi menyenangkan. : P Jauh lebih pendek sekarang, meskipun saya masih tidak punya kesempatan. : P


Wow. Bisakah Anda menambahkan penjelasan karena ini keren tapi saya tidak tahu apa yang terjadi: D
Sherlock9

@ Sherlock9 selesai. Terima kasih atas penghargaannya.
R

Jika saya memotong dan menempelkan ini ke sesi python interaktif 2.7.6 itu mengeluh bahwa tidak ada spasi sebelum elses.
eric

@ eric Saya menggunakan python 2.7.10 dan bekerja untuk saya ...
R

3

PowerShell, (215-10) = 205 197 167 106 104 103 byte

$d='$c=(,1*{2}).count;$d={0}{1}{0};(("$c, $d"-f[char]39,$d,($c+1)),$c)[$c-eq15]';"1, $d"-f[char]39,$d,2

(Jika satu-satunya alat Anda adalah PowerShell, setiap masalah terlihat seperti paku. Tunggu ...)

Pada dasarnya, kita mulai dengan pengaturan $dyang sama dengan string besar-ole-panjang dari hampir- Quine dari kode asli. Ini output 1dan kemudian $ddengan operator Format -funtuk benar mengisi {0}, {1}, {2}berdiri-in, incrementing {2}nomor di ,1*{2}bagian per satu setiap kali.

The ,x*yoperasi pada PowerShell menciptakan array baru dari yitem, yang masing-masing sama dengan x. Misalnya, ,2*3setara dengan @(2,2,2).

Ini berarti, output pertama akan 1, $c=(,1*2).length;$d=(etc...), jadi ketika kode kedua dieksekusi, $cakan sama dengan jumlah array @(1,1), atau 2, dll. Catatan yang $ctidak digunakan sebagai variabel dalam kode asli, hanya dalam menjalankan selanjutnya.

Berhenti ketika mencetak 15 dengan hanya menghitung apakah $csama 15dan kemudian mengindeks ke dalam array, elemen 0 adalah $c, $dseperti yang dijelaskan di atas, yang lain adalah adil 15. Jadi, ketika $cberusia 15 tahun, itu akan keluar 15dan 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


Jendela konsol Windows 10 tidak lagi menyalin linebreak bungkus keluaran.
Neil

2

JavaScript, 79 - 10 = 69 byte

s='STOP!';for(i=15;i;){s=i--+',alert("'+s.replace(/[\\"]/g,"\\$&")+'")'};alert(s)

Tanpa menggunakan Function.prototype.toStringcara apa pun.


2

Befunge, 57 - 10 = 47 byte

1:'!`'#*j:.',,1+:9`''*'0++,1#;:0g:48*`j@,1+;"!POTS",,,,,@

Yang ini luar biasa. Coba di sini .


Casing yang tepat untuk stop message adalahSTOP!
user48538

@ zyabin101 diperbaiki.
MegaTom

2

Batch, 73 + 5 - 10 = 68 byte

@set a=STOP!
@for /l %%a in (15,-1,1)do @set a=%%a, @echo !a!
@echo %a%

Membutuhkan CMD /V:ONjadi saya menambahkan 5 byte untuk itu.


2

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.

print "1, print \"2, print \\\"3, print \\\\\\\"4, print \\\\\\\\\\\\\\\"STOP!\\\\\\\\\\\\\\\"\\\\\\\"\\\"\""

Kemudian saya membuat fungsi lambda yang membuat string ini, berdasarkan indeks awal dan indeks berhenti, menggunakan rekursi. Ini dia:

l=lambda n,m:str(n)+", print "+"\\"*(2**(n-1)-1)+"\""+l(n+1,m)+"\\"*(2**(n-1)-1)+"\"" if n<m else "STOP!"

Gunakan seperti ini:

print l(1,15)

Output: [32902 karakter, terlalu lama untuk ditangani]

Jadi, tampaknya pendekatan kompleksitas kolmogorov saya tidak begitu berhasil ;-)


2

SMBF , 28 byte

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

+.<-<<.>.>[[<]>.[.>]<[-]], \x10

Penjelasan:

+.                                  Increment number and print
  <-                                Pre-decrement loop counter
    <<.>.>                          Print comma and space from own source
          [             ]           Only execute if loop counter != 0
           [<]>.                    Move to left of source, then print `+`
                [.>]                Print entire source.
                    <[-]            Zero out the loop counter so this program halts.
                         , \x10     The comma, space, and loop counter used earlier.
                                    Input is empty, so `,` doesn't do anything.

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.


1

Bash, 78 74 73 - 10 = 63 byte (Contoh, tidak dapat menang)

p='if(($((++a>15))));then unset a p;fi;echo ${a-STOP\!}${p+, $p}';eval $p

Datang terlambat, tetapi melihat bash belum dicoba jadi cobalah. Tantangan jurang pertama dan teka-teki seperti quine. Mereka menyenangkan!

Penjelasan:

Ini berfungsi karena alangkah dari 1 hingga 15 dan kemudian unsetdiikuti p. Script (disimpan dalam p) mencetak keduanya jika mereka setdan "BERHENTI!" jika tidak. Awalnya unset aadalah set0 karena muncul dalam ekspansi aritmatika.


1

𝔼𝕊𝕄𝕚𝕟, 30 karakter / 47 byte (tidak kompetitif)

⟮a=1)+(a<ḏ?⬬+ⒸⅩ222+ᶈ0:⬯)ē(a,⧺a

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.


1

Keg + PHP, 19-10 = 10 byte

ï_(. \,,,)\!POTS(,

Dihitung dari 1 hingga 15 dan kemudian berhenti. TIO

Tong, 13 byte

ï_(. \,,,).
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.