MS Windowsを検出する


78

チャレンジ

Microsoft Windowsで実行すると真理値を返すプログラムを作成し(簡単にするためにWindows 7、8.1および10に固執します)、他のオペレーティングシステム(OSX、FreeBSD、Linux)で実行すると偽値を返します。

ルール

  • プラットフォームでの実行/コンパイルに失敗したコードは、偽の値としてカウントされません。

受賞基準

私はこれをとラベル付けしているので、最低スコアが勝ちますが、この問題に対する創造的な解決策を見ることにも非常に興味があります。


7
プログラムは終了コードで出力できますか?(通常許可
-FlipTack

13
これが動作する必要があるオペレーティングシステムの明確なリストを提供できますか?
-FlipTack

2
結果はWindows RTでどのようになりますか?
アダム

6
サポートする必要があるいくつかの特定の非Windowsシステムを指定することができます。DOSやOS2などに関するコメントには、いくつかの議論があります。
jpmc26

2
おそらく、終了コードにとって真実と偽と見なされるものについてコンセンサスが必要です。通常の規則はtrueの場合は0であり、falseの場合は他のすべてのものですが、多くの答えはそれを反対として扱い、「ifステートメント」の定義は明らかに適用されません。

回答:


75

Vim、2バイト

<C-a>1

Windowsでは、<C-a>(ctrl + a)はデフォルトでにマップされますSelect All1Windowsの選択モードでaを入力すると、選択内容が入力したものに置き換えられ(1)、バッファに1が残ります。

他のオペレーティングシステムでは<C-a>、デフォルトでにマップされIncrement numberます。インクリメントする数値がないため、何も行われず、1はカウントを増やしますが、バッファに関しては何も行われません。

Vimでは1は真実であり、空の文字列は偽です


3回のキーストロークのように見えます。Ctrl + a + 1
パベル

12
このメタ投稿ごとに、meta.codegolf.stackexchange.com / questions / 8995 / ... Vimの回答は通常、修飾子なしでスコアリングされます(特に、投稿の最初の回答では1バイトの例として<ctrl + a>が使用されます)
nmjcman101

4
@PavelそれはCtrl + a1です。それがCtrl + a + 11キーストロークとしてカウントされた場合。
キャプテンマン

7
美しい、私はこの答えが大好きです!
DJMcMayhem

それはかなりエレガントです、私はそれが好きです。
ダン

108

MATLAB、4バイト

ispc

ドキュメントから:

tf = ispcMATLAB®ソフトウェアのバージョンがMicrosoft®Windows®プラットフォーム用である場合、論理値1(true)を返します。それ以外の場合、論理値0(false)を返します。

関数ismacともありますisunixこれらの機能が何をするのかを理解するために、読者に任せます。 MEGOは親切に説明する図を求めたismacisunix私はここでそれを説明することを試みました。

enter image description here

図の要求はありませんでしたが、ispc代替OSXUnixを除いて、動作はかなり似ていることがわかりWindowsます。


2番目のアプローチ:

getenv始まる別のオペレーティングシステムがない限り、防弾となる23バイトを使用する2番目のアプローチを次に示しますW

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

getenv 'name'基になるオペレーティングシステム環境リストで、フォームのテキストを検索します。name=valueここnameで、は入力文字ベクトルです。見つかった場合、MATLAB®は文字ベクトル値を返します。指定された名前が見つからない場合、空のマトリックスが返されます。


4
コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
デニス

54

Python 2.7.10、24バイト

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

3バイトのFlipTackに感謝

このプログラムは、Windowsが\パス区切り文字として使用する唯一のOSであるという事実を利用しています。通常、これはいらいらし、悪いことですが、一度は実際には利点です。Windowsでは'['>os.sepfalseであるため0/0、計算され、ZeroDivisionErrorゼロ以外の終了コードで終了します。Windows以外のプラットフォームで'['>os.sepはtrueになり、式が作成されますが、0/1何も実行されず、プログラムは終了コード0で終了します。


DOSはまた、パス区切り文字としてバックスラッシュを使用し、少なくとも1つのPython 2実装を備えています。
-isanae

5
@isanae私は、Python 2.7を指定するには、タイトルを編集した- DOS上のみのPython 2の実装は古風な、バギー2.4.2です
MEGO

OS / 2もバックスラッシュを使用し、Python 2.7を実装しています;)
isanae

9
@isanaeそこで、2.7.10を指定しました。それのポートを見つける幸運。
メゴ

2
どうやらそれだけで3つの最近のバージョンのWindowsとの3つの他のシステムの、おそらく同様に最近のversiosで正しい結果を与えることが必要で、OS2とDOSは、重要ではありません
Jasen

45

x86アセンブリ、7バイトRunemoroの回答に触発)

31 DB 89 D8 40 CD 80

または

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

説明

まず第一に、我々は設定しますeax1(システムコールの番号exit(int val)のためLinuxFreeBSDOSX)。その後、我々は割り込みゲート呼びます0x80ためのシステムコールゲートであるLinuxFreeBSDOSX。これにより、ステータスebx0false)のプログラムが終了します。

Windowsではint 0x80無効なゲート(2esyscallゲートとして使用)があり、プログラムをクラッシュさせて、正の終了コード(true)で終了させます。

編集:OSX 32ビット(スタックによる)で異なる引数を渡す規則があるため、動作しません。

参考資料と詳細資料


3
そりゃ素晴らしい!
z0rbergの

クラッシュが真実の価値をもたらすのはなぜですか?EAX(通常は戻り値)が1であるためですか?また、プログラムの開始時にEAXが0になることが保証されていますか?それともxor eax, eaxそこに必要ですか?
コールジョンソン

3
@ColeJohnson:OSが検出したクラッシュ(通常x86で使用されるオペレーティングシステム上)は、正常終了のために予約されているため、終了コード0を残すことはありません。(通常、終了コードは、OSがこの状況のた​​めに特別に予約する何らかの不安定な値です。)ただし、通常の慣習が与えられている場合、プログラム終了コードで0を偽として、1を真実としてカウントするのが理にかなっていない正反対(0が唯一の真実の値です。たとえば、標準のUNIX / Linux / POSIXプログラムfalseはコード1でtrue終了し、コード0で終了します)。

1
この答えは、暗黙的にレジスタeaxを想定しておりebx、プログラムの開始時に(Windows以外で)ゼロにクリアされますが、正しく覚えていれば保証されません。また、Linuxのsyscall引数受け渡し規則がFreeBSDおよびOSXのそれと一致することを明示的に想定していますが、これは実に驚くべきことです。
zwol

1
@Sebastian-LaurenţiuPlesciucいい質問ですね。mov eax, 1はに翻訳されるでしょう\xB8\x01\x00\x00\x00、それはただレジスタを動かして、呼ぶよりずっと長いですinc
シュミュエルH.

29

C、44 43 38 36バイト

@Downgoatに感謝します!取り消し線44はまだ規則的44
2バイトの@Neilに感謝!

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

元々、0outをにifdef変更して1to を変更すること!で、大量のバイトを節約できることを提案しようとしていましたが、_WIN32+0さらにうまくいくと思います。
ニール

c99に問題がない場合、fをmainに変更しreturn 1;、ifdef内に固定してelseを削除できます。c99に復帰しない場合、mainは0を返す必要があるためです
。– simon

11
それはコンパイラ指令です。たとえば、Windowsシステムでコンパイルされ、Linuxシステムで実行される場合、1が返されます
。-マイケルジョンソン

4
@MichealJohnsonいいえ Linuxでコンパイルできます(mingw32gcc msvcを使用)。Windowsで実行するとtrueを返すコードを取得します。WindowsでホストされるLinuxコンパイラは知りません。「ワイン」のようなエミュレーション層を議論したい場合、他のすべての答えはおそらく同じ問題に苦しんでいます
-Jasen

1
WIN32が単に定義されているかどうかは不明ですが、ゼロ以外に定義されています。後者の場合は、単に言うことができます#if WIN32。非ウィンドウでは、WIN32が定義されていないため、プリプロセッサはそれを0として扱う必要があります
。– Shahbaz

27

PHP、22バイト

`<?=PATH_SEPARATOR>":";`  

1パス区切り文字がセミコロン(DOSおよびOS / 2を除く他のすべてのOSの場合はコロンまたは空)である場合は印刷し、それ以外の場合は印刷しません。

また、22バイトですが、それほど安全ではありません:

<?=strpos(__FILE__,92);

ファイルパスにバックスラッシュが含まれる場合、正の整数を出力します。それ以外は何もありません。27バイトの
安全な代替手段:印刷するか、何もしない。<?=DIRECTORY_SEPARATOR>"/";1

奇妙な発見<?=__FILE__[1]==":";20バイト)は安全ではないはずですが、大丈夫です。が、しかし、__FILE__ふりは、文字列を(私が試したことvar_dumpgettype)あなたは(連結でも動作します)どこか別の場所にそれをコピーしたり、関数のパラメータとしてそれを使用しない限り、それをインデックスすると、エラーがスローされます。

編集:
<?=(__FILE__)[1]==":";(も22バイト)PHP 7で動作します。しかし、これは括弧が定数の値を一時変数にコピーするためです。

27バイト<?=stripos(PHP_OS,win)===0;
定義済みPHP_OS定数がwin(大文字と小文字を区別しない、Windows、WIN32、WINNTで始まるが、CYGWINまたはDarwinではない)で始まるかどうかをテストします。1Windows用に印刷します。それ以外は何もしません。

17/18バイト

<?=strlen("
")-1;

1Windowsの改行(DOS、OS / 2、Atari TOSでも保存されている場合-誰もPHPをTOS用にコンパイルしたとは思わないが)を印刷します0

定数も確認できPHP_EOLます。

より多くのオプション:

PHP_SHLIB_SUFFIXですdllが、必ずしもだけが、Windows上で。
php_uname()オペレーティングシステムなどに関する情報を返します。WindowsWindowsで始まります。Windowsのブラウザで呼び出されたとき
$_SERVER['HTTP_USER_AGENT']に含まWindowsれます。
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38バイト)PHP> = 5.3で動作

結論

それが本当にWindowsであるかどうかを判断する唯一のフェイルセーフ方法は、そのように見えるものではなく、OS名のチェックのようです。PHPのphp_os()場合:セキュリティ上の理由で無効になっている場合があります。ただし、PHP_OSおそらく常に必要な情報が含まれます。


4
* nixのファイル名にはバックスラッシュを含めることができるため、これは絶対確実ではありません。規則は、それが絶対確実である必要があるとは言っていないので、¯\ _(ツ)_ /¯–
ヨルダン

@ジョーダン:あなたは正しい。その情報を説明に追加しました。ありがとう。
タイタス

4
別の方法:<?=class_exists(COM);COM私の知る限り、このクラスはWindowsでのみ利用可能です。これで1バイト節約できます。
イスマエルミゲル

@IsmaelMiguelそれはあなたがそれをそのように投稿するのに十分な異なる答えです。(しかし、そうする価値はないかもしれません。この答えは非常によく書かれています。)
wizzwizz4

1
@ wizzwizz4それは価値がありません。答えは忘却に追いやられるでしょう。だから、自分の答えを書くのではなく、単にコメントを残しました。
イスマエルミゲル

16

Befunge-98、7バイト

6y2%!.@

オンラインでお試しください!

これは\、Windowsおよび/他のオペレーティングシステム上にあるシステムパスセパレーターを照会することで機能します。

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バイト

$OperatingSystem=="Windows"&

機能化する意味は何ですか?アンパサンドを削除して1バイトを節約することができ、コードは実行されたかどうかをWindows風のシステム上で直接評価します。
ルスラン

@Ruslanすべての回答は、結果を出力する完全なプログラムか、呼び出し可能な関数である必要があります。これがMathematicaノートブックの答えであると宣言されている場合は、完全なプログラムを呼び出すことで済ます&ことができますが、を使用せずにコマンドラインから呼び出すと、何も出力されません(そして、呼び出し可能な関数でもありません) 、しかし単なるスニペット/式)。
マーティンエンダー

@MartinEnder本当に出力がありませんか?これからOut[1]= False出力が得られます~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
ルスラン

@Ruslanまた、ノートブック環境(コマンドラインベースの環境のみ)も開始すると考えています。コマンドラインからプログラムを実行するということは、スクリプトモードを使用することです。
マーティンエンダー

13

Java 8、33バイト

提案separatorCharしてくれたOlivierGrégoireと、-1バイトのKritixi Lithosに感謝します!

これは、ブール値を返すラムダ式です。これはに割り当ててSupplier<Boolean> f = ...;呼び出すことができますf.get()

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

オンラインでお試しください!-サーバーはWindowsではないため、これはを出力しfalseます。ただし、私のWindowsマシンでは、同じコードが印刷されtrueます。

このコードは、システムのファイルセパレーターを取得し、そのコードポイントがcharacterよりも大きいかどうかを確認します[。これは\、セパレーターとして使用するため、Windowsにも当てはまりますが、他のすべてのOSが使用するの/は、ASCIIテーブルのコードが低いためです。


これは、Wで始まる他のOSでは中断しませんか?
ダウンゴート

()->java.io.File.separatorChar=='\\'わずか36バイトです。
オリビエグレゴワール

1
@OlivierGrégoireすてきなもの-そして私はそれを使って34までゴルフでき()->java.io.File.separatorChar>'['ます!
FlipTack

2
@Titus WebOS、Whonix。おそらくさらに。
オリビエグレゴワール

3
@タイタス待って、WAITSはどうですか?
-NoOneIsHere

11

J、7バイト

6=9!:12

これは、組み込みの外部接続詞9!:12を使用して、5がUnix、6がWindows32であるシステムタイプを取得する動詞(関数に類似)です。


J公式ドキュメントは、古いWindowsに対してこの値を返すことを示しています。「6 Windows32(95/98/2000 / NT)」ドキュメントを更新する必要がありますか?64ビットWindowsの場合はどうなりますか?jsoftware.com/help/dictionary/dx009.htm
キータ

64ビットWindows 7でテストし、6を返します。ドキュメントはかなり古いようです。
キータ

@Keetaはい、古いと思いますが、Windows 10 64ビットではまだ6を返しました。
マイル

11

R、15バイト

.Platform$O>"v"

リスト要素の抽出に部分一致を使用することを提案してくれたplannapusに感謝します。

.Platformは、Rが構築されたプラットフォームの詳細を含むリストです。OS.type文字列である要素(名前が「O」で始まる唯一の要素)があり、コンピュータのオペレーティングシステム(ファミリ)を示します。いずれ"unix""windows"

ので、それより"unix"も少ないが、より大きいです。その他の有効な15バイトの回答は"v""windows""v"

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

Rは、UnixライクなWindowsおよびMacファミリのオペレーティングシステム用に開発されています。他のOSファミリはサポートされていません。


1
知っているウィンドウではないUNIX以外のプラットフォームがあります
ブルー

2
@muddyfish:.Platform [[1]]は、Rドキュメントで「unix」または「windows」として定義されています。github.com/wch/r-source/blob/…–リオリ
1

申し訳ありませんが、それでは大丈夫です。回答はおそらく、この事実を含むように修正して、再度尋ねられるのを止める必要があります
-Blue

10

Perl、11バイト

print$^O=~MS

^O リテラルControl-Oに置き換える必要があります。

1Windowsでの出力、他のOSでは何も出力しません。

say末尾の改行を追加するので、私は使用していないことに注意してください。これはPerlでは真実です。

primoのおかげで-2バイト。(および潜在的な問題を修正)
ais523のおかげで-1バイト。


これはCygwin Perlでは機能しません。
イゴールスコチンスキー

これは、mingw Perlでも機能しません。しかし、Perlはこれらの両方をWindowsとは異なるオペレーティングシステムとして扱いますが(Windowsの規則ではなくUNIXに従うのが一般的であるため)、質問の目的のためにカウントすべきかどうかは明確ではありません。他のニュースでは、でなくリテラルのcontrol-O文字を使用して、ここにバイトを保存できます^O

@ ais523編集、ありがとう。CygwinとMingwについては、Windowsと見なす必要がある場合は投稿を削除しますが、あなたが言うように、それらを別個のOS(または少なくとも、非Windows OS)と見なす方が理にかなっています。
ダダ

正規表現の区切り文字は必要ないはずです$^O=~Wが、おそらく一致しMSます。または、に一致させることもできます$^X=~':'
プリモ

@primo右、ありがとう。他のOSがわからないWのでW、罰金を科すことを想定しましたMS
ダダ

9

ジュリア、10バイト

is_windows

ウィンドウに対してtrueを返す関数


9

x86マシンコード、9バイト

40 39 04 24 75 02 CD 80 C3

コンパイル元:

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
純粋なバイナリ(COM)がWindowsまたはLinuxで実行されないため、これが有効かどうかわからない
イゴールスコチンスキー

@IgorSkochinskyアセンブリには通訳が必要です。
シュミュエルH.

inc eaxとのみを残すことでコードをさらに短くするint 0x80ことができます。Windowsでは失敗し、プロセスを終了するはずです。
シュミュエルH.

2
@IgorSkochinsky生のバイナリを実行するプログラムもあります。以前のコメントのリンクを参照してください。
シュムエルH.

1
BochsとQEMUはベアメタル環境をシミュレートし、ホストOSの下でバイナリコードを実行しません。そのため、IMOは機能しません。しかし、これはすべてメタの議論になり得ます。
イゴールスコチンスキー

8

JavaScript、 42 30 26 25バイト

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

Firefoxでテスト済み。(クロームが持っていないoscpuプロパティを。)小文字は大文字よりも高い文字コードを持っているので、これはの最初の文字に依存しnavigator.oscpu、大文字であることとされていないWXYまたはZよりもFirefoxのサポートは、(他の任意のプラットフォーム上でもちろん、Windows)。この記事によると、そうです。

編集

  1. Neilのおかげで12バイト節約されました。
  2. 別の4バイトを保存しました
  3. Blenderのおかげでもう1バイト節約できました

oscpuおそらく、navigator使用できる最短のプロパティです。また、正規表現のテストはおそらく短くなりますが、私はそれを測定していません。
ニール

太い矢印の直後に削除!=-1して~3バイトを保存できます。
ルーク

関数を作成する必要がありますか?console.log正規表現だけをテストすることはできませんか?また、navigator.oscpu[0]=='W'動作するか、Wで始まる別のOSがあります。

2
どういうわけか、私のChromeにはoscpuがありません。
ミューザー

2
navigator.oscpu>'V'同様に動作する可能性があります
ブレンダー

8

C#、61 48バイト

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

TheLethalCoderのおかげで13バイト節約

または、83バイトの完全なプログラム:

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

さまざまなWindowsバリアントは、Microsoft .NET実装で列挙値0〜3を使用します。4はUnix、5はXbox [360](これは「Windows」とは考えません)、6はMacOSXです。Monoは同じ値を使用し、以前のバージョンのUnix / Linuxには128を追加しました。

したがって、4未満はWindowsであり、他のすべてはWindowsではありません。


2
私が何かを逃しているかどうかはわかりませんが、なぜあなたは値をにキャストしていますintか?
-auhmaan

@auhmaan- CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'基本的に、C#のタイピング規則では、a PlatformIDint直接比較することはできず、PlatformIDto からの暗黙のキャストはありませんint。しかし、そこにある明示的な私はここを利用し、その値にすべての列挙型からキャストは...
ボブ・

1
@MustafaAKTAŞまた、これはC#/。NET Framework / .NET Coreをターゲットにしていることを指摘する必要があります。Xbox Oneでは、まったく含まSystem.Environment.OSVersionれていない別のAPIを使用するUWPアプリのみを実行できます。問題がある場合は、他のすべての非UWP回答も削除する必要があります。また、Windows以外のプラットフォームでは(現在)UWPアプリを実行できないため、これらすべてを削除することもできます。答えが0で、答えのない質問があります。
ボブ

1
Action<bool>最初の例では48バイトにコンパイルできます(テストしていませんが、動作すると信じています)ただし、49バイトに_=>(int)System.Environment.OSVersion.Platform<4;する必要があるかもしれません()=>...
-TheLethalCoder

1
ここでは、FuncsやActions などの匿名関数へのコンパイルが常に使用されます。私はそれがゴルフのヒントのページにあると信じており、私はそれらをほとんどいつも使っています。また、匿名関数は他の言語で多く使用されているため、ここで使用しても安全だと思います
-TheLethalCoder

7

バッチ、50バイト

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

編集:DOSがWindowsであると主張する代わりに無視するように修正されました。

唯一の私は、Windowsの外でバッチを実行しているの知っている他の方法は、デフォルトでマッピングしますWINE使用することであるZ:にし/。したがって、Z:\bin\sh存在する場合は、/bin/shMS Windowsではなくである可能性があります。

WINEが%OS%をどのように設定するかわかりませんが、そうでないWindows_NT場合は23バイト節約できます。


1
もう1つの方法は、WindowsではないDOSです。
ルスラン

これはDOSで失敗するだけでなく、Z:がマップされているコンピューターでも失敗し、たまたまそのようなパスを含んでいます。
アダム

1
少なくとも、WINEを検出しようとしています。WINEで実行した場合、他の回答はどれも正しい結果を出しません。
ニール

3
@Adámもちろん、-DWIN32 = 1でCの回答をコンパイルすると、失敗します。あなたのポイント?
ニール

1
はい、ワインセットOS=Windows_NT
-Jasen

7

QBasic、31バイト

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

Windowsではゼロ以外、その他すべてでは0を出力します。

COMSPECMicrosoft OSに固有の環境変数です。それは、典型的には、コマンド・インタプリタを指しますcommand.comcmd.exe。Windowsでは、コマンドインタープリターはWindowsディレクトリのどこかにあります。MS-DOSでは、DOSディレクトリまたはディスクのルートにあり、他のOSでは存在しません。

の値にCOMSPEC「W」が含まれているかどうかを確認することで、Windowsと非Windowsの違いを知ることができます。


COMSPECLinuxで特に何かを意味するように予約されていません(デフォルトではユーザー制御下にあることを意味します)。W)?確かに、それはちょっとしたケースです。

1
@ ais523:また、WindowsディレクトリにWを含める必要はありません。どちらの場合も脆弱です。
ジョーイ

7

Node.js、27 16 15 13バイト

NodeのREPLを使用してソリューションから12バイト削った@Patrickに感謝します。

_=>os.EOL>`
`

元のソリューション:

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

これをに変更するとNode.js REPL、使用するだけで16バイトを節約できます_=>path.sep!='/'
パトリックロバーツ

私はcodegolfが初めてです。許可してもらえますか?
-GilZ

はい、そうでなければ私はそれを提案しなかったでしょう。REPLは、読み取り、実行、印刷ループ、nodeコンソールで入力したときに実行されるプログラムを意味します。そこから、すべてのシステムノードモジュールを必要なく使用できrequire()ます。
パトリックロバーツ

ああ、ごめんなさい。私は11を意味しますが、変更することで、別のバイトを保存することができます!=する>ためのASCII指数は以来、\ 92で、/47である
パトリック・ロバーツ

7

Excel VBA、41 40 30 29 26 24バイト

返す即時ウィンドウ機能true情報が出力に制限されているため、システムのOSのコードが開始した場合には、長い長さ3以上である他のいずれかmacまたはpcdosこれを返すtrueだけのWindows PC上で

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

以前のバージョン

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

変更点

-1 Left(...,1)以上を使用してくれたニールに感謝Mid(...,1,1)

-10 @Mego のPath Separator Trickを指摘してくれたChrisHに感謝

-1チェックするためWorkbookPathのために"\" 使用はなくApplication.Path Separator

-4への切り替え用 Environ()

-2への切り替え用 [Len(Info(...

新規ソリューション、51バイト

subVBEイミディエイトウィンドウに、条件付きコンパイルの方法で1 (truthy)アンダーウィンドウと0 (falsey)アンダーMACを出力する新しいルーチン。

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

1
leftバイトを節約します。
ニール

オンラインでoffice365で試しましたか?それはVBAもサポートしていますか?ちょっと興味があるんだけど。
クリスH

@ChrisH私の知る限り、office.comはオンラインVBAスクリプティングをサポートしていません(他の誰かがよりよく知っている場合は教えてください、それは私の人生を大幅に楽にします)。ただし、O365では、Office 2016(または最新のもの)のコピーをデスクトップにダウンロードする権限があり、VBAスクリプトをサポートしています。
テイラースコット

私はこれまでのところそれをどうにかして避けました。継続してセットに見えるコメント与えられた(私はオフィスのデスクトップのコピーを持って使用してWindowsマシンのみを、個人のマシンはすべてのLinuxです)
クリス・H

1
@Megoのパスセパレータートリック?Application.PathSeparator)="\"単一の文字なので32になります)
クリスH

6

Perl 6の 19の  18バイト

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

両方の出力True␤またはFalse␤それが実行されるシステムに依存します。


2つ目は、CWDの非ウィンドウ値に「」が含まれていないことに依存しています-それの保証はありません
-Jasen


4

tcl、38バイト

 expr [lsearch $tcl_platform windows]>0

4

PHP 17バイト

以下は、ウィンドウの場合は1を出力し、それ以外の場合は何も出力しません。文字列変換の通知を無視します。

<?=PHP_OS==WINNT;

サンドボックスはPoC用のLinuxであるため、Linuxのオンラインオンラインテストを試してください


確かにそれで十分ですか?のでお願いPHP_OS:使用可能な値
マナトワーク

1
'<?= PHP_OS [0] == W; `は両方とも1バイト短く、manatworkによってリンクされた質問の他のすべてのウィンドウ値をキャッチします。>Vうまくいくかもしれません。
user59178

Windows Visa \ 7以降、NT Authority KernelによりWindowsバージョンはWINNTで表されているため、manatworkはPHPがコンパイルされたWindowsバージョンに依存します。Windows XP以前はWIN32で、Windows Server 2003はWindowsでした。
DrWhat

4

Java 8、49バイト

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

他のJavaの回答よりも長いですが、異なるアプローチを取ります。

このラムダはに収まりSupplier<Boolean>、次のプログラムでテストできます。

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

}

リンクする最初の回答(編集前)と非常によく似ています。
オリビエグレゴワール

どうして.contains("W")
チョイス

@Cyoceは、実際、変数OSはWindows固有のようです。

4

Haskell、39 31バイト

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

「m」の最初の文字の出力を確認します。これは、ウィンドウの場合は「mingw」です。私が知る限り、Mで始まる他のOSはありません。情報はhttps://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hsから取得されます


1
私のシステム(Windowsの10の64ビット、GHC 8.0.1 64ビット)で、os提供します"mingw32"
メゴ

@Megoあなたは正しいです、そのために修正されました
ディランMeeus

4

bash + coreutils、5バイト

rm $0

他のほとんどのPOSIXyシェルでも機能します。(のWindowsのポートことに注意bashしてはrm存在し、それらは唯一、通常より重くPOSIXyオペレーティングシステムで使用しているにもかかわらず、これは完全に空虚なエントリではありません。)終了コードを経由して出力(0 =偽、1 =真)。ファイル名(例:)を想定できる場合、4バイトとしてカウントできますrm a。非常に奇妙なファイル名の場合、これは潜在的に失敗する可能性があることに注意してください(rm引用符がないために引数として解釈され、気になるファイルを削除する可能性があるため、奇妙な名前のファイルからこのプログラムを実行することをお勧めします)。

注:副作用としてプログラムをディスクから削除するか、少なくとも試行します。Windowsで実行している場合、OSは実行中のファイル(Windowsがデフォルトまたはフルストップで許可しない操作)の削除に失敗し、rmエラーが発生します。bashエラーをキャッチし、終了コードに変換します(したがって、プログラム全体が正常に終了します)。ここにある他のエントリのほとんどは、終了コードで偽を表す0と真実を表す1を使用しているため、これは同じです。bashifステートメントは整数をまったく受け入れないことに注意してください(むしろ、正常に実行されるかどうかに基づいてコマンドとブランチを受け入れ、算術テストは次のようなプログラムによって実行されます)test失敗した比較で意図的に「クラッシュ」を報告します)、これは合法性の観点から、ifステートメントテストで0が有効でelseブランチにプログラムを送信する言語で終了コードを介して出力するプログラムよりも不安定です。


4

8番目、11バイト

 
os 1- not .
 

trueWindows、falseLinux、およびmacOS で印刷します。8thでサポートされている他のプラットフォームはAndroid、iOS、Raspberry Piですが、私はそれらをテストすることはできません。

ゴルフされていないバージョン(コメント付き)

 
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バイト)

import winreg

Windowsの場合は終了コード0(シェルでは通常true)で戻り、それ以外の場合はゼロ以外の終了コードで戻ります。

あなたは他の方法でラウンドそれを好む場合は、12バイトのソリューションがあります:import posix


winreg.py同じディレクトリに呼び出されるファイルがある場合、これは機能しないと思います。
ザカリー

1
また、ルールに従って:「プラットフォームでの実行/コンパイルに失敗したコードは、偽の値としてカウントされません。」
ザカリー

4

TrumpScript、17バイト

America is great.

オンラインでお試しください!


このプログラムは、Windows上で実行された場合、次を印刷します。

The big problem this country has is being PC

これは真実の値と見なされます。


空の出力と次の値は偽物です。

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

空の出力はLinuxシステム(このプログラムの場合)で発生し、長いAppleの応答はMac(プログラムの場合)で発生します。TIOでは、バックエンド(私が想定している)はUnixオペレーティングシステムなので、偽の値しか取得できません。私のコンピューターでPCメッセージを受け取ります。


これがエラーメッセージ(回答を無効にする)としてカウントされるかどうかは100%確実ではありませんが、これについて知らなかった場合、おそらく笑う価値がありました。


どのような世界が来たの...
ooransoy

@avaragecoder PYTHON GREAT AGAIN!
魔法のタコUr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.