Tentukan versi bahasa Anda

51

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 mencetak 0.
  • Jika Anda memilih untuk mencetak nama lengkap atau nomor versi minor, misalnya C89 sebagai lawan C99, itu hanya harus mencetak nama. C89 build 32valid, sementara error in C89 build 32: foo bartidak.
  • 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!

MD XF
sumber
4
Apa itu nomor versi bahasa? Siapa yang menentukannya?
Wheat Wizard
9
Saya pikir invers-linear dalam jumlah versi tidak menyambut jawaban dengan jumlah versi yang tinggi.
user202729
6
@ user202729 Saya setuju. Printer Integer Serbaguna melakukannya dengan baik - skornya adalah (number of languages)^3 / (byte count).
Mego
6
Apa versi untuk suatu bahasa ? Bukankah kita mendefinisikan bahasa sebagai penerjemah / kompilernya di sini? Katakanlah, ada versi gcc yang memiliki bug yang dengan kode C89 tertentu ia menghasilkan executable yang perilakunya melanggar spesifikasi C89, dan diperbaiki pada versi gcc berikutnya. Haruskah ini menghitung solusi yang valid jika kita menulis sepotong kode berdasarkan perilaku bug ini untuk mengetahui versi gcc yang digunakan? Ini menargetkan pada versi kompiler yang berbeda, tetapi BUKAN versi bahasa yang berbeda .
tsh
6
Saya tidak mengerti. Pertama Anda mengatakan "Output program Anda hanya harus nomor versi." . Lalu Anda berkata "Jika Anda memilih untuk mencetak nama lengkap atau nomor versi minor, misalnya C89 sebagai lawan C99, itu hanya harus mencetak nama." Jadi aturan pertama sebenarnya bukan keharusan?
pipa

Jawaban:

16

Serius dan Sebenarnya , 3 byte, skor 1,5

'1u

Cobalah online: Sebenarnya , Serius

Penjelasan:

'1u
'1   both versions: push "1"
  u  Actually: increment character to "2"; Seriously: NOP
     (both versions: implicit print)

udan Dmemiliki fungsionalitas pada string hanya ditambahkan di Actually (yang Seriously v2).

Mego
sumber
3
README.md dari Sebenarnya mengatakan bahwa Sebenarnya adalah penerus spiritual untuk Serius. Tidak terdengar seperti perubahan versi belaka bagi saya.
Adám
7
@ Adám Jika Anda melihat cabang di repositori, Serius tinggal di v1cabang. Sebelum Serius ditinggalkan, Sebenarnya tinggal di v2cabang. Selain itu, Serius menggunakan 1.xnomor versi dalam rilis , sementara Sebenarnya menggunakan 2.x(baik di sana maupun di PyPI ).
Mego
115

Python 3.0 dan Python 2, skor 6

(12 byte, 2 versi)

print(3/2*2)

Cobalah secara Online:

Bergantung pada fakta bahwa Python 3+ menggunakan divisi float secara default, tidak seperti Python 2, yang menggunakan pembagian lantai.

fireflame241
sumber
@MaltySen Your program should work in at least two versions of your language.Ini berfungsi di setidaknya dua versi 2.7 dan 3.0. Saya memilih to print the full name or minor version numbers.
fireflame241
Oh, begitu, salahku.
Maltysen
4
YA TUHAN! Pengembang python yang malang
Regis Portalez
4
@ RegisPortalez from __future__ import division, masalah terpecahkan :)
Łukasz Rogalski
62

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.8dan9

(Untuk skor sebelumnya, periksa sejarah !)

Object v(){int i=0;try{for(String[]s={"Locale","Map","Timer","Currency","UUID","Deque","Objects","Base64","zip.CRC32C"};;i++)Class.forName("java.util."+s[i]);}finally{return i<9?"1."+i:i;}}

Jalankan di Java 8
Jalankan di Java 9 atau lebih baru

Tidak disatukan

Object v(){
  int v=0;
  try {
    for(
      String[] s={
        "Locale",          // 1.1
        "Map",             // 1.2
        "Timer",           // 1.3
        "Currency",        // 1.4
        "UUID",            // 1.5
        "Deque",           // 1.6
        "Objects",         // 1.7
        "Base64",          // 1.8
        "zip.CRC32C"       // 9
      };;v++)
      Class.forName("java.util."+s[v]);
  } finally {
    // Swallowing ClassNotFoundException when the version is not the last one
    // Swallowing ArrayIndexOutOfBoundsException that occurs after reaching the last version.
    return v < 9 ? "1." + v : v; // Return either an int or a String
  }
}

Harap dicatat bahwa bagian kode return v<9?"1."+v:v;(sebelumnya return(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.xtermasuk 1.0. Tapi ... dari Java 9 dan seterusnya dan JEP223 , skema versi telah berubah dari menggunakan 1.xmenjadi x. Itu adalah versi yang dikenal secara internal. Jadi kita memiliki tabel berikut (disatukan dengan Javadoc dan Wikipedia ):

 java.version | Rel. name | Product name
   property   |           |
--------------+-----------+-----------------
          1.0 | JDK 1.0   | Java 1
          1.1 | JDK 1.1   |
          1.2 | J2SE 1.2  | Java 2
          1.3 | J2SE 1.3  |
          1.4 | J2SE 1.4  |
          1.5 | J2SE 5.0  | Java 5
          1.6 | Java SE 6 | Java 6
          1.7 | Java SE 7 | Java 7
          1.8 | Java SE 8 | Java 8
          9   | Java SE 9 | Java 9

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.utilkarena 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 berkat finally-block, yang pada gilirannya menimpa on-hold pengecualian dengan benar-benar mengembalikan nilai yang "1."+vmana vyang 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.

Base cost: `java.util.` (10 chars)

 Version | Class name (cost in chars)     | Reduced name (cost in chars)
---------+--------------------------------+---------------------------
 9       | java.util.zip.CRC32C (20)      | zip.CRC32C (10)
 1.8     | java.util.Base64 (16)          | Base64 (6)
 1.7     | java.util.Objects (17)         | Objects (7)
 1.6     | java.util.Deque (15)           | Deque (5)
 1.5     | java.util.UUID (14)            | UUID (4)
 1.4     | java.util.Currency (18)        | Currency (8)
 1.3     | java.util.Timer (15)           | Timer (5)
 1.2     | java.util.Map (13)             | Map (3)
 1.1     | java.util.Locale (16)          | Locale (6)
 1.0     | <default>                      | <default>
---------+--------------------------------+---------------------------
Subtotal |                      144 chars |                  54 chars
    Base |                                |                  10 chars
   Total |                      144 chars |                  64 chars

Kredit

  • 30 byte disimpan berkat Kevin Cruijssen (walaupun saya sudah melakukannya sebelum saya membaca komentarnya, saya janji!).
  • 26 byte lebih lanjut disimpan berkat Neil (tidak, saya tidak berpikir untuk melakukan itu)
  • 12 byte berkat Nevay dan pemikiran out-of-the- box -try -catch yang bagus!
  • 11 byte lagi oleh Neil lagi dan finallytrik portabel yang bagus .
  • 2 lebih byte berkat Kevin Cruijssen dengan mengganti return(i<9?"1.":"")+i;dengan return 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:

String v(){return System.getProperty("java.version");}

54 byte untuk 13 versi (dari 1.0 hingga 12), sehingga skornya menjadi 4.1538.

Olivier Grégoire
sumber
1
@KevinCruijssen Saya membuka javadoc dan menjalankan kelas dengan nama pendek 1 oleh 1. Tapi ... Saya sedikit terbantu dengan halaman ini: docs.oracle.com/javase/8/docs/technotes/guides/lang/…
Olivier Grégoire
1
260 byte Atau mungkin 1 lebih, tidak tahu apakah return"...tanpa ruang mungkin di semua versi tbh.)
Kevin Cruijssen
1
235 byte: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;}}
Neil
3
216 byte: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;}
Nevay
1
Ooh, saya memang bertanya-tanya tentang iterasi array dan menangkap pengecualian, tetapi Anda bisa melakukannya dengan lebih baik finally{return"1."+i;}.
Neil
22

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 .

try:eval('1&2')
except:print('0.9.1');1/0
if`'\n'`<'\'\\n\'':print(2);1/0
try:from email import _Parser;print(2.2);1/0
except:0
try:eval('"go"in""')
except:print('2.2.2');1/0
try:int('2\x00',10);print(2.5);1/0
except:0
if pow(2,100)<1:print('2.5.1');1/0
if str(round(1,0))>'1':print(3);1/0
if format(complex(-0.0,2.0),'-')<'(-':print(3.1);1/0
if str(1.0/7)<repr(1.0/7):print('3.1.3');1/0
try:eval('u"abc"')
except:print('3.2.1');1/0
try:int(base=10);print(3.3);1/0
except:0
try:import enum
except:print('3.3.3');1/0
try:eval('[*[1]]')
except:print(3.4);1/0
try:eval('f""')
except:print(3.5);1/0
print(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.

benar-benar manusiawi
sumber
... Oh, tidak heran. Saya bertanya-tanya mengapa Sp3000 menempatkan tanda kurung di setiap printpanggilan ... Terima kasih telah memberi tahu saya!
totallyhuman
2
Anda dapat menyimpan 68 byte dengan menghapus jenis kesalahan spesifik (ganti semua exceptdengan except:).
NoOneIsHere
Apakah ini masih berfungsi jika Anda tidak x=<string inside eval>hanya melakukan evaling kode secara manual?
Biru
@NoOneIsDi sini saya pikir, pada awalnya, bahwa Anda tidak bisa karena semua 1/0itu, tapi kemudian saya sadar. Terima kasih!
totallyhuman
21

C ++ 11/14/17, skor = 147/3 = 49

Untuk membedakan antara C ++ 11 dan C ++ 14/17, ia menggunakan perubahan dalam fungsi default constdari constexprfungsi 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.

#include<iostream>
#define c constexpr int v
struct A{c(int){return 0;}c(float)const{return*"??="/10;}};int main(){const A a;std::cout<<11+a.v(0);}

Tidak Disatukan:

struct A {
    constexpr int v(int) { return 0; }
    constexpr int v(float) const {
        // with trigraphs, *"??=" == '#' == 35, v() returns 3
        // without trigraphs, *"??" == '?' == 63, v() returns 6
        return *("??=") / 10;
    }
};

int main() {
    const A a;
    std::cout << 11 + a.v(0);
}

(Diuji dengan Debian gcc 7.1.0 menggunakan -std=c++{11,14,17}.)

Daniel Schepler
sumber
1
Jawaban pertama yang bagus! Perhatikan bahwa Anda dapat memasukkan spasi antara includedan <di dalam pernyataan sertakan, misalnya #include<iostream>.
MD XF
1
Hmm ... jika aturan direvisi untuk melarang menggunakan perbedaan pustaka standar (yang dalam hal ini secara tidak langsung menggunakan __cplusplusmakro) - 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 baris boost::integer_iteratorsedemikian sehingga mengkonversi sentinel ke iterator memiliki perilaku "mengejutkan".
Daniel Schepler
4
return 0;tersirat untuk mainsehingga Anda dapat menyimpan 9 byte di sana. Juga menurut wc -csolusi Anda menggunakan 251 byte dan bukan 252 (editor Anda mungkin telah memasukkan baris baru di akhir).
nwp
1
Mungkin lebih pendek untuk menggunakan kurangnya trigraph untuk memisahkan c ++ 17 dari c ++ 14
Potato44
1
Apakah ini akan berhasil? return *=>return*
Zacharý
19

EcmaScript 3/5/2015/2016/2017 di Browser, 59 byte / 5 versi = 11,8 poin

alert(2017-2*![].map-2010*![].fill-![].includes-!"".padEnd)

NetScape 7 laporan 3, dan Opera 12 laporan 5

Hemat 1 byte berkat GOTO 0

tsh
sumber
1
Ninjaed ! ;)
Shaggy
Netscape 7 hanya mendukung ES3? Wow, ini lebih tua dari yang saya kira ...
Neil
1
Anda dapat menyimpan beberapa byte menggunakan -!daripada yang +!!masuk akal (dan mengubah konstanta numerik sesuai).
GOTO 0
3
Mungkin ada penjelasan? :)
Derek 朕 會 功夫
@ Derek: lihat solusi saya (ditautkan di atas) untuk penjelasan.
Shaggy
18

JavaScript (ES5 & ES6), 14 byte / 2 versi = 7

alert(5^"0o3")

0oKonstanta oktal-gaya baru dalam ES6; ES5 melemparkan string NaNyang tidak mempengaruhi hasil XOR bitwise.

Neil
sumber
13

JavaScript (ES 2, 3 & 5 - 8 9), 59/6 = 9,833 75/7 = 10,714

Semoga juga mengirimkan solusi dengan lebih banyak versi, meskipun skornya sedikit lebih tinggi daripada solusi 2-versi.

alert(9-(/./.dotAll!=0)-!"".padEnd-![].includes-![].keys-2*![].map-![].pop)

Cobalah online

Memeriksa keberadaan berbagai metode dalam prototipe Array, RegExp & String, meniadakannya, memberikan boolean, dan mengurangi boolean itu dari nilai awal 9. Penggandaan ![].mapakun untuk fakta bahwa ES4 ditinggalkan.

  • The dotAllproperti (dan terkait sbendera) untuk Regular Expressions diperkenalkan pada ES2018 (V9).
  • The padEndMetode String diperkenalkan pada ES2017 (v8).
  • The includesMetode Array diperkenalkan pada ES2016 (v7).
  • The keysMetode Array diperkenalkan pada ES2015 (v6).
  • The mapMetode Array diperkenalkan pada ES5.1 (v5).
  • The popMetode Array diperkenalkan pada ES3 (v3).
Shaggy
sumber
Apakah ES 7 atau ES 8 nomor versi yang valid? Mungkin itu harus disebut sebagai ES 201x?
tsh
1
@ tsh: Ya, mereka masih menggunakan nomor versi; mereka hanya menggunakan tahun untuk nama asli .
Shaggy
9

PHP 5/7, skor 5.5

<?=7-"0x2";

3V4L secara online!

PHP 5.3.9 / 5.3.11, skor 10

<?='5.3.'.(9-0x0+2);

3V4L secara online!

Versi online lebih panjang karena versi PHP lama di kotak pasir tidak mengaktifkan tag pendek.

Sisyphus
sumber
9

Befunge: 15 11 bytes / 2 versi = 5.5

4 byte dicukur oleh @ Pietu1998

"89",;5-;,@  

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.

karhell
sumber
"89",;5-;,@untuk 11 byte
PurkkaKoodari
@ Pietu1998 Bagus! Jika Anda ingin memposting itu sebagai jawaban, saya dengan senang hati akan
mendukung
Silakan dan ambil jika Anda mau, Anda tahu ;bagian itu.
PurkkaKoodari
@ Pietu1998 Diedit. Terima kasih banyak!
karhell
FYI, saya berhasil turun ke 7 byte, mengambil pendekatan yang berbeda. Tautan
James Holderness
7

Pyth 4/5 - 6 byte / 2 versi = 3

  5 ;4

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 memungkinkan 4untuk dicetak, sedangkan di Pyth 5, spasi dan titik koma membuat sisa baris komentar.

Maltysen
sumber
11
Siapa yang tahu Pyth punya versi?
Erik the Outgolfer
7

Python 3 dan Python 2.0, 18 byte, skor 18/2 = 9

print(3-round(.5))

Pembulatan Banker di Python 3, pembulatan standar dalam Python 2.

Cobalah online - Python 3!

Cobalah online - Python 2!

Stephen
sumber
wow saya selalu melihat orang membedakan python 2 dan 3 berdasarkan pembagian
phuclv
@LưuVĩnhPhúc divisi yang baik adalah pemain golf, jadi itu sebabnya: P
Stephen
7

Secara kubik, 4 byte, skor 4 / ∞

B3%0

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 1di bagian atas, memberinya jumlah wajah 3. %0cetakan 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.

MD XF
sumber
9
Bukankah seharusnya skornya 4 / ∞?
nwp
7

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 tanganuint8_t modedetect(void);

Daftar kode mesin + sumber mesin NASM (menunjukkan cara kerjanya dalam mode 16-bit, karena BITS 16memberitahu NASM untuk merakit source mnemonics untuk mode 16-bit.)

 1          machine      global modedetect
 2          code         modedetect:
 3 addr     hex          BITS 16

 5 00000000 B040             mov    al, 64
 6 00000002 B90000           mov    cx, 0       ; 3B in 16-bit.  5B in 32/64, consuming 2 more bytes as the immediate
 7 00000005 FEC1             inc    cl          ; always 2 bytes.  The 2B encoding of inc cx would work, too.
 8                       
 9                           ; want: 16-bit cl=1.   32-bit: cl=0
10 00000007 41               inc    cx       ; 64-bit: REX prefix
11 00000008 D2E8             shr    al, cl   ; 64-bit: shr r8b, cl doesn't affect AL at all.  32-bit cl=1.  16-bit cl=2
12 0000000A C3               ret
# end-of-function address is 0xB, length = 0xB = 11

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/ decencodings 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 a jmpatau jcc), tetapi dalam hal ini untuk mendapatkan 16/32/64 saya ingin memasukkan atau memutuskan ecxdaripada eax. Itu juga set REX.B, yang mengubah register tujuan. Tapi untungnya kita bisa melakukan itu tetapi mengatur semuanya agar 64-bit tidak perlu bergeser al.

    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 juga jmpdalam 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 :

08048070 <modedetect>:
 8048070:       b0 40                   mov    al,0x40
 8048072:       b9 00 00 fe c1          mov    ecx,0xc1fe0000   # fe c1 is the inc cl
 8048077:       41                      inc    ecx         # cl=1
 8048078:       d2 e8                   shr    al,cl
 804807a:       c3                      ret    

Pembongkaran 64-bit ( Coba online! ):

0000000000400090 <modedetect>:
  400090:       b0 40                   mov    al,0x40
  400092:       b9 00 00 fe c1          mov    ecx,0xc1fe0000
  400097:       41 d2 e8                shr    r8b,cl      # cl=0, and doesn't affect al anyway!
  40009a:       c3                      ret    

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 seperti lea ax, [bx+si+0x2]dalam mode 16-bit. Ini jelas sulit digunakan untuk kode-golf, terutama karena e/rbxdane/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 untuk ret).


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

; CPU p6   ;  YASM directive to make the ALIGN padding tidier
global _start
_start:
    call   modedetect
    movzx  ebx, al
    mov    eax, 1
    int    0x80        ; sys_exit(modedetect());

align 16
modedetect:
BITS 16
    mov    al, 64
    mov    cx, 0       ; 3B in 16-bit.  5B in 32/64, consuming 2 more bytes as the immediate
    inc    cl          ; always 2 bytes.  The 2B encoding of inc cx would work, too.

    ; want: 16-bit cl=1.   32-bit: cl=0
    inc    cx       ; 64-bit: REX prefix
    shr    al, cl   ; 64-bit: shr r8b, cl doesn't affect AL at all.  32-bit cl=1.  16-bit cl=2
    ret

Program Linux ini keluar dengan status keluar = modedetect(), jadi jalankan sebagai ./a.out; echo $?. Merakit dan menautkannya ke biner statis, misalnya

$ asm-link -m32 x86-modedetect-polyglot.asm && ./x86-modedetect-polyglot; echo $?
+ yasm -felf32 -Worphan-labels -gdwarf2 x86-modedetect-polyglot.asm
+ ld -melf_i386 -o x86-modedetect-polyglot x86-modedetect-polyglot.o
32
$ asm-link -m64 x86-modedetect-polyglot.asm && ./x86-modedetect-polyglot; echo $?
+ yasm -felf64 -Worphan-labels -gdwarf2 x86-modedetect-polyglot.asm
+ ld -o x86-modedetect-polyglot x86-modedetect-polyglot.o
64

## maybe test 16-bit with BOCHS somehow if you really want to.

7 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:

 # 16-bit mode:
42                                  detect123:
43 00000020 B80300                      mov ax,3
44 00000023 FEC8                        dec al
45                                  
46 00000025 48                          dec ax
47 00000026 C3                          ret

Yang menerjemahkan dalam mode 32-bit sebagai

08048080 <detect123>:
 8048080:       b8 03 00 fe c8          mov    eax,0xc8fe0003
 8048085:       48                      dec    eax
 8048086:       c3                      ret    

dan 64-bit sebagai

00000000004000a0 <detect123>:
  4000a0:       b8 03 00 fe c8          mov    eax,0xc8fe0003
  4000a5:       48 c3                   rex.W ret 
Peter Cordes
sumber
Saya tidak yakin ini dianggap sebagai versi yang berbeda . Tidakkah mereka hanya berkorelasi dengan konfigurasi sistem yang berbeda.?
Uriel
1
@Uriel: Menjalankan blok kode mesin dengan CPU dalam mode 16-bit, mode 32-bit, atau mode 64-bit adalah kode mesin yang setara dengan menjalankan python2vs. python3interpreter 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.
Peter Cordes
5

Brachylog / Brachylog v1 , 5/2 = 2.5

2,1hw

Cobalah online! (Brachylog)

Cobalah online! (Brachylog v1)

Penjelasan untuk Brachylog:

?2,1hw.
?2      Unify ? (input) with 2 (no input so it succeeds)
  ,1    Append 1 (21)
    h   First element/head (2)
     w. Write to STDOUT and unify with output (not displayed)

Penjelasan untuk Brachylog v1:

?2,1hw.
?2      Unify ? (input) with 2 (no input so it succeeds)
  ,     Break implicit unification/logical AND
   1h   Take first element/head of 1 (1)
     w. Write to STDOUT and unify with output (not displayed)
Erik the Outgolfer
sumber
Bagus! Sebagai sidenote, 2,1dalam Brachylog v2 tidak membangun daftar [2,1]( 2;1akan), melainkan nomor 21(yang tidak mengubah cara Anda ingin jawaban Anda bekerja).
Fatalkan
@Segera Ooh terima kasih saya bingung dengan Jelly ...
Erik the Outgolfer
@Formatisasi BTW 2;1tidak akan berfungsi di Brachylog v1 sebagai ;cara logis ATAU di sana.
Erik the Outgolfer
5

C89 / C99, 25 byte, 2 versi, skor = 12,5

#include <stdio.h>

int main() {
    int v = 11 //**/ 11
            + 88;
    printf("C%d\n", v);
    return 0;
}

// komentar style tidak dikenali di C89.

Versi golf:

v(){return 20//**/2
+79;}

Cobalah online: C89 , C99

nwellnhof
sumber
ganti int v()dengan main(), lebih pendek dan benar-benar akan dikompilasi sebagai program yang lengkap!
Andrea
@ Andrea Terima kasih. AFAIK, diizinkan memposting fungsi atau seluruh program.
nwellnhof
Kamu benar.
Andrea
5

Perl 5 dan Perl 6, 23 byte 19 byte, skor 9,5

print 6-grep '.',''

Perl 5 grepop pertama selalu diperlakukan sebagai regex, tidak demikian di Perl 6.

Joshua
sumber
skornya 19/2 = 9,5
Daniel Vestøl
5

Bash, semua 4 versi, skor 72 71 32 byte ⇒ = 8

s=$'\ua\xa\n';expr 5 - ${#s} / 2

Sepotong kode ini menggunakan interpretasi $'...'string yang berbeda di setiap versi Bash.
Menghasilkan nomor versi utama - dan hanya itu.

Doc ditemukan di sini .

Tidak Disatukan:

s=$'\ua\xa\n';
expr 5 - ${#s} / 2
# Bash v4 sees three linefeeds => length of 3 => 5 - 3 / 2 = 4
# Bash v3 sees the literal '\ua' + two linefeeds: 5 chars in length
#    => 5 - 5 / 2 = 3
# Bash v2 sees '\ua\xa' + linefeed, 7 chars: 5 - 7 / 2 = 2
# Bash v1 does not even interpret $'..' strings, and sees literally '$\ua\xa\n' of length 9 => 5 - 9 / 2 = 1

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 expride)!

joH1
sumber
Tata bahasa shell tidak membutuhkan ;;alternatif terakhir. Gunakan ;untuk mencukur byte.
Jens
1
Saya baru saja mencoba ini di bash-2.05a (dikompilasi barusan untuk Cygwin), dan salah melaporkan "3", bukan "2" :(
Jason Musgrove
1
$'\xNfitur interpretasi tampaknya telah ditambahkan pada 2.01.1 ... Saya harus memperbarui jawaban saya. Mengerjakannya
joH1
dapatkah saya meminta Anda untuk mencoba ini? s="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
joH1
1
Anda mungkin bisa bermain golf seperti ini s=$'\ua\xa\n';expr 5 - ${#s} / 2. Ini berfungsi pada v3 dan v4. Saya tidak memiliki versi yang lebih lama untuk dicoba sekarang.
Digital Trauma
4

R, versi 2 dan 3, skor: 10,5 poin

cat(exists("cite")+2)

Perintah ini kembali 2untuk R 2.xx dan 3untuk R 3.xx Fungsi citeini ditambahkan dalam R versi 3.0.0. Oleh karena itu, perintah exists("cite")kembali FALSEuntuk R 2.xx dan TRUEuntuk R 3.xx

R, semua versi (1, 2, dan 3), skor: 12⅓ poin

e=exists;cat(e("cite")+e("eapply")+1)

Fungsi eapplyini diperkenalkan di R 2.0.0.

Sven Hohenstein
sumber
R.version$major. 15 karakter. Saya tidak sejak kapan itu ada.
Rui Barradas
@RuiBarradas Izinkan saya mengutip OP: " Program Anda mungkin tidak menggunakan flag kompiler builtin, makro, atau kustom untuk menentukan versi bahasa. "
Sven Hohenstein
Ok, maaf, saya melewatkan bagian itu. Haruskah saya menghapus komentar?
Rui Barradas
@RuiBarradas Tidak masalah. Anda tidak perlu menghapus komentar.
Sven Hohenstein
Anda harus menangani pencetakan hasilnya. Saat ini, ketika dijalankan sebagai program lengkap ini tidak mencetak apa pun.
JAD
4

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.

i=15
try:
 for m in'os.atexit.os.os.os.warnings.cgitb.heapq.collections._ast.abc.queue.os.os.os.importlib.argparse.lzma.asyncio.zipapp.secrets.'.split('.'):__import__(m);i=i+1
except:print(i/10.)

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

g.jaket
sumber
4

File Batch Windows , versi 35 byte / 2 = skor 17,5

@if /i Z==z @echo NT&exit
@echo DOS

Mencetak DOSpada MS-DOS (duh) dan NTpada 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.COMmenjadi cmd.exe(sekarang juga memungkinkan ekstensi .cmdsebagai alternatif dari yang asli .bat).

Dengan itu, mereka juga menerapkan beberapa perubahan , seperti /iflag untuk mengabaikan case string pada conditional. Yaitu, meskipun Z==zsalah, /i Z==zitu benar.

Kami mengeksploitasi bahwa DOS tidak memiliki case insensitivy dan membandingkan huruf besar Zdengan huruf kecil z. Dengan menggunakan /iflag, kita berakhir dengan Z==zconditional (false) pada DOS dan z==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:

Windows 10

(jalankan dengan cmd /kuntuk mencegah penutupan jendela aktif exit)

DOSBox:

DOSBox

vDos:

vDos

Matheus Avellar
sumber
Windows 7lebih pendek dari Windows NT.
user202729
2
@ user202729 Saya kira, tapi sekali lagi, 7sebenarnya bukan versi bahasa, sudah sama di semua Windows sejak 3.1. Jadi saya tidak berpikir itu akan sangat adil untuk menyebutnya 7ketika seharusnya bahkan mungkin3.1
Matheus Avellar
3

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.

In[1]:= $Version

Out[1]= "10.4.1 for Microsoft Windows (64-bit) (April 11, 2016)"

In[2]:= (Length@DateRange[{1}, {1}][[1]] + 27)/3

Out[2]= 10

dan

In[1]:= $Version

Out[1]= "11.1.1 for Microsoft Windows (64-bit) (April 18, 2017)"

In[2]:= (Length@DateRange[{1}, {1}][[1]] + 27)/3

Out[2]= 11

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]]mengevaluasi 1dalam Mathematica versi 1- ~ 8, tetapi saya tidak punya waktu untuk memasukkannya.

user6014
sumber
2
Cukup yakin bahwa jawaban Anda tidak memenuhi persyaratan prompt, yaitu aturan terakhir karena Anda menggunakan $Version:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
Amndeep7
7
Saya hanya menggunakan $Versionuntuk menunjukkan bahwa itu menghasilkan hasil yang benar dalam versi yang benar, $Versionbukan bagian dari jawaban saya ...
user6014
Semua teman baik - masalahnya adalah, Anda menggunakan sesuatu seperti $VersionNumber , tetapi sebaliknya Anda menyebutnya $Version. Menurut saya, sementara daging program Anda adalah Length@DateRangehal - hal, itu tidak akan berhasil tanpa $Versionhanya memberikan informasi versi lengkap yang kemudian Anda proses, yang karenanya melanggar aturan.
Amndeep7
4
@ Amndeep7 Pengajuan adalah kode 37 byte yang diuraikan dalam paragraf pertama. Blok kode hanyalah demonstrasi keluaran.
PurkkaKoodari
3
Penjelasan: Menggunakan format waktu yang berbeda dalam versi yang berbeda. Itu bisa di-golf lebih ke {1} Tr[1^#&@@%~DateRange~%]/3+9(31 byte), atau bahkan 7+Length@Now(12 byte)
user202729
3

Ruby 1.x dan 2.x, 20 byte, skor 10

p [].to_h&&2rescue 1

Berdasarkan to_hmetode yang diperkenalkan pada Arraykelas di Ruby 2.

Philipp Frank
sumber
Jawaban pertama yang bagus. Saya tidak punya 1.x berguna untuk menguji, tetapi p [].to_h&&2rescue 1sedikit lebih pendek.
manatwork
@manatwork Hebat, hemat 3 byte dan berfungsi seperti pesona
Philipp Frank
3

Erlang, 180 byte, 11 versi, skor 16,36

20-length([A||A<-[schedulers,c_compiler_used,cpu_topology,snifs,dynamic_trace,port_count,nif_version,end_time,max_heap_size,atom_count],{'EXIT',_}<-[catch erlang:system_info(A)]]).

Dengan lekukan dan jeda baris:

20-length([A||A<-
                  [schedulers,
                   c_compiler_used,
                   cpu_topology,
                   snifs,
                   dynamic_trace,
                   port_count,
                   nif_version,
                   end_time,
                   max_heap_size,
                   atom_count],
              {'EXIT',_}<-[catch erlang:system_info(A)]]).

Diuji pada satu rilis minor dari setiap versi utama sejak 10:

  • R10B-9
  • R11B-5
  • R12B-5
  • R13B04
  • R14B04
  • R15B03
  • R16B03
  • 17.5.6.2
  • 18.2.1
  • 19.2
  • 20.0

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.

legoscia
sumber
3

Julia 0.4, 0.5, 46 bytes, skor 22

f(::ASCIIString)=.4
f(::String)=.5
f()=f("")

Julia telah mengubah nama tipe dari tipe String konkret dan abstrak dalam banyak versi.

Kode ini khususnya memanfaatkan:

Julia 0.4 :

  • Beton adalah ASCIIString,
  • Abstrak secara resmi AbstractString,
  • Abstrak telah usang alias ke String.
  • Beton lebih spesifik daripada abstrak sehingga menang pengiriman

Julia 0.5 :

  • Beton secara resmi String,
  • Beton sudah tidak digunakan lagi alias untuk ASCIIString,
  • Abstrak adalah AbstractString, (meskipun itu tidak masalah di sini)
  • Karena dua metode telah didefinisikan untuk tipe string beton, yang terakhir over-menulis yang pertama.

Lihat juga solusi saya yang lebih baru dan lebih efektif berdasarkan prinsip yang berbeda

Lyndon White
sumber
3

Japt (1 & 2), 8 6/2 = 4 3

'1r\S2

Uji v1  |   Uji v2

  • 2 byte disimpan berkat Oliver

Penjelasan

Sebelum v2, Japt menggunakan sintaks RegEx yang dikustomisasi, sehingga kami dapat memanfaatkannya.

'1

Angka 1 sebagai string.

 r  2

Ganti ( r) yang di bawah ini dengan a 2.

\S

Japt 2 melihat ini sebagai RegEx /\S/g, yang cocok dengan 1. Japt 1 mengabaikan \karakter pelarian dan hanya melihat S, yang merupakan konstanta Japt untuk karakter ruang dan, jelas, tidak cocok dengan 1.

Shaggy
sumber
3

Di luar, skor = 3.5

7 byte, 2 versi

"]"'b.@

Cobalah online di Befunge-93
Cobalah online di Befunge-98

"]"adalah string literal di kedua versi, mendorong 93 (nilai ASCII dari [) ke stack. 'badalah karakter literal di Befunge-98, mendorong 98 (nilai ASCII b), 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.

James Holderness
sumber
]"[email protected]'atau ][email protected]'juga bekerja
MildlyMilquetoast
3

Ruby 1.x (<1.9) dan 2.x, 10 8 byte, skor = 4

$><<?2%7

Cobalah:

Ini berfungsi dengan mengeksploitasi berbagai perilaku ?xantara Ruby 1.x dan 2.x. Di Ruby 1.x, ?A(misalnya) mengembalikan 65(nilai ASCII karakter A), tetapi di Ruby 2.0 ia mengembalikan string satu karakter "A".

Kode di atas setara dengan ini:

val = ?2
$> << val % 7

Di Ruby 1.x (<1.9), nilai valis 50(nilai ASCII dari karakter 2), sebuah Fixnum. Fixnum#%adalah operator modulo, jadi 50 % 7kembali 1.

Di Ruby 2.x, valadalah string "2". String#%adalah versi infiks sprintf, jadi "2" % 7sama dengan sprintf("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.

Jordan
sumber
1
Ooh, bagus! Saya mencoba melakukan sesuatu seperti ?A==66?1:2sebelum saya menemukan jawaban Anda
Piccolo
3

Python 2 dan Python 3 , 36 34 byte, skor 18 17

print(str(hash(float('-inf')))[1])

Dalam Python 2 , hash infinity negatif adalah -271828 tetapi dalam Python 3 -314159. Sunting: Disimpan 2 byte, 1 poin skor, terima kasih kepada @ArBo.

Neil
sumber
menyipitkan mata Apakah ini disengaja e vs pi hal?
Jo King
@JoKing Ya; rupanya ketika hashpertama 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.
Neil
2

Python 3 , Python 2 , skor 17.5

(35 byte, 2 versi)

try:exec("print 2")
except:print(3)

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!

jferard
sumber
Hmm, bisakah Anda menempatkan setiap pernyataan pada baris sebelumnya? Yaitutry:exec("print 2")\nexcept:print(3)
ETHproduksi
@ ETHproduk terima kasih! Saya tidak berharap untuk menang, jadi saya agak terganggu. Saya terutama ingin fokus pada perubahan besar - besaran antara Python 2 dan 3.
jferard