Phát hiện MS Windows


78

Thử thách

Tạo một chương trình trả về giá trị trung thực khi chạy trên Microsoft Windows (để đơn giản, chúng tôi sẽ sử dụng Windows 7, 8.1 và 10) và giá trị falsey khi chạy trên bất kỳ hệ điều hành nào khác (OSX, FreeBSD, Linux).

Quy tắc

  • Mã không chạy / biên dịch trên nền tảng không được tính là giá trị falsey.

Tiêu chí chiến thắng

Tôi gắn nhãn này là , vì vậy điểm số thấp nhất sẽ thắng, nhưng tôi cũng rất thích xem giải pháp sáng tạo cho vấn đề này.


7
Các chương trình có thể xuất ra bằng mã thoát? ( thường được phép )
FlipTack

13
Bạn có thể đưa ra một danh sách xác định các hệ điều hành này cần phải làm việc không?
FlipTack

2
Kết quả trong Windows RT là gì?
Adám

6
Bạn có thể muốn chỉ định một vài hệ thống không phải Windows cụ thể phải được hỗ trợ. Có một số tranh luận về ý kiến ​​về những thứ như DOS và OS2.
jpmc26

2
Chúng tôi có lẽ cần một sự đồng thuận về những gì được coi là trung thực và chim ưng cho mã thoát; quy ước thông thường là 0 cho đúng và bất cứ điều gì khác là sai, nhưng nhiều câu trả lời đang coi nó là ngược lại và định nghĩa "câu lệnh if" rõ ràng không được áp dụng.

Câu trả lời:


75

Vim, 2 byte

<C-a>1

Trên Windows, <C-a>(ctrl + a) được ánh xạ theo mặc định Select All. Nếu bạn nhập a 1trong chế độ chọn trong Windows, nó sẽ thay thế lựa chọn bằng những gì bạn đã nhập (1) để lại 1 trong bộ đệm.

Trên các hệ điều hành khác, <C-a>theo mặc định được ánh xạ tới Increment number. Bởi vì không có số nào để tăng, đó là số không, và sau đó số 1 tăng số lượng nhưng về mặt bộ đệm là số không.

1 là sự thật trong Vim và một chuỗi trống là sai


Hình như 3 tổ hợp phím. Ctrl + a + 1
Pavel

12
Tôi nghĩ rằng mỗi bài meta này meta.codegolf.stackexchange.com/questions/8995/... Vim câu trả lời thường được ghi mà không có sự bổ (đặc biệt là cho rằng câu trả lời đầu tiên trên bài sử dụng <ctrl + a> làm ví dụ cho 1 byte)
nmjcman101

4
@Pavel đó Ctrl + a, 1. Nếu là Ctrl + a + 1nó, nó sẽ được tính là 1 tổ hợp phím.
Thuyền trưởng Man

7
Đẹp, tôi thích câu trả lời này!
DJMcMayhem

Điều đó khá thanh lịch, tôi thích nó.
Dan

108

MATLAB, 4 byte

ispc

Từ tài liệu :

tf = ispctrả về logic 1 (đúng) nếu phiên bản phần mềm MATLAB® dành cho nền tảng Microsoft® Windows®. Nếu không, nó trả về logic 0 (sai).

Ngoài ra còn có các chức năng ismacisunix. Tôi sẽ để nó cho người đọc tìm ra những chức năng đó làm gì. Mego vui lòng yêu cầu giải thích sơ đồ ismacisunixvì vậy tôi đã cố gắng minh họa nó ở đây:

nhập mô tả hình ảnh ở đây

Nó không được yêu cầu cho một sơ đồ ispcnhưng tôi có thể tiết lộ rằng hành vi này khá giống nhau, ngoại trừ thay thế OSXUnixvới Windows.


Cách tiếp cận thứ hai:

Đây là cách tiếp cận thứ hai với getenvviệc sử dụng 23 byte nên chống đạn, trừ khi có một hệ điều hành khác bắt đầu bằng W:

x=getenv('OS');x(1)==87

getenv 'name'tìm kiếm danh sách môi trường hệ điều hành cơ bản cho văn bản của biểu mẫu name=value, trong đó namelà vectơ ký tự đầu vào. Nếu được tìm thấy, MATLAB® trả về giá trị vectơ ký tự. Nếu tên được chỉ định không thể được tìm thấy, một ma trận trống được trả về.


4
Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Dennis

54

Python 2.7.10 , 24 byte

import os
0/('['>os.sep)

Cảm ơn FlipTack cho 3 byte

Chương trình này lợi dụng thực tế rằng Windows là HĐH duy nhất được sử dụng \làm dấu tách đường dẫn. Thông thường điều này là bực bội và xấu, nhưng lần đầu tiên nó thực sự là một lợi thế. Trên Windows, '['>os.seplà sai và do đó 0/0được tính toán, gây ra ZeroDivisionErrorvà thoát với mã thoát khác không. Trên các nền tảng không phải của Windows, '['>os.seplà đúng, tạo biểu thức 0/1, không có gì và chương trình thoát với mã thoát 0.


DOS cũng sử dụng dấu gạch chéo ngược làm dấu tách đường dẫn và nó có ít nhất một lần thực hiện Python 2.
isanae

5
@isanae Tôi đã chỉnh sửa tiêu đề để chỉ định Python 2.7 - triển khai Python 2 duy nhất trên DOS là lỗi cổ điển, lỗi 2.4.2
Mego

OS / 2 cũng sử dụng dấu gạch chéo ngược và có triển khai Python 2.7;)
isanae

9
@isanae Ở đó, tôi chỉ định 2.7.10. Chúc may mắn tìm được một cổng của điều đó.
Mego

2
rõ ràng là nó chỉ cần đưa ra kết quả chính xác trên 3 phiên bản windows gần đây và có lẽ các phiên bản gần đây tương tự của ba hệ thống khác được liệt kê, OS2 và DOS không thành vấn đề,
Jasen

45

Hội x86, 7 byte (Lấy cảm hứng từ câu trả lời của Runemoro )

31 DB 89 D8 40 CD 80

Hoặc là

xor ebx, ebx 
mov eax, ebx
inc eax
int 0x80

Sự miêu tả

Trước hết, chúng tôi sẽ thiết eaxđể 1(số hệ thống gọi cho exit(int val)cho Linux, FreeBSDOSX). Sau đó, chúng tôi sẽ gọi cổng ngắt 0x80đó là hệ thống cửa khẩu kêu gọi Linux, FreeBSDOSX. Điều đó sẽ khiến chương trình thoát với trạng thái ebx0( false).

Trên Windows int 0x80là một cổng không hợp lệ (Nó sử dụng 2enhư một cổng tòa nhà) và sẽ làm sập chương trình, khiến nó kết thúc bằng mã thoát tích cực ( true).

Chỉnh sửa: Sẽ không hoạt động OSXvì nó có quy ước chuyển đối số khác nhau trên 32 bit (theo ngăn xếp).

Tài liệu tham khảo và đọc thêm


3
Thật tuyệt vời!
z0rberg

Tại sao các vụ tai nạn xảy ra một giá trị trung thực? Có phải vì EAX (thường là giá trị trả về) là 1? Ngoài ra, EAX có được đảm bảo là 0 khi bắt đầu chương trình không? Hay bạn cần xor eax, eaxtrong đó?
Cole Johnson

3
@ColeJohnson: Các sự cố do hệ điều hành phát hiện (trên các hệ điều hành thường được sử dụng với x86) không bao giờ để lại mã thoát là 0, vì đó là dành riêng để chấm dứt thành công. . hoàn toàn ngược lại (với 0 là vaue trung thực duy nhất, ví dụ chương trình UNIX / Linux / POSIX tiêu chuẩn falsethoát với mã 1 trong khi truethoát với mã 0).

1
Câu trả lời này mặc nhiên giả định rằng các thanh ghi eaxebxbị xóa về 0 khi bắt đầu chương trình (trên không phải Windows), điều này không được đảm bảo nếu tôi nhớ chính xác. Nó cũng giả định một cách rõ ràng rằng quy ước chuyển đối số cao cho Linux phù hợp với FreeBSD và OSX, điều này thực sự rất đáng ngạc nhiên.
zwol

1
@ Sebastian-LaurenţiuPlesciuc Câu hỏi hay. mov eax, 1sẽ được dịch sang \xB8\x01\x00\x00\x00, lâu hơn rất nhiều chỉ cần di chuyển đăng ký và gọi inc.
Shmuel H.

29

C, 44 43 38 36 byte

Cảm ơn @Downgoat cho một byte! gạch bỏ 44 vẫn là thường xuyên 44
Cảm ơn @Neil cho hai byte!

f(){return
#ifdef WIN32
!
#endif
0;}

Ban đầu tôi sẽ đề nghị bạn có thể lưu một loạt byte bằng cách di chuyển 0ra khỏi ifdefvà thay đổi 1thành !, nhưng tôi nghĩ rằng _WIN32+0công việc thậm chí còn tốt hơn.
Neil

Nếu c99 vẫn ổn, bạn có thể đổi f thành main và dán return 1;bên trong ifdef và xóa cái khác, vì main không quay trở lại trong c99 phải trả về 0.
simon

11
Đó là một chỉ thị của trình biên dịch. Ví dụ, nếu nó được biên dịch trên hệ thống Windows và chạy trên hệ thống Linux, nó sẽ vẫn trả về 1.
Micheal Johnson

4
@MichealJohnson không. Tôi có thể biên dịch nó trên linux (sử dụng mingw32gcc msvc) để nhận mã trả về true khi chạy trên windows. Tôi không biết bất kỳ trình biên dịch linux lưu trữ windows. nếu bạn muốn tranh luận các lớp mô phỏng như "rượu vang" thì tất cả các câu trả lời khác có thể gặp phải vấn đề tương tự
Jasen

1
Không chắc chắn nếu WIN32 chỉ được xác định, nhưng được xác định khác không. Nếu đó là trường hợp sau, bạn chỉ có thể nói #if WIN32. Trên các cửa sổ không phải là cửa sổ, vì WIN32 không được xác định, nên bộ tiền xử lý được coi là 0.
Shahbaz

27

PHP, 22 byte

`<?=PATH_SEPARATOR>":";`  

in 1nếu dấu phân cách đường dẫn là dấu chấm phẩy (dấu hai chấm hoặc trống cho tất cả các hệ điều hành khác ngoại trừ DOS và OS / 2), không có gì khác.

cũng 22 byte , nhưng không an toàn:

<?=strpos(__FILE__,92);

in một số nguyên dương nếu đường dẫn tệp chứa dấu gạch chéo ngược; không có gì khác
Một thay thế an toàn với 27 byte : <?=DIRECTORY_SEPARATOR>"/";in 1hoặc không có gì.

Một phát hiện lạ : <?=__FILE__[1]==":";( 20 byte ) nên, cũng không an toàn, nhưng ok. Nhưng mặc dù __FILE__giả vờ là một chuỗi (tôi đã thử var_dumpgettype), lập chỉ mục nó sẽ gây ra lỗi, trừ khi bạn sao chép nó ở một nơi khác (nối cũng hoạt động) hoặc sử dụng nó làm tham số hàm.

Chỉnh sửa:
<?=(__FILE__)[1]==":";(cũng 22 byte ) hoạt động trong PHP 7; nhưng đó là vì các dấu ngoặc đơn sao chép giá trị không đổi trong một biến tạm thời.

27 byte : <?=stripos(PHP_OS,win)===0;
kiểm tra nếu PHP_OShằng số được xác định trước bắt đầu bằng win(không phân biệt chữ hoa chữ thường; Windows, WIN32, WINNT, nhưng không phải CYGWIN hoặc Darwin); in 1cho Windows, không có gì khác.

17/18 byte :

<?=strlen("
")-1;

in 1nếu nó được lưu trữ với Windows linebreak (cũng trên DOS, OS / 2 và Atari TOS - mặc dù tôi nghi ngờ rằng bất kỳ ai đã từng biên dịch PHP cho TOS), khác 0.

Bạn cũng có thể kiểm tra hằng số PHP_EOL.

lựa chọn khác:

PHP_SHLIB_SUFFIXdlltrên Windows, nhưng không nhất thiết chỉ có ở đó.
php_uname()trả về thông tin trên hệ điều hành và hơn thế nữa; bắt đầu với WindowsWindows.
$_SERVER['HTTP_USER_AGENT']sẽ chứa Windowskhi được gọi trong trình duyệt trên Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 byte) hoạt động trong PHP> = 5.3

phần kết luận

Cách duy nhất không an toàn để biết nếu nó thực sự là Windows, không phải bất cứ thứ gì trông giống như vậy, dường như là một kiểm tra về tên hệ điều hành. Đối với PHP: php_os()có thể bị vô hiệu hóa vì lý do bảo mật; nhưng PHP_OScó lẽ sẽ luôn chứa thông tin mong muốn


4
Tên tệp trên * nix có thể chứa dấu gạch chéo ngược, vì vậy điều này không thực sự dễ hiểu. Tuy nhiên, các quy tắc không nói rằng nó phải hoàn hảo, vì vậy, \ _ (ツ) _ / ¯
Jordan

@Jordan: Bạn rất đúng. Tôi đã thêm thông tin đó vào mô tả. Cảm ơn.
Tít

4
Một thay thế : <?=class_exists(COM);. Lớp học COMchỉ có sẵn trong Windows, theo như tôi biết. Điều đó sẽ giúp bạn tiết kiệm một byte.
Ismael Miguel

@IsmaelMiguel Đó là một câu trả lời khác nhau để bạn đăng nó như vậy. (Tuy nhiên, nó có thể không đáng để làm như vậy; câu trả lời này được viết rất tốt.)
wizzwizz4

1
@ wizzwizz4 Không đáng đâu. Câu trả lời sẽ bị đẩy vào quên lãng. Đó là lý do tại sao tôi chỉ để lại bình luận, thay vì viết câu trả lời của riêng tôi.
Ismael Miguel

16

Befunge-98, 7 byte

6y2%!.@

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

Điều này hoạt động bằng cách truy vấn trình phân tách đường dẫn hệ thống, \trên Windows và /trên các hệ điều hành khác.

6y            System information query: #6 returns the path separator.
  2%          Test the low bit - this will be 1 for '/' and 0 for '\'.
    !         Not the value, so it becomes 0 for '/' and 1 for '\'.   
     .@       Output the result and exit.

15

Toán học, 28 byte

$OperatingSystem=="Windows"&

Điểm quan trọng trong việc biến nó thành một chức năng là gì? Bạn có thể loại bỏ các ký hiệu và lưu một byte và mã sẽ chỉ trực tiếp đánh giá xem nó có được thực hiện trên hệ thống Windows không.
Ruslan

@Ruslan Tất cả các câu trả lời phải là chương trình đầy đủ in kết quả hoặc hàm có thể gọi được. Nếu đây được tuyên bố là câu trả lời của Mathicala, thì bạn có thể thoát khỏi việc gọi nó là một chương trình đầy đủ, nhưng nếu tôi gọi điều đó từ dòng lệnh mà không có &, thì nó sẽ không in bất cứ điều gì (và đó cũng không phải là chức năng có thể gọi được , nhưng chỉ đơn thuần là một đoạn / biểu thức).
Martin Ender

@MartinEnder Thực sự không có đầu ra? Tôi nhận được Out[1]= Falseđầu ra từ đây:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan

@Ruslan Tôi tin rằng cũng bắt đầu một môi trường máy tính xách tay (chỉ là một môi trường dựa trên dòng lệnh). Ý tôi là bằng cách chạy một chương trình từ dòng lệnh đang sử dụng chế độ tập lệnh.
Martin Ender

13

Java 8, 33 byte

Đặc biệt cảm ơn Olivier Grégoire đã gợi ý separatorCharvà Kritixi Lithos cho -1 byte!

Đây là một biểu thức lambda trả về một boolean. Điều này có thể được chỉ định Supplier<Boolean> f = ...;và được gọi với f.get().

()->java.io.File.separatorChar>90

Hãy thử trực tuyến! - máy chủ không phải là windows, vì vậy bản in nàyfalse. Tuy nhiên, trong máy windows của tôi, cùng một mã intrue.

Những gì mã này làm là lấy bộ tách tệp của Hệ thống và kiểm tra xem mã của nó có lớn hơn ký tự không [. Điều này đúng với Windows, vì nó sử dụng \như bộ tách rời - nhưng mọi hệ điều hành khác đều sử dụng /, có mã thấp hơn trong bảng ASCII.


Điều này sẽ không phá vỡ trên các hệ điều hành khác bắt đầu với W?
Hạ cấp

()->java.io.File.separatorChar=='\\'chỉ có 36 byte.
Olivier Grégoire

1
@ OlivierGrégoire một cái hay - và tôi có thể đánh nó tới 34 bằng cách sử dụng ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, Whonix. Có lẽ còn hơn thế nữa.
Olivier Grégoire

3
@Titus Chờ đã, còn WAITS thì sao?
NoOneIsHãy

11

J, 7 byte

6=9!:12

Đây là một động từ (tương tự như một hàm) sử dụng kết hợp ngoại ngữ dựng sẵn 9!:12để có được loại hệ thống trong đó 5 là Unix và 6 là Windows32.


J Tài liệu chính thức cho thấy nó trả về giá trị này cho Windows cũ. "6 Windows32 (95/98/2000 / NT)" Tài liệu có cần được cập nhật không? Điều gì xảy ra khi nó là Windows 64 bit? jsoftware.com/help/dipedia/dx009.htm
Keeta

Đã thử nghiệm trên Windows 7 64 bit và nó trả về 6. Tài liệu dường như khá cũ.
Keeta

@Keeta Có tôi nghĩ nó đã cũ nhưng nó vẫn trả về 6 cho tôi trên Windows 10 64 bit.
dặm

11

R, 15 byte

.Platform$O>"v"

Cảm ơn plannapus cho đề xuất sử dụng kết hợp một phần để trích xuất phần tử danh sách.

.Pl Platform là một danh sách với một số chi tiết về nền tảng mà R được xây dựng. Có một phần tử OS.type( phần tử duy nhất có tên bắt đầu bằng "O") là chuỗi ký tự, cung cấp cho Hệ điều hành (họ) của máy tính. Một trong "unix"hoặc "windows".

Như vậy "unix"là ít hơn "v", nhưng "windows"sau đó là lớn hơn "v". Các câu trả lời 15 byte hợp lệ khác là

.Platform$O>"V"
.Platform$O>"w"
.Platform$O>"W"

R đang được phát triển cho các hệ điều hành giống như Unix, Windows và Mac . Các họ hệ điều hành khác không được hỗ trợ.


1
có những nền tảng khác ngoài unix mà không phải là cửa sổ mà bạn biết ...
Blue

2
@muddyfish: .Pl platform [[1]] được định nghĩa là "unix" hoặc "windows" trong tài liệu R. github.com/wch/r-source/blob/
Mạnh

Xin lỗi, vậy là được rồi. Câu trả lời có lẽ nên được sửa đổi để bao gồm thực tế này để ngăn chặn việc được hỏi lại
Blue

10

Perl, 11 byte

print$^O=~MS

^O nên được thay thế bằng Control-O theo nghĩa đen.

Đầu ra 1trên windows, không có gì trên hệ điều hành khác.

Lưu ý rằng tôi không sử dụng sayvì nó thêm một dòng mới, đó là sự thật trong Perl.

-2 byte nhờ vào primo. (và các sự cố tiềm ẩn đã được sửa)
-1 byte nhờ ais523.


AFAIR này sẽ không hoạt động trong Cygwin Perl.
Igor Skochinsky

Điều này sẽ không hoạt động trong mingw Perl. Mặc dù vậy, Perl coi cả hai là hệ điều hành khác biệt với Windows (vì chúng thường tuân theo UNIX chứ không phải là quy ước của Windows), và không rõ liệu chúng có nên được tính cho mục đích của câu hỏi hay không. Trong các tin tức khác, bạn có thể lưu một byte ở đây bằng cách sử dụng ký tự control-O theo nghĩa đen chứ không phải ^O.

@ ais523 Tôi đã chỉnh sửa nó, cảm ơn. Đối với Cygwin và Mingw, tôi sẽ xóa bài đăng nếu chúng được coi là Windows, nhưng như bạn nói, sẽ có ý nghĩa hơn khi xem chúng như hệ điều hành riêng biệt (hoặc ít nhất, giống như không phải hệ điều hành Windows).
Dada

Regex delimiter không cần thiết $^O=~W, mặc dù, tôi có thể sẽ phù hợp với MS. Ngoài ra, bạn cũng có thể phù hợp $^X=~':'.
primo

@primo đúng rồi, cảm ơn. Tôi không biết bất kỳ hệ điều hành nào khác có Wtrong đó vì vậy tôi giả sử kiểm tra xem có Wbị phạt không .. lý do nào khiến bạn đề xuất MSthay thế?
Dada

9

julia, 10 byte

is_windows

Một hàm trả về true cho windows


9

mã máy x86, 9 byte

40 39 04 24 75 02 CD 80 C3

Tổng hợp từ:

inc eax        ; set eax to 1
cmp [esp], eax ; check if [esp] == 1 (linux)
jne windows    ; jump over "int 0x80" if on windows
int 0x80       ; exit with exit code 0 (ebx)
windows:
ret            ; exit with exit code 1 (eax)

3
nhị phân thuần túy (COM) sẽ không chạy trên Windows hoặc Linux nên không chắc điều này có hợp lệ hay không
Igor Skochinsky

@IgorSkochinsky Phải có người phiên dịch để lắp ráp.
Shmuel H.

Bạn có thể làm cho mã thậm chí ngắn hơn bằng cách chỉ để lại inc eaxint 0x80, tôi nghĩ rằng nó sẽ thất bại trên các cửa sổ và chấm dứt quá trình.
Shmuel H.

2
@IgorSkochinsky Có những chương trình cũng chạy nhị phân thô. Xem liên kết trong bình luận trước của tôi.
Shmuel H.

1
Bochs và QEMU mô phỏng môi trường kim loại trần và không chạy mã nhị phân trong HĐH máy chủ. Vì vậy, họ sẽ không làm việc IMO. Nhưng tất cả điều này có thể là một cuộc thảo luận cho meta.
Igor Skochinsky

8

JavaScript, 42 30 26 25 byte

console.log((
//Begin
_=>navigator.oscpu[0]>'V'
//End
)())

Đã thử nghiệm với Firefox. (Chrome không có thuộc oscputính.) Vì các chữ cái viết thường có mã ký tự cao hơn chữ in hoa, điều này phụ thuộc vào chữ cái đầu tiên navigator.oscpulà chữ hoa và không phải là W , X , Y hoặc Z trên bất kỳ nền tảng nào mà Firefox hỗ trợ (trừ Windows, tất nhiên). Theo bài đăng này , đó là trường hợp.

Chỉnh sửa

  1. Đã lưu 12 byte nhờ Neil .
  2. Đã lưu bốn byte khác
  3. Đã lưu một byte khác nhờ Blender .

oscpucó lẽ là navigatortài sản ngắn nhất mà bạn có thể sử dụng. Ngoài ra, việc kiểm tra một biểu thức chính quy có thể sẽ có kết quả ngắn hơn, nhưng tôi chưa đo được.
Neil

Bạn có thể loại bỏ !=-1và thêm một ~quyền sau mũi tên béo, tiết kiệm 3 byte.
Lu-ca

Bạn có phải tạo một chức năng? Bạn có thể chỉ console.logkiểm tra regex không? Cũng sẽ navigator.oscpu[0]=='W'hoạt động hoặc có một hệ điều hành khác cũng bắt đầu với W.

2
Hmm, vì một số lý do, Chrome của tôi không có oscpu.
Muzer

2
navigator.oscpu>'V'cũng có thể hoạt động tốt
Blender

8

C #, 61 48 byte

()=>(int)System.Environment.OSVersion.Platform<4

Đã lưu 13 byte nhờ TheLethalCoder

Hoặc một chương trình đầy đủ ở 83 byte:

class P{static int Main(){return(int)System.Environment.OSVersion.Platform<4?1:0;}}

Các biến thể Windows khác nhau sử dụng giá trị enum từ 0 đến 3 trong triển khai Microsoft .NET . 4 là Unix, 5 là Xbox [360] (mà tôi sẽ không coi là "Windows"), 6 là MacOSX. Mono sử dụng các giá trị tương tự , thêm 128 cho Unix / Linux trong các phiên bản trước.

Do đó, mọi thứ <4 là Windows và mọi thứ khác không phải là Windows.


2
Không chắc chắn nếu tôi thiếu một cái gì đó, nhưng tại sao bạn lại truyền giá trị cho một int?
auhmaan

@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- về cơ bản, quy tắc đánh máy của C # nói rằng tôi không thể so sánh trực tiếp với a PlatformIDintkhông có diễn viên ngầm nào từ PlatformIDđến int. Nhưng có một rõ ràng khuôn đúc ra khỏi tất cả sự đếm đến giá trị của họ, mà tôi tận dụng ở đây ...
Bob

1
@ MustafaAKTAŞ Ngoài ra, tôi phải chỉ ra rằng điều này đang nhắm mục tiêu C # /. NET Framework / .NET Core. Trên Xbox One, chỉ có thể chạy các ứng dụng UWP, sử dụng một API khác không bao gồm System.Environment.OSVersiontất cả . Nếu bạn sẽ gặp vấn đề với điều đó, thì bạn cũng nên xóa mọi câu trả lời không thuộc UWP khác. Nó cũng chỉ ra rằng bạn (hiện tại) không thể chạy các ứng dụng UWP trên các nền tảng không phải Windows, vì vậy bạn cũng có thể xóa tất cả những ứng dụng đó. Điều này khiến bạn có 0 câu trả lời và một câu hỏi không thể trả lời.
Bob

1
Bạn có thể biên dịch thành Action<bool>ví dụ đầu tiên cho 48 byte (Tôi chưa kiểm tra nhưng tin rằng nó sẽ hoạt động) Mặc dù vậy, _=>(int)System.Environment.OSVersion.Platform<4;nó có thể cần đến ()=>...49 byte
TheLethalCoder

1
Biên dịch thành các hàm ẩn danh như Funcs và Actions được sử dụng mọi lúc tại đây. Tôi tin rằng nó trong trang mẹo chơi golf và tôi sử dụng chúng gần như mọi lúc. Ngoài ra các chức năng ẩn danh được sử dụng trong các ngôn ngữ khác rất nhiều vì vậy tôi nghĩ an toàn khi sử dụng chúng ở đây
TheLethalCoder

7

Mẻ, 50 byte

@if %OS%==Windows_NT if not exist Z:\bin\sh echo 1

Chỉnh sửa: Đã sửa lỗi bỏ qua DOS thay vì cho rằng đó là Windows.

Cách khác duy nhất tôi biết để chạy Batch bên ngoài Windows là sử dụng WINE mà theo mặc định sẽ ánh xạ Z:tới /. Do đó, nếu Z:\bin\shcó, rất có thể là /bin/shvậy, không phải MS Windows.

Tôi không biết WINE đặt% OS% thành gì, nhưng nếu không Windows_NTthì tôi có thể tiết kiệm 23 byte.


1
Một cách khác là DOS, không phải Windows.
Ruslan

Điều này không chỉ thất bại trong DOS, mà còn trên máy tính có Z: được ánh xạ và có chứa đường dẫn như vậy.
Adám

1
Ít nhất là tôi đang cố gắng phát hiện RƯỢU. Không có câu trả lời nào khác sẽ cho kết quả chính xác khi chạy trong RƯỢU.
Neil

3
@ Adám Chắc chắn và nếu bạn biên dịch câu trả lời C với -DWIN32 = 1 thì nó cũng thất bại. Điểm của bạn?
Neil

1
vâng, bộ rượu vangOS=Windows_NT
Jasen

7

QBasic, 31 byte

?INSTR(ENVIRON$("COMSPEC"),"W")

In khác không trong Windows, 0 dưới mọi thứ khác.

COMSPEClà một biến môi trường duy nhất cho hệ điều hành Microsoft. Nó trỏ đến trình thông dịch lệnh, thường command.comhoặc cmd.exe. Trong Windows, trình thông dịch lệnh nằm ở đâu đó trong thư mục Windows; trong MS-DOS, nó nằm trong thư mục DOS hoặc trên thư mục gốc của đĩa và dưới bất kỳ HĐH nào khác, nó không tồn tại.

Bằng cách kiểm tra xem giá trị của COMSPECcó chứa "W" hay không, chúng ta có thể biết sự khác biệt giữa Windows và không phải Windows.


COMSPECkhông dành riêng cho bất cứ điều gì cụ thể trong Linux (có nghĩa là nó nằm dưới sự kiểm soát của người dùng theo mặc định), do đó, người dùng không thể đặt nó thành một giá trị mà họ đang sử dụng cho mục đích riêng của họ (và tình cờ có chứa một W)? Phải thừa nhận rằng đó là một chút của một trường hợp cạnh.

1
@ ais523: Ngoài ra, thư mục Windows không phải chứa W. Nó dễ vỡ trong cả hai trường hợp.
Joey

7

Node.js, 27 16 15 13 byte

Cảm ơn @Patrick , người đã loại bỏ 12 byte khỏi giải pháp của tôi bằng REPL của Node:

_=>os.EOL>`
`

Giải pháp ban đầu:

_=>require('path').sep!='/'

Nếu bạn thay đổi điều này thành Node.js REPL, bạn có thể lưu 16 byte chỉ bằng cách sử dụng_=>path.sep!='/'
Patrick Roberts

Tôi mới biết đến codegolf. Tôi có được phép làm điều đó không?
GilZ

Vâng, nếu không tôi sẽ không đề nghị nó. REPL có nghĩa là đọc, thực thi, in vòng lặp, chương trình chạy khi bạn nhập nodetrên bàn điều khiển. Từ đó, tất cả các mô-đun nút hệ thống có sẵn mà không cần đến require()chúng.
Patrick Roberts

Ồ vâng xin lỗi. Tôi có nghĩa là 11. Bạn có thể lưu byte khác bằng cách thay đổi !=để >kể từ khi chỉ số ASCII cho \ là 92 và /là 47.
Patrick Roberts

7

VBA Excel, 41 40 30 29 26 24 byte

Chức năng cửa sổ ngay lập tức trả về truenếu mã hệ điều hành của hệ thống khởi động dài hơn độ dài 3, vì thông tin bị hạn chế ở đầu ra machoặc pcdosđiều này truechỉ trả về trên các cửa sổ máy tính

?[Len(Info("SYSTEM"))>3]

Những phiên bản trước

''# Ignore the second `"` that follows every `\` - its only there for highlighting 

?Left(Environ("OS"),1)="W"                 # 24 Bytes

?InStr(ThisWorkbook.Path,"\"")             # 29 Bytes

?Mid(ThisWorkbook.Path,3,1)="\""           # 30 Bytes, Restricted to local Files

?Application.PathSeparator="\""            # 30 Bytes

?Left(Application.OperatingSystem,1)="W"   # 40 Bytes

Thay đổi

-1 Cảm ơn Neil đã sử dụng Left(...,1)hơnMid(...,1,1)

-10 Cảm ơn ChrisH đã chỉ ra Thủ thuật phân tách đường dẫn của @ Mego

-1 Ví Kiểm tra WorkbookPathcho "\" hơn là sử dụngApplication.Path Separator

-4 Để chuyển sang Environ()

-2 Để chuyển sang [Len(Info(...

Giải pháp mới, 51 byte

subThói quen tiểu thuyết xuất ra, đến cửa sổ VBE ngay lập tức, 1 (truthy)dưới cửa sổ và 0 (falsey)dưới mac theo phương pháp biên dịch có điều kiện.

Sub a
i=1
#If Mac Then
i=0
#End If
Debug.?i
End Sub

1
leftgiúp bạn tiết kiệm một byte.
Neil

Bạn đã thử nó trên office365 trực tuyến chưa? Điều đó thậm chí còn hỗ trợ VBA? Chỉ tò mò thôi.
Chris H

@ChrisH Theo hiểu biết của tôi office.com không hỗ trợ kịch bản VBA trực tuyến (mặc dù nếu có ai biết rõ hơn xin vui lòng cho tôi biết, điều đó sẽ làm cho cuộc sống của tôi dễ dàng hơn đáng kể); Tuy nhiên, với O365, bạn có quyền tải xuống một bản sao Office 2016 (hoặc bất cứ thứ gì hiện tại) vào máy tính để bàn của bạn và điều đó hỗ trợ kịch bản VBA.
Taylor Scott

Cho đến nay tôi đã xoay sở để tránh nó; đưa ra nhận xét của bạn có vẻ như sẽ tiếp tục (các máy windows duy nhất tôi sử dụng có bản sao văn phòng trên máy tính, máy cá nhân đều là linux)
Chris H

1
Thủ thuật phân tách đường dẫn của @ Mego ( ?Application.PathSeparator)="\"sẽ là 32 vì nó là một char duy nhất)
Chris H

6

Perl 6 ,  19  18 byte

put $*DISTRO.is-win
put ?($*CWD~~/\\/)

Cả hai đầu ra True␤hoặc False␤tùy thuộc vào hệ thống mà nó được chạy.


cái thứ hai dựa trên các giá trị không phải cửa sổ của CWD không chứa bất kỳ `` nào - không có gì đảm bảo điều đó,
Jasen

5

APL (Dyalog) , 21 byte

'W'∊∊#⎕WG'APLVersion'

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

#⎕WG'APLVersion' Root ( # ) W indow G et property Phiên bản APL

 tranh thủ (làm phẳng)

'W'∊ là W là thành viên? (không có giá trị trả về không phải của Windows có chứa vốn W)


4

tcl, 38 byte

 expr [lsearch $tcl_platform windows]>0

4

PHP 17 byte

Sau đây sẽ xuất 1 nếu windows và không có gì nếu có gì khác. Bỏ qua các thông báo về sự hội tụ chuỗi.

<?=PHP_OS==WINNT;

Hãy thử trực tuyến các bài kiểm tra trực tuyến cho linux vì hộp cát là linux cho PoC.


Chắc chắn là đủ? Hỏi vì các giá trị có thể có cho: PHP_OS .
manatwork

1
'<? = PHP_OS [0] == W; `ngắn hơn 1 byte và bắt tất cả các giá trị cửa sổ khác trong câu hỏi được liên kết bởi manatwork. >Vcũng có thể làm việc
dùng59178

Thao tác phụ thuộc vào phiên bản Windows mà PHP đã được biên dịch, vì Windows Visa \ 7, phiên bản Windows đã được đại diện với WINNT vì Hạt nhân NT. trước Windows XP trở xuống là WIN32 và máy chủ Windows 2003 là Windows.
DrWhat

4

Java 8, 49 byte

()->System.getenv().get("OS").contains("Windows")

Dài hơn câu trả lời Java khác , nhưng có một cách tiếp cận khác.

Lambda này phù hợp với một Supplier<Boolean>và có thể được thử nghiệm với chương trình sau đây:

public class DetectMSWindows {

  public static void main(String[] args) {
    System.out.println(f(() -> System.getenv().get("OS").contains("Windows")));
  }

  private static boolean f(java.util.function.Supplier<Boolean> s) {
    return s.get();
  }

}

Nó rất, rất giống với câu trả lời ban đầu mà bạn liên kết (trước khi chỉnh sửa).
Olivier Grégoire

Tại sao không chỉ .contains("W")?
Cyoce

@Cyoce thực sự, hệ điều hành biến có vẻ là dành riêng cho Windows.

4

Haskell, 39 31 byte

import System.Info
f=os!!0=='m'

Tôi kiểm tra đầu ra chữ cái đầu tiên của "m", đó là "mingw" cho các cửa sổ. Theo như tôi có thể nói, không có hệ điều hành nào khác bắt đầu bằng M. Thông tin đến từ https://github.com/ghc/ghc/blob/master/compiler/utils/Pl platform.hs


1
Trên hệ thống của tôi (Windows 10 64 bit, GHC 8.0.1 64 bit), ossẽ cung cấp "mingw32".
Mego

@Mego bạn đã đúng, đã sửa lỗi cho điều đó
Dylan Meeus

4

bash + coreutils, 5 byte

rm $0

Cũng hoạt động trong hầu hết các vỏ POSIXy khác. (Lưu ý rằng các cổng Windows tồn tại bashrmmặc dù chúng thường chỉ được sử dụng với các hệ điều hành POSIXy nặng nề hơn, nhưng đây không phải là một mục hoàn toàn trống.) Đầu ra thông qua mã thoát (0 = false, 1 = true). Có thể được tính là 4 byte nếu bạn được phép giả sử tên tệp (ví dụ rm a). Lưu ý rằng điều này có khả năng thất bại trong trường hợp tên tệp rất kỳ lạ ( rmsẽ diễn giải thành đối số do thiếu trích dẫn và có thể xóa các tệp bạn quan tâm, vì vậy tôi khuyên bạn không nên chạy chương trình này từ một tệp có tên lạ ).

Lưu ý: xóa chương trình khỏi đĩa dưới dạng tác dụng phụ hoặc ít nhất là cố gắng. Trong trường hợp chúng tôi đang chạy trên Windows, HĐH sẽ không xóa tệp đang chạy (một thao tác mà Windows không tuân theo mặc định hoặc dừng hoàn toàn) và do đó rmsẽ xảy ra lỗi. bashbắt lỗi và chuyển đổi nó thành một mã thoát (do đó toàn bộ chương trình chấm dứt bình thường). Hầu hết các mục khác ở đây đang sử dụng 0 cho falsey và 1 cho sự thật trong mã thoát, vì vậy điều này cũng tương tự; lưu ý rằng bash's iftuyên bố không chấp nhận số nguyên ở tất cả (đúng hơn, nó chấp nhận lệnh , ngành dựa trên việc họ chạy thành công, và kiểm tra số học được thực hiện thông qua các phương tiện của các chương trình nhưtestđã cố tình báo cáo "sự cố" khi so sánh không thành công), vì vậy đây là vấn đề về tính hợp pháp so với các chương trình xuất qua mã thoát trong các ngôn ngữ trong đó 0 là hợp lệ trong ifkiểm tra câu lệnh và gửi chương trình đến elsechi nhánh.


4

8 , 11 byte

 
os 1- not .
 

In truetrên Windows, falsetrên Linux và macOS. Các nền tảng khác được hỗ trợ bởi 8 là Android, iOS và Raspberry Pi, nhưng tôi không thể thử nghiệm chúng.

Phiên bản Ungolfed (có ý kiến)

 
G:os  \ Return a number n indicating the operating system 
      \ 0 for Linux
      \ 1 for Windows 
      \ 2 for macOS
      \ 3 for Android 
      \ 4 for iOS 
      \ 5 for Raspberry Pi
n:1-  \ Subtract 1
G:not \ If Windows --> true, otherwise --> false
.     \ Print result
 

4

Python 3 (13 byte)

import winreg

Trả về với mã thoát bằng 0 (thường là đúng trong shell) nếu trên windows và với mã thoát khác không.

Nếu bạn thích nó theo cách khác, có một giải pháp 12 byte : import posix.


Tôi nghĩ rằng điều này sẽ không hoạt động nếu có một tập tin được gọi winreg.pytrong cùng một thư mục.
Zacharý

1
Ngoài ra, theo các quy tắc: "Mã không chạy / biên dịch trên nền tảng không được tính là giá trị falsey."
Zacharý

4

TrumpScript , 17 byte

America is great.

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


Chương trình này, nếu chạy trên windows, sẽ in:

The big problem this country has is being PC

Đây được coi là một giá trị trung thực.


Đầu ra trống và giá trị sau là sai lệch:

Boycott all Apple products  until such time as Apple gives cellphone info to authorities regarding radical Islamic terrorist couple from Cal

Đầu ra trống sẽ xảy ra trên bất kỳ hệ thống linux nào (đối với chương trình này), phản hồi táo dài rõ ràng xảy ra trên Mac (đối với bất kỳ chương trình nào). Trên TIO, phần phụ trợ (tôi giả sử) là một hệ điều hành Unix, vì vậy bạn chỉ có thể nhận được giá trị giả; trên máy tính của tôi, tôi nhận được tin nhắn PC.


Không chắc chắn 100% nếu điều này được tính là một thông báo lỗi (sẽ làm mất hiệu lực câu trả lời), nhưng nếu bạn không biết về điều này thì có lẽ đáng để bạn cười.


Thế giới đã đến với điều gì ...
ooransoy

@avaragecoder KIẾM PYTHON TUYỆT VỜI!
Bạch tuộc ma thuật Urn
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.