Xác định phiên bản ngôn ngữ của bạn


51

Thách thức của bạn là viết một polyglot hoạt động trong các phiên bản khác nhau của ngôn ngữ của bạn. Khi chạy, nó sẽ luôn xuất phiên bản ngôn ngữ.

Quy tắc

  • Chương trình của bạn nên hoạt động với ít nhất hai phiên bản ngôn ngữ của bạn.
  • Đầu ra của chương trình của bạn chỉ nên là số phiên bản. Không có dữ liệu bên ngoài.
  • Chương trình của bạn có thể sử dụng bất kỳ phương pháp nào bạn muốn để xác định số phiên bản. Tuy nhiên, đầu ra phải tuân theo quy tắc 2; tuy nhiên, bạn xác định số phiên bản, đầu ra chỉ phải là số.
  • Chương trình của bạn chỉ cần xuất phiên bản chính của ngôn ngữ. Ví dụ: trong FooBar 12.3.456789-beta, chương trình của bạn chỉ cần xuất 12.
  • Nếu ngôn ngữ của bạn đặt các từ hoặc ký hiệu trước hoặc sau số phiên bản, bạn không cần xuất các từ đó và chỉ số đó. Ví dụ, trong C89, chương trình của bạn chỉ cần in 89và trong C ++ 0x, chương trình của bạn chỉ cần in 0.
  • Nếu bạn chọn in tên đầy đủ hoặc số phiên bản nhỏ, ví dụ C89 trái ngược với C99, thì chỉ phải in tên. C89 build 32là hợp lệ, trong khi error in C89 build 32: foo barkhông.
  • Chương trình của bạn không được sử dụng cờ dựng sẵn, macro hoặc trình biên dịch tùy chỉnh để xác định phiên bản ngôn ngữ.

Chấm điểm

Điểm của bạn sẽ là chiều dài mã chia cho số phiên bản mà nó hoạt động. Điểm thấp nhất sẽ thắng, chúc may mắn!


4
Số phiên bản ngôn ngữ là gì? Ai xác định nó?
Phù thủy lúa mì

9
Tôi nghĩ rằng tuyến tính ngược trong số lượng phiên bản không chào đón câu trả lời với số lượng phiên bản cao.
dùng202729

6
@ user202729 Tôi đồng ý. Máy in Integer Integer đã làm tốt điều đó - điểm số là (number of languages)^3 / (byte count).
Mego

6
Phiên bản cho một ngôn ngữ là gì? Không phải chúng ta định nghĩa một ngôn ngữ là thông dịch viên / trình biên dịch của nó ở đây sao? Giả sử, có một phiên bản gcc có lỗi với một số mã C89 nhất định, nó tạo ra một thực thi có hành vi vi phạm đặc tả C89 và nó đã được sửa trên phiên bản tiếp theo của gcc. Điều này có nên tính một giải pháp hợp lệ nếu chúng ta viết một đoạn mã dựa trên hành vi lỗi này để cho biết phiên bản gcc nào đang sử dụng? Nó nhắm mục tiêu vào phiên bản khác của trình biên dịch , nhưng KHÔNG phải phiên bản ngôn ngữ khác .
tsh

6
Tôi không hiểu điều này. Đầu tiên bạn nói "Đầu ra của chương trình của bạn chỉ nên là số phiên bản." . Sau đó, bạn nói "Nếu bạn chọn in tên đầy đủ hoặc số phiên bản nhỏ, ví dụ C89 trái ngược với C99, thì chỉ phải in tên." Vì vậy, quy tắc đầu tiên không thực sự là một yêu cầu?
đường ống

Câu trả lời:


16

Nghiêm túcthực tế , 3 byte, điểm 1,5

'1u

Dùng thử trực tuyến: Trên thực tế , Nghiêm túc

Giải trình:

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

uDcó chức năng trên các chuỗi chỉ được thêm vào trong Thực tế (đó là Nghiêm túc v2).


3
Trên thực tế README.md nói rằng Thật ra là người kế thừa tinh thần cho Nghiêm túc. Có vẻ như không phải là một phiên bản thay đổi đối với tôi.
Adám

7
@ Adám Nếu bạn nhìn vào các nhánh trong kho lưu trữ, Nghiêm túc nằm trong v1nhánh. Trước khi Nghiêm túc bị từ chối, Thực tế cư trú trong v2chi nhánh. Ngoài ra, Nghiêm túc sử dụng 1.xsố phiên bản trong các bản phát hành , trong khi Thực tế sử dụng 2.x(cả ở đó và trên PyPI ).
Mego

115

Python 3.0 và Python 2, điểm 6

(12 byte, 2 phiên bản)

print(3/2*2)

Dùng thử trực tuyến:

Dựa vào thực tế là Python 3+ sử dụng phân chia float theo mặc định, không giống như Python 2, sử dụng phân chia tầng.


@MaltySen Your program should work in at least two versions of your language.Nó hoạt động trong ít nhất hai phiên bản 2.7 và 3.0. Tôi đã chọn to print the full name or minor version numbers.
fireflame241

Ồ tôi hiểu rồi, xấu của tôi.
Maltysen

4
CHÚA ƠI! Các nhà phát triển trăn đáng thương
Regis Portalez

4
@RegisPortalez from __future__ import division, vấn đề đã được giải quyết :)
Rogalski

62

Java, 189 byte, 10 phiên bản, điểm = 18,9

Các phiên bản hỗ trợ: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.89

(Đối với điểm số trước, hãy kiểm tra lịch sử !)

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;}}

Chạy nó trên Java 8
Chạy nó trên Java 9 trở lên

Ung dung

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

Xin lưu ý rằng phần mã return v<9?"1."+v:v;(trước đây return(v<9?"1.":"")+v;) cần được kiểm tra đối với bất kỳ phiên bản nào giữa Java 1.0 và Java 1.3 được bao gồm. Tôi không có bất kỳ cài đặt Java 1.3 nào hoặc sớm hơn theo ý của tôi để thực sự kiểm tra cú pháp này.

Giới thiệu

Phiên bản Java có một lịch sử đặc biệt. Tất cả các phiên bản trong lịch sử đã được 1.xbao gồm 1.0. Nhưng ... từ Java 9 trở đi và JEP223 , lược đồ phiên bản đã thay đổi từ sử dụng 1.xsang x. Đó là phiên bản như được biết đến trong nội bộ. Vì vậy, chúng tôi có bảng sau (đặt cùng với Javadoc và 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

Mục thử thách này khớp với cột phiên bản trong bảng trên, đây là những gì được chứa trong thuộc tính hệ thống "java.version".

Giải trình

Mục tiêu là kiểm tra xem phiên bản nào mà một lớp bắt đầu tồn tại, bởi vì Java không dùng mã nhưng không bao giờ loại bỏ nó. Mã đã được viết riêng trong Java 1.0 để tương thích với tất cả các phiên bản, một lần nữa, vì JDK là (phần lớn) tương thích nguồn chuyển tiếp .

Việc triển khai cố gắng tìm các tên lớp ngắn nhất mà mỗi phiên bản được giới thiệu. Mặc dù, để có được byte, cần phải thử và chọn một gói con chung. Cho đến nay tôi đã tìm thấy gói hiệu quả nhất là java.utilbởi vì nó chứa một số lớp thực sự có tên ngắn gọn trải rộng trên tất cả các phiên bản của Java.

Bây giờ, để tìm số phiên bản thực tế, tên lớp được sắp xếp theo phiên bản giới thiệu. Sau đó, tôi cố gắng tạo ra từng lớp một cách tuần tự và tăng chỉ số mảng. Nếu lớp tồn tại, chúng ta bỏ qua phần tiếp theo, nếu không, chúng ta sẽ để ngoại lệ bị bắt bởi try-block. Khi hoàn thành, một ngoại lệ khác được đưa ra bởi vì không còn lớp nào mà chúng ta cần kiểm tra.

Trong mọi trường hợp, luồng sẽ để lại try-block với một ngoại lệ. Ngoại lệ mà không bị bắt, nhưng chỉ cần đặt ở trạng thái giữ nhờ vào finally-block, mà lần lượt đè ngoại lệ trên-giữ bởi thực sự trả về một giá trị mà là "1."+vnơi vđược chỉ số sử dụng trước đó. Nó cũng xảy ra, chúng tôi đã làm cho chỉ mục này khớp với số phiên bản nhỏ của Java.

Một phần quan trọng của golf là tìm tên lớp mới ngắn nhất trong gói java.util(hoặc bất kỳ gói trẻ em nào) cho mỗi phiên bản. Đây là bảng tôi đã sử dụng để tính chi phí đó.

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

Tín dụng

  • 30 byte được lưu nhờ Kevin Cruijssen (mặc dù tôi đã làm điều đó trước khi đọc bình luận của anh ấy, tôi hứa!).
  • 26 byte được lưu thêm nhờ Neil (không, tôi đã không nghĩ về việc đó)
  • 12 byte nhờ Nevay và thoải mái out-of-the -box suy nghĩ hãy thử-catch!
  • Thêm 11 byte bởi Neil một lần nữa và finallythủ thuật di động tốt đẹp .
  • Thêm 2 byte nhờ Kevin Cruijssen bằng cách thay thế return(i<9?"1.":"")+i;bằng return i<9?"1."+i:i;(điều này cần được xác thực theo 1.0 hoặc nhiều nhất là 1.3 vì không có thay đổi cú pháp nào xảy ra trước 1.4)

Với nội dung

Nếu nội dung được cho phép:

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

54 byte cho 13 phiên bản (từ 1.0 đến 12), vì vậy điểm sẽ là 4.1538.


1
@KevinCruijssen Tôi đã mở javadoc và chạy các lớp với tên ngắn 1 bằng 1. Nhưng ... Tôi đã được giúp đỡ một chút bởi trang này: docs.oracle.com/javase/8/docs/technotes/guides/lang/ tựa
Olivier Grégoire

1
260 byte Hoặc có thể thêm 1 byte nữa, không biết nếu return"...không có không gian thì có thể có trong tất cả các phiên bản 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
Ồ, tôi đã tự hỏi về việc lặp lại một mảng và bắt một ngoại lệ, nhưng bạn có thể đi tốt hơn với một mảng finally{return"1."+i;}.
Neil

22

Python , 606 byte / 15 phiên bản = điểm 40,4

-67 byte (lol) nhờ NoOneIsHere.

Các phiên bản là 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)

Tất cả tín dụng cho câu trả lời tuyệt vời của Sp3000 . Các dòng mới là cần thiết.

Whee, đó là niềm vui để chơi golf. Điều này sẽ hoạt động (vâng, tôi đã cài đặt tất cả các phiên bản này), nhưng tôi có thể đã vô tình làm hỏng một cái gì đó. Nếu bất cứ ai tìm thấy một lỗi, xin vui lòng cho tôi biết.



... Ồ, không có gì lạ. Tôi đã tự hỏi tại sao Sp3000 đã đặt dấu ngoặc đơn trong mỗi printcuộc gọi ... Cảm ơn đã cho tôi biết!
hoàn toàn là

2
Bạn có thể lưu 68 byte bằng cách loại bỏ các loại lỗi cụ thể (thay thế tất cả excepts bằng except:).
NoOneIsĐây là

Điều này sẽ vẫn hoạt động nếu bạn đã làm x=<string inside eval>thay vì chỉ trốn tránh mã bằng tay?
Màu xanh

@NoOneIs Lúc đầu, tôi nghĩ rằng bạn không thể vì tất cả 1/0, nhưng sau đó tôi nhận ra. Cảm ơn!
hoàn toàn là

21

C ++ 11/11/17, điểm = 147/3 = 49

Để phân biệt giữa C ++ 11 và C ++ 14/17, nó sử dụng sự thay đổi về số lượng mặc định constcủa các constexprhàm thành viên trong C ++ 14 (với tín dụng cho ví dụ tại https://stackoverflow.com/questions/23980929/ what-thay đổi-giới thiệu-trong-c14-có thể có khả năng phá vỡ một chương trình-bằng văn bản-trong-c1 ). Để phân biệt giữa C ++ 14 và C ++ 17, nó sử dụng thực tế là C ++ 17 bị vô hiệu hóa.

#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);}

Ung dung:

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);
}

(Đã thử nghiệm với Debian gcc 7.1.0 bằng cách sử dụng -std=c++{11,14,17}.)


1
Câu trả lời tuyệt vời đầu tiên! Lưu ý rằng bạn có thể đánh gôn khoảng trắng giữa include<trong các câu lệnh bao gồm, ví dụ #include<iostream>.
MD XF

1
Hmm ... nếu các quy tắc được sửa đổi để cấm sử dụng các khác biệt thư viện tiêu chuẩn (trong trường hợp này sử dụng gián tiếp __cplusplusmacro) - thì để phân biệt C ++ 17 với C ++ 14 Tôi muốn sử dụng thay đổi trong phạm vi dựa trên phạm vi cho ngữ nghĩa. Có thể tạo các lớp iterator / sentinel tối thiểu dọc theo các dòng boost::integer_iteratornhư vậy để chuyển đổi sentinel thành iterator có hành vi "đáng ngạc nhiên".
Daniel Schepler

4
return 0;là ẩn cho mainbạn có thể lưu 9 byte ở đó. Ngoài ra, theo wc -cgiải pháp của bạn là sử dụng 251 byte chứ không phải 252 (trình soạn thảo của bạn có thể đã chèn một dòng mới ở cuối).
nwp

1
Có lẽ ngắn hơn khi sử dụng việc thiếu các bộ ba để tách c ++ 17 khỏi c ++ 14
Potato44

1
Điều này sẽ làm việc? return *=>return*
Zacharý

19

EcmaScript 3/5/2015/2016/2017 trong Trình duyệt, 59 byte / 5 phiên bản = 11,8 điểm

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

NetScape 7 báo cáo 3 và Opera 12 báo cáo 5

Tiết kiệm 1 byte nhờ GOTO 0


1
Ninja ! ;)
Xù xì

Netscape 7 chỉ hỗ trợ ES3? Wow, nó già hơn tôi nghĩ ...
Neil

1
Bạn có thể lưu một vài byte bằng cách sử dụng -!thay vì +!!nó có ý nghĩa (và thay đổi các hằng số cho phù hợp).
GOTO 0

3
Có lẽ một số lời giải thích? :)
Derek 朕 會

@Derek: xem giải pháp của tôi (được liên kết ở trên) để được giải thích.
Xù xì

18

JavaScript (ES5 & ES6), 14 byte / 2 phiên bản = 7

alert(5^"0o3")

0ohằng số bát phân kiểu là mới trong ES6; ES5 chuyển chuỗi thànhNaN mà không ảnh hưởng đến kết quả của XOR bitwise.


13

JavaScript (ES 2, 3 & 5 - 8 9), 59/6 = 9.833 75/7 = 10.714

Cũng có thể gửi giải pháp với nhiều phiên bản hơn, ngay cả khi nó đạt điểm cao hơn một chút so với giải pháp 2 phiên bản.

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

Dùng thử trực tuyến

Kiểm tra sự hiện diện của các phương thức khác nhau trong các nguyên mẫu Array, RegExp & String, phủ định chúng, đưa ra một boolean và trừ boolean từ giá trị ban đầu là 9. Phép nhân của các ![].maptài khoản cho việc ES4 bị bỏ rơi.

  • Các dotAlltài sản (và liên quan scờ) cho Regular Expressions được giới thiệu vào ES2018 (v9).
  • Các padEndphương pháp chuỗi đã được giới thiệu trong ES2017 (v8).
  • Các includesphương pháp mảng được giới thiệu vào ES2016 (v7).
  • Các keysphương pháp mảng được giới thiệu vào ES2015 (v6).
  • Các mapphương pháp mảng được giới thiệu vào ES5.1 (v5).
  • Các popphương pháp mảng được giới thiệu vào ES3 (v3).

ES 7 hoặc ES 8 là số phiên bản hợp lệ? Có lẽ nó nên được gọi là ES 201x?
tsh

1
@tsh: Có, họ vẫn sử dụng số phiên bản; họ chỉ sử dụng nhiều năm cho tên thật .
Xù xì


9

Befunge: 15 11 byte / 2 phiên bản = 5.5

4 byte bị xóa bởi @ Pietu1998

"89",;5-;,@  

Dùng thử trực tuyến:
Befunge 93
Befunge 98
Sử dụng toán tử dấu chấm phẩy độc quyền Befunge 98 ("chuyển sang dấu chấm phẩy tiếp theo") để phân biệt các phiên bản. Cả hai sẽ in "9". Befunge 93 sẽ bỏ qua dấu chấm phẩy, trừ 5 từ "8" (giá trị còn lại trên đỉnh của ngăn xếp), in kết quả "3" và chấm dứt. Mặt khác, Befunge 98 sẽ bỏ qua, in "8" và chấm dứt.


"89",;5-;,@cho 11 byte
PurkkaKoodari

@ Pietu1998 Tốt đẹp! Nếu bạn muốn đăng nó như một câu trả lời, tôi sẽ vui lòng upvote :)
karhell

Đi trước và lấy nó nếu bạn muốn, bạn đã tìm ra ;phần.
PurkkaKoodari

@ Pietu1998 Đã chỉnh sửa. Rất cám ơn!
karhell

FYI, tôi đã quản lý để giảm xuống còn 7 byte, thực hiện một cách tiếp cận khác. Liên kết
James Holdiness

7

Pyth 4/5 - 6 byte / 2 phiên bản = 3

  5 ;4

Trong Pyth 5, một số lượng không gian chẵn ở đầu dòng bị bỏ qua để sử dụng để thụt lề, trong khi ở Pyth 4, nó chỉ hoạt động như một khoảng trắng duy nhất và ngăn in 5. Trong Pyth 4, dấu chấm phẩy chỉ hoàn thành các câu lệnh, cho phép 4in ra, trong khi ở Pyth 5, một dấu cách và dấu chấm phẩy làm cho phần còn lại của dòng bình luận.


11
Ai biết Pyth có phiên bản?
Erik the Outgolfer


7

Về cơ bản, 4 byte, điểm 4 /

B3%0

Hoạt động trong mọi phiên bản hệ thống của bạn có đủ bộ nhớ để chạy. Không cạnh tranh vì nó khập khiễng. Hợp lệ cho mỗi bài đăng meta này .

Về cơ bản, B3 xoay một hàng từ mặt trái sang mặt trên. F3 cũng hoạt động tốt như F₁3 hoặc B₁3. Vì một hàng trong 3x3x3 của Cubally là ba khối bằng một khối, điều này đặt ba 1mặt vào mặt trên, cho tổng số mặt là 3. %0in tổng mặt trên, in 3 cho 3 x3x3.

Trong Cubally 4x4x4, các hàng là 4x1 khối. Đặt 4 1 vào mặt trên, thu được tổng số 4.


9
Điểm số có nên là 4 / ∞ không?
nwp

7

mã máy x86 16/32/64 bit: 11 byte, điểm = 3,66

Hàm này trả về chế độ hiện tại (kích thước toán hạng mặc định) dưới dạng một số nguyên trong AL. Gọi nó từ C có chữ kýuint8_t modedetect(void);

Danh sách mã + mã máy của NASM (hiển thị cách thức hoạt động ở chế độ 16 bit, kể từ khi BITS 16yêu cầu NASM lắp ráp các bản ghi nhớ nguồn cho chế độ 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

Biện minh :

Mã máy x86 không chính thức có số phiên bản, nhưng tôi nghĩ rằng điều này thỏa mãn mục đích của câu hỏi bằng cách tạo ra các số cụ thể, thay vì chọn những gì thuận tiện nhất (chỉ mất 7 byte, xem bên dưới).

CPU x86 ban đầu, 8086 của Intel, chỉ hỗ trợ mã máy 16 bit. 80386 đã giới thiệu mã máy 32 bit (có thể sử dụng ở chế độ được bảo vệ 32 bit và sau đó ở chế độ tương thích trong HĐH 64 bit). AMD giới thiệu mã máy 64 bit, có thể sử dụng ở chế độ dài. Đây là các phiên bản của ngôn ngữ máy x86 theo cùng nghĩa rằng Python2 và Python3 là các phiên bản ngôn ngữ khác nhau. Chúng hầu hết tương thích, nhưng với những thay đổi có chủ ý. Bạn có thể chạy các tệp thực thi 32 hoặc 64 bit trực tiếp trong nhân hệ điều hành 64 bit giống như cách bạn có thể chạy các chương trình Python2 và Python3.

Làm thế nào nó hoạt động:

Bắt đầu với al=64. Di chuyển nó sang phải 1 (chế độ 32 bit) hoặc 2 (chế độ 16 bit).

  • 16/32 so với 64 bit: Mã hóa 1 byte inc/ decmã hóa là tiền tố REX trong 64 bit ( http://wiki.osdev.org/X86-64_In cản_Encoding#REX_prefix ). REX.W hoàn toàn không ảnh hưởng đến một số hướng dẫn (ví dụ: a jmphoặc jcc), nhưng trong trường hợp này để có được 16/32/64 tôi muốn inc hoặc dec ecxthay vì eax. Điều đó cũng thiết lập REX.B, mà thay đổi đăng ký đích. Nhưng may mắn thay, chúng ta có thể thực hiện công việc đó nhưng thiết lập mọi thứ để 64-bit không cần phải thay đổi al.

    (Các) lệnh chỉ chạy ở chế độ 16 bit có thể bao gồm a ret, nhưng tôi không thấy cần thiết hoặc hữu ích. (Và sẽ làm cho nó không thể nội tuyến như một đoạn mã, trong trường hợp bạn muốn làm điều đó). Nó cũng có thể là một jmptrong chức năng.

  • 16 bit so với 32/64: tức thì là 16 bit thay vì 32 bit. Việc thay đổi chế độ có thể thay đổi độ dài của một lệnh, vì vậy các chế độ 32/64 bit giải mã hai byte tiếp theo như một phần của lệnh ngay lập tức, thay vì một lệnh riêng biệt. Tôi giữ mọi thứ đơn giản bằng cách sử dụng lệnh 2 byte ở đây, thay vì giải mã không đồng bộ để chế độ 16 bit sẽ giải mã từ các ranh giới lệnh khác nhau hơn 32/64.

    Liên quan: Tiền tố kích thước toán hạng thay đổi độ dài của tức thời (trừ khi đó là tiền tố 8 bit được mở rộng ký hiệu), giống như sự khác biệt giữa chế độ 16 bit và 32/64 bit. Điều này làm cho việc giải mã độ dài lệnh khó thực hiện song song; CPU Intel có quầy giải mã LCP .


Hầu hết các quy ước gọi (bao gồm các psABI Hệ thống x86-32 và x86-64) cho phép các giá trị trả về hẹp có rác trong các bit cao của thanh ghi. Chúng cũng cho phép ghi đè CX / ECX / RCX (và R8 cho 64 bit). IDK nếu điều đó là phổ biến trong các quy ước gọi 16 bit, nhưng đây là mã golf nên tôi luôn có thể nói đó là quy ước gọi tùy chỉnh.

Tháo gỡ 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    

Tháo gỡ 64 bit ( Dùng thử trực tuyến! ):

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    

Liên quan: Hỏi & Đáp mã máy x86-32 / x86-64 của tôi trên SO.

Một điểm khác biệt giữa 16 bit và 32/64 là chế độ địa chỉ được mã hóa khác nhau. ví dụ: lea eax, [rax+2]( 8D 40 02giải mã như lea ax, [bx+si+0x2]trong chế độ 16 bit. Điều này rõ ràng là khó sử dụng cho môn đánh gôn, đặc biệt là từ e/rbxe/rsi được bảo toàn cuộc gọi trong nhiều quy ước gọi.

Tôi cũng đã cân nhắc sử dụng 10 byte mov r64, imm64, đó là REX + mov r32,imm32. Nhưng vì tôi đã có một giải pháp 11 byte, nên điều này sẽ tốt nhất bằng (10 byte + 1 cho ret).


Mã kiểm tra cho chế độ 32 và 64 bit. (Tôi chưa thực sự thực hiện nó ở chế độ 16 bit, nhưng quá trình tháo gỡ cho bạn biết nó sẽ giải mã như thế nào. Tôi không có trình giả lập 16 bit được thiết lập.)

; 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

Chương trình Linux này thoát với exit-status = modedetect(), vì vậy hãy chạy nó dưới dạng ./a.out; echo $?. Lắp ráp và liên kết nó thành một nhị phân tĩnh, vd

$ 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 (điểm = 2,33) nếu tôi có thể đánh số các phiên bản 1, 2, 3

Không có số phiên bản chính thức cho các chế độ x86 khác nhau. Tôi chỉ thích viết câu trả lời asm. Tôi nghĩ rằng nó sẽ vi phạm ý định của câu hỏi nếu tôi chỉ gọi các chế độ 1,2,3 hoặc 0,1,2, vì vấn đề là buộc bạn phải tạo ra một số bất tiện. Nhưng nếu điều đó được cho phép:

 # 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

Giải mã ở chế độ 32 bit là

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

và 64 bit như

00000000004000a0 <detect123>:
  4000a0:       b8 03 00 fe c8          mov    eax,0xc8fe0003
  4000a5:       48 c3                   rex.W ret 

Tôi không chắc những tính này là các phiên bản khác nhau . Không phải chúng chỉ tương quan với các cấu hình hệ thống khác nhau.?
Uriel

1
@Uriel: Chạy một khối mã máy với CPU ở chế độ 16 bit, chế độ 32 bit hoặc chế độ 64 bit là mã máy tương đương với chạy python2so với python3trình thông dịch trên cùng một chương trình Python. Các CPU x86 mới luôn bao gồm một chế độ tương thích với các CPU cũ hơn (đây là lý do duy nhất để sử dụng định dạng mã máy khó giải mã như vậy!), Nhưng chế độ được bảo vệ 32 bit và chế độ dài của x86-64 thực sự là phiên bản mới của mã máy x86. Chế độ dài thậm chí loại bỏ một số opcodes, làm cho chúng không hợp lệ.
Peter Cordes

5

Brachylog / Brachylog v1 , 5/2 = 2,5

2,1hw

Hãy thử trực tuyến! (Brachylog)

Hãy thử trực tuyến! (Brachylog v1)

Giải thích cho 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)

Giải thích cho 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)

Tuyệt quá! Là một sidenote, 2,1trong Brachylog v2 không xây dựng danh sách [2,1]( 2;1sẽ), mà là số 21(không thay đổi cách bạn dự định câu trả lời của bạn hoạt động).
Gây tử vong

@Firthize Ooh cảm ơn tôi đã nhầm lẫn điều đó với Jelly ...
Erik the Outgolfer 17/08/17

@Firthize BTW 2;1sẽ không hoạt động trong Brachylog v1 ;có nghĩa là logic HOẶC ở đó.
Erik the Outgolfer

5

C89 / C99, 25 byte, 2 phiên bản, điểm = 12,5

#include <stdio.h>

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

// ý kiến ​​phong cách không được công nhận trong C89.

Phiên bản chơi gôn:

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

Dùng thử trực tuyến: C89 , C99


thay thế int v()bằng main(), nó ngắn hơn và thực sự sẽ biên dịch thành một chương trình hoàn chỉnh!
Andrea

@Andrea Cảm ơn. AFAIK, nó được phép đăng một trong hai chức năng hoặc toàn bộ chương trình.
nwellnhof

Bạn hoàn toàn đúng.
Andrea

5

Perl 5 và Perl 6, 23 byte 19 byte, điểm 9.5

print 6-grep '.',''

Perl 5 grepop đầu tiên luôn được coi là regex, không như vậy trong Perl 6.


số điểm là 19/2 = 9,5
Daniel Vestøl

5

Bash, tất cả 4 phiên bản, 72 71 32 byte điểm = 8

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

Đoạn mã này sử dụng các cách hiểu khác nhau về các $'...'chuỗi trong mỗi phiên bản Bash.
Xuất ra số phiên bản chính - và đó là nó.

Tài liệu tìm thấy ở đây .

Ung dung:

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

Câu trả lời này là một nửa phỏng đoán; Tôi chỉ thử nghiệm nó trong bash 4 và 3, nhưng nó cũng hoạt động trên các phiên bản khác.

Hãy cho tôi biết nếu nó không / không, tôi sẽ thử với các phiên bản khác ngay khi tôi có sẵn chúng.

-1 char cảm ơn Jens.
-29 byte nhờ Digital Trauma (toàn bộ exprý tưởng)!


Ngữ pháp shell không yêu cầu một ;;thay thế cuối cùng. Sử dụng ;để cạo một byte.
Jens

1
Tôi vừa thử cái này trên bash-2.05a (vừa được biên dịch cho Cygwin) và nó báo cáo không chính xác "3", không phải "2" :(
Jason Musgrove

1
$'\xNtính năng phiên dịch dường như đã được thêm vào trong 2.01.1 ... Tôi sẽ phải cập nhật câu trả lời của mình. Làm việc trên nó
joH1

Tôi có thể yêu cầu bạn thử điều này? s="$'\ua\xa\n'";case ${#s} in 3)echo 4;;5)echo 3;;7)echo 2;;9)echo 1;esac
joH1

1
Bạn có thể có thể chơi golf này để một cái gì đó như s=$'\ua\xa\n';expr 5 - ${#s} / 2. Điều này hoạt động trên v3 và v4. Tôi không có các phiên bản cũ hơn để thử ngay bây giờ.
Chấn thương kỹ thuật số

4

R, phiên bản 2 và 3, điểm: 10,5 điểm

cat(exists("cite")+2)

Lệnh này trả về 2 cho R 2.xx và 3cho R 3.xx Hàm citeđược thêm vào trong phiên bản R 3.0.0. Do đó, lệnh exists("cite")trả về FALSEcho R 2.xx vàTRUE cho R 3.xx

R, tất cả các phiên bản (1, 2 và 3), điểm: 12⅓ điểm

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

Chức năng eapplyđược giới thiệu trong R 2.0.0.


R.version$major. 15 ký tự. Tôi không từ khi nó tồn tại.
Rui Barradas

@RuiBarradas Hãy để tôi trích dẫn OP: " Chương trình của bạn không được sử dụng cờ dựng sẵn, macro hoặc trình biên dịch tùy chỉnh để xác định phiên bản ngôn ngữ. "
Sven Hohenstein

Ok, xin lỗi, tôi đã bỏ lỡ phần đó. Tôi có nên xóa bình luận?
Rui Barradas

@RuiBarradas Không có vấn đề. Bạn không cần phải xóa bình luận.
Sven Hohenstein

Bạn nên xử lý in kết quả. Hiện tại, khi chạy như một chương trình đầy đủ, điều này không in bất cứ điều gì.
JAD

4

Python , 196 byte / 16 phiên bản = điểm 12,25

Các phiên bản là 1.5, 1.6, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5 và 3.6
Thật không may tôi phải rời khỏi 2.7 vì không có mô-đun nào trong nó (theo như tôi có thể nói) không phải là 2.6 mà là 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.)

Chúng tôi lặp qua một loạt các mô-đun được giới thiệu trong các phiên bản khác nhau của python và ở lỗi đầu tiên, chúng tôi thoát và trả lại phiên bản. Khoảng cách giữa các phiên bản chính được lấp đầy bằng cách nhập liên tục os. Thử nghiệm cho python 1.5 dựa vàostring.split không có mặt cho đến 1.6.

Tín dụng cho câu trả lời của Olivier Grégoire cho ý tưởng thử nghiệm các lớp / mô-đun mới trong một vòng lặp.

Cuối cùng tôi đã thử nghiệm trên tất cả các phiên bản python có liên quan ... yêu cầu chỉnh sửa mã nguồn 1.5 để biên dịch ...


4

Tệp Batch của Windows , 35 byte / 2 phiên bản = điểm 17,5

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

In DOStrên MS-DOS (duh)NTtrên Windows NT. (tât nhiên)

Bây giờ, cho một số giải thích.

Windows đã có kịch bản hàng loạt kể từ thời MS-DOS và nó đã không thay đổi nhiều kể từ đó. Tuy nhiên, khi Windows NT xuất hiện, Microsoft đã thay đổi trình thông dịch mặc định cho các tập lệnh bó, từ COMMAND.COMsang cmd.exe(hiện tại cũng cho phép tiện ích mở rộng .cmdthay thế cho bản gốc .bat).

Cùng với đó, họ cũng thực hiện một vài thay đổi , chẳng hạn như /icờ bỏ qua trường hợp chuỗi trên các điều kiện. Đó là, trong khi Z==zlà sai, /i Z==zlà đúng.

Chúng tôi khai thác rằng DOS không có trường hợp không nhạy cảm và so sánh chữ hoa Zvới chữ thường z. Bằng cách sử dụng /icờ, chúng tôi kết thúc với một Z==zđiều kiện (sai) trên DOS vàz==z (đúng) trên NT.

Bây giờ, tôi nhận ra rằng thách thức chỉ định rằng một số phiên bản nên được in. Nhưng, theo như tôi biết, không có 'số phiên bản' cho kịch bản hàng loạt, vì vậy đây là lần gần nhất tôi có thể nhận được.


Đã thử nghiệm trên Windows 10, DOSBox và vDos:

Windows 10:

Windows 10

(chạy với cmd /kđóng cửa sổ trước exit)

DOSBox:

DOSBox

vDos:

vDos


Windows 7ngắn hơn Windows NT.
dùng202729

2
@ user202729 Tôi cho rằng, nhưng sau đó một lần nữa, 7 thực sự không phải là phiên bản ngôn ngữ, nó giống nhau trên tất cả Windows 'kể từ 3.1. Vì vậy, tôi đã không nghĩ rằng sẽ rất công bằng khi gọi nó là 7khi nó thậm chí có thể trở thành3.1
Matheus Avellar

3

Ngôn ngữ Wolfram / Mathicala 10/11, 37 byte / 2 phiên bản = 18,5

Hãy xem xét (Length@DateRange[{1},{1}][[1]]+27)/3, ở mức 37 byte và làm việc với 2 phiên bản, cho tôi điểm 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

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

Tôi chắc chắn có một cách hiệu quả hơn, nhưng sự khác biệt giữa đầu ra DateRange cắn vào mông tôi gần đây, vì vậy tôi đã bắt đầu sử dụng nó.

Để theo dõi, ai đó có thể có thể tận dụng việc Length@DateRange[{1}, {1}][[1]]đánh giá 1trong các phiên bản Mathicala 1- ~ 8, nhưng tôi không có thời gian để kết hợp điều đó.


2
Chắc chắn rằng câu trả lời của bạn không đáp ứng các yêu cầu của lời nhắc, cụ thể là quy tắc cuối cùng do bạn sử dụng $Version:Your program may not use a builtin, macro, or custom compiler flags to determine the language version.
Amndeep7

7
Tôi chỉ sử dụng $Versionđể chứng minh rằng nó đưa ra kết quả chính xác trong phiên bản chính xác, $Versionkhông phải là một phần câu trả lời của tôi ...
user6014

Tất cả bạn tốt - vấn đề là, bạn đang sử dụng một cái gì đó như thế $VersionNumber, nhưng thay vào đó bạn đang gọi nó $Version. Theo suy nghĩ của tôi, trong khi phần cốt lõi của chương trình của bạn là Length@DateRangethứ, nó sẽ không hoạt động nếu không $Versioncung cấp thông tin phiên bản đầy đủ mà bạn xử lý, do đó vi phạm các quy tắc.
Amndeep7

4
@ Amndeep7 Việc gửi là mã 37 byte được in trong đoạn đầu tiên. Các khối mã chỉ là trình diễn đầu ra.
PurkkaKoodari

3
Giải thích: Sử dụng định dạng thời gian khác nhau trong các phiên bản khác nhau. Điều đó có thể được đánh gôn nhiều hơn {1} Tr[1^#&@@%~DateRange~%]/3+9(31 byte) hoặc thậm chí 7+Length@Now(12 byte)
dùng202729

3

Ruby 1.x và 2.x, 20 byte, điểm 10

p [].to_h&&2rescue 1

Dựa trên to_hphương thức đã được giới thiệu trên Arraylớp trong Ruby 2.


Câu trả lời đầu tiên tốt đẹp. Tôi không có sẵn 1.x để kiểm tra, nhưng p [].to_h&&2rescue 1ngắn hơn một chút.
manatwork

@manatwork Tuyệt vời, tiết kiệm 3 byte và hoạt động như một bùa mê
Philipp Frank

3

Erlang, 180 byte, 11 phiên bản, điểm 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)]]).

Với thụt dòng và ngắt dòng:

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

Đã thử nghiệm trên một phiên bản nhỏ của mỗi phiên bản chính kể từ 10:

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

Ý tưởng là mỗi bản phát hành chính đã thêm ít nhất một đối số cho phép mới cho hàm erlang:system_info, vì vậy, hãy thử những cái trong danh sách, đếm xem có bao nhiêu lỗi trong số đó và trừ đi số lỗi từ 20, là phiên bản hiện tại.


3

Julia 0,4, 0,5, 46 byte, điểm 22

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

Julia đã thay đổi tên loại của các loại Chuỗi cụ thể và trừu tượng trong nhiều phiên bản.

Mã này đặc biệt tận dụng:

Julia 0,4 :

  • Bê tông là ASCIIString,
  • Tóm tắt là chính thức AbstractString,
  • Tóm tắt đã phản đối bí danh để String.
  • Cụ thể là cụ thể hơn trừu tượng để nó thắng công văn

Julia 0,5 :

  • Bê tông là chính thức String,
  • Bê tông đã phản đối bí danh ASCIIString,
  • Tóm tắt là AbstractString, (mặc dù điều đó không quan trọng ở đây)
  • Vì hai phương thức đã được định nghĩa cho kiểu chuỗi cụ thể, nên phương thức sau ghi đè lên kiểu trước.

Xem thêm giải pháp mới hiệu quả hơn của tôi dựa trên các nguyên tắc khác nhau


3

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

'1r\S2

Kiểm tra v1  |   Kiểm tra v2


Giải trình

Trước v2, Japt đã sử dụng cú pháp RegEx tùy chỉnh, vì vậy chúng tôi có thể tận dụng lợi thế đó.

'1

Số 1 dưới dạng một chuỗi.

 r  2

Thay thế ( r) bên dưới bằng a 2.

\S

Japt 2 xem đây là RegEx /\S/g, phù hợp với 1. Japt 1 bỏ qua \nhân vật thoát và chỉ nhìn thấy S, đó là hằng số Japt cho một nhân vật không gian và, rõ ràng, không khớp với 1.


3

Befunge, điểm = 3,5

7 byte, 2 phiên bản

"]"'b.@

Dùng thử trực tuyến trong Befunge-93
Thử trực tuyến trong Befunge-98

"]"là một chuỗi ký tự trong cả hai phiên bản, đẩy 93 (giá trị ASCII của [) lên ngăn xếp. 'blà một ký tự theo nghĩa đen trong Befunge-98, đẩy 98 (giá trị ASCII của b), nhưng đó là những hướng dẫn không hợp lệ trong Befunge-93, vì vậy chúng chỉ bị bỏ qua. Do đó, chúng tôi kết thúc với 93 trên đỉnh của ngăn xếp trong Befunge-93 và 98 trong Befunge-98. .@ghi ra giá trị ở đầu ngăn xếp và sau đó thoát ra.


]".@.b'hoặc ]g.@.b'cũng hoạt động
MildlyMilquetoast

3

Ruby 1.x (<1.9) và 2.x, 10 8 byte, điểm = 4

$><<?2%7

Thử nó:

Điều này hoạt động bằng cách khai thác các hành vi khác nhau ?xgiữa Ruby 1.x và 2.x. Trong Ruby 1.x, ?A(ví dụ) trả về 65(giá trị ASCII của ký tự A), nhưng trong Ruby 2.0, nó trả về chuỗi một ký tự"A" .

Mã ở trên tương đương với điều này:

val = ?2
$> << val % 7

Trong Ruby 1.x (<1.9), giá trị val50(giá trị ASCII của ký tự 2), Fixnum. Fixnum#%là toán tử modulo, vì vậy 50 % 7trả về1 .

Trong Ruby 2.x, vallà chuỗi "2". String#%là một phiên bản infix của sprintf, do đó, "2" % 7tương đương với sprintf("2", 7), "2"chuỗi định dạng ở đâu. Vì chuỗi định dạng không chứa bất kỳ chuỗi định dạng nào (ví dụ %d), các đối số tiếp theo sẽ bị loại bỏ và"2" được trả về.

Cuối cùng, $>là một bí danh cho $stdout, vì vậy $> << ...in kết quả.


1
Ooh tuyệt đó! Tôi đã cố gắng làm một cái gì đó giống như ?A==66?1:2trước khi tôi bắt gặp câu trả lời của bạn
Piccolo

3

Python 2Python 3 , 36 34 byte, điểm 18 17

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

Trong Python 2 , hàm băm của vô cực âm là -271828 nhưng trong Python 3 là -314159. Chỉnh sửa: Đã lưu 2 byte, 1 điểm số, nhờ @ArBo.


liếc Đây có phải là một e ý vs điều pi?
Jo King

@JoKing Có; rõ ràng khi hashlần đầu tiên được cố định để làm việc trên các điểm vô cùng nổi, nhà phát triển có liên quan đã sử dụng pi * 1e5 và e * -1e5 làm giá trị băm. Tại một số điểm trong Python 3, giá trị vô cực âm đã được thay đổi thành phủ định của giá trị băm cho vô cực.
Neil

2

Python 3 , Python 2 , điểm 17,5

(35 byte, 2 phiên bản)

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

Python 2 , 35 byte

Hãy thử trực tuyến!

Python 3 , 35 byte

Hãy thử trực tuyến!

Đã lưu 5 byte nhờ vào ETHproductions

Không phải là một câu trả lời golf mã tốt, nhưng một sự thay đổi lớn!


Hmm, bạn có thể đặt từng câu trên dòng trước không? Tức làtry:exec("print 2")\nexcept:print(3)
Sản phẩm ETH

@ETHản xuất cảm ơn! Tôi đã không mong đợi để chiến thắng, vì vậy tôi đã bị phân tâm một chút. Tôi chủ yếu muốn tập trung vào sự thay đổi lớn giữa Python 2 và 3.
jferard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.