Bukankah itu menjengkelkan ketika Anda menemukan sepotong kode dan Anda tidak tahu bahasa apa itu ditulis? Tantangan ini mencoba memecahkan masalah ini.
Tantangan
Anda harus menulis sebuah program yang ketika dijalankan dalam dua bahasa yang berbeda, akan menampilkan string:
This program wasn't written in <language program compiled/interpreted in>, it was built for <other language the program can be run in>!
Dalam output, nama bahasa harus memiliki huruf besar resmi. misalnya: CJam, C ++
Tidak ada program yang harus mengambil input dari pengguna.
Saat dijalankan dalam kedua bahasa, output harus stdout atau setara.
Seharusnya tidak ada output untuk stderr di kedua program.
Anda dapat menggunakan komentar dalam bahasa apa pun.
Dua versi berbeda dari bahasa yang sama dihitung sebagai bahasa yang berbeda.
Jika ini dilakukan, program harus menampilkan nomor versi utama, dan jika berjalan pada dua versi minor yang berbeda, harus melaporkan versi minornya juga.
Anda tidak boleh menggunakan fungsi versi prebuilt (ini termasuk variabel yang telah dievaluasi saat runtime).
Contoh output:
Perl dan Ruby:
Perl:
This program wasn't written in Perl, it was built for Ruby!
Rubi:
This program wasn't written in Ruby, it was built for Perl!
Python dan C:
Python:
This program wasn't written in Python, it was built for C!
C:
This program wasn't written in C, it was built for Python!
Python 2 dan Python 3:
Python 2:
This program wasn't written in Python 2, it was built for Python 3!
Python 3:
This program wasn't written in Python 3, it was built for Python 2!
Python 2.4 dan Python 2.7:
Python 2.4:
This program wasn't written in Python 2.4, it was built for Python 2.7!
Python 2.7:
This program wasn't written in Python 2.7, it was built for Python 2.4!
Ini adalah kode golf sehingga kode terpendek dalam byte menang.
argv[0]
?Jawaban:
Foo / CJam, 70 byte
Di Foo, seperti yang diketahui banyak orang, ia hanya mencetak semuanya dalam tanda kutip ganda, dan mengabaikan sebagian besar karakter lain atau melakukan sesuatu yang tidak memengaruhi output dalam kebanyakan kasus. Singkatnya,
\@
tidak melakukan apa-apa dan semua string dicetak apa adanya.Di CJam,
\
menukar dua item teratas, dan@
memindahkan item ke-3 ke atas, yang mengatur string ke dalam urutan yang benar. Dan setelah program berakhir, semua yang tersisa di tumpukan dicetak secara otomatis.sumber
R"This program wasn't written in ""Fission"", it was built for ""CJam"\@'!O
"This program wasn't written in Clip, it was built for CJam!"3{4-_36+e\}/
untuk Clip / CJam.C89 / C99,
171152136114111107105 byteTerima kasih di @Hurkyls, @Qwertiys, @ jimmy23013 dan @MD XF untuk petunjuk Anda.
versi golf:
versi tanpa ungolfed:
Sedikit deskripsi:
Versi C sebelumnya C99 hanya memiliki komentar multiline seperti ini:
dengan C99, komentar single line diperkenalkan. seperti ini:
jadi jika Anda mengkompilasi garis seperti ini:
kode untuk kompilasi terkait kompilasi c99 adalah:
sedangkan kode yang relevan untuk kompiler c89 adalah:
(sebagai yang pertama
/
bukan bagian dari komentar dan karenanya memperlakukan sebagai operator)sumber
//**/
. Di C89, itulah operator divisi diikuti oleh komentar kosong. Di C99,//
mulai komentar satu baris, sehingga sisa baris kosong. Oleh karena itu, di C89, menjadi(90-(-4.5/-4.5))
, yaitu 89, sedangkan di C99, menjadi(90-(-4.5-4.5))
, yaitu 99.188-c
sebagai gantic==99?89:99
.JavaScript / Ruby, 170 byte
Mungkin hanya 2.0, tampaknya tidak berfungsi di setidaknya 2.1.5 ... Sunting: Pembaruan sesuai saran dari @ Jordan semoga bekerja di beberapa versi sekarang!
Menyalahgunakan
~
operator dalam Ruby yang akan memperlakukan=~
sebagai pertandingan regex mengembalikan posisi pertandingan pertama dalam string (0
), tetapi JavaScript akan memperlakukannya sebagaimana=
~/1/
adanya-1
(karena/1/
dikonversi keNaN
untuk operasi numerik, yang memiliki0
nilai).sumber
NoMethodError: undefined method `log' for :log:Symbol
eval
kembali:log
. Saya pikir Anda bisa memperbaikinya dengan menempatkan;c
setelahend
. The=~
/= ~
trik besar, meskipun!$><<s
bukanputs s
dan menggunakan tanda kutip ganda sehingga Anda dapat memasukkan backslashwasn\'t
.\'
dengan tanda kutip ganda, dan$><<
berarti saya bisa menerapkan perbaikan yang Anda sebutkan dan menyimpan jumlah byte yang sama!Python 2 / Python 3, 92
Menggunakan pemeriksaan versi Python "standar" (bilangan bulat vs float).
sumber
Memancing / > <>
233217 byteMemancing adalah bahasa yang didasarkan pada seorang nelayan yang berjalan berkeliling menangkap ikan. Untuk membuat program dalam bahasa ini yang pertama-tama harus menentukan dok tempat ia berjalan. Dermaga hanya menyediakan aliran kontrol ke suatu program. Dermaga dalam program ini adalah:
Setiap kali
C
perintah itu ditemukan, nelayan membuang garis untuk menangkap instruksi. The+
dan-
petunjuk menurunkan dan meningkatkan panjang garis nya masing-masing.v
mengubah arah lemparannya ke bawah. Ikan yang ia tangkap dalam program ini adalah:> <> adalah bahasa yang didasarkan pada seekor ikan yang bergerak melalui air. The
v
perintah mulai ikan bergerak ke bawah, di mana ia kemudian tercermin ke kanan dengan\
perintah. Segala sesuatu di antara tanda kutip didorong ke tumpukan. Setelah tali didorong ke tumpukan, ikan membungkus ke sisi lain di mana ia dipantulkan ke bawah oleh\
. Itu kemudian mencetak isi tumpukan dengan:sumber
23 / Malbolge, 5688 byte
Perhatikan bahwa program ini membutuhkan linefeed tambahan. Tidak ada baris yang mengandung spasi spasi, jadi salin / tempel harus berfungsi dengan baik.
Verifikasi
Untuk menguji kode Malbolge dalam juru bahasa online ini , rekatkan kode itu di area kode Malbolge dan klik Load/Reset, lalu Execute.
Untuk menguji 23 kode dalam interpreter online , paste di Sumber wilayah, tekan Enteruntuk memasukkan linefeed Trailing, jenis
23
di Konsol daerah (untuk beralih dari default 23.dezsy notasi untuk auto-deteksi) dan klik Run Interpreter!.sumber
Lua / C -
182164 byteMengambil keuntungan dari fitur di mana Lua memperlakukan tanda pagar di baris pertama sebagai komentar untuk memungkinkan unix shebangs. Kalau tidak, balas komentar bahasa lain dalam komentarnya sendiri.
Untuk mencukur byte, saya mengandalkan perilaku implisit yang hanya memancarkan peringatan di GCC dan Dentang: deklarasi int implisit untuk definisi printf utama dan implisit.
sumber
//
komentar di bagian C? Menghemat 2 byte.JavaScript / Haskell,
158 byte147 byteGagasan umum: menyelinap sintaks komentar masing-masing ke yang lain.
Dalam satu baris:
Seperti apa rasanya Haskell:
Seperti apa ini dalam JavaScript:
sumber
alert
adalah pemain golf.Brainfuck / Foo, 769 byte
Jawaban yang sangat rumit dan kompleks ... atau tidak.
sumber
,
di teks di akhir. Saya percaya itu bertentangan dengan aturan penugasan.,
hanya menetapkan sel ke 0, untuk EOFC / Python, 238 karakter
Ini tidak mencetak 100% persis apa yang diminta, tetapi cukup dekat.
Reboot kartu hari valentine saya .
sumber
def
dan:
setelahnyadef main()
, dan Anda tidak benar-benar membuka badan fungsi untuk main. Apakah Anda benar-benar mencoba menyusun jawaban Anda di C?#define def main(){0?
tidak ada#define return
membuat saya sedikit menangis ...C / C ++, 136
Baris baru ditambahkan untuk pemformatan. Cobalah di C atau C ++ .
sumber
struct{}s;z=2*sizeof s
Befunge / > <> ,
141138134133130 byte3 byte disimpan berkat @Cole .
Tepatnya, saya menggunakan Befunge-98.
Menggunakan fakta bahwa:
\
adalah mirror di> <> dan swap di Befunge'string'
adalah string dalam> <> dan'c
merupakan char di Befungesumber
?!;>ol
PHP / MySQL, 147 byte
sumber
SELECT"This program wasn't written in MySQL, it was built for PHP!";
Python 3 / > <> ,
177173172167 BytesTerima kasih kepada @mathmandan karena telah memangkas 5 byte!
Nah ini adalah pengalaman, dan yang mencoba juga. Setiap saran golf dipersilahkan, karena ini cukup panjang. Saya mencoba yang terbaik untuk menggunakan kembali teks, tetapi itu cukup sulit.
Secara teknis, itu akan menjadi Python 3 bahwa program ini harus menampilkan (dan saya bisa mengubah itu jika saya tidak memenuhi spesifikasi - tetapi dalam contoh output Python / C
Python
terdaftar).Cobalah menggunakan interpreter online> <> dan interpreter Python 3 ( interpreter >> <> mengharuskan Anda untuk memasukkan kode secara manual)
Kembali
di> <> dan
dalam Python.
Penjelasan (Python)
Untuk sisi Python, cukup sederhana. Berikut kode yang kami pedulikan (pada dasarnya kode tanpa komentar, yang dilambangkan dengan
#
in Python). Perhatikan bahwa dalam Python\
adalah karakter pelarian ketika digunakan dalam string, jadi\"
evaluasinya"
dalam string.Yang paling kami pedulikan di sini adalah operasi yang dilakukan pada variabel
aa
:Pernyataan cetak dengan demikian dievaluasi menjadi
Penjelasan (> <>)
Sekarang kita sampai pada bagian yang lebih sulit. Sekali lagi, ini kode dengan bit yang tidak perlu dihapus.
Baris 1:
Tumpukan sekarang (jika dicetak):
\This program wasn't written in
Baris 2:
Perhatikan bahwa garis 2 dimulai pada
/
karena posisi penunjuk dari garis 1, dan bergerak ke kanan ke kiri.Tumpukan sekarang:
><> ni nettirw t'nsaw margorp sihT
Baris 3:
Seperti baris sebelumnya, baris ini dimulai pada
\
, di mana baris 2 mengirimkan pointer. Perhatikan bahwa karena penunjuk membungkus garis ketika mencapai yang pertamaa
saya akan menulis penjelasan saya di mana penunjuk pergi (dan dengan demikian apa yang dieksekusi)Tumpukan sekarang (
x
adalah karakter yang dibentuk oleh penambahan "r" dan spasi. - itu bukan karakter yang sebenarnya, hanya pengganti dari saya):xof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Baris 4:
Pointer terus berlanjut ke bawah sehingga baris ini tidak memerlukan penjelasan lebih lanjut.
Baris 5:
Mulai dari
/
dan ke kiri.Tumpukan sekarang (output terbalik):
!nohtyP rof tliub saw ti ,><> ni nettirw t'nsaw margorp sihT
Dan itu harusnya untuk penjelasan. Beritahu saya jika ada ketidakkonsistenan antara penjelasan / kode atau jika saya melakukan kesalahan; Saya menurunkan kode saya lagi sementara saya berada di tengah-tengah menulis penjelasan sehingga saya mungkin telah mencampur bit kode lama dan baru.
sumber
aa[:-2][::-1]
denganaa[-3::-1]
. Dalam hal ini, tentu saja, itu dapat mengganggu pemformatan> <>, tetapi mungkin ada baiknya mempertimbangkan jika Anda belum melakukannya. Khususnya saya cukup yakin Anda membutuhkan spasi di bawahv
pada baris sebelumnya, tetapi sepertinyaprint(aa[-3::-1]+"Pytho"
akan masuk ke dalam 24 karakter di bawaha=", it was built for "+
, dan kemudian Anda bisa menempatkan spasi diikuti oleh+"n"+a)
. Saya tidak yakin apakah ini akan merusak sesuatu yang lain, tetapi jika berhasil itu akan menghemat beberapa byte.print aa[-3::-1]+"Pytho" +"n"+a
. Namun satu pertanyaan lain: dalam versi> <>, apa yang terjadi pada1
yang semula didorong ke stack?File BAT. File BAT /. CMD File,
194185 BytesSunting: Disimpan 9 byte, dan koreksi yang hilang
!
berkat DLoscYa, ada perbedaan antara file BAT dan CMD. Referensi. Pada dasarnya, CMD menetapkan
ERRORLEVEL
padaSET
perintah, sementara BAT tidak, artinya di siniERRORLEVEL
set oleh cacatmd
perintah akan dibersihkan olehSET v=1
satu versi tetapi tidak yang lain. Script ini didasarkan pada contoh yang diberikan oleh "Ritchie" di utas newsgroup itu.Perhatikan bahwa skrip yang diperpendek di atas
ENABLEEXTENSIONS
dianggap diaturON
(secara default pada setiap platform). Skrip yang diperluas di bawah secara eksplisit mengaturnya, untuk menjamin fungsionalitas yang benar. Tanpa itu,SET
perintah untuk CMD tidak mengizinkan semua ekstensi, dan (pada beberapa sistem, mungkin) mungkin tidak mengatur denganERRORLEVEL
tepat.Diperluas dan dikomentari
sumber
Javascript / C,
148146143 karakterC:
http://codepad.org/u8UimGLchttp://codepad.org/Y80M5jpchttp://codepad.org/m4DB2NddJavascript: cukup salin kode ke konsol browser
sumber
CJam / GolfScript,
8178 byteVersi 81 byte asli:
sumber
PHP / Perl,
9896 byteTidak tahu apakah ini curang atau tidak, karena sejauh yang saya tahu satu-satunya cara untuk menjalankan PHP tanpa
<?
tag pembuka adalah sesuatu sepertiphp -r $(cat codefile.php)
. Tetapi dengan asumsi itu legal ...//
adalah komentar PHP, tetapi di Perl itu adalah regex (yang, dalam pernyataannya sendiri, tidak melakukan apa-apa). Sisanya harus cukup jelas.Sunting: Sekarang menggunakan bareword di bagian Perl-only. Saya ingin menggunakan yang di tempat pertama untuk kedua bahasa, tetapi PHP menampilkan peringatan ketika Anda melakukan itu, bertentangan dengan "Seharusnya tidak ada output ke stderr."
sumber
<?'>#';
adalah sintaks yang valid dalam kedua bahasa.Ruby / Python, 105 karakter
sumber
JavaScript 1.8 / JavaScript 1.7, 89 byte
Karena Array.prototype.reduce baru dalam 1,8
EDIT: Golf 7 byte dengan langsung menginisialisasi
a
daripada menggunakanreverse()
EDIT:
JavaScript
dapat ditulis sebagaiJS
, menghemat 8 byteEDIT: Terima kasih Hedi karena telah menunjukkan bahwa saya dapat menyimpan 3 byte lebih banyak jika saya tidak menggunakan variabel
b
lagiEDIT: Golf 6 byte oleh komputasi
7+a
dan8-a
, di manaa=1
jika mengurangi didefinisikan (JS 1.8) dana=0
jika tidak didefinisikan (JS 1.7)EDIT: Hedi mengeluarkan 6 byte lebih menunjukkan penggunaan string template
EDIT: ETHproduk golf 2 byte menyarankan
a=!![].reduce;
bukana=[].reduce?1:0;
EDIT: no1xsyzy bermain golf satu byte lagi menyarankan untuk membalikkan cek boolean
sumber
a=[].reduce?1:0;
kea=!![].reduce;
.a
memegang nilai1
atau0
, bukantrue
ataufalse
SWI-Prolog 6 / SWI-Prolog 7, 156 byte
Menggunakan fakta bahwa tanda kutip ganda
""
adalah kode string (yaitu daftar kode karakter) dalam versi SWI-Prolog yang lebih tua dari 7, dan merupakan tipe String yang tepat di versi 7.is_list("")
dengan demikian akan salah di versi 7 dan benar di versi sebelumnya.sumber
BF / SPL, 5342 bytes
Saya cukup yakin ini adalah polyglot Bahasa Pemrograman Shakespeare pertama di situs ini.
Mungkin tidak akan memenangkan hadiah apa pun. Bekerja dengan menyelinap kode BF ke judul act / scene / program. Kode SPL menggunakan tanda seru alih-alih titik kecuali untuk beberapa kasus. Program tidak seharusnya mengambil input, jadi koma dalam deklarasi karakter "dikomentari" dengan memusatkan sel dan menempatkan tanda kurung di sekitar koma. Prosedur yang sama berlaku ketika menyembunyikan tanda kurung siku di sekitar pernyataan enter / exeunt.
Uji BF di https://repl.it/E8Hh/23 .
Kode SPL diuji di kompiler yang ditemukan di sini: https://github.com/drsam94/Spl/ .
sumber
Ruby 1.8 / Ruby 1.9, 87
Di Ruby 1.8,
?9
adalah nilai ASCII dari "9", yang merupakan 8 modulo 49. Di Ruby 1.9, itu adalah string "9", dan%49
merupakan operasi pemformatan yang tidak melakukan apa-apa karena "9" tidak memiliki string format apa pun di saya t.sumber
Python 2.7.9 / Python 2.7.10, 127 byte
Kami memiliki beberapa pos yang menggunakan versi minor, tetapi tidak ada yang naik ke tingkat berikutnya ...
Cobalah di Ideone (Python 2.7.10) dan repl.it (secara teknis Python 2.7.2, tetapi harus memberikan hasil yang sama dengan 2.7.9).
Python 2.7.10, menurut changelog :
Ini didorong
len(dir(types))
dari 42 menjadi 43, memberikan perbedaan numerik yang dapat kita manfaatkan untuk menghasilkan output yang diinginkan.sumber
Python / QBasic,
160142 byteDiuji dengan Python 3 dan QBasic 1.1 . Tidak akan bekerja di Python 2 tanpa menambahkan
from __future__ import print_function
ke baris 4.1#
adalah ekspresi1
(no-op) diikuti oleh komentar. Di QBasic, ini adalah nomor baris (dengan tipe suffix yang menandainya sebagai aDOUBLE
). TheDEFSTR
pernyataan mengatakan QBasic bahwa semua variabel yang namanya mulai denganA
atauB
(case-sensitive) adalah variabel string. Dengan begitu, kita bisa memanggil variabel kitaa
danb
bukannyaa$
danb$
(yang tidak akan bekerja dengan Python).'
dimulai komentar. Dalam Python,''
adalah string kosong (tanpa-op). Kemudian kami menukar nama bahasa dan menetapkan alias untukprint
fungsi (karena kata kunci QBasic diformat secara otomatis menjadi huruf besar).Jika saya diizinkan untuk mematikan autoformatter (yang merupakan opsi di QB64 , meskipun tidak di QBasic asli), saya bisa turun ke 114 byte menggunakan Python 2 :
sumber
Perl / Ruby, 129 byte
Tidak ada penyalahgunaan ekspresi reguler dalam hal ini, hanya membuat sebagian besar fakta bahwa 0 benar di Ruby ke
eval
definisi untuksort
(yang sebenarnyareverse
s) danprintf
ing. Ruby tidak suka menggunakan daftar untuk argumen, jadi saya harus melakukan masing-masing secara individual.sumber
a
harus menjadi variabel instan, bukan variabel lokal?@
sigil pada variabel di Perl menunjukkan bahwa itu adalah daftar, di Perl menyimpan, katakan$a
saja, tidak menghasilkan output./// dan Retina , 95 + 3 = 98 byte
+3 byte untuk
-s
bendera di Retina.Penjelasan untuk ///
Instruksi pertama adalah
menghapus semua baris baru dari sisa kode, menghasilkan
Semuanya terserah
!
hanya literal dan dicetak untuk STDOUT. Instruksi selanjutnya adalahTetapi string pencarian
?.
tidak dapat ditemukan, jadi tidak ada yang terjadi. Kemudian kode yang tersisa adalah//!
instruksi yang tidak lengkap sehingga program berakhir, setelah mencetak string yang benar.Penjelasan untuk Retina
Ini memberitahu Retina untuk menggantikan
/
dengan//
. Tapi inputnya kosong, jadi ini tidak cocok dengan apa pun.Ini menggantikan input dengan string di baris kedua.
Ini cocok dengan string
\/\/\/, it was built for Retina!
dan menggantinya denganRetina, it was built for ///!
untuk memberikan hasil yang benar.sumber
-s
, meskipun mengatakan apa yang saya lakukan akan merusak kesenangan! : Dsed / Hexagony 251 Bytes
sed: Cobalah Online!
Hexagony: Cobalah Online!
Selain itu, ia mencetak string yang benar jika cocok dengan string kosong di akhir (selalu). Baris kedua adalah komentar. Ini memang membutuhkan string pada STDIN, tetapi bisa kosong ( diizinkan berdasarkan konsensus ini ).
Contoh:
Dalam Hexagony,
/
pengalihan pertama ke kiri bawah, itu mengikuti sisi kiri ke tempat bagian sed dimulai, kemudian hanya membungkus kiri ke kanan, ke bawah garis, kanan ke kiri, ke bawah garis, dan sebagainya. Hex diperluas terlihat seperti ini:sumber
;
mengambil mod sel 256 saat ini untuk menentukan nilai byte (mis. Anda dapat mencetak spasi denganP0;
terlepas dari nilai sel saat ini). Skrip CJam ini menghasilkan semua pasangan: cjam.tryitonline.net/...Python / Retina,
133120119117115 byteSekarang saya tahu lebih banyak tentang Retina dan regex, saya telah memainkannya sedikit lebih banyak. Ini juga benar-benar berfungsi sekarang.
Python hanya mencetak pernyataan. Retina menggantikan apa pun dengan pernyataan cetak Python, lalu menghapus
print
dan kutipan apa pun. Kemudian, saya swapPython
danRetina
dan menghapus#
.Coba dengan Python | Coba di Retina
sumber
JavaScript / CoffeeScript,
125124 byteDalam CoffeeScript,
a==b
dikompilasi ke bawaha===b
, yang membuat kondisi menengah salah. Saya menggunakan sedikit sihir untuk mengubah nilai boolean ke integer.Disimpan 1 byte berkat @DomHastings!
Versi 125 byte:
sumber
+(b=0=='0')
bukannya+0
!b^1
, saya pikir Anda bisa menggunakan~b
undefinedScript
.~1 == -2
. Tetapi(b=0=='0')+0
bisa ditulis sebagai+(b=0=='0')
. Ataub=+(0=='0')
. Itu harus memotong 1 byte.