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 kode-golf , sehingga skor terendah menang, tetapi saya juga sangat tertarik melihat solusi kreatif untuk masalah ini.
code-golf
decision-problem
Daniel
sumber
sumber
Jawaban:
Vim, 2 byte
Di Windows,
<C-a>
(ctrl + a) dipetakan secara default keSelect All
. Jika Anda mengetik a1
dalam 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 keIncrement 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
sumber
Ctrl + a
,1
. Jika ituCtrl + a + 1
akan dihitung sebagai 1 keystroke.MATLAB, 4 byte
Dari dokumentasi :
Ada juga fungsi
ismac
danisunix
.Saya akan menyerahkannya kepada pembaca untuk mencari tahu apa fungsi-fungsi itu lakukan.Mego meminta diagram menjelaskanismac
danisunix
jadi saya sudah mencoba untuk menggambarkannya di sini:Itu tidak diminta untuk diagram
ispc
tetapi saya dapat mengungkapkan bahwa perilakunya sangat mirip, kecuali penggantiOSX
danUnix
denganWindows
.Pendekatan kedua:
Inilah pendekatan kedua dengan
getenv
menggunakan 23 byte yang seharusnya menjadi bukti, kecuali ada sistem operasi lain yang dimulai denganW
:sumber
Python 2.7.10 , 24 byte
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.sep
itu salah, dan karenanya0/0
dihitung, menyebabkan aZeroDivisionError
dan keluar dengan kode keluar yang tidak nol. Pada platform non-Windows,'['>os.sep
benar, membuat ekspresi0/1
, yang tidak melakukan apa-apa, dan program keluar dengan kode keluar 0.sumber
x86 Assembly, 7 byte(Terinspirasi oleh jawaban Runemoro )Atau
Deskripsi
Pertama-tama, kami akan mengatur
eax
ke1
(nomor panggilan sistemexit(int val)
untukLinux
,FreeBSD
danOSX
). Kemudian, kita akan memanggil gerbang interupsi0x80
yang merupakan gerbang panggilan sistemLinux
,FreeBSD
danOSX
. Itu akan menyebabkan program untuk keluar dengan statusebx
adalah0
(false
).Pada Windows
int 0x80
adalah gerbang yang tidak valid (Ini digunakan2e
sebagai gerbang syscall) dan akan crash program, menyebabkannya diakhiri dengan kode keluar positif (true
).Sunting: Tidak akan berfungsi
OSX
karena memiliki konvensi penyelesaian argumen yang berbeda pada 32 bit (oleh stack).Referensi dan bacaan lebih lanjut
FreeBSD - System Calls
: Informasi tentang panggilan sistem masukFreeBSD
.System calls in the Linux kernel. Part 2.
: Artikel yang bagus tentang panggilan sistem Linux.Linux Syscall Reference
: referensi nomor panggilan sistem untukLinux
.Windows Syscall Shellcode
: Artikel tentang langsung memanggil panggilan sistemwindows
dari majelis.Making system calls from Assembly in Mac OS X
: Artikel tentang panggilan sistem aktifOSX
.sumber
xor eax, eax
di sana?false
keluar dengan kode 1 sementaratrue
keluar dengan kode 0).eax
danebx
dihapus 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.mov eax, 1
akan diterjemahkan\xB8\x01\x00\x00\x00
, yang jauh lebih lama dari sekadar memindahkan register dan meneleponinc
.C,
44433836 byteBerkat @Downgoat untuk satu byte! dicoret 44 masih teratur 44
Terima kasih kepada @Neil selama dua byte!
sumber
0
keluarifdef
dan mengubah1
ke!
, tapi saya pikir_WIN32+0
bekerja lebih baik lagi.return 1;
di dalam ifdef dan menghapus yang lain, karena main tanpa kembali di c99 harus mengembalikan 0.#if WIN32
. Pada non-windows, karena WIN32 tidak didefinisikan, preprosesor diharuskan untuk memperlakukannya sebagai 0.PHP, 22 byte
mencetak
1
jika 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:
mencetak bilangan bulat positif jika path file berisi garis miring terbalik; selain itu tidak ada.
Alternatif aman dengan 27 byte :
<?=DIRECTORY_SEPARATOR>"/";
cetakan1
atau tidak sama sekali.Temuan aneh :
<?=__FILE__[1]==":";
( 20 byte ) seharusnya, tidak aman juga, tapi ok. Tetapi meskipun__FILE__
berpura-pura menjadi string (saya mencobavar_dump
dangettype
), 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_OS
konstanta yang sudah ditentukan dimulai denganwin
(case-sensitive; Windows, WIN32, WINNT, tetapi tidak CYGWIN atau Darwin); mencetak1
untuk Windows, tidak ada yang lain.17/18 byte :
mencetak
1
jika itu disimpan dengan linebreak Windows (juga pada DOS, OS / 2 dan Atari TOS - walaupun saya ragu ada yang mengompilasi PHP untuk TOS), yang lain0
.Anda juga dapat memeriksa konstanta
PHP_EOL
.lebih banyak pilihan:
PHP_SHLIB_SUFFIX
adadll
di Windows, tetapi tidak harus hanya di sana.php_uname()
mengembalikan info tentang sistem operasi dan banyak lagi; dimulai denganWindows
untuk Windows.$_SERVER['HTTP_USER_AGENT']
akan berisiWindows
ketika dipanggil di browser di Windows.<?=defined(PHP_WINDOWS_VERSION_BUILD);
(38 byte) berfungsi di PHP> = 5.3kesimpulan
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; tetapiPHP_OS
mungkin akan selalu berisi info yang diinginkan.sumber
<?=class_exists(COM);
. KelasCOM
ini hanya tersedia di bawah Windows, sejauh yang saya tahu. Itu akan menghemat satu byte.Befunge-98, 7 byte
Cobalah online!
Ini berfungsi dengan menanyakan pemisah jalur sistem, yang ada
\
di Windows dan/
sistem operasi lainnya.sumber
Mathematica, 28 byte
sumber
&
, itu tidak akan mencetak apa pun (dan itu juga bukan fungsi yang bisa dipanggil) , tetapi hanya cuplikan / ekspresi).Out[1]= False
hasil dari ini:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
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 denganf.get()
.Cobalah online! - server bukan windows, jadi ini mencetak
false
. 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.sumber
()->java.io.File.separatorChar=='\\'
hanya 36 byte.()->java.io.File.separatorChar>'['
!J, 7 byte
Ini adalah kata kerja (mirip dengan fungsi) yang menggunakan konjungsi asing bawaan
9!:12
untuk mendapatkan jenis sistem di mana 5 adalah Unix dan 6 adalah Windows32.sumber
R, 15 byte
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 adalahR sedang dikembangkan untuk keluarga sistem operasi Unix-like, Windows dan Mac . Keluarga OS lainnya tidak didukung.
sumber
Perl, 11 byte
^O
harus diganti dengan Control-O literal.Output
1
di windows, tidak ada pada OS lain.Perhatikan bahwa saya tidak menggunakan
say
karena menambahkan baris tambahan, yang benar di Perl.-2 byte berkat primo. (dan memperbaiki masalah potensial)
-1 byte berkat ais523.
sumber
^O
.$^O=~W
, meskipun, saya mungkin akan cocokMS
. Atau, Anda juga bisa mencocokkan$^X=~':'
.W
di dalamnya jadi saya berasumsi memeriksaW
untuk baik-baik saja .. ada alasan mengapa Anda menyarankanMS
?julia, 10 byte
Fungsi yang mengembalikan true untuk windows
sumber
kode mesin x86, 9 byte
Dikompilasi dari:
sumber
inc eax
danint 0x80
, saya pikir itu harus gagal pada windows dan menghentikan proses.JavaScript,
42302625 byteDiuji dengan Firefox. (Chrome tidak memiliki
oscpu
properti.) Karena huruf kecil memiliki kode karakter yang lebih tinggi daripada huruf besar, ini tergantung pada huruf pertamanavigator.oscpu
menjadi 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
sumber
oscpu
mungkinnavigator
properti terpendek yang dapat Anda gunakan. Juga, menguji regexp mungkin akan berhasil lebih pendek, tapi saya belum mengukurnya.!=-1
dan menambahkan~
tepat setelah panah lemak, menghemat 3 byte.console.log
melakukan tes regex? Juga akannavigator.oscpu[0]=='W'
berfungsi atau apakah ada OS lain yang juga dimulai dengan W.navigator.oscpu>'V'
mungkin bekerja jugaC #,
6148 byteDisimpan 13 byte berkat TheLethalCoder
Atau program lengkap dengan 83 byte:
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.
sumber
int
?CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'
- pada dasarnya, aturan mengetik C # mengatakan saya tidak bisa membandingkanPlatformID
danint
secara langsung, dan tidak ada pemeran tersirat dariPlatformID
keint
. Tapi ada adalah sebuah eksplisit pemain dari seluruh enum nilai-nilai mereka, yang saya mengambil keuntungan dari sini ...System.Environment.OSVersion
sama 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.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 byteFunc
s danAction
s 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 siniBatch, 50 byte
Sunting: Diperbaiki untuk mengabaikan DOS alih-alih mengklaim itu Windows.
Satu-
satunyacara saya tahu menjalankan Batch di luar Windows adalah dengan menggunakan WINE yang secara default akan dipetakanZ:
ke/
. Karena itu jikaZ:\bin\sh
ada, kemungkinannya adalah itu/bin/sh
, jadi bukan MS Windows.Saya tidak tahu apa yang WINE atur% OS%, tetapi jika tidak
Windows_NT
maka saya bisa menghemat 23 byte.sumber
OS=Windows_NT
QBasic, 31 byte
Mencetak non-nol di bawah Windows, 0 di bawah segalanya.
COMSPEC
adalah variabel lingkungan yang unik untuk Microsoft OS. Ini menunjuk ke penerjemah perintah, biasanyacommand.com
ataucmd.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
COMSPEC
mengandung "W", kita dapat mengetahui perbedaan antara Windows dan bukan-Windows.sumber
COMSPEC
tidak 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 mengandungW
)? Memang, itu sedikit kasus tepi.Node.js,
27161513 byteTerima kasih kepada @Patrick , yang mencukur 12 byte dari solusi saya menggunakan REPL Node:
Solusi asli:
sumber
Node.js REPL
, Anda dapat menyimpan 16 byte dengan hanya menggunakan_=>path.sep!='/'
node
pada konsol. Dari sana, semua modul simpul sistem tersedia tanpa perlu menggunakannyarequire()
.!=
ke>
sejak indeks ASCII untuk\
adalah 92 dan/
47.Excel VBA,
414030292624 BytesFungsi windows langsung yang kembali
true
jika kode OS sistem dimulai lebih panjang dari panjang 3, karena info dibatasi untuk output yang lainmac
ataupcdos
initrue
hanya kembali pada windows pcsVersi sebelumnya
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
WorkbookPath
untuk"\"
daripada menggunakanApplication.Path Separator
-4 Untuk beralih ke
Environ()
-2 Untuk beralih ke
[Len(Info(...
Solusi Baru, 51 byte
Novel
sub
rutin yang menampilkan, ke VBE jendela segera,1 (truthy)
jendela di0 (falsey)
bawah dan di bawah mac dengan metode kompilasi bersyarat.sumber
left
menghemat satu byte.?Application.PathSeparator)="\"
akan menjadi 32 karena ini adalah char tunggal)Perl 6 ,
1918 byteBaik output
True
atauFalse
tergantung pada sistem itu dijalankan.sumber
APL (Dyalog) , 21 byte
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)sumber
tcl, 38 byte
sumber
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.
sumber
>V
mungkin bekerja juga.Java 8, 49 byte
Lebih lama dari jawaban Java lainnya , tetapi mengambil pendekatan yang berbeda.
Lambda ini cocok dalam
Supplier<Boolean>
dan dapat diuji dengan program berikut:sumber
.contains("W")
?Haskell,
3931 byteSaya 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
sumber
os
memberi"mingw32"
.bash + coreutils, 5 byte
Juga berfungsi di sebagian besar shell POSIXy lainnya. (Perhatikan bahwa port Windows ada
bash
danrm
ada; 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 (yangrm
akan 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
rm
akan kesalahan keluar.bash
menangkap 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 bahwabash
'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 sepertitest
yang 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 dalamif
tes pernyataan dan mengirimkan program keelse
cabang.sumber
8 , 11 byte
Mencetak
true
pada Windows,false
pada 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)
sumber
Python 3 (13 byte)
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
.sumber
winreg.py
di direktori yang sama.TrumpScript , 17 byte
Cobalah online!
Program ini, jika dijalankan di windows, akan mencetak:
Ini dianggap sebagai nilai kebenaran.
Output kosong dan nilai berikut adalah falsy:
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.
sumber