# 4"16" 3//v\(@#/;\D"14"<;n4
#/*`3 afaaZ">;[77*,68*,@;'1,'1,q)(22)S# ␉␉␉␉ (
#yy␉;36!@
#`<` ␉
#=␉x
#<]+<[.>-]>[
#␉<
###xR+++++[D>+++++++L+++<-][<<<]>+.---.>][
#px%>~~~+␉+~*ttt*.x
#D>xU/-<+++L)
#R+.----.R␉>]|
#[#yy#yy0l0mx01k1k0l0ix0jx0h0h1d111P0eU0bx0b0o1d0b0e0e00x1d0i0fx0g0n0n11x0o0n0cx0c0o0f0c0gx0g0f0h0j0j0i0001k10mx0m0l11111100(^_)
#|␉
print((eval("1\x2f2")and(9)or(13 ) )-(0and 4)^1<<(65)>>(62))or'(\{(\{})(\{}[()])}\{}\{}\{})'#46(8+9+9+9+9+=!)#1111|=/=1/24=x=9[<$+@+-@@@@=>+<@@@=>+<?#>+.--.]/
__DATA__=1#//
#.\."12"␉*
###; console.log 39
""""#//
=begin␉//
#*/
#define␉z sizeof 'c'-1?"38":"37"
#include<stdio.h>
int main() /*/
#()`#`\'*/{puts(z);}/*'``
$'main'␉//
#-3o4o#$$$
<>"3"O.<␉>//
#
=end #//
"""#"#//
#0]#echo 21#/(\[FAC,1<-#2FAC,1SUB#1<-#52FAC,1SUB#2<-#32FACLEGEREEX,1PLEASEGIVEUPPLEASE) a>>>
#>27.say# /7Jn~15o|
#8␛dggi2␛`␉|1|6$//''25 =#print(17) ###^_^_LEintnd"3"z!]/}23!@/*///Z222999"26
␉
adalah tab literal, ␛
karakter ESC literal; Stack Exchange akan memotong-motong program sebaliknya. Saya sarankan untuk menyalin program dari kotak "masukan" dari tautan TIO di bawah ini, jika Anda ingin mengerjakannya.
Cobalah online!
Skor VIP (Printer Integer Serbaguna): 0,01329
Kehabisan
Program ini mencetak 41 di BrainF ***, 40 di Minimal-2D, 39 di CoffeeScript, 38 di C, 37 di C ++, 36 di Labyrinth, 35 di INTERCAL, 34 di Rail, 33 di Insiden, 32 di Whirl, 31 di SNUSP Modular, 30 di Whitespace, 29 di Trigger, 28 di Brain-Flak, 27 di Perl 6, 26 di 05AB1E, 25 di Pip, 24 di Thutu, 23 di Hexagony, 22 di Underload,21 di Nim, 20 di Prelude, 19 di Reng, 18 di Kardinal, 17 di Julia, 16 di Pyth, 15 di Haystack, 14 di Turtlèd, 13 di Ruby, 12 di Fission, 11 di Befunge-98, 10 di Befunge- 93, 9 di Perl 5, 8 di Retina, 7 di Japt, 6 di SMBF, 5 di Python 2, 4 di> <>, 3 di Minkolang, 2 di V / Vim, dan 1 di Python 3.
Verifikasi
Sebagian besar bahasa diuji oleh driver tes yang ditunjukkan di atas. Anda dapat menguji Reng di sini dan SNUSP Modular di sini ; mereka menghasilkan 19 dan 31 masing-masing, sesuai kebutuhan.
Test Driver telah diperbarui untuk menyertakan Tokenizer, akhirnya. Semua kode C disimpan sebagai argumen dari perspektif Bash Script. Saya juga mengubah output untuk membungkus secara horizontal dengan spasi tambahan setelah setiap token alih-alih menghasilkan secara vertikal. Ini hanya preferensi saya, agar sesuai dengan output Whitespace. Tetapi orang lain dapat mengubahnya jika mereka merasa itu terlalu membingungkan.
Saya juga membuat penyesuaian Test Driver untuk menangani spasi kolom untuk Turtlèd's UFT8 char di jadwal. Ketidakselarasan itu membuatku gila! "Perbaikan" ini cukup hack-ish karena hanya mencari è dan mengubah lebar kolom untuk kasus itu, tetapi itu menyelesaikan pekerjaan.
Penjelasan
Pertama, saya ingin mengatakan betapa mengagumkannya snipet kode Skor Rundown dari SnoringFrog's Integer Printer dari pos terakhir. Saya telah menghitung jawaban sebelum memposting untuk sementara waktu, dan ini telah mengilhami saya untuk tetap kecil. Saya pikir kita bisa mengalahkan jawaban @ sp3000 pada akhirnya.
Jadi saya mulai mengerjakan jawaban ini dengan mencoba mengurangi apa yang saya bisa dan saya cukup sukses. Saya bahkan punya jawaban dalam bahasa yang berbeda dengan jumlah byte total lebih kecil dari # 40. Tetapi ketika saya mencoba bermain Minimal-2D, saya harus belajar BF sehingga saya bisa bekerja dengan turunannya dan dalam prosesnya saya menemukan pemecahan rekor @ Primo Hello, World! . Aku jatuh cinta pada keanggunan.
Minimal-2D, ternyata, tidak cukup efisien untuk memanfaatkan teknik inisialisasi tape yang digunakan oleh @PoGo, tapi saya berpendapat sekarang mungkin akan terlalu berat byte. Kami hanya mencoba mencetak bilangan bulat. Tapi @Primo memang mengirim saya ke jalur untuk belajar bagaimana mengalikan dalam BF, yang saya bawa ke kode Minimal-2D.
Kemudian setelah semua ini, saya membaca kembali komentar @ SnoringFrog tentang cara memasukkan BF dan menyadari bahwa tidak hanya saya bisa melakukannya, tetapi saya juga bisa menggunakan banyak kode Minimal-2D yang saya temukan dalam jawaban BF. Jadi saya menggali untuk menjawab dengan BF, dan inilah kita.
Satu hal lagi sebelum saya masuk ke detail. Ada beberapa perubahan yang saya buat untuk alasan non-golf. Pertama, saya memindahkan sebagian besar kode @SnoringFrog ditambahkan ke tepat di bawah bahasa 2D di beberapa baris teratas. Bagi saya, ini adalah langkah strategis jangka panjang untuk mencegah 2D-langs melintasi pusat polyglot untuk mencegah bug di masa depan jika memungkinkan. Hit byte rendah untuk gerakan ini, jadi saya melakukannya.
Kedua, selama berbagai faktor ulang, saya mengetahui bahwa Begunges dan Minkolang menghasilkan spasi tambahan setelah output numerik dan bahwa ini adalah penyebab byte nol yang telah kami lihat di Test Driver untuk bahasa-bahasa ini. Saya memperbaikinya dengan mengeluarkan nilai stack sebagai kode ascii (yang tidak menyertakan fitur spasi tambahan), alih-alih nilainya secara langsung. Ada hit byte kecil untuk perubahan ini juga, tetapi sekarang output Driver Test sangat seragam. Bagaimana bisa aku tidak?
SM / BF
Mari kita cepat membahas dasar-dasarnya. Ini adalah satu-satunya perintah yang valid untuk SMBF dan BF:
> Move the pointer to the right
< Move the pointer to the left
+ Increment the memory cell under the pointer
- Decrement the memory cell under the pointer
. Output the character signified by the cell at the pointer
, Input a character and store it in the cell at the pointer
[ Jump past the matching ] if the cell under the pointer is 0
] Jump back to the matching [ if the cell under the pointer is nonzero
Kedua bahasa memiliki pita memori di mana nilai disimpan dan diubah. Satu-satunya perbedaan SMBF adalah bahwa kode apa pun yang sedang dieksekusi juga disimpan pada pita memori di sebelah kiri titik awal. Seperti yang ditunjukkan oleh @SnoringFrog, membuat SMBF dan BF untuk menghasilkan hasil yang berbeda bergantung pada pemindahan penunjuk memori ke kiri sumber aslinya. Dalam penerjemah BF Tio, penunjuk memori mampu bergerak ke kiri dari asal dan akan menemukan 0 alih-alih kode ascii Polyglot yang dilihat SMBF. Berikut adalah contoh yang dapat dijalankan di SMBF dan BF untuk menunjukkan perbedaannya.
Pada awal polyglot, Befunges mengharuskan >
pada baris kedua untuk menjalankan sampai selesai dan Perl6 mengharuskan setiap >
didahului oleh a <
. Jadi SM / BF mulai dengan<>
meninggalkan penunjuk memori di tempat asalnya, lalu tekan [
yang melompat beberapa karakter ofensif untuk kedua bahasa ke ]
pada baris ke-6.
Selanjutnya, kami menambah sel memori asal untuk kedua bahasa dan memindahkan penunjuk memori ke kiri dengan +<
. (Untuk konvensi percakapan, kami akan memanggil sel memori asal sebagai sel 0, sel di sebelah kanan titik asal 1, 2, ... Dan sel di sebelah kiri -1, -2, ...). Sel -1 berisi kode asci dari karakter terakhir dalam polyglot di SMBF dan 0 di BF, jadi ketika berikutnya [
ditemui, hanya BF melompat ke yang berikutnya ]
sementara SMBF masuk ke dalam kode.
Sebagai SMBF melintasi [.>-]
ia mencetak 6 yang ditemukan di ujung polyglot dan kemudian memindahkan penunjuk memori kembali ke sel 0, mengatur nilainya kembali ke nol untuk keluar dari ]
. Untuk meninjau, rekaman di pint ini adalah: Sel-sel negatif SMBF menahan polyglot, dan itu 0 dan sel-sel positif memegang nol. Sel-sel negatif dan positif BF memegang nol sedangkan sel asal memegang 1.
Selanjutnya >
pindahkan SMBF ke sel 1 dan BF kembali ke sel 0 yang memungkinkan BF untuk memasukkan blok kode pribadi:[<+++++[>++++++++++<-][<<<]>+.---.>]
(Saya telah menghapus karakter non-BF dari ini). Di sini, kita kembali ke sel -1 dan menginisialisasi variabel kontrol loop (sel -1) ke nilai 5. Kemudian kita masukkan loop di mana kita menambahkan 10 ke sel 0 dan mengurangi sel -1 lima kali sebelum keluar dari loop di mana kita akan menunjuk pada sel -1 dengan nilai 0.
Selanjutnya kita temui [<<<]
sambil menunjuk nol, jadi BF tidak melewati ini. Tujuannya di sini adalah untuk menyeimbangkan sejumlah >
's dengan sebelumnya <
sehingga Perl6 tidak kesalahan.
Pada titik ini sel 0 bernilai 51. Nilai ascii dari 4 adalah 52, jadi kami memindahkan kursor ke sel 0 tambah 1, lalu cetak nilainya. Dan akhirnya, kita menurunkan sel 0 kembali ke karakter ascii 1 dan mencetak lagi sebelum mengatur penunjuk memori ke sel 1 (nilai 0) untuk keluar melewati ]
.
SMBF dan BF keduanya mencapai yang terakhir [
pada baris 8 berikutnya sementara keduanya bertumpu pada nilai 0. Jadi keduanya melompat melewati kode Minimal-2D yang tersisa sampai ]
ditemui pada baris 11. Tapi ini berumur pendek karena baris 12 dimulai dengan yang lain[
yang membawa kedua bahasa ke hampir akhir polyglot di mana tidak ada instruksi lebih lanjut ditemui.
Refaktor
Minimal-2D
Minimal-2D menulis ulang sebagian besar untuk menghemat beberapa byte dengan cara yang mirip dengan trik multiplikasi BF. Minimal-2D namun tidak memiliki [
dan ]
karakter untuk kontrol loop. Sebaliknya ia memiliki perintah-perintah ini:
/ Skips next instruction if the data pointer is set to 0.
U Tells the program to switch to the up direction of processing instructions.
D Tells the program to switch to the down direction of processing instructions.
L Tells the program to switch to the left direction of processing instructions.
R Tells the program to switch to the right direction of processing instructions.
Ini dapat digunakan untuk menghasilkan struktur logika yang sama, meskipun dalam manor 2D, seperti halnya pada BF. Misalnya, BF's ++++++[>++++++<-]>.
setara dengan ini dalam Minimal-2D.
Berikut adalah versi disederhanakan dari kode Minimal-2D di polyglot, dengan semua kode asing dihapus dan semua karakter tempat holding diganti #
.
###################D
###R+++++[D>+++++++L
###>
D>#U/-<+++L)
R+.----.R
The D
sejalan 1 mengirimkan instruksi pointer turun ke L
sejalan 8 dari polyglot yang mengirimkan pointer ke kiri. Di sini kita mengatur variabel kontrol loop (sel 0) ke 7, pindahkan penunjuk memori ke sel 1 dan masukkan satu loop. Dalam lingkaran, kita menambahkan 3 ke sel 1, menurunkan sel 0 lalu memeriksa apakah nilai sel 0 masih nol. Jika tidak, kami menambahkan 8 lagi ke sel 1 lalu mengurangi dan memeriksa lagi. Hasil dari loop ini adalah nilai sel 1 diatur ke 51 pada akhir loop (6 * 8 + 3).
Kami keluar dari loop dengan melompat U
, memindahkan penunjuk memori ke sel 1 dan turun kemudian ke kanan pada baris 11 dari polyglot. Dan akhirnya, kami menambah hingga nilai ascii untuk 4 lalu turun ke nilai ascii untuk 0 sebelum lari ke kanan untuk mengakhiri program.
Retina
Retina memiliki banyak persyaratan yang sulit untuk dikerjakan untuk semua turunan BF. Tidak suka berturut - turut +
atau tidak cocok ()
atau []
. Tapi ini benar-benar hanya persyaratan untuk setiap baris lain, jadi banyak pekerjaan untuk BF, SMBF dan Minimal-2D berputar menempatkan sebagian besar kode pada baris genap.
Satu byte yang |
dikhususkan hanya untuk Retina adalah pada akhir baris 11. Mengutip @ ais523 “kebanyakan regex berakhir dengan | akan cocok dengan apa pun ”. Tanpa ini, Retina mengembalikan 0. Mengapa ini memperbaikinya, saya tidak tahu. Saya tidak perlu menggali Retina terlalu banyak, mungkin karena saya telah menghindari antrian panjang. Tapi seperti Prelude, saya menemukan saya tidak perlu memahaminya sebanyak yang saya perlu mengerti bagaimana men-debug itu, yang dalam hal ini sebagian besar terdiri dari menghapus garis (dalam kelipatan 2) sampai saya menemukan garis itu menyebabkannya pecah. Saya menduga perbaikan ini berdasarkan komentar @ ais523, dan dihargai. Kurasa terlalu keren untuk sekolah.
Kardinal
Saya kebetulan menyukai penempatan Minimal-2D dari @ SnoringFrog ke kode Cardinal. Ini adalah lokasi yang baik mengingat Cardinal tidak mengecewakan Retina, dan sepertinya memungkinkan beberapa menjalin dengan Minimal-2D. Jadi ketika saya memulai transplantasi Minimal-2D hingga ke 2D, saya membawa Cardinal untuk ikut. Ada beberapa perubahan kosmetik pada Cardinal. Pertama, saya melemparkan >
hampir awal pernyataannya #p x%>~~~+ +~*ttt*.x
untuk Minimal-2D untuk mengubah pointer memori dalam loop-nya / Kedua, saya menggeser semua karakter satu ke kanan untuk memberikan ruang Minimal-2D untuk keluar dari loop itu dengan anggun. The p
dalam sengatan ini untuk padding karakter ini.
Befunge / 98
The Befunges sebenarnya di mana saya mulai mencoba golf turun polyglot, karena C ++ refactor mengubah semua kode lang 2D lainnya, kecuali yang ini. Dalam mencoba mempelajari WTF yang terjadi dalam kode ini, saya menemukan ini di dokumentasi Begunge:
The .
perintah akan muncul nilai dari tumpukan dan output sebagai integer desimal, diikuti dengan spasi , agak seperti Forth. ,
akan memunculkan nilai, menafsirkannya sebagai nilai ASCII dari suatu karakter, dan menampilkan karakter tersebut ( tidak diikuti oleh spasi. )
Molly suci! Kita dapat membersihkan byte nol pada output. Setelah ini, itu semua hanya masalah mencari tahu bagaimana cara memasukkan nilai asci yang lebih besar, dan memisahkan kode. Befunge-98 memiliki kode melompat ;
mengatakan hal itu untuk melewatkan [77*,68*,@
di ;[77*,68*,@;'1,'1,q
, yang memberi kami segregasi tersebut.
Befunge-98 juga memiliki perintah ( '
) untuk mengambil kode ascii dari karakter selanjutnya. Jadi, '1,
ambil kode kode asci untuk karakter tersebut 1
, letakkan di tumpukan, lalu cetak karakter ascii untuk nilai teratas di tumpukan ,
. Hanya harus melakukan ini dua kali untuk mencetak 11 dan menjatuhkan q
untuk keluar dengan anggun.
Befunge yang tepat sedikit kurang nyaman, tetapi hanya adil. Di sini kita harus melakukan perhitungan untuk meletakkan kode yang diinginkan di tumpukan. Untungnya, kode kita dengan mudah dikalikan dengan 7 * 7 dan 6 * 8 sebelum perintah output yang sama ,
. Kemudian kami keluar dari Befunge dengan @
sebelum kode kakaknya terkontaminasi output.
Minkolang
Setelah menemukan perbaikan untuk ruang trailing Befunge saya cukup bersemangat tentang ide menemukan perbaikan Minkolang juga dan dokumentasi Minkolang mengatakan bahwa perintah output yang telah digunakan sampai titik ini bekerja dengan cara yang sama seperti Juru Bahasa Befunge. O
Kebetulan didokumentasikan sebagai perintah output lain, yang tidak digambarkan sebagai berbagi Begunge-ness ini, jadi saya hanya mengambil bidikan dalam gelap dan mencoba mengeluarkan string "3"
. Kemenangan sempurna.
> <>
Salah satu hal pertama yang saya lihat ketika memindahkan kode Minimal-2D adalah memverifikasi bahwa saya bisa bergerak> <> bersamaan dengan itu. Jika saya akan berurusan dengan transversalisme polyglot 2D, saya akan berurusan dengan semua pelanggaran. Saya pada dasarnya beruntung memilah jalan saya ke solusi menempatkan ;n4
pada akhir baris 1 dan pindah \D
lebih jauh ke belakang di baris 1. BTW, saya tidak tahu bahwa> <> dapat diarahkan ke bawah sebelum jawaban 40 karena sudah terkandung dengan sangat baik . Saya ingin berpikir ini dapat digunakan nanti untuk menyimpang> <> dari bahasa lain yang serupa.
Perl6
Saya sudah bicara tentang beberapa <>
masalah keseimbangan Perl6 di tempat lain dalam jawaban ini, jadi saya tidak akan membahasnya lagi. Tetapi saya ingin menunjukkan bahwa saya pindah#>27.say#
ke baris kedua ke baris terakhir. Ini tidak memiliki tujuan fungsional dalam jawaban ini. Saya benar-benar membuat langkah ini untuk memuaskan jawaban berbeda yang akhirnya saya tidak menggunakan putaran ini. Saya memutuskan untuk meninggalkannya karena saya berencana untuk mengirim jawaban itu di kesempatan berikutnya dan saya tidak ingin repot-repot membatalkan dan melakukannya lagi.
Perbaikan kerusakan
05as1e
05as1e pasti tidak suka kode Begunge baru seperti versi lama. Saya kira itu ,
karena itu satu-satunya karakter revolusioner. Bagaimanapun, saya harus pindah "
lebih jauh ke belakang di baris dua untuk menyembunyikan perintah ofensif, dan saya tahu bahwa "
harus pergi sebelum jalur kode Befunge karena "
merupakan ya-op dalam kedua bahasa. (Saya hanya bisa membuat istilah seperti yes-op kan?) 2-dimentionality Line 2 cukup kaku, tapi saya bisa mengganti <
sebelum kode jalur Begunge dengan "
. The <
namun adalah kebutuhan Perl6. (Itu harus memiliki <
semua sebelumnya >
.) Saya dapat menjatuhkan <
baris satu di lokasi yang diramalkan oleh naluri dan pengetahuan sebelumnya menyelesaikan 05ab1e dan pertikaian Perl6.
Berputar
Perubahan Befunge pada baris 2 menambahkan ekstra 1
ke polyglot sebelum garis Insident / Whirl. Ekstra ini 1
menyebabkan Whirl untuk mulai menunjuk ke instruksi yang salah pada roda. Yang paling pertama 1
dalam arahan preprocessor C / C ++ hanyalah referensi nomor baris dalam kode, dan ini bisa dengan mudah menjadi nomor baris lain, jadi saya sewenang-wenang mengubah ini 4
untuk memuaskan Whirl.
Kejadian
String detokenizing pada akhir polyglot sudah dikenal saat ini, jadi saya tidak akan membahasnya. Saya menghapus dari string apa yang saya bisa dan menambahkan token baru yang diperlukan. Ada 2 karakter detokenizing yang tidak ada dalam string ini meskipun saya harus tunjukkan. Pertama, yang kedua R
di #R+.----.R >]|
yang dibutuhkan di sini karena itu titik Fusion awal, dan itu lebih aman pada baris ini karena sudah ada Fusion awal titik pos dalam arah yang sama. Kedua, x
in #= x
adalah untuk menghapus token yang terlibat dalam suatu ␉␊#
pola, yang telah menjadi lebih umum.
Lainnya
Hexagony, Whitespace, dan Prelude semuanya memiliki penyesuaian kecil yang biasa, tetapi tidak ada yang layak dibicarakan.
Pikiran terakhir
Hanya itu yang saya dapat untuk jawaban ini. Bagi mereka yang mencari titik awal pada jawaban berikutnya, saya sarankan yang jahat. Tampaknya bisa diterapkan, meskipun saya belum melihatnya terlalu dekat, tetapi saya kira itu tidak akan terlalu sulit untuk diintegrasikan. Saya tahu ini memiliki perintah lompat yang seharusnya membantu melewati sebagian besar polyglot. Semoga berhasil.