Tantangan Anda adalah menulis polyglot yang berfungsi di berbagai versi bahasa Anda. Saat dijalankan, itu akan selalu menampilkan versi bahasa.
Aturan
- Program Anda harus bekerja dalam setidaknya dua versi bahasa Anda.
- Output program Anda seharusnya hanya nomor versi. Tidak ada data asing.
- Program Anda dapat menggunakan metode apa pun yang Anda suka untuk menentukan nomor versi. Namun, output harus mengikuti aturan 2; Namun Anda menentukan nomor versi, output hanya harus berupa angka.
- Program Anda hanya perlu menampilkan versi utama bahasa. Misalnya, dalam FooBar 12.3.456789-beta, program Anda hanya perlu menghasilkan 12.
- Jika bahasa Anda menempatkan kata atau simbol sebelum atau setelah nomor versi, Anda tidak perlu menampilkannya, dan hanya nomornya. Misalnya, di C89, program Anda hanya perlu mencetak
89
, dan di C ++ 0x, program Anda hanya perlu mencetak0
. - Jika Anda memilih untuk mencetak nama lengkap atau nomor versi minor, misalnya C89 sebagai lawan C99, itu hanya harus mencetak nama.
C89 build 32
valid, sementaraerror in C89 build 32: foo bar
tidak. - Program Anda mungkin tidak menggunakan flag kompiler builtin, makro, atau custom untuk menentukan versi bahasa.
Mencetak gol
Skor Anda akan menjadi panjang kode dibagi dengan jumlah versi yang berfungsi. Skor terendah menang, semoga berhasil!
(number of languages)^3 / (byte count)
.Jawaban:
Serius dan Sebenarnya , 3 byte, skor 1,5
Cobalah online: Sebenarnya , Serius
Penjelasan:
u
danD
memiliki fungsionalitas pada string hanya ditambahkan di Actually (yang Seriously v2).sumber
v1
cabang. Sebelum Serius ditinggalkan, Sebenarnya tinggal div2
cabang. Selain itu, Serius menggunakan1.x
nomor versi dalam rilis , sementara Sebenarnya menggunakan2.x
(baik di sana maupun di PyPI ).Python 3.0 dan Python 2, skor 6
(12 byte, 2 versi)
Cobalah secara Online:
Python 2
Python 3
Bergantung pada fakta bahwa Python 3+ menggunakan divisi float secara default, tidak seperti Python 2, yang menggunakan pembagian lantai.
sumber
Your program should work in at least two versions of your language.
Ini berfungsi di setidaknya dua versi 2.7 dan 3.0. Saya memilihto print the full name or minor version numbers
.from __future__ import division
, masalah terpecahkan :)Java, 189 byte, 10 versi, skor = 18.9
Versi yang didukung:
1.0
,1.1
,1.2
,1.3
,1.4
,1.5
,1.6
,1.7
,1.8
dan9
(Untuk skor sebelumnya, periksa sejarah !)
Jalankan di Java 8
Jalankan di Java 9 atau lebih baru
Tidak disatukan
Harap dicatat bahwa bagian kode
return v<9?"1."+v:v;
(sebelumnyareturn(v<9?"1.":"")+v;
) harus diperiksa terhadap versi apa pun antara Java 1.0 dan Java 1.3 yang disertakan. Saya tidak memiliki Java 1.3 atau instalasi sebelumnya yang saya inginkan untuk benar-benar menguji sintaks ini.pengantar
Versi Java memiliki sejarah khusus. Semua versi secara historis sudah
1.x
termasuk1.0
. Tapi ... dari Java 9 dan seterusnya dan JEP223 , skema versi telah berubah dari menggunakan1.x
menjadix
. Itu adalah versi yang dikenal secara internal. Jadi kita memiliki tabel berikut (disatukan dengan Javadoc dan Wikipedia ):Entri tantangan ini cocok dengan kolom versi pada tabel di atas, yang merupakan apa yang terkandung dalam properti sistem
"java.version"
.Penjelasan
Tujuannya adalah untuk memeriksa dari versi mana suatu kelas mulai ada, karena Java mencela kode tetapi tidak pernah menghapusnya. Kode telah secara khusus ditulis dalam Java 1.0 agar kompatibel dengan semua versi, sekali lagi, karena JDK (kebanyakan) source forward kompatibel .
Implementasi mencoba menemukan nama kelas terpendek yang diperkenalkan oleh setiap versi. Padahal, untuk mendapatkan byte, perlu mencoba dan memilih sub paket yang sama. Sejauh ini saya menemukan paket yang paling efisien adalah
java.util
karena berisi beberapa kelas yang benar-benar bernama singkat yang tersebar di semua versi Java.Sekarang, untuk menemukan nomor versi aktual, nama-nama kelas diurutkan dengan memperkenalkan versi. Kemudian saya mencoba untuk instanciate setiap kelas secara berurutan, dan meningkatkan indeks array. Jika kelas ada, kita lewati ke yang berikutnya, jika tidak kita membiarkan pengecualian ditangkap oleh
try
-block. Ketika selesai, pengecualian lain dilemparkan karena tidak ada lagi kelas yang keberadaannya perlu kita periksa.Bagaimanapun, utas akan meninggalkan
try
-blok dengan pengecualian. Pengecualian yang tidak tertangkap, tetapi hanya ditunda berkatfinally
-block, yang pada gilirannya menimpa on-hold pengecualian dengan benar-benar mengembalikan nilai yang"1."+v
manav
yang indeks digunakan sebelumnya. Kami juga membuat indeks ini sesuai dengan nomor versi minor Java.Bagian penting dari golf adalah menemukan nama kelas baru terpendek dalam paket
java.util
(atau paket anak-anak) untuk setiap versi. Ini adalah tabel yang saya gunakan untuk menghitung biaya itu.Kredit
box -try-catch yang bagus!finally
trik portabel yang bagus .return(i<9?"1.":"")+i;
denganreturn i<9?"1."+i:i;
(kebutuhan ini harus divalidasi terhadap 1.0 atau paling 1,3 karena tidak ada perubahan sintaks terjadi sebelumnya 1,4)Dengan builtin
Jika builtin diizinkan:
54 byte untuk 13 versi (dari 1.0 hingga 12), sehingga skornya menjadi 4.1538.
sumber
return"...
tanpa ruang mungkin di semua versi tbh.)String v(){return "1."+(e("time.Year")+e("nio.file.Path")+e("io.Console")+e("util.UUID")+e("text.Bidi")+e("util.Timer")+e("sql.Ref")+e("lang.Void"));}int e(String c){try{Class.forName("java."+c);return 1;}catch(Exception e){return 0;}}
String v(){int i=0;try{for(String[]s={"lang.Void","sql.Ref","util.Timer","net.URI","util.UUID","net.IDN","nio.file.Path","time.Year","lang.Module"};;i++)Class.forName("java."+s[i]);}catch(Exception e){}return"1."+i;}
finally{return"1."+i;}
.Python , 606 byte / 15 versi = skor 40,4
-67 bytes (lol) terima kasih kepada NoOneIsHere.
Versi-versi tersebut adalah 0.9.1, 2 (.0), 2.2, 2.2.2, 2.5.0, 2.5.1, 3 (.0), 3.1, 3.1.3, 3.2.1, 3.3, 3.4, 3.5 aaand 3.6 .
Semua kredit untuk jawaban Sp3000 yang luar biasa . Baris baru yang tertinggal diperlukan.
Wah, itu menyenangkan untuk bermain golf. Ini seharusnya bekerja (ya, saya menginstal semua versi ini), tetapi saya mungkin secara tidak sengaja telah merusak sesuatu. Jika ada yang menemukan bug, beri tahu saya.
sumber
print'0.9.1'
sintaks yang tidak valid.print
panggilan ... Terima kasih telah memberi tahu saya!except
denganexcept:
).x=<string inside eval>
hanya melakukan evaling kode secara manual?1/0
itu, tapi kemudian saya sadar. Terima kasih!C ++ 11/14/17, skor = 147/3 = 49
Untuk membedakan antara C ++ 11 dan C ++ 14/17, ia menggunakan perubahan dalam fungsi default
const
dariconstexpr
fungsi anggota dalam C ++ 14 (dengan kredit sebagai contoh di https://stackoverflow.com/questions/23980929/ apa-perubahan-diperkenalkan-di-c14-bisa-berpotensi-istirahat-program-ditulis-in-c1 ). Untuk membedakan antara C ++ 14 dan C ++ 17, ia menggunakan fakta bahwa C ++ 17 menonaktifkan trigraph.Tidak Disatukan:
(Diuji dengan Debian gcc 7.1.0 menggunakan
-std=c++{11,14,17}
.)sumber
include
dan<
di dalam pernyataan sertakan, misalnya#include<iostream>
.__cplusplus
makro) - maka untuk membedakan C ++ 17 dari C ++ 14 Saya akan cenderung menggunakan perubahan dalam rentang berbasis untuk semantik. Mungkin membuat kelas iterator / sentinel minimal di sepanjang barisboost::integer_iterator
sedemikian sehingga mengkonversi sentinel ke iterator memiliki perilaku "mengejutkan".return 0;
tersirat untukmain
sehingga Anda dapat menyimpan 9 byte di sana. Juga menurutwc -c
solusi Anda menggunakan 251 byte dan bukan 252 (editor Anda mungkin telah memasukkan baris baru di akhir).return *
=>return*
EcmaScript 3/5/2015/2016/2017 di Browser, 59 byte / 5 versi = 11,8 poin
Hemat 1 byte berkat GOTO 0
sumber
-!
daripada yang+!!
masuk akal (dan mengubah konstanta numerik sesuai).JavaScript (ES5 & ES6), 14 byte / 2 versi = 7
0o
Konstanta oktal-gaya baru dalam ES6; ES5 melemparkan stringNaN
yang tidak mempengaruhi hasil XOR bitwise.sumber
JavaScript (ES 2, 3 & 5 -
89),59/6 = 9,83375/7 = 10,714Semoga juga mengirimkan solusi dengan lebih banyak versi, meskipun skornya sedikit lebih tinggi daripada solusi 2-versi.
Cobalah online
Memeriksa keberadaan berbagai metode dalam prototipe Array, RegExp & String, meniadakannya, memberikan boolean, dan mengurangi boolean itu dari nilai awal 9. Penggandaan
![].map
akun untuk fakta bahwa ES4 ditinggalkan.dotAll
properti (dan terkaits
bendera) untuk Regular Expressions diperkenalkan pada ES2018 (V9).padEnd
Metode String diperkenalkan pada ES2017 (v8).includes
Metode Array diperkenalkan pada ES2016 (v7).keys
Metode Array diperkenalkan pada ES2015 (v6).map
Metode Array diperkenalkan pada ES5.1 (v5).pop
Metode Array diperkenalkan pada ES3 (v3).sumber
PHP 5/7, skor 5.5
3V4L secara online!
PHP 5.3.9 / 5.3.11, skor 10
3V4L secara online!
Versi online lebih panjang karena versi PHP lama di kotak pasir tidak mengaktifkan tag pendek.
sumber
Befunge:
1511 bytes / 2 versi = 5.54 byte dicukur oleh @ Pietu1998
Cobalah online:
Befunge 93
Befunge 98
Menggunakan operator titik koma eksklusif 98-Befunge ("lewati ke titik koma berikutnya") untuk membedakan versi. Keduanya akan mencetak "9". Befunge 93 akan mengabaikan titik koma, kurangi 5 dari "8" (nilai tersisa di atas tumpukan), cetak "3" yang dihasilkan, dan akhiri. Befunge 98 di sisi lain, akan melompati, mencetak "8" dan mengakhiri.
sumber
"89",;5-;,@
untuk 11 byte;
bagian itu.Pyth 4/5 - 6 byte / 2 versi = 3
Dalam Pyth 5, jumlah spasi genap di awal baris diabaikan untuk digunakan dalam indentasi, sedangkan pada Pyth 4, ia hanya bertindak seperti ruang tunggal dan mencegah pencetakan
5
. Dalam Pyth 4, titik koma hanya menyelesaikan pernyataan, yang memungkinkan4
untuk dicetak, sedangkan di Pyth 5, spasi dan titik koma membuat sisa baris komentar.sumber
Python 3 dan Python 2.0, 18 byte, skor 18/2 = 9
Pembulatan Banker di Python 3, pembulatan standar dalam Python 2.
Cobalah online - Python 3!
Cobalah online - Python 2!
sumber
Secara kubik, 4 byte, skor 4 / ∞
Bekerja di setiap versi sistem Anda memiliki memori yang cukup untuk dijalankan. Non-bersaing karena lumpuh. Berlaku per kiriman meta ini .
Pada dasarnya, B3 memutar satu baris dari wajah kiri ke wajah atas. F3 akan bekerja dengan baik, seperti halnya F₁3 atau B₁3. Karena satu baris dalam Cubically 3x3x3 adalah tiga kubik demi satu cubelet, ini menempatkan tiga
1
di bagian atas, memberinya jumlah wajah 3.%0
cetakan yang jumlah bagian atas, mencetak 3 untuk Cubically 3 x3x3.Di 4x4x4 Kubik, baris adalah 4x1 kubus. Letakkan 4 1 di permukaan atas, menghasilkan jumlah 4.
sumber
x86 16/32/64-bit kode mesin: 11 byte, skor = 3,66
Fungsi ini mengembalikan mode saat ini (ukuran operan default) sebagai integer dalam AL. Sebut saja dari C dengan tanda tangan
uint8_t modedetect(void);
Daftar kode mesin + sumber mesin NASM (menunjukkan cara kerjanya dalam mode 16-bit, karena
BITS 16
memberitahu NASM untuk merakit source mnemonics untuk mode 16-bit.)Pembenaran :
kode mesin x86 tidak secara resmi memiliki nomor versi, tetapi saya pikir ini memuaskan maksud pertanyaan dengan harus menghasilkan angka-angka tertentu, daripada memilih apa yang paling nyaman (yang hanya memakan waktu 7 byte, lihat di bawah).
CPU x86 asli, Intel 8086, hanya mendukung kode mesin 16-bit. 80386 memperkenalkan kode mesin 32-bit (dapat digunakan dalam mode dilindungi 32-bit, dan kemudian dalam mode compat di bawah OS 64-bit). AMD memperkenalkan kode mesin 64-bit, dapat digunakan dalam mode panjang. Ini adalah versi bahasa mesin x86 dalam arti yang sama bahwa Python2 dan Python3 adalah versi bahasa yang berbeda. Mereka sebagian besar kompatibel, tetapi dengan perubahan yang disengaja. Anda dapat menjalankan 32 atau 64-bit executable langsung di bawah kernel OS 64-bit dengan cara yang sama Anda bisa menjalankan program Python2 dan Python3.
Bagaimana itu bekerja:
Mulai dengan
al=64
. Geser ke kanan dengan 1 (mode 32-bit) atau 2 (mode 16-bit).16/32 vs. 64-bit: 1-byte
inc
/dec
encodings adalah awalan REX dalam 64-bit ( http://wiki.osdev.org/X86-64_Instruction_Encoding#REX_prefix ). REX.W sama sekali tidak memengaruhi beberapa instruksi (misalnya ajmp
ataujcc
), tetapi dalam hal ini untuk mendapatkan 16/32/64 saya ingin memasukkan atau memutuskanecx
daripadaeax
. Itu juga setREX.B
, yang mengubah register tujuan. Tapi untungnya kita bisa melakukan itu tetapi mengatur semuanya agar 64-bit tidak perlu bergeseral
.Instruksi (s) yang dijalankan hanya dalam mode 16-bit dapat menyertakan
ret
, tetapi saya tidak menemukan itu perlu atau membantu. (Dan akan membuatnya mustahil untuk sebaris sebagai sebuah fragmen kode, jika Anda ingin melakukan itu). Bisa jugajmp
dalam fungsi.16-bit vs 32/64: segera adalah 16-bit, bukan 32-bit. Mengubah mode dapat mengubah panjang instruksi, jadi mode 32/64 bit mendekodekan dua byte berikutnya sebagai bagian dari instruksi langsung, bukan instruksi terpisah. Saya menjaga hal-hal sederhana dengan menggunakan instruksi 2-byte di sini, daripada mendapatkan decode dari sinkronisasi sehingga mode 16-bit akan memecahkan kode dari batas instruksi yang berbeda dari 32/64.
Terkait: Awalan ukuran operan mengubah panjang langsung (kecuali jika itu langsung diperpanjang 8-bit), sama seperti perbedaan antara mode 16-bit dan 32/64-bit. Ini membuat decoding panjang instruksi sulit dilakukan secara paralel; CPU Intel memiliki warung decoding LCP .
Kebanyakan konvensi pemanggilan (termasuk psABI Sistem V x86-32 dan x86-64) memungkinkan nilai pengembalian yang sempit memiliki sampah di bit register yang tinggi. Mereka juga memungkinkan clobbering CX / ECX / RCX (dan R8 untuk 64-bit). IDK jika itu biasa dalam konvensi pemanggilan 16-bit, tapi ini kode golf jadi saya selalu bisa mengatakan itu konvensi pemanggilan kustom.
Pembongkaran 32-bit :
Pembongkaran 64-bit ( Coba online! ):
Terkait: kode mesin x86-32 / x86-64 saya T&J di SO.
Perbedaan lain antara 16-bit dan 32/64 adalah bahwa mode pengalamatan dikodekan secara berbeda. eg
lea eax, [rax+2]
(8D 40 02
) menerjemahkan sepertilea ax, [bx+si+0x2]
dalam mode 16-bit. Ini jelas sulit digunakan untuk kode-golf, terutama karenae/rbx
dane/rsi
dilindungi panggilan dalam banyak konvensi pemanggilan.Saya juga mempertimbangkan untuk menggunakan 10-byte
mov r64, imm64
, yaitu REX +mov r32,imm32
. Tetapi karena saya sudah memiliki solusi 11 byte, ini akan menjadi yang terbaik sama (10 byte +1 untukret
).Kode uji untuk mode 32 dan 64-bit. (Saya belum benar-benar menjalankannya dalam mode 16-bit, tetapi pembongkaran memberitahu Anda bagaimana itu akan memecahkan kode. Saya tidak memiliki emulator 16-bit yang diatur.)
Program Linux ini keluar dengan status keluar =
modedetect()
, jadi jalankan sebagai./a.out; echo $?
. Merakit dan menautkannya ke biner statis, misalnya7 byte (skor = 2.33) jika saya dapat memberi nomor versi 1, 2, 3
Tidak ada nomor versi resmi untuk mode x86 berbeda. Saya hanya suka menulis jawaban asm. Saya pikir itu akan melanggar maksud pertanyaan jika saya hanya memanggil mode 1,2,3, atau 0,1,2, karena intinya adalah memaksa Anda untuk menghasilkan angka yang merepotkan. Tetapi jika itu diizinkan:
Yang menerjemahkan dalam mode 32-bit sebagai
dan 64-bit sebagai
sumber
python2
vs.python3
interpreter pada program Python yang sama. CPU x86 baru selalu menyertakan mode yang kompatibel dengan CPU yang lebih lama (ini adalah satu-satunya alasan untuk menggunakan format kode mesin yang sulit didekodekan yang berbelit-belit!), Tetapi mode terlindungi 32-bit 386 dan mode panjang x86-64 benar-benar versi baru kode mesin x86. Mode lama bahkan menghapus beberapa opcode, membuatnya tidak valid.Brachylog / Brachylog v1 , 5/2 = 2.5
Cobalah online! (Brachylog)
Cobalah online! (Brachylog v1)
Penjelasan untuk Brachylog:
Penjelasan untuk Brachylog v1:
sumber
2,1
dalam Brachylog v2 tidak membangun daftar[2,1]
(2;1
akan), melainkan nomor21
(yang tidak mengubah cara Anda ingin jawaban Anda bekerja).2;1
tidak akan berfungsi di Brachylog v1 sebagai;
cara logis ATAU di sana.C89 / C99, 25 byte, 2 versi, skor = 12,5
//
komentar style tidak dikenali di C89.Versi golf:
Cobalah online: C89 , C99
sumber
int v()
denganmain()
, lebih pendek dan benar-benar akan dikompilasi sebagai program yang lengkap!Perl 5 dan Perl 6,
23 byte19 byte, skor 9,5Perl 5
grep
op pertama selalu diperlakukan sebagai regex, tidak demikian di Perl 6.sumber
Bash, semua 4 versi, skor
727132 byte ⇒ = 8Sepotong kode ini menggunakan interpretasi
$'...'
string yang berbeda di setiap versi Bash.Menghasilkan nomor versi utama - dan hanya itu.
Doc ditemukan di sini .
Tidak Disatukan:
Jawaban ini setengah duga; Saya hanya mengujinya di bash 4 dan 3, tetapi itu harus bekerja pada versi lain juga.
Beri tahu saya jika tidak / tidak, saya akan mencoba dengan versi lain segera setelah saya memilikinya.
-1 char berkat Jens.
-29 byte berkat Digital Trauma (seluruh
expr
ide)!sumber
;;
alternatif terakhir. Gunakan;
untuk mencukur byte.$'\xN
fitur interpretasi tampaknya telah ditambahkan pada 2.01.1 ... Saya harus memperbarui jawaban saya. Mengerjakannyas="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
s=$'\ua\xa\n';expr 5 - ${#s} / 2
. Ini berfungsi pada v3 dan v4. Saya tidak memiliki versi yang lebih lama untuk dicoba sekarang.R, versi 2 dan 3, skor: 10,5 poin
Perintah ini kembali
2
untuk R 2.xx dan3
untuk R 3.xx Fungsicite
ini ditambahkan dalam R versi 3.0.0. Oleh karena itu, perintahexists("cite")
kembaliFALSE
untuk R 2.xx danTRUE
untuk R 3.xxR, semua versi (1, 2, dan 3), skor: 12⅓ poin
Fungsi
eapply
ini diperkenalkan di R 2.0.0.sumber
R.version$major
. 15 karakter. Saya tidak sejak kapan itu ada.Python , 196 byte / 16 versi = skor 12.25
Versi-versi tersebut adalah 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 3.0, 3.1, 3.3, 3.4, 3.5, dan 3.6
Sayangnya saya harus meninggalkan 2.7 karena tidak ada modul dalam itu (sejauh yang saya tahu) yang tidak ada di 2.6 tetapi di 3.0.
Kami mengulang melalui sekelompok modul yang diperkenalkan dalam versi python yang berbeda, dan pada kesalahan pertama kami berhenti dan mengembalikan versi. Kesenjangan antara versi utama diisi dengan mengimpor berulang kali
os
. Tes untuk python 1.5 bergantungstring.split
tidak hadir sampai 1,6.Kredit untuk jawaban Olivier Grégoire untuk ide pengujian untuk kelas / modul baru dalam satu lingkaran.
Saya sekarang akhirnya telah menguji pada semua versi python yang relevan ... yang memerlukan pengeditan 1,5 kode sumber untuk membuatnya dikompilasi ...
sumber
File Batch Windows , versi 35 byte / 2 = skor 17,5
Mencetak
DOS
pada MS-DOS (duh) danNT
pada Windows NT.(duh)Sekarang, untuk penjelasan.
Windows memiliki batch scripting sejak masa MS-DOS dan tidak banyak berubah sejak saat itu. Namun, ketika Windows NT datang, Microsoft mengubah penerjemah default untuk skrip batch, dari
COMMAND.COM
menjadicmd.exe
(sekarang juga memungkinkan ekstensi.cmd
sebagai alternatif dari yang asli.bat
).Dengan itu, mereka juga menerapkan beberapa perubahan , seperti
/i
flag untuk mengabaikan case string pada conditional. Yaitu, meskipunZ==z
salah,/i Z==z
itu benar.Kami mengeksploitasi bahwa DOS tidak memiliki case insensitivy dan membandingkan huruf besar
Z
dengan huruf kecilz
. Dengan menggunakan/i
flag, kita berakhir denganZ==z
conditional (false) pada DOS danz==z
(true) pada NT.Sekarang, saya menyadari bahwa tantangan menentukan bahwa nomor versi harus dicetak. Tapi, sejauh yang saya tahu, tidak ada 'nomor versi' untuk skrip batch, jadi ini adalah yang terdekat yang bisa saya dapatkan.
Diuji pada Windows 10, DOSBox dan vDos:
Windows 10:
(jalankan dengan
cmd /k
untuk mencegah penutupan jendela aktifexit
)DOSBox:
vDos:
sumber
7
lebih pendek dari WindowsNT
.7
sebenarnya bukan versi bahasa, sudah sama di semua Windows sejak 3.1. Jadi saya tidak berpikir itu akan sangat adil untuk menyebutnya7
ketika seharusnya bahkan mungkin3.1
Bahasa Wolfram Bahasa / Matematika 10/11, 37 byte / 2 = 18,5
Pertimbangkan
(Length@DateRange[{1},{1}][[1]]+27)/3
, pada 37 byte dan bekerja dengan 2 versi, memberi saya skor 18,5.dan
Saya yakin ada cara yang lebih efisien, tetapi perbedaan antara output DateRange menggigit saya baru-baru ini, jadi saya mulai menggunakan itu.
Sebagai tindak lanjut, seseorang mungkin bisa mengambil keuntungan dari
Length@DateRange[{1}, {1}][[1]]
mengevaluasi1
dalam Mathematica versi 1- ~ 8, tetapi saya tidak punya waktu untuk memasukkannya.sumber
$Version
:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
$Version
untuk menunjukkan bahwa itu menghasilkan hasil yang benar dalam versi yang benar,$Version
bukan bagian dari jawaban saya ...$VersionNumber
, tetapi sebaliknya Anda menyebutnya$Version
. Menurut saya, sementara daging program Anda adalahLength@DateRange
hal - hal, itu tidak akan berhasil tanpa$Version
hanya memberikan informasi versi lengkap yang kemudian Anda proses, yang karenanya melanggar aturan.{1} Tr[1^#&@@%~DateRange~%]/3+9
(31 byte), atau bahkan7+Length@Now
(12 byte)Ruby 1.x dan 2.x, 20 byte, skor 10
Berdasarkan
to_h
metode yang diperkenalkan padaArray
kelas di Ruby 2.sumber
p [].to_h&&2rescue 1
sedikit lebih pendek.Erlang, 180 byte, 11 versi, skor 16,36
Dengan lekukan dan jeda baris:
Diuji pada satu rilis minor dari setiap versi utama sejak 10:
Idenya adalah bahwa setiap rilis utama telah menambahkan setidaknya satu argumen baru yang diijinkan untuk fungsi
erlang:system_info
, jadi mari kita coba yang ada dalam daftar, hitung berapa banyak dari mereka yang gagal, dan kurangi jumlah kegagalan dari 20, yang merupakan versi saat ini.sumber
Julia 0.4, 0.5, 46 bytes, skor 22
Julia telah mengubah nama tipe dari tipe String konkret dan abstrak dalam banyak versi.
Kode ini khususnya memanfaatkan:
Julia 0.4 :
ASCIIString
,AbstractString
,String
.Julia 0.5 :
String
,ASCIIString
,AbstractString
, (meskipun itu tidak masalah di sini)Lihat juga solusi saya yang lebih baru dan lebih efektif berdasarkan prinsip yang berbeda
sumber
Japt (1 & 2),
86/2 =43Uji v1 | Uji v2
Penjelasan
Sebelum v2, Japt menggunakan sintaks RegEx yang dikustomisasi, sehingga kami dapat memanfaatkannya.
Angka 1 sebagai string.
Ganti (
r
) yang di bawah ini dengan a2
.Japt 2 melihat ini sebagai RegEx
/\S/g
, yang cocok dengan1
. Japt 1 mengabaikan\
karakter pelarian dan hanya melihatS
, yang merupakan konstanta Japt untuk karakter ruang dan, jelas, tidak cocok dengan1
.sumber
Di luar, skor = 3.5
7 byte, 2 versi
Cobalah online di Befunge-93
Cobalah online di Befunge-98
"]"
adalah string literal di kedua versi, mendorong 93 (nilai ASCII dari[
) ke stack.'b
adalah karakter literal di Befunge-98, mendorong 98 (nilai ASCIIb
), tetapi itu adalah instruksi yang tidak valid di Befunge-93, sehingga mereka diabaikan begitu saja. Kami dengan demikian berakhir dengan 93 di atas tumpukan di Befunge-93 dan 98 di Befunge-98..@
menulis nilai di bagian atas tumpukan dan kemudian keluar.sumber
]"[email protected]'
atau][email protected]'
juga bekerjaRuby 1.x (<1.9) dan 2.x,
108 byte, skor = 4Cobalah:
Ini berfungsi dengan mengeksploitasi berbagai perilaku
?x
antara Ruby 1.x dan 2.x. Di Ruby 1.x,?A
(misalnya) mengembalikan65
(nilai ASCII karakterA
), tetapi di Ruby 2.0 ia mengembalikan string satu karakter"A"
.Kode di atas setara dengan ini:
Di Ruby 1.x (<1.9), nilai
val
is50
(nilai ASCII dari karakter2
), sebuah Fixnum.Fixnum#%
adalah operator modulo, jadi50 % 7
kembali1
.Di Ruby 2.x,
val
adalah string"2"
.String#%
adalah versi infikssprintf
, jadi"2" % 7
sama dengansprintf("2", 7)
, di mana"2"
format string. Karena string format tidak mengandung urutan format apa pun (misalnya%d
), argumen selanjutnya dibuang dan"2"
dikembalikan.Akhirnya,
$>
adalah alias untuk$stdout
, jadi$> << ...
cetak hasilnya.sumber
?A==66?1:2
sebelum saya menemukan jawaban AndaPython 2 dan Python 3 ,
3634 byte, skor1817Dalam Python 2 , hash infinity negatif adalah -271828 tetapi dalam Python 3 -314159. Sunting: Disimpan 2 byte, 1 poin skor, terima kasih kepada @ArBo.
sumber
hash
pertama kali diperbaiki untuk bekerja pada infinitas floating-point pengembang yang relevan menggunakan pi * 1e5 dan e * -1e5 sebagai nilai hash. Pada beberapa titik di Python 3 nilai untuk infinity negatif diubah menjadi negasi dari nilai hash untuk infinity.Python 3 , Python 2 , skor 17.5
(35 byte, 2 versi)
Python 2 , 35 byte
Cobalah online!
Python 3 , 35 byte
Cobalah online!
Disimpan 5 byte berkat produk ETH
Bukan jawaban golf yang bagus, tapi perubahan besar!
sumber
try:exec("print 2")\nexcept:print(3)