Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Yes it is exactly what you think.

Challenge

Create a program that returns a truthy value when run on Microsoft Windows (for simplicity we'll stick with Windows 7, 8.1 and 10) and a falsey value when run on any other operating system (OSX, FreeBSD, Linux).

Rules

  • Code that fails to run/compile on a platform doesn't count as a falsey value.

Winning criteria

I'm labelling this as , so lowest score wins, but I'm also very interested in seeing creative solutions to this problem.

share|improve this question
4  
Can the programs output by exit code? (normally allowed) – FlipTack 11 hours ago
    
I'm gonna say yes @FlipTack – Daniel 9 hours ago
5  
Can you give a definite list of which operating systems this needs to work on? – FlipTack 8 hours ago
    
is True␤ and False␤ valid outputs? – Brad Gilbert b2gills 7 hours ago
    
What should the result be under Windows RT? – Adám 4 hours ago

26 Answers 26

MATLAB, 4 bytes

ispc

From the documentation:

tf = ispc returns logical 1 (true) if the version of MATLAB® software is for the Microsoft® Windows® platform. Otherwise, it returns logical 0 (false).

There are also the functions ismac and isunix. I'll leave it to the reader to figure out what those functions do. Mego kindly asked for diagrams explaining ismac and isunix so I've tried to illustrate it here:

enter image description here

It was not asked for a diagram of ispc but I can reveal that the behaviour is pretty similar, except substitute OSX and Unix with Windows.

share|improve this answer
17  
I don't get it... What do ismac and isunix do? Diagrams would be helpful. :P – Mego 11 hours ago
28  
@Mego, are the diagrams helpful enough? Please let me know if further explanations are needed. – Stewie Griffin 10 hours ago
10  
Perfect, I can understand it clearly now. – Mego 10 hours ago
4  
@z0rberg's It does, though. ispc is truthy iff the Matlab installation is for MS Windows. Though it could be run on WINE and still be truthy - I'd consider that "running on MS Windows", since WINE is a Windows compatibility layer. The same thing goes for WSL in Windows 10 - you're actually running Linux (in/with Windows), so it should be false. – Mego 8 hours ago
1  
What about MacOS? How do I tell if I'm on that system? Your diagram confuses me! – enderland 7 hours ago

Python 2.7, 24 bytes

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

Thanks to FlipTack for 3 bytes

This program takes advantage of the fact that Windows is the only OS to use \ as a path separator. Normally this is frustrating and bad, but for once it is actually an advantage. On Windows, '['>os.sep is false, and thus 0/0 is computed, causing a ZeroDivisionError and exiting with a non-zero exit code. On non-Windows platforms, '['>os.sep is true, making the expression 0/1, which does nothing, and the program exits with exit code 0.

share|improve this answer
    
DOS also uses a backslash as the path separator and it has at least one Python 2 implementation. – isanae 7 hours ago
1  
@isanae I've edited the title to specify Python 2.7 - the only Python 2 implementation on DOS is an archaic, buggy 2.4.2 – Mego 7 hours ago
    
OS/2 also uses a backslash and has a Python 2.7 implementation ;) – isanae 7 hours ago
    
@isanae The only Python 2 port I see for OS/2 is 2.4.4: python.org/download/other – Mego 7 hours ago
    
This port is 2.7.5. – isanae 7 hours ago

PHP, 22 bytes

`<?=PATH_SEPARATOR>":";`  

prints 1 if the path separator is semicolon (colon or empty for all other OSs except for DOS and OS/2), else nothing.

also 22 bytes, but not that safe:

<?=strpos(__FILE__,92);

prints a positive integer if the file path contains a backslash; else nothing.
A safe alternative with 27 bytes: <?=DIRECTORY_SEPARATOR>"/"; prints 1 or nothing.

Strange: <?=__FILE__[1]==":"; (20 bytes) should be, not safe either, but ok. But although __FILE__ pretends to be a string (I tried var_dump and gettype), indexing it throws an error (at least in online testers).
I´ll try it on my server tomorrow. Will someone test it on Windows?

27 bytes: <?=stripos(PHP_OS,win)===0;
tests if predefined PHP_OS constant starts with win (case insensitive; Windows,WIN32,WINNT, but not CYGWIN or Darwin); prints 1 for Windows, else nothing.

17/18 bytes:

<?=strlen("
")-1;

prints 1 if it was stored with Windows linebreak (also on DOS, OS/2 and Atari TOS - although I doubt that anyone ever compiled PHP for TOS), else 0.

You could also check the constant PHP_EOL.

more options:

PHP_SHLIB_SUFFIX is dll on Windows, but not necessarily only there.
php_uname() returns info on the operating system and more; starts with Windows for Windows.
$_SERVER['HTTP_USER_AGENT'] will contain Windows when called in a browser on Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD); (38 bytes) works in PHP>=5.3

conclusion

The only failsafe way to tell if it´s really Windows, not anything looking like it, seems to be a check on the OS name. For PHP: php_os() may be disabled for security reasons; but PHP_OS will probably always contain the desired info.

share|improve this answer
3  
File names on *nix can contain backslashes, so this isn't really foolproof. The rules don't say it has to be foolproof, though, so ¯\_(ツ)_/¯ – Jordan 8 hours ago
    
@Jordan: You´re right. I added that info to the description. Thanks. – Titus 7 hours ago
    
An alternative: <?=class_exists(COM);. The class COM is only available under Windows, as far as I know. That should save you one byte. – Ismael Miguel 1 hour ago

C, 44 43 38 36 bytes

Thanks to @Downgoat for a byte! crossed out 44 is still regular 44
Thanks to @Neil for two bytes!

f(){return
#ifdef WIN32
!
#endif
0;}
share|improve this answer
    
Originally I was going to suggest that you can save a bunch of bytes by moving the 0 out of the ifdef and changing the 1 to !, but I think _WIN32+0 works even better still. – Neil 9 hours ago
    
If c99 is OK you can change f to main and stick return 1; inside the ifdef and remove the else, since main without return in c99 must return 0. – gurka 9 hours ago
2  
That's a compiler directive. If it's compiled on a Windows system and run on a Linux system, for example, it will still return 1. – Micheal Johnson 8 hours ago
    
Do you need _ in WIN32? I never added it on my code – Downgoat 8 hours ago
    
@Neil, "Code that fails to run/compile on a platform doesn't count as a falsey value.", it won't compile on a Linux/macOS/etc system (TIO link, click debug). – betseg 7 hours ago

Mathematica, 28 bytes

$OperatingSystem=="Windows"&
share|improve this answer
    
What's the point in making it a function? You could remove the ampersand saving one byte, and the code would just directly evaluate whether it's executed is on a Windows-ish system. – Ruslan 5 hours ago
    
@Ruslan All answers must be either full programs that print the result or callable functions. If this is declared a Mathematica notebook answer, then you might get away with calling it a full program, but if I invoke the thing from the command-line without the &, it won't print anything (and it's then also not a callable function, but merely a snippet/expression). – Martin Ender 4 hours ago
    
@MartinEnder Really no output? I get Out[1]= False output from this: ~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"' – Ruslan 4 hours ago
    
@Ruslan I believe that also starts a notebook environment (just a command-line based one). What I mean by running a program from the command-line is using script mode. – Martin Ender 3 hours ago

Java 8, 33 bytes

Special thanks to Olivier Grégoire for suggesting separatorChar, and Kritixi Lithos for -1 byte!

This is a lambda expression which returns a boolean. This can be assigned to Supplier<Boolean> f = ...; and called with f.get().

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

Try it online! - the server isn't windows, so this prints false. However, in my windows machine, the same code prints true.

What this code does is get the System's file seperator, and check whether its codepoint is larger than the character [. This true for Windows, as it uses \ as the seperator - but every other OS uses /, which has a lower code in the ASCII table.

share|improve this answer
    
Won't this break on other OSes which start with W? – Downgoat 8 hours ago
    
()->java.io.File.separatorChar=='\\' is only 36 bytes. – Olivier Grégoire 8 hours ago
1  
@OlivierGrégoire nice one - and I can golf it to 34 using ()->java.io.File.separatorChar>'['! – FlipTack 8 hours ago
    
I think you can golf this using >90 instead of >'[' tio.run/nexus/… – Kritixi Lithos 7 hours ago
    
@KritixiLithos thanks, don't know why I didn't remember that... – FlipTack 7 hours ago

J, 7 bytes

6=9!:12

This is a verb (similar to a function) that uses the builtin foreign conjunction 9!:12 to acquire the system type where 5 is Unix and 6 is Windows32.

share|improve this answer

Befunge-98, 7 bytes

6y2%!.@

Try it online!

This works by querying the system path separator, which is \ on Windows and / on other operating systems.

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.
share|improve this answer

Perl, 15 bytes

print$^O=~/Win/

Outputs 1 on windows, nothing on another OS.

Note that I'm not using say as it adds a trailing newline, which is truthy in Perl.

share|improve this answer

Batch, 50 bytes

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

Edit: Fixed to ignore DOS instead of claiming that it's Windows.

The only other way I know of running Batch outside of Windows is to use WINE which by default will map Z: to /. Therefore if Z:\bin\sh exists, chances are that it's /bin/sh, so not MS Windows.

I don't know what WINE sets %OS% to, but if it's not Windows_NT then I could save 23 bytes.

share|improve this answer
1  
Another way is DOS, which is not Windows. – Ruslan 5 hours ago
    
Not only does this fail under DOS, but also, on a computer where Z: is mapped, and happens to contain such a path. – Adám 4 hours ago
    
This doesn't work if cygwin is install to the root of drive Z: – DavidPostill 4 hours ago
    
At least I'm trying to detect WINE. None of the other answers will give the correct result when run under WINE either. – Neil 4 hours ago
    
DOS: set OS=Windows_NT & subst Z: C:\ & mkdir Z:\bin & echo X > Z:\bin\sh. – Adám 4 hours ago

Node.js, 27 bytes

_=>require('path').sep!='/'
share|improve this answer

Perl 6,  19  18 bytes

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

Both output True␤ or False␤ depending on the system it is run on.

share|improve this answer

julia, 10 bytes

is_windows

A function that returns true for windows

share|improve this answer

JavaScript, 42 30 bytes

console.log((
//Begin
_=>/Win/.test(navigator.oscpu)
//End
)())

Edit: saved 12 bytes thanks to Neil.

share|improve this answer
    
oscpu is probably the shortest navigator property that you can use. Also, testing a regexp will probably work out shorter, but I haven't measured it. – Neil 9 hours ago
    
You can remove !=-1 and add a ~ right after the fat arrow, saving 3 bytes. – L. Serné 7 hours ago

Excel VBA, 41 Bytes

Immediate windows function that returns if the true if the name of the operating system starts with W. This will only ever be true on Windows based systems as Excel VBA is restricted to Windows and OSX.

?mid(Application.OperatingSystem,1,1)="W"
share|improve this answer

R, 21 byte

el(.Platform)!="unix"
share|improve this answer
1  
there are platforms other than unix that aren't windows you know... – muddyfish 3 hours ago
    
@muddyfish: .Platform[[1]] is defined as either "unix" or "windows" in R documentation. github.com/wch/r-source/blob/… – liori 2 hours ago
    
Sorry, that's ok then. The answer should probably be modified to include this fact to stop that being asked again – muddyfish 1 hour ago

Haskell, 32 bytes

import System.Info
f=os=="mingw"
share|improve this answer
1  
On my system (Windows 10 64-bit, GHC 8.0.1 64-bit), os gives "mingw32". – Mego 7 hours ago

tcl, 51

puts [string match windows $tcl_platform(platform)]

I don't have a Windows machine online, but on http://rextester.com/live/OVTY1488 replace windows by unix to see it output 1 instead of 0.

2nd attempt:

tcl, 40

puts [string match W* $tcl_platform(os)]

assuming Windows is the only system the name begins on a W.

3rd attempt:

tcl, 26

puts [info exists env(OS)]

assuming Windows is the only system the OS environment variable is defined.

share|improve this answer

tcl, 38 bytes

 expr [lsearch $tcl_platform windows]>0
share|improve this answer

PHP 17 Bytes

The following will output 1 if windows and nothing if anything else. Ignoring notices of string convertion.

<?=PHP_OS==WINNT;

Try online Online tests for linux because the sandbox is linux for PoC.

share|improve this answer

FPC, 65 chars

begin{$ifdef win32}writeln('f');{$else}writeln('nf');{$endif}end;
share|improve this answer

8th, 11 characters

 
os 1- not .
 

Ungolfed version (with comments)

 
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
 
share|improve this answer

Dyalog APL, 21 bytes

'W'=⊃⊃⎕WG'APLVersion'

⎕WG'APLVersion' system function Windows Get property APL Version

pick the first element (Target Environment)

pick the first letter (Windows/Linux/AIX/Solaris)

'W'= W equal to that letter?

share|improve this answer

Java 8, 49 bytes

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

Longer than the other Java answer, but takes a different approach.

This lambda fits in a Supplier<Boolean> and can be tested with the following program:

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

}
share|improve this answer

Vim, 2 bytes

<C-a>1

On Windows, <C-a> (ctrl+a) is mapped by default to Select All. If you type a 1 in select mode in Windows, it replaces the selection with what you typed (1) leaving a 1 in the buffer.

On other operating systems, <C-a> by default is mapped to Increment number. Because there's no number to increment, it's a no-op, and then the 1 increases the count but in terms of the buffer is a no-op.

1 is truthy in Vim, and an empty string is falsy

share

FPC, 71 chars

begin
{$ifdef win32}
writeln('f');
{$else}
writeln('nf');
{$endif}
end;
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.