MS Windows 감지


78

도전

Microsoft Windows에서 실행할 때 정확한 값을 반환하는 프로그램 (단순함을 위해 Windows 7, 8.1 및 10을 사용함)과 다른 운영 체제 (OSX, FreeBSD, Linux)에서 실행할 때 잘못된 값을 반환하는 프로그램을 만듭니다.

규칙

  • 플랫폼에서 실행 / 컴파일에 실패한 코드는 잘못된 값으로 간주되지 않습니다.

우승 기준

나는 이것을 로 라벨링 하고 있으므로 가장 낮은 점수를 얻지 만이 문제에 대한 창의적인 솔루션을 보는 데 매우 관심이 있습니다.


7
종료 코드로 프로그램을 출력 할 수 있습니까? ( 일반적으로 허용됨 )
FlipTack

13
작동해야하는 운영 체제의 명확한 목록을 제공 할 수 있습니까?
FlipTack

2
Windows RT에서 어떤 결과가 나오나요?
Adám

6
지원해야하는 몇 가지 특정 비 Windows 시스템을 지정할 수 있습니다. DOS 및 OS2와 같은 것에 대한 의견에는 몇 가지 논쟁이 있습니다.
jpmc26

2
종료 코드에 대해 진실하고 거짓으로 간주되는 것에 대한 합의가 필요할 것입니다. 일반적인 규칙은 true이고 다른 것들은 false이지만 많은 답변이 반대로 취급하고 있으며 "if statement"정의는 분명히 적용되지 않습니다.

답변:


75

Vim, 2 바이트

<C-a>1

Windows에서 <C-a>(ctrl + a)는 기본적으로로 매핑됩니다 Select All. 1Windows에서 선택 모드로 a를 입력하면 선택 영역이 입력 한 내용 (1)으로 버퍼에 1을 남겨 둡니다.

다른 운영 체제에서는 <C-a>기본적으로에 매핑됩니다 Increment number. 증분 할 숫자가 없기 때문에 No-op이고 1은 카운트를 증가 시키지만 버퍼 측면에서는 No-op입니다.

1은 Vim에서 진실하고 빈 문자열은 거짓입니다.


3 번의 키 스트로크처럼 보입니다. Ctrl + a + 1
Pavel

12
나는이 메타 포스트 meta.codegolf.stackexchange.com/questions/8995 / ... Vim 답변은 일반적으로 수정 자없이 점수가 매겨진 다고 생각 합니다 (특히 게시물의 첫 번째 답변은 <ctrl + a>를 1 바이트의 예로 사용하는 경우)
nmjcman101

4
그것의 @Pavel Ctrl + a, 1. 만약 그것이 Ctrl + a + 11 번의 키 스트로크로 계산됩니다.
캡틴 맨

7
아름답다, 나는이 대답을 좋아한다!
DJMcMayhem

다소 우아합니다. 마음에 듭니다.
Dan

108

MATLAB, 4 바이트

ispc

로부터 문서 :

tf = ispcMATLAB® 소프트웨어 버전이 Microsoft® Windows® 플랫폼 용인 경우 논리 값 1 (true)을 반환합니다. 그렇지 않으면 논리 값 0 (거짓)을 반환합니다.

이 기능은 또한 ismacisunix. 나는 그 기능들이 무엇을하는지 알아 내기 위해 독자에게 맡길 것이다. Mego는 친절 다이어그램 설명을 요구 ismac하고 isunix그래서 여기 설명하기 위해 시도했다 :

enter image description here

의 다이어그램을 요구 ispc하지는 않았지만 OSX, Unixwith 와 with를 제외하고는 동작이 매우 유사하다는 것을 알 수 있습니다 Windows.


두 번째 접근법 :

다음으로 getenv시작하는 다른 운영 체제가없는 한 23 바이트를 사용하여 방탄해야하는 두 번째 방법은 다음 과 W같습니다.

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

getenv 'name'기본 운영 체제 환경 목록 에서 형식의 텍스트를 검색합니다 name=value. 여기서 name입력 문자 벡터입니다. MATLAB®이 발견되면 문자형 벡터 값을 반환합니다. 지정된 이름을 찾을 수 없으면 빈 행렬이 반환됩니다.


4
의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Dennis

54

파이썬 2.7.10 , 24 바이트

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

3 바이트의 FlipTack 덕분에

이 프로그램은 Windows가 \경로 분리 자로 사용 되는 유일한 OS라는 사실을 이용 합니다. 일반적으로 이것은 실망스럽고 나쁘지만 한 번은 실제로 이점입니다. Windows에서는 '['>os.sepfalse이므로 0/0계산 되어 ZeroDivisionError0이 아닌 종료 코드로 종료됩니다. Windows 이외의 플랫폼에서는 '['>os.septrue를 수행하여 표현식을 작성하면 0/1아무 것도 수행하지 않으며 프로그램은 종료 코드 0으로 종료됩니다.


DOS는 또한 경로 분리 자로 백 슬래시를 사용하며 적어도 하나의 Python 2 구현이 있습니다.
isanae

5
@isanae 저는 파이썬 2.7을 지정하기 위해 제목을 편집했습니다. DOS에서 유일하게 파이썬 2를 구현 한 것은 고풍스럽고 버그가있는 2.4.2
Mego

OS / 2는 또한 백 슬래시를 사용하며 Python 2.7 구현
을가집니다

9
@isanae 거기에 2.7.10을 지정했습니다. 그 항구를 찾는 행운을 빕니다.
Mego

2
분명히 그것은 3 개의 최신 Windows 버전에서만 올바른 결과를 제공해야하며 아마도 목록에있는 다른 세 가지 시스템의 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)에 대한 Linux, FreeBSD그리고 OSX). 그런 다음, 우리는 인터럽트 게이트 전화 할게 0x80위한 시스템 콜 게이트입니다 Linux, FreeBSD하고 OSX. 그러면 프로그램 상태 ebx0( false) 인 상태로 종료됩니다 .

Windows int 0x80에서 유효하지 않은 게이트 ( 2esyscall 게이트로 사용)이며 프로그램을 중단시켜 프로그램을 종료 코드 ( true)로 종료합니다 .

편집 :OSX 32 비트 (스택 기준)에 다른 인수 전달 규칙이 있으므로 작동하지 않습니다 .

참고 문헌 및 추가 자료


3
훌륭합니다!
z0rberg의

충돌 사례가 진실한 가치 인 이유는 무엇입니까? EAX (일반적으로 반환 값)가 1이기 때문입니까? 또한 프로그램 시작시 EAX는 0이 보장됩니까? 아니면 xor eax, eax거기에 필요 합니까?
Cole Johnson

3
@ColeJohnson : OS 감지 크래시 (일반적으로 x86과 함께 사용되는 운영 체제에서)는 종료 코드 0을 남기지 않습니다. 이는 종료를 위해 예약되어 있기 때문입니다. (일반적으로 종료 코드는 OS 가이 상황을 위해 특별히 예약 한 약간의 값입니다.) 그러나 정상적인 규칙이 정반대입니다 (예 : 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.
Shmuel H.

29

C, 44 43 38 36 바이트

바이트에 대한 @Downgoat 덕분에! 44를 넘었습니다.
@Neil에게 2 바이트 감사합니다!

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

원래 난 당신이 이동하여 바이트의 무리를 저장할 수 있습니다 제안 거라고 0의 아웃 ifdef하고, 변화 1!,하지만 난 생각 _WIN32+0더 나은 여전히 작동합니다.
Neil

c99가 정상이면 f를 main으로 변경 return 1;하고 ifdef 내부에 고정 하고 다른 것을 제거 할 수 있습니다 . c99에서 리턴하지 않은 main은 0을 리턴해야하기 때문입니다.
simon

11
이것이 컴파일러 지시어입니다. 예를 들어 Windows 시스템에서 컴파일되어 Linux 시스템에서 실행되는 경우 여전히 1을 반환합니다.
Micheal Johnson

4
@MichealJohnson 번호. 리눅스에서 (mingw32gcc msvc를 사용하여) 컴파일 할 수 있으며 snd는 Windows에서 실행될 때 true를 반환하는 코드를 얻습니다. Windows 호스팅 Linux 컴파일러를 모르겠습니다. "와인"과 같은 에뮬레이션 레이어를 논쟁하고 싶다면 다른 모든 대답은 아마 같은 문제를 겪을 것입니다
Jasen

1
WIN32가 방금 정의되었지만 0이 아닌 것으로 정의되어 있는지 확실하지 않습니다. 나중의 경우라면 그냥 말할 수 있습니다 #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_dump하고 gettype) 인덱싱하면 다른 곳에서 복사하거나 (연결도 가능) 함수 매개 변수로 사용하지 않는 한 오류가 발생합니다.

편집 :
<?=(__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에서도-TOS 용 PHP를 컴파일 한 사람은 의심 스럽습니다) 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의 파일 이름은 백 슬래시를 포함 할 수 있으므로 이것이 절대적인 것은 아닙니다. 그러나이 규칙은 그것이 완전하지 않아야한다고 말하지 않으므로 ¯ \ _ (ツ) _ / ¯
Jordan

@ 요르단 : 당신이 맞아요. 나는 그 정보를 설명에 추가했다. 감사.
Titus

4
대안 : <?=class_exists(COM);. 이 수업 COM은 내가 아는 한 Windows에서만 사용할 수 있습니다. 그것은 1 바이트를 절약해야합니다.
Ismael Miguel

@IsmaelMiguel 그것은 당신이 그것을 게시하는 다른 대답으로 충분합니다. (그러나 그렇게하는 것이 가치가 없을 수도 있습니다.이 답변은 매우 잘 쓰여져 있습니다.)
wizzwizz4

1
@ wizzwizz4 그만한 가치가 없습니다. 대답은 망각으로 밀려날 것입니다. 그래서 나는 내 자신의 대답을 쓰지 않고 단순히 의견을 남겼습니다.
Ismael Miguel

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

수학, 28 바이트

$OperatingSystem=="Windows"&

기능화의 요점은 무엇입니까? 앰퍼를 제거하고 1 바이트를 절약 할 수 있으며 코드는 Windows-ish 시스템에서 실행되는지 직접 평가합니다.
Ruslan

@Ruslan 모든 답변은 결과를 인쇄하는 전체 프로그램이거나 호출 가능한 기능이어야합니다. 이것이 Mathematica 노트북 답변으로 선언 되면 전체 프로그램이라고 부르지 않아도되지만 명령 줄 &에서을 호출하지 않으면 아무것도 인쇄하지 않으며 호출 가능한 함수도 아닙니다. , 단지 스 니펫 / 표현).
Martin Ender

@MartinEnder 실제로 출력이 없습니까? 나는 Out[1]= False이것으로부터 결과를 얻는다 :~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan

@Ruslan 나는 노트북 환경 (명령 줄 기반 환경)을 시작한다고 생각합니다. 명령 줄에서 프로그램을 실행한다는 것은 스크립트 모드를 사용하는 것입니다.
Martin Ender

13

자바 8, 33 바이트

제안하는 Olivier Grégoire separatorChar와 -1 바이트의 Kritixi Lithos에 특별한 감사를드립니다 !

부울을 반환하는 람다 식입니다. 로 지정 Supplier<Boolean> f = ...;하고 호출 할 수 있습니다 f.get().

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

온라인으로 사용해보십시오! -서버가 윈도우가 아니므로이 메시지가 인쇄false됩니다. 그러나 내 Windows 컴퓨터에서 동일한 코드가 인쇄true됩니다.

이 코드는 시스템의 파일 분리기를 가져 와서 해당 코드 포인트가 character보다 큰지 확인합니다 [. 이것은 분리 자로 사용되기 때문에 Windows의 경우에도 마찬가지입니다. \그러나 다른 모든 OS는 /ASCII 테이블에서 코드가 더 낮은를 사용 합니다.


W로 시작하는 다른 OS에서는 이것이 중단되지 않습니까?
Downgoat

()->java.io.File.separatorChar=='\\'36 바이트입니다.
Olivier Grégoire

1
@ OlivierGrégoire 좋은 것-그리고 나는 그것을 사용하여 34까지 골프를 칠 수 있습니다 ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, 후 닉스. 아마 훨씬 더.
Olivier Grégoire

3
@Titus 잠깐만, WAITS는 어떻습니까?
NoOneIsHere1

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
Keeta

64 비트 Windows 7에서 테스트되었으며 6을 반환합니다. 설명서가 상당히 오래된 것 같습니다.
Keeta

@Keeta 예 오래되었다고 생각하지만 Windows 10 64 비트에서 여전히 6을 반환했습니다.
마일

11

R, 15 바이트

.Platform$O>"v"

목록 요소 추출에 부분 일치를 사용하도록 제안한 plannapus 에게 감사합니다 .

.Platform는 R 내장 된 아래 플랫폼의 일부 세부 목록입니다. OS.type컴퓨터의 운영 체제 (패밀리)를 제공하는 문자열 인 요소 (이름이 "O"로 시작하는 유일한 요소)가 있습니다. "unix"또는 중 하나입니다 "windows".

따라서 "unix"그보다 "v"작지만 "windows"그보다 큽니다 "v". 다른 유효한 15 바이트 답변은 다음과 같습니다.

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

R은 Unix와 유사한 Windows 및 Mac 운영 체제 제품 군용으로 개발되고 있습니다 . 다른 OS 제품군은 지원되지 않습니다.


1
당신이 아는 윈도우가 아닌 유닉스 이외의 플랫폼이 있습니다 ...
Blue

2
@muddyfish : .Platform [[1]]은 R 문서에서 "unix"또는 "windows"로 정의됩니다. github.com/wch/r-source/blob/…
liori

죄송합니다. 그때는 괜찮습니다. 답변은 아마도 다시 요청되는 것을 막기 위해이 사실을 포함하도록 수정되어야합니다
Blue

10

펄, 11 바이트

print$^O=~MS

^O 리터럴 Control-O로 대체해야합니다.

1다른 OS에서는 아무것도 출력 하지 않고 Windows에서 출력 합니다.

sayPerl에서 진실한 후행 줄 바꿈을 추가하므로 사용하지 않습니다 .

primo 덕분에 -2 바이트 ais523 덕분에 -1 바이트 (및 잠재적 문제 수정)
-1 바이트


AFAIR Cygwin Perl에서는 작동하지 않습니다.
Igor Skochinsky

이것은 mingw Perl에서도 작동하지 않습니다. Perl은 Windows와는 별개의 운영 체제로 취급하지만 (일반적으로 Windows 규칙보다는 UNIX를 준수하므로) 질문의 목적으로 계산해야하는지 확실하지 않습니다. 다른 소식으로는 문자 대신 control-O 문자를 사용하여 여기에 바이트를 저장할 수 있습니다 ^O.

@ ais523 감사합니다. Cygwin과 Mingw의 경우 게시물을 Windows로 간주 해야하는 경우 게시물을 삭제하지만, 말하지만, 별도의 OS (또는 적어도 Windows가 아닌 OS)와 같은 것으로 간주하는 것이 더 합리적입니다.
Dada

정규식 구분 기호는 필요하지 $^O=~W않지만 반드시 일치 MS합니다. 또는을 일치시킬 수도 있습니다 $^X=~':'.
primo

@primo 맞습니다. 감사합니다. 나는 W그것으로 다른 OS를 모른다. 그래서 나는 W벌금을 확인하는 것을 가정 MS했다.
Dada

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에서 실행되지 않으므로 이것이 유효한지 확실하지 않습니다.
Igor Skochinsky

@IgorSkochinsky 조립을 위해 통역사가 있어야합니다.
Shmuel H.

당신은 떠나하여 코드도 단축 할 수 inc eaxint 0x80나는 그것이 창에 실패하고 프로세스를 종료한다고 생각합니다.
Shmuel H.

2
@IgorSkochinsky 원시 바이너리도 실행하는 프로그램이 있습니다. 이전 의견의 링크를 참조하십시오.
Shmuel H.

1
Boch 및 QEMU는 베어 메탈 환경을 시뮬레이션하고 호스트 OS에서 이진 코드를 실행하지 않습니다. 그래서 그들은 IMO를 사용할 수 없습니다. 그러나이 모든 것이 메타에 대한 토론이 될 수 있습니다.
Igor Skochinsky 2016 년

8

자바 스크립트, 42 30 26 25 바이트

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

Firefox로 테스트했습니다. (크롬은없는 oscpu속성을.) 소문자가 대문자보다 높은 문자 코드를 가지고 있기 때문에,이의 첫 글자에 따라 navigator.oscpu대문자 인 및 없다는 W , X , Y 또는 Z 모든 플랫폼에서 이외의 그 파이어 폭스 지원 ( 물론 Windows). 이 게시물 에 따르면 , 그 경우입니다.

편집

  1. Neil 덕분에 12 바이트를 절약했습니다 .
  2. 다른 4 바이트를 저장했습니다
  3. Blender 덕분에 다른 바이트를 저장했습니다 .

oscpu아마도 가장 짧은 navigator속성 일 것입니다 . 또한 정규 표현식을 테스트하는 것이 더 짧을 수도 있지만 측정하지는 않았습니다.
Neil

팻 화살표 바로 뒤에 오른쪽을 제거 !=-1하고 추가하여 ~3 바이트를 절약 할 수 있습니다 .
Luke

함수를 만들어야합니까? console.log정규식 테스트 만 할 수 있습니까 ? 또한 navigator.oscpu[0]=='W'작동하거나 W로 시작하는 다른 OS가

2
흠, 어떤 이유로 내 Chrome에는 oscpu가 없습니다.
Muzer

2
navigator.oscpu>'V'잘 작동합니다
Blender

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는 유닉스, 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 #의 입력 규칙은 내가 비교할 수 없다고 PlatformIDint직접적으로, 그리고 암시 적 캐스트에서 없다 PlatformIDint. 그러나 모든 열거 형에서 그 가치 명백한 캐스트가 있습니다. 여기에서 활용합니다.
Bob

1
@ MustafaAKTAŞ 또한 C # /. NET Framework / .NET Core를 대상으로하고 있음을 지적해야합니다. X 박스 하나에 그것은 다른 API를 사용 UWP 응용 프로그램을 실행 만 가능 제외한 System.Environment.OSVersion모든시를 . 이 문제를 해결하려면 UWP가 아닌 다른 모든 답변도 삭제해야합니다. 또한 Windows가 아닌 플랫폼에서 UWP 앱을 (현재) 실행할 수 없으므로 모든 것을 삭제할 수도 있습니다. 답이 0이고 대답 할 수없는 질문이 남습니다.
Bob

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

편집 : Windows라고 주장하는 대신 DOS를 무시하도록 수정되었습니다.

에만 나는 윈도우의 외부에 배치를 실행 알고 다른 방법은 기본적으로 매핑됩니다 WINE 사용하는 것입니다 Z:에를 /. 따라서 Z:\bin\sh존재하는 경우 /bin/shMS Windows가 아닌 가능성이 높습니다 .

WINE이 % OS %를 무엇으로 설정하는지 모르겠지만, 그렇지 않으면 Windows_NT23 바이트를 절약 할 수 있습니다.


1
다른 방법은 Windows가 아닌 DOS입니다.
Ruslan

DOS에서뿐만 아니라 Z :가 매핑 된 컴퓨터에서도 실패하고 이러한 경로가 포함됩니다.
Adám

1
적어도 WINE을 감지 하려고 합니다. WINE에서 실행될 때 다른 답변 중 어느 것도 올바른 결과를 제공하지 않습니다.
Neil

3
@ Adám은 물론 -DWIN32 = 1로 C 응답을 컴파일하면 실패합니다. 네 입장?
Neil

1
예, 와인 세트OS=Windows_NT
Jasen

7

Q 기본, 31 바이트

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

Windows에서는 0이 아닌 값을, 다른 모든 항목에는 0을 인쇄합니다.

COMSPECMicrosoft OS에 고유 한 환경 변수입니다. 일반적으로 command.com또는 명령 인터프리터를 가리 킵니다 cmd.exe. Windows에서 명령 인터프리터는 Windows 디렉토리 어딘가에 있습니다. MS-DOS에서는 DOS 디렉토리 나 디스크 루트에 있으며 다른 OS에서는 존재하지 않습니다.

값에 COMSPEC"W" 가 포함되어 있는지 확인하면 Windows와 Windows 이외의 차이점을 알 수 있습니다.


COMSPECLinux에서 특히 의미가있는 것은 아닙니다 (기본적으로 사용자 제어하에 있음을 의미). 사용자가 자신의 목적으로 사용하는 값으로 설정할 수 없으며 W)? 분명히, 그것은 약간의 경우입니다.

1
@ ais523 : 또한 Windows 디렉토리는 W를 포함 할 필요가 없습니다. 두 경우 모두 취하기 쉽습니다.
Joey

7

Node.js, 27 16 15 13 바이트

@Patrick 덕분에 Node의 REPL을 사용하여 솔루션에서 12 바이트 를 였습니다.

_=>os.EOL>`
`

독창적 인 솔루션 :

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

이것을로 변경하면 다음을 Node.js REPL사용하여 16 바이트를 절약 할 수 있습니다._=>path.sep!='/'
Patrick Roberts

저는 codegolf를 처음 사용합니다. 내가 할 수 있습니까?
GilZ

예, 그렇지 않으면 제안하지 않았을 것입니다. REPL은 node콘솔에 들어갈 때 실행되는 프로그램을 읽고, 실행하고, 인쇄 루프를 의미 합니다. 거기에서 모든 시스템 노드 모듈은 필요없이 사용할 수 require()있습니다.
Patrick Roberts

아 죄송합니다 나는 당신이 변화하여 다른 바이트를 저장할 수 있습니다 (11) 의미 !=>대한 ASCII 인덱스 이후 \ 92과 /47이다
패트릭 로버츠

7

Excel VBA, 41 40 30 29 26 24 바이트

true정보가 다른 출력으로 제한 mac되거나 Windows PC에서만 pcdos반환 true되므로 시스템의 OS 코드가 시작될 때 반환 되는 즉각적인 Windows 기능은 길이 3보다 깁니다.

?[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바이트를 절약합니다.
Neil

온라인으로 office365에서 사용해 보셨습니까? VBA도 지원합니까? 그냥 궁금해서
Chris H

@ChrisH 내 지식 office.com은 온라인 VBA 스크립팅을 지원하지 않습니다 (다른 사람이 더 잘 알고 있다면 저의 삶을 훨씬 쉽게 만들 수 있습니다). 그러나 O365를 사용하면 Office 2016 (또는 최신 버전)을 데스크톱에 다운로드 할 수있는 권한이 있으며 VBA 스크립팅을 지원합니다.
Taylor Scott

나는 지금까지 그것을 피하기 위해 관리했다; 당신의 의견은 계속 될 것으로 보입니다 (내가 사용하는 유일한 Windows 컴퓨터에는 사무실의 데스크탑 사본이 있으며 개인 컴퓨터는 모두 Linux입니다)
Chris H

1
@ Mego의 경로 구분자 트릭 ( ?Application.PathSeparator)="\"단일 문자이므로 32 일 것입니다)
Chris H

6

펄 6 ,  19  18 바이트

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

출력 True␤또는 False␤실행되는 시스템에 따라 다릅니다.


두 번째는 포함하지 않는 CWD의 비 창 값에 의존하는``- 그 보장은 없다
Jasen


4

tcl, 38 바이트

 expr [lsearch $tcl_platform windows]>0

4

PHP 17 바이트

다음은 windows이면 1을 출력하고 아무것도 없으면 아무것도 출력하지 않습니다. 문자열 변환 통지를 무시합니다.

<?=PHP_OS==WINNT;

샌드 박스는 PoC 용 Linux이므로 온라인 Linux 테스트를 사용해보십시오 .


충분합니다? 가능한 값 때문에 묻는 : PHP_OS .
manatwork

1
'<? = PHP_OS [0] == W;`는 1 바이트 더 짧으며 manatwork로 연결된 질문의 다른 모든 창 값을 포착합니다. >V작동 할 수도 있습니다.
user59178

manatwork는 PHP가 컴파일 된 Windows 버전에 따라 다릅니다. Windows Visa \ 7 이후 Windows NT 버전은 NT Authority Kernel로 인해 WINNT로 표시되었습니다. Windows XP 이하 버전은 WIN32 였고 Windows Server 2003은 Windows였습니다.
DrWhat

4

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

}

그것은 편집하기 전에 링크하는 초기 답변과 매우 유사합니다.
Olivier Grégoire

왜 안돼 .contains("W")?
Cyoce

@Cyoce 실제로 변수 OS는 Windows에 특정한 것으로 보입니다.

4

하스켈, 39 31 바이트

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

"m"의 첫 번째 문자 출력을 확인합니다. 이는 Windows의 경우 "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

@ Mego 당신 말이 맞아요
Dylan Meeus

4

bash + coreutils, 5 바이트

rm $0

대부분의 다른 POSIXy 쉘에서도 작동합니다. (이것은 Windows 포트가 bash있으며 rm존재합니다. 더 많은 POSIXy 운영 체제에서만 일반적으로 사용 되더라도 완전히 빈번한 항목은 아닙니다.) 종료 코드를 통한 출력 (0 = false, 1 = true). 파일 이름 (예 :)을 사용할 수있는 경우 4 바이트로 계산할 수 있습니다 rm a. 매우 이상한 파일 이름의 경우 잠재적으로 실패 할 수 있습니다 ( rm따옴표가 없기 때문에 인수로 해석하고 관심있는 파일을 삭제할 수 있으므로 이상한 이름의 파일 에서이 프로그램을 실행하지 않는 것이 좋습니다) ).

참고 : 부작용으로 디스크에서 프로그램을 삭제하거나 최소한 시도합니다. Windows에서 실행중인 경우 OS는 실행중인 파일 (Windows가 기본적으로 또는 전체 중지를 허용하지 않는 작업)을 삭제하지 못하므로 rm오류가 발생합니다. bash오류를 잡아서 종료 코드로 변환합니다 (따라서 프로그램 전체가 정상적으로 종료됩니다). 여기에있는 대부분의 다른 항목은 종료 코드에서 0을 거짓으로 사용하고 1을 진실로 사용하므로 동일하게 수행됩니다. 주의 bash의의 ' if문이 전혀 정수를 (오히려 그것을 받아들이는 허용하지 않습니다 명령이 성공적 실행 여부에 따라 분기를하고, 연산 테스트는 같은 프로그램의 수단을 통해 이루어집니다test(실패한 비교에서 의도적으로 "충돌"을보고하는)), 이는 에서 0이 유효한 언어로 종료 코드를 통해 출력 프로그램보다 합법성 측면에서 흔들릴 수 있습니다if진술 테스트 및 프로그램을 else지점으로 보냅니다 .


4

8 번째 , 11 바이트

 
os 1- not .
 

trueWindows, falseLinux 및 macOS에서 인쇄 합니다 . 8th가 지원하는 다른 플랫폼은 Android, iOS 및 Raspberry Pi이지만 테스트 할 수는 없습니다.

Ungolfed 버전 (댓글 포함)

 
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

파이썬 3 (13 바이트)

import winreg

Windows에서는 종료 코드 0 (일반적으로 쉘에서는 true), 그렇지 않으면 0이 아닌 종료 코드로 리턴합니다.

다른 방법으로 선호한다면 12 바이트 솔루션이 import posix있습니다.


winreg.py같은 디렉토리에 파일이 있으면 작동하지 않을 것이라고 생각합니다 .
Zacharý

1
또한 규칙에 따라 : "플랫폼에서 실행 / 컴파일에 실패한 코드는 잘못된 값으로 간주되지 않습니다."
Zacharý

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에서 백엔드 (가정이라고 가정)는 유닉스 운영 체제이므로 잘못된 값만 얻을 수 있습니다. 내 컴퓨터에 PC 메시지가 나타납니다.


이것이 오류 메시지 (응답을 무효화 할 것)로 간주되는지 100 % 확실하지는 않지만, 이것에 대해 모른다면 아마도 웃을만한 가치가 있습니다.


세상은 어떻게
되었습니까

@avaragecoder PYTHON GREAT를 다시 만드십시오!
매직 문어 Urn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.