Deteksi MS Windows


80

Tantangan

Buat program yang mengembalikan nilai kebenaran ketika dijalankan di Microsoft Windows (untuk kesederhanaan kami akan tetap menggunakan Windows 7, 8.1 dan 10) dan nilai falsey ketika dijalankan pada sistem operasi lain (OSX, FreeBSD, Linux).

Aturan

  • Kode yang gagal dijalankan / dikompilasi pada platform tidak dihitung sebagai nilai falsey.

Kriteria menang

Saya memberi label ini sebagai , sehingga skor terendah menang, tetapi saya juga sangat tertarik melihat solusi kreatif untuk masalah ini.


7
Bisakah program mengeluarkan dengan kode keluar? ( biasanya diizinkan )
FlipTack

13
Bisakah Anda memberikan daftar yang pasti tentang sistem operasi mana yang perlu dikerjakan?
FlipTack

2
Apa yang seharusnya hasilnya di bawah Windows RT?
Adm

6
Anda mungkin ingin menentukan beberapa sistem non-Windows spesifik yang harus didukung. Ada beberapa perdebatan dalam komentar tentang hal-hal seperti DOS dan OS2.
jpmc26

2
Kita mungkin membutuhkan konsensus tentang apa yang dianggap sebagai kebenaran dan kesalahan untuk kode keluar; konvensi normal adalah 0 untuk true dan lainnya untuk false, tetapi banyak jawaban memperlakukannya sebagai kebalikan, dan definisi "jika pernyataan" jelas tidak berlaku.

Jawaban:


77

Vim, 2 byte

<C-a>1

Di Windows, <C-a>(ctrl + a) dipetakan secara default ke Select All. Jika Anda mengetik a 1dalam mode pilih di Windows, itu menggantikan pilihan dengan apa yang Anda ketikkan (1) meninggalkan 1 di buffer.

Pada sistem operasi lain, <C-a>secara default dipetakan ke Increment number. Karena tidak ada angka untuk ditambahkan, itu adalah no-op, dan kemudian 1 meningkatkan jumlah tetapi dalam hal buffer adalah no-op.

1 benar di Vim, dan string kosong adalah palsu


Sepertinya 3 penekanan tombol. Ctrl + a + 1
Pavel

12
Saya pikir per posting meta ini meta.codegolf.stackexchange.com/questions/8995/... Jawaban Vim umumnya diberi skor tanpa pengubah (terutama mengingat bahwa jawaban pertama pada posting menggunakan <ctrl + a> sebagai contoh untuk 1 byte)
nmjcman101

4
@Pavel itu Ctrl + a, 1. Jika itu Ctrl + a + 1akan dihitung sebagai 1 keystroke.
Kapten Man

7
Cantik, saya suka jawaban ini!
DJMcMayhem

Itu agak elegan, saya suka itu.
Dan

109

MATLAB, 4 byte

ispc

Dari dokumentasi :

tf = ispcmengembalikan logis 1 (benar) jika versi perangkat lunak MATLAB® untuk platform Microsoft® Windows®. Kalau tidak, ia mengembalikan logis 0 (salah).

Ada juga fungsi ismacdan isunix. Saya akan menyerahkannya kepada pembaca untuk mencari tahu apa fungsi-fungsi itu lakukan. Mego meminta diagram menjelaskan ismacdan isunixjadi saya sudah mencoba untuk menggambarkannya di sini:

masukkan deskripsi gambar di sini

Itu tidak diminta untuk diagram ispctetapi saya dapat mengungkapkan bahwa perilakunya sangat mirip, kecuali pengganti OSXdan Unixdengan Windows.


Pendekatan kedua:

Inilah pendekatan kedua dengan getenvmenggunakan 23 byte yang seharusnya menjadi bukti, kecuali ada sistem operasi lain yang dimulai dengan W:

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

getenv 'name'mencari daftar lingkungan sistem operasi yang mendasari untuk teks formulir name=value, di mana namevektor karakter input. Jika ditemukan, MATLAB® mengembalikan nilai vektor karakter. Jika nama yang ditentukan tidak dapat ditemukan, matriks kosong dikembalikan.


4
Komentar bukan untuk diskusi panjang; percakapan ini telah dipindahkan ke obrolan .
Dennis

55

Python 2.7.10 , 24 byte

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

Berkat FlipTack selama 3 byte

Program ini memanfaatkan fakta bahwa Windows adalah satu-satunya OS yang digunakan \sebagai pemisah jalur. Biasanya ini membuat frustrasi dan buruk, tetapi untuk sekali ini sebenarnya merupakan keuntungan. Pada Windows, '['>os.sepitu salah, dan karenanya 0/0dihitung, menyebabkan a ZeroDivisionErrordan keluar dengan kode keluar yang tidak nol. Pada platform non-Windows, '['>os.sepbenar, membuat ekspresi 0/1, yang tidak melakukan apa-apa, dan program keluar dengan kode keluar 0.


DOS juga menggunakan backslash sebagai pemisah jalur dan memiliki setidaknya satu implementasi Python 2.
isanae

5
@ isanae Saya sudah mengedit judul untuk menentukan Python 2.7 - satu-satunya implementasi Python 2 pada DOS adalah kuno, buggy 2.4.2
Mego

OS / 2 juga menggunakan backslash dan memiliki implementasi Python 2.7;)
isanae

9
@ isanae Di sana, saya tentukan 2.7.10. Semoga berhasil menemukan pelabuhan itu.
Mego

2
rupanya itu hanya perlu memberikan hasil yang benar pada 3 versi windows terbaru dan agaknya versi terbaru yang sama dari tiga sistem lain yang terdaftar, OS2 dan DOS tidak masalah,
Jasen

45

x86 Assembly, 7 byte (Terinspirasi oleh jawaban Runemoro )

31 DB 89 D8 40 CD 80

Atau

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

Deskripsi

Pertama-tama, kami akan mengatur eaxke 1(nomor panggilan sistem exit(int val)untuk Linux, FreeBSDdan OSX). Kemudian, kita akan memanggil gerbang interupsi 0x80yang merupakan gerbang panggilan sistem Linux, FreeBSDdan OSX. Itu akan menyebabkan program untuk keluar dengan status ebxadalah 0( false).

Pada Windows int 0x80adalah gerbang yang tidak valid (Ini digunakan 2esebagai gerbang syscall) dan akan crash program, menyebabkannya diakhiri dengan kode keluar positif ( true).

Sunting: Tidak akan berfungsi OSXkarena memiliki konvensi penyelesaian argumen yang berbeda pada 32 bit (oleh stack).

Referensi dan bacaan lebih lanjut


3
Itu brilian!
z0rberg's

Mengapa tabrakan memiliki nilai yang sebenarnya? Apakah karena EAX (biasanya nilai pengembalian) adalah 1? Juga, apakah EAX dijamin 0 pada awal program? Atau apakah Anda perlu xor eax, eaxdi sana?
Cole Johnson

3
@ColeJohnson: OS-terdeteksi crash (pada sistem operasi yang biasanya digunakan dengan x86) tidak pernah meninggalkan kode keluar 0, karena itu disediakan untuk penghentian yang sukses. (Biasanya kode keluar adalah nilai miring yang disediakan OS khusus untuk keadaan ini.) Namun, saya tidak yakin masuk akal untuk menghitung 0 sebagai falsey dan 1 sebagai kebenaran dalam kode keluar program, mengingat bahwa konvensi normal adalah kebalikannya (dengan 0 sebagai satu-satunya vaue yang benar, mis. program standar UNIX / Linux / POSIX falsekeluar dengan kode 1 sementara truekeluar dengan kode 0).

1
Jawaban ini secara implisit mengasumsikan bahwa register eaxdan ebxdihapus ke nol pada awal program (pada non-Windows), yang tidak dijamin jika saya ingat dengan benar. Ini juga secara eksplisit mengasumsikan bahwa konvensi pelepasan argumen syscall untuk Linux cocok dengan FreeBSD dan OSX, yang tentunya akan sangat mengejutkan.
zwol

1
@ Sebastian-LaurenţiuPlesciuc Pertanyaan bagus. mov eax, 1akan diterjemahkan \xB8\x01\x00\x00\x00, yang jauh lebih lama dari sekadar memindahkan register dan menelepon inc.
Shmuel H.

29

C, 44 43 38 36 byte

Berkat @Downgoat untuk satu byte! dicoret 44 masih teratur 44
Terima kasih kepada @Neil selama dua byte!

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

Awalnya saya akan menyarankan agar Anda dapat menyimpan banyak byte dengan memindahkan 0keluar ifdefdan mengubah 1ke !, tapi saya pikir _WIN32+0bekerja lebih baik lagi.
Neil

Jika c99 OK Anda dapat mengubah f ke main dan tetap return 1;di dalam ifdef dan menghapus yang lain, karena main tanpa kembali di c99 harus mengembalikan 0.
simon

11
Itu adalah arahan kompiler. Jika itu dikompilasi pada sistem Windows dan berjalan pada sistem Linux, misalnya, ia masih akan mengembalikan 1.
Micheal Johnson

4
@MichealJohnson no. Saya dapat mengkompilasinya di linux (menggunakan mingw32gcc msvc) snd mendapatkan kode yang mengembalikan true ketika dijalankan di windows. Saya tidak tahu ada kompiler linux yang di-host windows. jika Anda ingin berdebat lapisan emulasi seperti "anggur" semua jawaban lain mungkin menderita masalah yang sama
Jasen

1
Tidak yakin apakah WIN32 baru didefinisikan, tetapi didefinisikan sebagai bukan nol. Jika ini masalahnya nanti, Anda bisa mengatakannya #if WIN32. Pada non-windows, karena WIN32 tidak didefinisikan, preprosesor diharuskan untuk memperlakukannya sebagai 0.
Shahbaz

27

PHP, 22 byte

`<?=PATH_SEPARATOR>":";`  

mencetak 1jika pemisah path adalah titik koma (titik dua atau kosong untuk semua OS lain kecuali untuk DOS dan OS / 2), tidak ada yang lain.

juga 22 byte , tetapi tidak aman:

<?=strpos(__FILE__,92);

mencetak bilangan bulat positif jika path file berisi garis miring terbalik; selain itu tidak ada.
Alternatif aman dengan 27 byte : <?=DIRECTORY_SEPARATOR>"/";cetakan 1atau tidak sama sekali.

Temuan aneh : <?=__FILE__[1]==":";( 20 byte ) seharusnya, tidak aman juga, tapi ok. Tetapi meskipun __FILE__berpura-pura menjadi string (saya mencoba var_dumpdan gettype), pengindeksan itu melemparkan kesalahan, kecuali jika Anda menyalinnya di tempat lain (concatenation juga berfungsi) atau menggunakannya sebagai parameter fungsi.

Sunting:
<?=(__FILE__)[1]==":";(juga 22 byte ) berfungsi di PHP 7; tapi itu karena tanda kurung menyalin nilai konstanta ke variabel sementara.

27 byte : <?=stripos(PHP_OS,win)===0;
tes jika PHP_OSkonstanta yang sudah ditentukan dimulai dengan win(case-sensitive; Windows, WIN32, WINNT, tetapi tidak CYGWIN atau Darwin); mencetak 1untuk Windows, tidak ada yang lain.

17/18 byte :

<?=strlen("
")-1;

mencetak 1jika itu disimpan dengan linebreak Windows (juga pada DOS, OS / 2 dan Atari TOS - walaupun saya ragu ada yang mengompilasi PHP untuk TOS), yang lain 0.

Anda juga dapat memeriksa konstanta PHP_EOL.

lebih banyak pilihan:

PHP_SHLIB_SUFFIXada dlldi Windows, tetapi tidak harus hanya di sana.
php_uname()mengembalikan info tentang sistem operasi dan banyak lagi; dimulai dengan Windowsuntuk Windows.
$_SERVER['HTTP_USER_AGENT']akan berisi Windowsketika dipanggil di browser di Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 byte) berfungsi di PHP> = 5.3

kesimpulan

Satu-satunya cara yang gagal untuk mengetahui apakah itu benar-benar Windows, bukan sesuatu yang tampak seperti itu, tampaknya merupakan pemeriksaan pada nama OS. Untuk PHP: php_os()dapat dinonaktifkan karena alasan keamanan; tetapi PHP_OSmungkin akan selalu berisi info yang diinginkan.


4
Nama file di * nix dapat berisi garis miring terbalik, jadi ini tidak benar-benar mudah. Aturannya tidak mengatakan itu harus sangat mudah, jadi ¯ \ _ (ツ) _ / ¯
Jordan

@ Jordan: Kamu benar. Saya menambahkan info itu ke deskripsi. Terima kasih.
Titus

4
Alternatif: <?=class_exists(COM);. Kelas COMini hanya tersedia di bawah Windows, sejauh yang saya tahu. Itu akan menghemat satu byte.
Ismael Miguel

@ IsmaelMiguel Cukup jawaban yang berbeda bagi Anda untuk mempostingnya. (Namun, mungkin tidak layak untuk melakukannya; jawaban ini ditulis dengan sangat baik.)
wizzwizz4

1
@ wizzwizz4 Tidak layak. Jawabannya akan didorong untuk dilupakan. Itu sebabnya saya hanya meninggalkan komentar, alih-alih menuliskan jawaban saya sendiri.
Ismael Miguel

16

Befunge-98, 7 byte

6y2%!.@

Cobalah online!

Ini berfungsi dengan menanyakan pemisah jalur sistem, yang ada \di Windows dan /sistem operasi lainnya.

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

Mathematica, 28 byte

$OperatingSystem=="Windows"&

Apa gunanya menjadikannya fungsi? Anda dapat menghapus ampersand menyimpan satu byte, dan kode hanya akan langsung mengevaluasi apakah itu dijalankan pada sistem Windows-ish.
Ruslan

@Ruslan Semua jawaban harus berupa program lengkap yang mencetak hasil atau fungsi yang dapat dipanggil. Jika ini dinyatakan sebagai jawaban buku catatan Mathematica, maka Anda mungkin bisa menyebutnya program penuh, tetapi jika saya meminta hal itu dari baris perintah tanpa &, itu tidak akan mencetak apa pun (dan itu juga bukan fungsi yang bisa dipanggil) , tetapi hanya cuplikan / ekspresi).
Martin Ender

@ MartinEnder Benarkah tidak ada output? Saya mendapatkan Out[1]= Falsehasil dari ini:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan

@Ruslan Saya percaya itu juga memulai lingkungan notebook (hanya berbasis command-line). Yang saya maksud dengan menjalankan program dari command-line adalah menggunakan mode skrip.
Martin Ender

13

Java 8, 33 byte

Terima kasih khusus kepada Olivier Grégoire untuk sarannya separatorChar, dan Kritixi Lithos untuk -1 byte!

Ini adalah ekspresi lambda yang mengembalikan boolean. Ini dapat ditugaskan Supplier<Boolean> f = ...;dan dipanggil dengan f.get().

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

Cobalah online! - server bukan windows, jadi ini mencetakfalse. Namun, di mesin windows saya, kode yang sama dicetaktrue.

Apa yang dilakukan kode ini adalah mendapatkan pemisah file Sistem, dan memeriksa apakah codepoint-nya lebih besar dari karakter [ . Ini berlaku untuk Windows, karena digunakan \sebagai pemisah - tetapi setiap OS lainnya menggunakan /, yang memiliki kode lebih rendah dalam tabel ASCII.


Tidakkah ini akan pecah pada OS lain yang dimulai dengan W?
Downgoat

()->java.io.File.separatorChar=='\\'hanya 36 byte.
Olivier Grégoire

1
@ OlivierGrégoire bagus - dan saya bisa golf ke 34 menggunakan ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, Whonix. Mungkin bahkan lebih.
Olivier Grégoire

3
@Itus Tunggu, bagaimana dengan TUNGGU ?
NoOneIsHere

11

J, 7 byte

6=9!:12

Ini adalah kata kerja (mirip dengan fungsi) yang menggunakan konjungsi asing bawaan 9!:12untuk mendapatkan jenis sistem di mana 5 adalah Unix dan 6 adalah Windows32.


J Dokumentasi resmi menunjukkannya mengembalikan nilai ini untuk Windows yang lebih lama. "6 Windows32 (95/98/2000 / NT)" Apakah dokumentasi perlu diperbarui? Apa yang terjadi ketika Windows 64 bit? jsoftware.com/help/dictionary/dx009.htm
Keeta

Diuji pada 64 bit Windows 7 dan mengembalikan 6. Dokumentasi tampaknya cukup lama.
Keeta

@ Keeta Ya saya pikir ini sudah tua tapi masih mengembalikan 6 untuk saya di Windows 10 64 bit.
mil

11

R, 15 byte

.Platform$O>"v"

Terima kasih pada plannapus untuk saran untuk menggunakan pencocokan sebagian untuk ekstraksi elemen daftar.

.Platform adalah daftar dengan beberapa perincian platform tempat R dibangun. Ada elemen OS.type(satu-satunya elemen dengan nama yang dimulai dengan "O") yang merupakan karakter string, memberikan Sistem Operasi (keluarga) komputer. Salah satu "unix"atau"windows" .

Jadi "unix"kurang dari itu "v", tetapi "windows"lebih besar dari itu "v". Jawaban 15 byte yang valid lainnya adalah

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

R sedang dikembangkan untuk keluarga sistem operasi Unix-like, Windows dan Mac . Keluarga OS lainnya tidak didukung.


1
ada platform selain unix yang bukan windows lho ...
Blue

2
@muddyfish: .Platform [[1]] didefinisikan sebagai "unix" atau "windows" dalam dokumentasi R. github.com/wch/r-source/blob/...
liori

Maaf, tidak apa-apa kalau begitu. Jawabannya mungkin harus dimodifikasi untuk memasukkan fakta ini untuk menghentikan yang diminta lagi
Biru

10

Perl, 11 byte

print$^O=~MS

^O harus diganti dengan Control-O literal.

Output 1di windows, tidak ada pada OS lain.

Perhatikan bahwa saya tidak menggunakan saykarena menambahkan baris tambahan, yang benar di Perl.

-2 byte berkat primo. (dan memperbaiki masalah potensial)
-1 byte berkat ais523.


AFAIR ini tidak akan berfungsi di Cygwin Perl.
Igor Skochinsky

Ini tidak akan bekerja di mingw Perl. Perl memperlakukan keduanya sebagai sistem operasi yang berbeda dari Windows (karena mereka umumnya lebih mematuhi UNIX daripada konvensi Windows), dan tidak jelas apakah mereka harus menghitung untuk tujuan pertanyaan. Dalam berita lain, Anda dapat menyimpan byte di sini dengan menggunakan karakter kontrol-O literal daripada ^O.

@ ais523 Saya mengeditnya, terima kasih. Adapun Cygwin dan Mingw, saya akan menghapus posting jika mereka harus dianggap sebagai Windows, tetapi seperti yang Anda katakan, akan lebih masuk akal untuk menganggap mereka sebagai OS yang terpisah (atau setidaknya, seperti bukan OS Windows).
Dada

Pembatas Regex seharusnya tidak diperlukan $^O=~W, meskipun, saya mungkin akan cocok MS. Atau, Anda juga bisa mencocokkan $^X=~':'.
Primo

@primo benar, terima kasih. Saya tidak tahu OS lain dengan Wdi dalamnya jadi saya berasumsi memeriksa Wuntuk baik-baik saja .. ada alasan mengapa Anda menyarankan MS?
Dada

9

julia, 10 byte

is_windows

Fungsi yang mengembalikan true untuk windows


9

kode mesin x86, 9 byte

40 39 04 24 75 02 CD 80 C3

Dikompilasi dari:

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
pure binary (COM) tidak akan berjalan di Windows atau Linux jadi tidak yakin apakah ini valid
Igor Skochinsky

@IgorSkochinsky Harus ada juru bahasa untuk perakitan.
Shmuel H.

Anda dapat membuat kode lebih pendek dengan hanya menyisakan inc eaxdan int 0x80, saya pikir itu harus gagal pada windows dan menghentikan proses.
Shmuel H.

2
@IgorSkochinsky Ada beberapa program yang menjalankan raw binary juga. Lihat tautan di komentar saya sebelumnya.
Shmuel H.

1
Bochs dan QEMU mensimulasikan lingkungan bare metal dan tidak menjalankan kode biner di bawah OS host. Jadi mereka tidak akan bekerja IMO. Tapi ini semua bisa menjadi diskusi untuk meta.
Igor Skochinsky

8

JavaScript, 42 30 26 25 byte

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

Diuji dengan Firefox. (Chrome tidak memiliki oscpuproperti.) Karena huruf kecil memiliki kode karakter yang lebih tinggi daripada huruf besar, ini tergantung pada huruf pertama navigator.oscpumenjadi huruf besar dan bukan W , X , Y atau Z pada platform apa pun yang didukung Firefox (selain Windows, tentu saja). Menurut posting ini , itulah masalahnya.

Suntingan

  1. Disimpan 12 byte berkat Neil .
  2. Menyimpan empat byte lagi
  3. Menyimpan byte lain berkat Blender .

oscpumungkin navigatorproperti terpendek yang dapat Anda gunakan. Juga, menguji regexp mungkin akan berhasil lebih pendek, tapi saya belum mengukurnya.
Neil

Anda dapat menghapus !=-1dan menambahkan ~tepat setelah panah lemak, menghemat 3 byte.
Luke

Apakah Anda harus membuat fungsi? Tidak bisakah Anda hanya console.logmelakukan tes regex? Juga akan navigator.oscpu[0]=='W'berfungsi atau apakah ada OS lain yang juga dimulai dengan W.

2
Hmm, entah kenapa Chrome saya tidak punya oscpu.
Muzer

2
navigator.oscpu>'V'mungkin bekerja juga
Blender

8

C #, 61 48 byte

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

Disimpan 13 byte berkat TheLethalCoder

Atau program lengkap dengan 83 byte:

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

Berbagai varian Windows menggunakan nilai enum 0 hingga 3 dalam implementasi Microsoft .NET . 4 adalah Unix, 5 adalah Xbox [360] (yang saya tidak akan menganggap "Windows"), 6 adalah MacOSX. Mono menggunakan nilai yang sama , menambahkan 128 untuk Unix / Linux di versi sebelumnya.

Karenanya, apa pun <4 adalah Windows, dan yang lainnya bukan Windows.


2
Tidak yakin apakah saya melewatkan sesuatu, tetapi mengapa Anda memberikan nilainya ke int?
auhmaan

@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- pada dasarnya, aturan mengetik C # mengatakan saya tidak bisa membandingkan PlatformIDdan intsecara langsung, dan tidak ada pemeran tersirat dari PlatformIDke int. Tapi ada adalah sebuah eksplisit pemain dari seluruh enum nilai-nilai mereka, yang saya mengambil keuntungan dari sini ...
Bob

1
@ MustafaAKTAŞ Juga, saya harus menunjukkan bahwa ini menargetkan C # / .NET Framework / .NET Core. Di Xbox One hanya dimungkinkan untuk menjalankan aplikasi UWP, yang menggunakan API berbeda tidak termasuk System.Environment.OSVersionsama sekali . Jika Anda akan mengambil masalah dengan itu, maka Anda juga harus menghapus setiap jawaban non-UWP lainnya. Juga ternyata Anda tidak dapat (saat ini) menjalankan aplikasi UWP pada platform non-Windows, jadi Anda juga bisa menghapus semua itu. Yang membuat Anda dengan 0 jawaban, dan pertanyaan yang tidak bisa dijawab.
Bob

1
Anda dapat mengkompilasi ke Action<bool>dalam dalam contoh pertama untuk 48 byte (saya belum mengujinya tetapi percaya itu akan berhasil) _=>(int)System.Environment.OSVersion.Platform<4;Mungkin perlu ()=>...untuk 49 byte
TheLethalCoder

1
Kompilasi ke fungsi anonim seperti Funcs dan Actions digunakan sepanjang waktu di sini. Saya percaya itu ada di halaman tips golf dan saya menggunakannya hampir setiap saat. Fungsi anonim juga banyak digunakan dalam bahasa lain, jadi saya pikir aman untuk menggunakannya di sini
TheLethalCoder

7

Batch, 50 byte

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

Sunting: Diperbaiki untuk mengabaikan DOS alih-alih mengklaim itu Windows.

Satu- satunya cara saya tahu menjalankan Batch di luar Windows adalah dengan menggunakan WINE yang secara default akan dipetakan Z:ke /. Karena itu jika Z:\bin\shada, kemungkinannya adalah itu /bin/sh, jadi bukan MS Windows.

Saya tidak tahu apa yang WINE atur% OS%, tetapi jika tidak Windows_NTmaka saya bisa menghemat 23 byte.


1
Cara lain adalah DOS, yang bukan Windows.
Ruslan

Ini tidak hanya gagal di DOS, tetapi juga, di komputer di mana Z: dipetakan, dan kebetulan mengandung jalur seperti itu.
Adm

1
Setidaknya saya mencoba mendeteksi WINE. Tidak ada jawaban lain yang akan memberikan hasil yang benar ketika dijalankan di bawah WINE juga.
Neil

3
@ Adám Tentu dan jika Anda mengkompilasi jawaban C dengan -DWIN32 = 1 maka gagal juga. Poin Anda?
Neil

1
ya, set anggurOS=Windows_NT
Jasen

7

QBasic, 31 byte

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

Mencetak non-nol di bawah Windows, 0 di bawah segalanya.

COMSPECadalah variabel lingkungan yang unik untuk Microsoft OS. Ini menunjuk ke penerjemah perintah, biasanya command.comatau cmd.exe. Di bawah Windows, juru bahasa perintah duduk di suatu tempat di direktori Windows; di bawah MS-DOS, itu duduk di direktori DOS atau di root disk, dan di bawah OS lain, itu tidak ada.

Dengan memeriksa untuk melihat apakah nilai COMSPECmengandung "W", kita dapat mengetahui perbedaan antara Windows dan bukan-Windows.


COMSPECtidak dicadangkan untuk maksud apa pun khususnya di Linux (berarti itu di bawah kendali pengguna secara default), jadi bukankah mungkin pengguna menetapkannya untuk nilai yang mereka gunakan untuk tujuan mereka sendiri (dan kebetulan mengandung W)? Memang, itu sedikit kasus tepi.

1
@ ais523: Juga, direktori Windows tidak harus mengandung W. Ini rapuh dalam kedua kasus.
Joey

7

Node.js, 27 16 15 13 byte

Terima kasih kepada @Patrick , yang mencukur 12 byte dari solusi saya menggunakan REPL Node:

_=>os.EOL>`
`

Solusi asli:

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

Jika Anda mengubah ini menjadi Node.js REPL, Anda dapat menyimpan 16 byte dengan hanya menggunakan_=>path.sep!='/'
Patrick Roberts

Saya baru mengenal codegolf. Apakah saya diizinkan melakukan itu?
GilZ

Ya, kalau tidak saya tidak akan menyarankan itu. REPL berarti membaca, menjalankan, mencetak lingkaran, program yang berjalan saat Anda masuk nodepada konsol. Dari sana, semua modul simpul sistem tersedia tanpa perlu menggunakannya require().
Patrick Roberts

Oh ya maaf. Aku berarti 11. Anda dapat menyimpan byte lain dengan mengubah !=ke >sejak indeks ASCII untuk \ adalah 92 dan /47.
Patrick Roberts

7

Excel VBA, 41 40 30 29 26 24 Bytes

Fungsi windows langsung yang kembali truejika kode OS sistem dimulai lebih panjang dari panjang 3, karena info dibatasi untuk output yang lain macatau pcdosini truehanya kembali pada windows pcs

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

Versi sebelumnya

''# 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

Perubahan

-1 Terima kasih kepada Neil untuk menggunakan Left(...,1) lebihMid(...,1,1)

-10 Terima kasih kepada ChrisH karena menunjukkan Trik Pemisah Jalur @ Mego

-1 Untuk Memeriksa WorkbookPathuntuk"\" daripada menggunakanApplication.Path Separator

-4 Untuk beralih ke Environ()

-2 Untuk beralih ke [Len(Info(...

Solusi Baru, 51 byte

Novel subrutin yang menampilkan, ke VBE jendela segera, 1 (truthy)jendela di 0 (falsey)bawah dan di bawah mac dengan metode kompilasi bersyarat.

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

1
leftmenghemat satu byte.
Neil

Sudahkah Anda mencobanya di office365 online? Apakah itu bahkan mendukung VBA? Hanya penasaran.
Chris H

@ ChrisHe Untuk pengetahuan saya office.com tidak mendukung skrip VBA online (meskipun jika ada orang lain yang lebih tahu tolong beri tahu saya, itu akan membuat hidup saya jauh lebih mudah); Namun, dengan O365 Anda memiliki hak untuk mengunduh salinan Office 2016 (atau apa pun yang saat ini) ke desktop Anda, dan itu mendukung skrip VBA.
Taylor Scott

Sejauh ini saya berhasil menghindarinya; mengingat komentar Anda yang tampaknya akan terus berlanjut (satu-satunya mesin windows yang saya gunakan memiliki salinan desktop kantor, semua mesin pribadi adalah linux)
Chris H

1
@ Trik pemisah jalur Mego ( ?Application.PathSeparator)="\"akan menjadi 32 karena ini adalah char tunggal)
Chris H

6

Perl 6 ,  19  18 byte

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

Baik output True␤atau False␤tergantung pada sistem itu dijalankan.


yang kedua bergantung pada nilai non windows CWD yang tidak mengandung `` - tidak ada jaminan untuk itu,
Jasen

5

APL (Dyalog) , 21 byte

'W'∊∊#⎕WG'APLVersion'

Cobalah online!

#⎕WG'APLVersion' Root ( # ) W indow G et properti APL Versi

 minta (ratakan)

'W'∊ apakah W anggota? (tidak ada nilai pengembalian non-Windows yang mengandung huruf kapital W)


4

tcl, 38 byte

 expr [lsearch $tcl_platform windows]>0

4

PHP 17 Bytes

Berikut ini akan menampilkan 1 jika windows dan tidak ada jika ada yang lain. Mengabaikan pemberitahuan konversi string.

<?=PHP_OS==WINNT;

Coba online tes online untuk linux karena sandbox adalah linux untuk PoC.


Yakin itu cukup? Meminta karena Kemungkinan Nilai Untuk: PHP_OS .
manatwork

1
'<? = PHP_OS [0] == W; `keduanya 1 byte lebih pendek dan menangkap semua nilai windows lainnya dalam pertanyaan yang ditautkan oleh manatwork. >Vmungkin bekerja juga.
user59178

manatwork tergantung pada versi Windows mana PHP dikompilasi, sejak Windows Visa \ 7, versi Windows telah diwakili dengan WINNT karena NT Authority Kernel. sebelum windows XP dan di bawahnya adalah Win32 dan Windows server 2003 adalah Windows.
DrWhat

4

Java 8, 49 byte

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

Lebih lama dari jawaban Java lainnya , tetapi mengambil pendekatan yang berbeda.

Lambda ini cocok dalam Supplier<Boolean>dan dapat diuji dengan program berikut:

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

}

Ini sangat, sangat mirip dengan jawaban awal yang Anda tautkan (sebelum diedit).
Olivier Grégoire

Kenapa tidak adil .contains("W")?
Cyoce

@Cyoce sebenarnya, variabel OS tampaknya khusus untuk Windows.


4

bash + coreutils, 5 byte

rm $0

Juga berfungsi di sebagian besar shell POSIXy lainnya. (Perhatikan bahwa port Windows ada bashdan rmada; meskipun mereka biasanya hanya digunakan dengan sistem operasi POSIXy yang lebih berat, ini bukan entri yang sepenuhnya kosong.) Keluaran melalui kode keluar (0 = false, 1 = true). Dapat dihitung sebagai 4 byte jika Anda diizinkan untuk menggunakan nama file (misrm a ). Perhatikan bahwa ini berpotensi gagal dalam kasus nama file yang sangat aneh (yang rmakan menafsirkan sebagai argumen karena kurangnya mengutip, dan mungkin menghapus file yang Anda pedulikan, jadi saya akan menyarankan agar tidak menjalankan program ini dari file dengan nama aneh ).

Catatan: menghapus program dari disk sebagai efek samping, atau setidaknya mencoba. Dalam kasus di mana kita menjalankan pada Windows, OS akan gagal untuk menghapus file yang sedang berjalan (operasi yang Windows tidak diizinkan baik secara default atau berhenti penuh), dan dengan demikian rmakan kesalahan keluar. bashmenangkap kesalahan dan mengubahnya menjadi kode keluar (dengan demikian program secara keseluruhan berakhir secara normal). Sebagian besar entri lain di sini menggunakan 0 untuk falsey dan 1 untuk kebenaran dalam kode keluar, jadi ini melakukan hal yang sama; dicatat bahwa bash'sif pernyataan tidak menerima bilangan bulat sama sekali (lebih tepatnya, ia menerima perintah dan cabang berdasarkan apakah mereka berjalan dengan sukses, dan tes aritmatika dilakukan melalui sarana program sepertitestyang dengan sengaja melaporkan "crash" pada perbandingan yang gagal), jadi ini lebih beralasan dalam hal legalitas daripada program yang menghasilkan melalui kode keluar dalam bahasa di mana 0 valid dalam iftes pernyataan dan mengirimkan program ke elsecabang.


4

8 , 11 byte

 
os 1- not .
 

Mencetak truepada Windows, falsepada Linux dan macOS. Platform lain yang didukung oleh 8 adalah Android, iOS dan Raspberry Pi, tetapi saya tidak dapat mengujinya.

Versi tidak digabungkan (dengan komentar)

 
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

Kembali dengan kode keluar nol (umumnya benar di shell) jika di windows, dan dengan kode keluar non-nol sebaliknya.

Jika Anda lebih suka sebaliknya, ada solusi 12 bytes: import posix.


Saya pikir ini tidak akan berfungsi jika ada file yang dipanggil winreg.pydi direktori yang sama.
Zacharý

1
Juga, sesuai aturan: "Kode yang gagal dijalankan / dikompilasi pada platform tidak dihitung sebagai nilai falsey."
Zacharý

4

TrumpScript , 17 byte

America is great.

Cobalah online!


Program ini, jika dijalankan di windows, akan mencetak:

The big problem this country has is being PC

Ini dianggap sebagai nilai kebenaran.


Output kosong dan nilai berikut adalah falsy:

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

Output kosong akan terjadi pada sistem linux apa pun (untuk program ini), respons apel lama jelas terjadi pada Mac (untuk program apa pun). Pada TIO, backend (saya berasumsi) adalah sistem operasi Unix, jadi Anda hanya bisa mendapatkan nilai falsy; di komputer saya, saya mendapatkan pesan PC.


Tidak 100% yakin jika ini dianggap sebagai pesan kesalahan (yang akan membatalkan jawaban), tetapi jika Anda tidak tahu tentang hal ini, itu mungkin layak untuk ditertawakan.


Apa yang terjadi dengan dunia ...
ooransoy

@avaragecoder, BUAT PYTHON BESAR LAGI!
Magic Gurita Guci
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.