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.

Daniel
sumber
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

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

Stewie Griffin
sumber
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.

Mego
sumber
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

Shmuel H.
sumber
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;}
betseg
sumber
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.

Titus
sumber
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.
James Holderness
sumber
15

Mathematica, 28 byte

$OperatingSystem=="Windows"&
alephalpha
sumber
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.

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

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

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

Dada
sumber
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

rahnema1
sumber
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)

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

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

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

Menandai
sumber
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!='/'
GilZ
sumber
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
Taylor Scott
sumber
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.

Brad Gilbert b2gills
sumber
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)

Adm
sumber
4

tcl, 38 byte

 expr [lsearch $tcl_platform windows]>0
hdrz
sumber
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.

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

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

Haskell, 39 31 byte

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

Saya memeriksa keluaran huruf pertama dari "m", yang seharusnya menjadi "mingw" untuk windows. Sejauh yang saya tahu, tidak ada OS lain yang dimulai dengan M. Informasi ini berasal dari https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs

Dylan Meeus
sumber
1
Pada sistem saya (Windows 10 64-bit, GHC 8.0.1 64-bit), osmemberi "mingw32".
Mego
@Mego Anda benar, dikoreksi untuk itu
Dylan Meeus
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.


sumber
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
 
Chaos Manor
sumber
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.

Jonas Schäfer
sumber
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.

Guci Gurita Ajaib
sumber
Apa yang terjadi dengan dunia ...
ooransoy
@avaragecoder, BUAT PYTHON BESAR LAGI!
Magic Gurita Guci