Detectar MS Windows

80

Desafío

Cree un programa que devuelva un valor verdadero cuando se ejecuta en Microsoft Windows (por simplicidad nos quedaremos con Windows 7, 8.1 y 10) y un valor falso cuando se ejecuta en cualquier otro sistema operativo (OSX, FreeBSD, Linux).

Reglas

  • El código que no se ejecuta / compila en una plataforma no cuenta como un valor falso.

Criterios ganadores

Estoy etiquetando esto como , por lo que gana la puntuación más baja, pero también estoy muy interesado en ver soluciones creativas a este problema.

Daniel
fuente
77
¿Los programas pueden salir por código de salida? ( normalmente permitido )
FlipTack
13
¿Puede dar una lista definitiva de los sistemas operativos en los que esto necesita trabajar?
FlipTack
2
¿Cuál debería ser el resultado en Windows RT?
Adám
66
Es posible que desee especificar algunos sistemas específicos que no son de Windows que deben ser compatibles. Hay algunos debates en los comentarios sobre cosas como DOS y OS2.
jpmc26
2
Probablemente necesitemos un consenso sobre lo que cuenta como verdadero y falso para los códigos de salida; la convención normal es 0 para verdadero y cualquier otra cosa para falso, pero muchas respuestas lo tratan como lo contrario, y la definición de "declaración if" obviamente no se aplica.

Respuestas:

77

Vim, 2 bytes

<C-a>1

En Windows, <C-a>(ctrl + a) se asigna de forma predeterminada a Select All. Si escribe un 1modo de selección en Windows, reemplaza la selección con lo que escribió (1) dejando un 1 en el búfer.

En otros sistemas operativos, <C-a>de forma predeterminada se asigna a Increment number. Debido a que no hay un número para incrementar, es un no-op, y luego el 1 aumenta el conteo, pero en términos del búfer es un no-op.

1 es verdadero en Vim, y una cadena vacía es falsa

nmjcman101
fuente
Parece 3 pulsaciones de teclas. Ctrl + a + 1
Pavel
12
Creo que según esta meta publicación meta.codegolf.stackexchange.com/questions/8995/… Las respuestas de Vim generalmente se puntúan sin los modificadores (especialmente dado que la primera respuesta en la publicación usa <ctrl + a> como ejemplo para 1 byte)
nmjcman101
44
@Pavel es Ctrl + a, 1. Si lo fuera Ctrl + a + 1, se contaría como 1 pulsación de tecla.
Capitán Man el
77
Hermosa, me encanta esta respuesta!
DJMcMayhem
Eso es bastante elegante, me gusta.
Dan
109

MATLAB, 4 bytes

ispc

De la documentación :

tf = ispcdevuelve 1 lógico (verdadero) si la versión del software MATLAB® es para la plataforma Microsoft® Windows®. De lo contrario, devuelve 0 lógico (falso).

También están las funciones ismacy isunix. Le dejaré al lector que descubra qué hacen esas funciones. Mego amablemente pidió diagramas para explicar ismacy isunixpor lo que he tratado de ilustrar aquí:

ingrese la descripción de la imagen aquí

No se le pidió un diagrama de, ispcpero puedo revelar que el comportamiento es bastante similar, excepto sustituto OSXy Unixcon Windows.


Segundo enfoque:

Aquí hay un segundo enfoque con el getenvuso de 23 bytes que deberían ser a prueba de balas, a menos que haya otro sistema operativo que comience con W:

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

getenv 'name'busca en la lista del entorno del sistema operativo subyacente el texto del formulario name=value, donde se nameencuentra el vector de caracteres de entrada. Si se encuentra, MATLAB® devuelve el valor del vector de caracteres. Si no se puede encontrar el nombre especificado, se devuelve una matriz vacía.

Stewie Griffin
fuente
44
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Dennis
55

Python 2.7.10 , 24 bytes

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

Gracias a FlipTack por 3 bytes

Este programa aprovecha el hecho de que Windows es el único sistema operativo que se utiliza \como separador de ruta. Normalmente esto es frustrante y malo, pero por una vez es realmente una ventaja. En Windows, '['>os.sepes falso y, por lo tanto, 0/0se calcula, provocando una ZeroDivisionErrorsalida y un código de salida distinto de cero. En plataformas que no son Windows, '['>os.sepes cierto, haciendo la expresión 0/1, que no hace nada, y el programa sale con el código de salida 0.

Mego
fuente
DOS también usa una barra diagonal inversa como separador de ruta y tiene al menos una implementación de Python 2.
isanae
55
@isanae He editado el título para especificar Python 2.7: la única implementación de Python 2 en DOS es un arcaico y defectuoso 2.4.2
Mego
OS / 2 también usa una barra diagonal inversa y tiene una implementación Python 2.7;)
isanae
99
@isanae Allí, especifiqué 2.7.10. Buena suerte encontrando un puerto de eso.
Mego
2
Al parecer, sólo tiene que dar resultados correctos en 3 versiones de Windows más recientes y, presumiblemente, de manera similar recientes versios de los otros tres sistemas mencionados, OS2 y DOS no importan,
Jasen
45

Ensamblaje x86, 7 bytes (inspirado por la respuesta de Runemoro )

31 DB 89 D8 40 CD 80

O

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

Descripción

En primer lugar, vamos a establecer eaxa 1(el número de llamadas al sistema para exit(int val)para Linux, FreeBSDy OSX). Luego, llamaremos a la puerta de interrupción, 0x80que es la puerta de llamada del sistema Linux, FreeBSDy OSX. Eso haría que el programa salga con el estado de ebxque es 0( false).

En Windows int 0x80es una puerta inválida (se usa 2ecomo puerta syscall) y bloqueará el programa, haciendo que termine con un código de salida positivo ( true).

Editar: no funcionaría OSXya que tiene una convención de paso de argumento diferente en 32 bits (por la pila).

Referencias y lecturas adicionales

Shmuel H.
fuente
3
¡Eso es brillante!
z0rberg's
¿Por qué el accidente tiene un valor verdadero? ¿Es porque EAX (generalmente el valor de retorno) es 1? Además, ¿se garantiza que EAX será 0 al inicio del programa? ¿O necesitas xor eax, eaxallí?
Cole Johnson
3
@ColeJohnson: los bloqueos detectados por el sistema operativo (en los sistemas operativos que generalmente se usan con x86) nunca dejan un código de salida de 0, porque está reservado para una terminación exitosa. (Normalmente, el código de salida es un valor inestable que el sistema operativo reserva específicamente para esta circunstancia). Sin embargo, no estoy seguro de que tenga sentido contar 0 como falsey y 1 como verdadero en los códigos de salida del programa, dado que la convención normal es la exactamente opuesto (con 0 siendo el único valor verdadero, por ejemplo, el programa UNIX / Linux / POSIX estándar falsesale con el código 1 mientras que truesale con el código 0).
1
Esta respuesta asume implícitamente que los registros eaxy ebxse borran a cero en el inicio del programa (en un sistema que no es Windows), lo cual no está garantizado si recuerdo correctamente. También asume explícitamente que la convención de aprobación de argumentos syscall para Linux coincide con la de FreeBSD y OSX, lo que sería realmente sorprendente.
zwol
1
@ Sebastian-LaurenţiuPlesciuc Buena pregunta. mov eax, 1se traduciría a \xB8\x01\x00\x00\x00, que es mucho más larga que sólo mover registro y llamadas inc.
Shmuel H.
29

C, 44 43 38 36 bytes

¡Gracias a @Downgoat por un byte! tachado 44 sigue siendo regular 44 ¡
Gracias a @Neil por dos bytes!

f(){return
#ifdef WIN32
!
#endif
0;}
Betseg
fuente
Originalmente, iba a sugerir que puede guardar un montón de bytes moviendo 0el ifdefy cambiando el 1a !, pero creo que _WIN32+0funciona aún mejor.
Neil
Si c99 está bien, puede cambiar f a main y pegarse return 1;dentro de ifdef y eliminar lo demás, ya que main sin return en c99 debe devolver 0.
simon
11
Esa es una directiva del compilador. Si se compila en un sistema Windows y se ejecuta en un sistema Linux, por ejemplo, todavía devolverá 1.
Micheal Johnson
44
@MichealJohnson no. Puedo compilarlo en Linux (usando mingw32gcc msvc) y obtener el código que devuelve verdadero cuando se ejecuta en Windows. No conozco ningún compilador de Linux alojado en Windows. si quieres discutir las capas de emulación como "vino", todas las otras respuestas probablemente sufran el mismo problema
Jasen el
1
No estoy seguro si WIN32 se acaba de definir, pero se define como distinto de cero Si es el caso posterior, solo puede decir #if WIN32. En ventanas que no son Windows, dado que WIN32 no está definido, el preprocesador debe tratarlo como 0.
Shahbaz
27

PHP, 22 bytes

`<?=PATH_SEPARATOR>":";`  

se imprime 1si el separador de ruta es punto y coma (dos puntos o vacío para todos los demás sistemas operativos excepto DOS y OS / 2), de lo contrario, nada.

También 22 bytes , pero no es tan seguro:

<?=strpos(__FILE__,92);

imprime un entero positivo si la ruta del archivo contiene una barra invertida; de lo contrario nada.
Una alternativa segura con 27 bytes : <?=DIRECTORY_SEPARATOR>"/";impresiones 1o nada.

Un hallazgo extraño : <?=__FILE__[1]==":";( 20 bytes ) debería ser, tampoco seguro, pero está bien. Pero aunque __FILE__pretende ser una cadena (lo intenté var_dumpy gettype), indexarlo arroja un error, a menos que lo copie en otro lugar (la concatenación también funciona) o lo use como un parámetro de función.

Editar:
<?=(__FILE__)[1]==":";(también 22 bytes ) funciona en PHP 7; pero eso se debe a que los paréntesis copian el valor de la constante en una variable temporal.

27 bytes : <?=stripos(PHP_OS,win)===0;
comprueba si la PHP_OSconstante predefinida comienza con win(mayúsculas y minúsculas; Windows, WIN32, WINNT, pero no CYGWIN o Darwin); impresiones 1para Windows, de lo contrario nada.

17/18 bytes :

<?=strlen("
")-1;

imprime 1si se almacenó con Windows linebreak (también en DOS, OS / 2 y Atari TOS, aunque dudo que alguien haya compilado PHP para TOS), de lo contrario 0.

También puede verificar la constante PHP_EOL.

mas opciones:

PHP_SHLIB_SUFFIXestá dllen Windows, pero no necesariamente solo allí.
php_uname()devuelve información sobre el sistema operativo y más; comienza con Windowspara Windows.
$_SERVER['HTTP_USER_AGENT']contendrá Windowscuando se llame en un navegador en Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 bytes) funciona en PHP> = 5.3

conclusión

La única forma segura de saber si realmente es Windows, y no nada parecido, es verificar el nombre del sistema operativo. Para PHP: php_os()puede deshabilitarse por razones de seguridad; pero PHP_OSprobablemente siempre contendrá la información deseada.

Titus
fuente
44
Los nombres de archivo en * nix pueden contener barras invertidas, por lo que esto no es realmente infalible. Sin embargo, las reglas no dicen que tenga que ser infalible, así que ¯ \ _ (ツ) _ / ¯
Jordania
@ Jordan: Tienes razón. Agregué esa información a la descripción. Gracias.
Titus
44
Una alternativa: <?=class_exists(COM);. La clase COMsolo está disponible en Windows, que yo sepa. Eso debería ahorrarte un byte.
Ismael Miguel
@IsmaelMiguel Esa es una respuesta suficiente para que puedas publicarla como tal. (Sin embargo, puede que no valga la pena hacerlo; esta respuesta está muy bien escrita.)
wizzwizz4
1
@ wizzwizz4 No vale la pena. La respuesta sería llevada al olvido. Es por eso que simplemente dejé el comentario, en lugar de escribir mi propia respuesta.
Ismael Miguel
16

Befunge-98, 7 bytes

6y2%!.@

Pruébalo en línea!

Esto funciona consultando el separador de ruta del sistema, que está \en Windows y /en otros sistemas operativos.

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
fuente
15

Mathematica, 28 bytes

$OperatingSystem=="Windows"&
alephalpha
fuente
¿Cuál es el punto de hacerlo una función? Puede eliminar el ampers y guardar un byte, y el código solo evaluaría directamente si se ejecuta en un sistema Windows-ish.
Ruslan
@Ruslan Todas las respuestas deben ser programas completos que impriman el resultado o funciones invocables. Si esto se declara una respuesta del cuaderno de Mathematica, entonces podría salirse con la suya de llamarlo un programa completo, pero si invoco la cosa desde la línea de comandos sin el &, no imprimirá nada (y tampoco es una función invocable , pero simplemente un fragmento / expresión).
Martin Ender
@MartinEnder ¿Realmente no hay salida? Me sale Out[1]= Falsede esto:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan
@Ruslan Creo que también se inicia un entorno portátil (solo uno basado en la línea de comandos). Lo que quiero decir al ejecutar un programa desde la línea de comandos es usar el modo script.
Martin Ender
13

Java 8, 33 bytes

¡Un agradecimiento especial a Olivier Grégoire por sugerir separatorChar, y Kritixi Lithos por -1 byte!

Esta es una expresión lambda que devuelve un valor booleano. Esto se puede asignar Supplier<Boolean> f = ...;y llamar con f.get().

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

Pruébalo en línea! - el servidor no es Windows, así que esto se imprimefalse. Sin embargo, en mi máquina Windows, se imprime el mismo códigotrue.

Lo que hace este código es obtener el separador de archivos del sistema y verificar si su punto de código es más grande que el carácter [. Esto es cierto para Windows, ya que se usa \como separador, pero cualquier otro sistema operativo usa /, que tiene un código más bajo en la tabla ASCII.

FlipTack
fuente
¿No se romperá esto en otros sistemas operativos que comienzan con W?
Downgoat
()->java.io.File.separatorChar=='\\'tiene solo 36 bytes.
Olivier Grégoire
1
@ OlivierGrégoire agradable - y puedo jugar golf a 34 usando ()->java.io.File.separatorChar>'['!
FlipTack
2
@Titus WebOS, Whonix. Probablemente aún más.
Olivier Grégoire
3
@Titus Espera, ¿qué pasa con WAITS ?
NoOneIsHere
11

J, 7 bytes

6=9!:12

Este es un verbo (similar a una función) que utiliza la conjunción extranjera incorporada 9!:12para adquirir el tipo de sistema donde 5 es Unix y 6 es Windows32.

millas
fuente
J La documentación oficial muestra que devuelve este valor para Windows más antiguo. "6 Windows32 (95/98/2000 / NT)" ¿Es necesario actualizar la documentación? ¿Qué sucede cuando es Windows de 64 bits? jsoftware.com/help/dictionary/dx009.htm
Keeta
Probado en Windows 7 de 64 bits y devuelve un 6. La documentación parece ser bastante antigua.
Keeta
@Keeta Sí, creo que es antiguo, pero aún así me devolvió un 6 en Windows 10 de 64 bits.
millas
11

R, 15 bytes

.Platform$O>"v"

Gracias a plannapus por la sugerencia de utilizar una coincidencia parcial para la extracción de elementos de lista.

.Platform es una lista con algunos detalles de la plataforma bajo la cual se construyó R. Hay un elemento OS.type(el único elemento con nombre que comienza con "O") que es una cadena de caracteres, que proporciona el sistema operativo (familia) de la computadora. Uno de "unix"o "windows".

Entonces "unix"es menor entonces "v", pero "windows"es mayor entonces "v". Otras respuestas válidas de 15 bytes son

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

R se está desarrollando para las familias de sistemas operativos tipo Unix, Windows y Mac . No se admiten otras familias de sistemas operativos.

djhurio
fuente
1
hay plataformas que no sean UNIX que no son ventanas que conoces ...
Azul
2
@muddyfish: .Platform [[1]] se define como "unix" o "windows" en la documentación de R. github.com/wch/r-source/blob/…
liori
Lo siento, está bien entonces. La respuesta probablemente debería modificarse para incluir este hecho para evitar que se vuelva a preguntar
Azul
10

Perl, 11 bytes

print$^O=~MS

^O debe ser reemplazado por un Control-O literal.

Salidas 1en Windows, nada en otro sistema operativo.

Tenga en cuenta que no estoy usando, sayya que agrega una nueva línea final, lo cual es cierto en Perl.

-2 bytes gracias a primo. (y problemas potenciales corregidos)
-1 bytes gracias a ais523.

Dada
fuente
AFAIR esto no funcionará en Cygwin Perl.
Igor Skochinsky
Esto tampoco funcionará en mingw Perl. Sin embargo, Perl trata a ambos como sistemas operativos distintos de Windows (ya que generalmente obedecen a UNIX en lugar de las convenciones de Windows), y no está claro si deberían contar para el propósito de la pregunta. En otras noticias, puede guardar un byte aquí utilizando un carácter de control O literal en lugar de ^O.
@ ais523 Edité eso, gracias. En cuanto a Cygwin y Mingw, eliminaré la publicación si deben considerarse como Windows, pero como usted dice, tendría más sentido considerarlos como un sistema operativo separado (o al menos, como un sistema operativo no Windows).
Dada
Los delimitadores de expresiones regulares no deberían ser necesarios $^O=~W, aunque probablemente coincida con ellos MS. Alternativamente, también podría coincidir $^X=~':'.
primo
@primo bien, gracias. No conozco ningún otro sistema operativo con un W, así que asumí que estaba buscando un Wbien ... ¿alguna razón por la que sugieres MS?
Dada
9

julia, 10 bytes

is_windows

Una función que devuelve verdadero para windows

rahnema1
fuente
9

código de máquina x86, 9 bytes

40 39 04 24 75 02 CD 80 C3

Compilado de:

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)

fuente
3
binario puro (COM) no se ejecutará en Windows o Linux, así que no estoy seguro de si esto es válido
Igor Skochinsky
@IgorSkochinsky Debe haber un intérprete para el montaje.
Shmuel H.
Puede hacer que el código sea aún más corto al salir solo inc eaxy int 0x80, creo que debería fallar en Windows y finalizar el proceso.
Shmuel H.
2
@IgorSkochinsky También hay programas que ejecutan archivos binarios sin formato. Ver el enlace en mi comentario anterior.
Shmuel H.
1
Bochs y QEMU simulan un entorno de metal desnudo y no ejecutan el código binario en el sistema operativo host. Entonces no funcionarán en la OMI. Pero todo esto podría ser una discusión para el meta.
Igor Skochinsky
8

JavaScript 42 30 26 25 bytes

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

Probado con Firefox. (Chrome no tiene la oscpupropiedad). Dado que las letras minúsculas tienen un código de caracteres más alto que las mayúsculas, esto depende de que la primera letra navigator.oscpusea ​​mayúscula y no sea W , X , Y o Z en ninguna plataforma que admita Firefox (que no sea Windows, por supuesto). Según esta publicación , ese es el caso.

Ediciones

  1. Guardado 12 bytes gracias a Neil .
  2. Guardado otros cuatro bytes
  3. Guardado otro byte gracias a Blender .
usuario2428118
fuente
oscpues probablemente la navigatorpropiedad más corta que puede usar. Además, probar una expresión regular probablemente saldrá más corto, pero no lo he medido.
Neil
Puede eliminar !=-1y agregar un ~derecho después de la flecha gruesa, ahorrando 3 bytes.
Lucas
¿Tienes que crear una función? ¿No puedes simplemente console.logla prueba de expresiones regulares? También navigator.oscpu[0]=='W'funcionaría o hay otro sistema operativo que también comience con W.
2
Hmm, por alguna razón mi Chrome no tiene oscpu.
Muzer el
2
navigator.oscpu>'V'podría funcionar también
Blender
8

C #, 61 48 bytes

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

Guardado 13 bytes gracias a TheLethalCoder

O un programa completo a 83 bytes:

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

Varias variantes de Windows usan valores de enumeración 0 a 3 en la implementación de Microsoft .NET . 4 es Unix, 5 es Xbox [360] (que no consideraré "Windows"), 6 es MacOSX. Mono usa los mismos valores , agregando 128 para Unix / Linux en versiones anteriores.

Por lo tanto, cualquier cosa <4 es Windows, y todo lo demás no es Windows.

Mover
fuente
2
No estoy seguro de si me estoy perdiendo algo, pero ¿por qué le das el valor a un int?
auhmaan
@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- básicamente, las reglas de escritura de C # 's dice que no puedo comparar una PlatformIDy intdirectamente, y no hay conversión implícita de PlatformIDa int. Pero no es una explícita elenco de todas las enumeraciones de sus valores, que aprovecho aquí ...
Bob
1
@ MustafaAKTAŞ Además, debo señalar que esto está dirigido a C # / .NET Framework / .NET Core. En Xbox One solo es posible ejecutar aplicaciones UWP, que usan una API diferente que no incluye System.Environment.OSVersionen absoluto . Si va a tener problemas con eso, entonces también debe eliminar cualquier otra respuesta que no sea UWP. También resulta que (actualmente) no puedes ejecutar aplicaciones para UWP en plataformas que no sean de Windows, por lo que también puedes eliminarlas. Lo que te deja con 0 respuestas y una pregunta sin respuesta.
Bob
1
Puede compilar a un Action<bool>en el primer ejemplo para 48 bytes (no lo he probado, pero creo que funcionará) _=>(int)System.Environment.OSVersion.Platform<4;Sin embargo, es posible que tenga que ser ()=>...para 49 bytes
TheLethalCoder
1
La compilación de funciones anónimas como Funcs y Actions se usa todo el tiempo aquí. Creo que está en la página de consejos de golf y los uso casi todo el tiempo. También las funciones anónimas se usan mucho en otros idiomas, así que creo que es seguro usarlas aquí
TheLethalCoder
7

Lote, 50 bytes.

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

Editar: arreglado para ignorar DOS en lugar de afirmar que es Windows.

La única otra forma que conozco de ejecutar Batch fuera de Windows es usar WINE, que por defecto se asignará Z:a /. Por lo tanto, si Z:\bin\shexiste, lo más probable es que sí /bin/sh, así que no MS Windows.

No sé en qué WINE establece% OS%, pero si no es Windows_NTasí, podría ahorrar 23 bytes.

Neil
fuente
1
Otra forma es DOS, que no es Windows.
Ruslan
Esto no solo falla en DOS, sino también en una computadora donde Z: está mapeado y contiene esa ruta.
Adám
1
Al menos estoy tratando de detectar WINE. Ninguna de las otras respuestas dará el resultado correcto cuando se ejecute bajo WINE.
Neil
3
@ Adám Claro y si compila la respuesta C con -DWIN32 = 1, entonces también falla. ¿Tu punto?
Neil
1
sí, juegos de vinoOS=Windows_NT
Jasen
7

QBasic, 31 bytes

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

Imprime no cero en Windows, 0 en todo lo demás.

COMSPECes una variable de entorno exclusiva de los sistemas operativos de Microsoft. Apunta al intérprete de comandos, típicamente command.como cmd.exe. En Windows, el intérprete de comandos se encuentra en algún lugar del directorio de Windows; en MS-DOS, se encuentra en el directorio de DOS o en la raíz del disco, y en cualquier otro sistema operativo, no existe.

Al verificar si el valor de COMSPECcontiene una "W", podemos ver la diferencia entre Windows y no Windows.

marca
fuente
COMSPECno está reservado para significar nada en particular en Linux (lo que significa que está bajo el control del usuario por defecto), por lo que no es posible que el usuario lo configure en un valor que esté utilizando para sus propios fines (y que contenga un W)? Es cierto que es un caso marginal.
1
@ ais523: Además, el directorio de Windows no tiene que contener una W. Es frágil en cualquier caso.
Joey
7

Node.js, 27 16 15 13 bytes

Gracias a @Patrick , que eliminó 12 bytes de mi solución usando REPL de Node:

_=>os.EOL>`
`

Solución original:

_=>require('path').sep!='/'
GilZ
fuente
Si cambia esto a Node.js REPL, puede guardar 16 bytes simplemente usando_=>path.sep!='/'
Patrick Roberts
Soy nuevo en codegolf. ¿Se me permite hacer eso?
GilZ
Sí, de lo contrario no lo habría sugerido. REPL significa leer, ejecutar, imprimir bucle, el programa que se ejecuta cuando ingresas nodeen la consola. A partir de ahí, todos los módulos de nodo del sistema están disponibles sin necesidad de require()ellos.
Patrick Roberts
Oh si lo siento Quise decir 11. Puede guardar otro byte cambiando !=a >ya que el índice ASCII para \ es 92 y /es 47.
Patrick Roberts
7

Excel VBA, 41 40 30 29 26 24 Bytes

La función de Windows inmediata que se devuelve truesi el código del sistema operativo del sistema comienza es mayor que la longitud 3, porque la información está restringida a la salida maco solo se pcdosdevuelve trueen PC con Windows

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

Versión anterior

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

Cambios

-1 Gracias a Neil por usar Left(...,1)más deMid(...,1,1)

-10 Gracias a ChrisH por señalar el truco del separador de ruta de @ Mego

-1 Para verificar el WorkbookPathen "\" lugar de usarApplication.Path Separator

-4 Para cambiar a Environ()

-2 Para cambiar a [Len(Info(...

Solución nueva, 51 bytes

subRutina novedosa que emite, a la ventana VBE inmediata, una ventana 1 (truthy)debajo y 0 (falsey)debajo de mac por método de compilación condicional.

Sub a
i=1
#If Mac Then
i=0
#End If
Debug.?i
End Sub
Taylor Scott
fuente
1
leftte ahorra un byte.
Neil
¿Lo has probado en office365 en línea? ¿Eso incluso es compatible con VBA? Sólo curioso.
Chris H
@ChrisH Que yo sepa, office.com no admite las secuencias de comandos de VBA en línea (aunque si alguien más lo sabe mejor, dígamelo, eso me facilitaría mucho la vida); Sin embargo, con O365 tiene los derechos para descargar una copia de Office 2016 (o lo que sea actual) en su escritorio, y eso admite las secuencias de comandos VBA.
Taylor Scott
Hasta ahora he logrado evitarlo; dado su comentario que parece que continuará (las únicas máquinas con Windows que uso tienen una copia de escritorio de la oficina, las máquinas personales son todas linux)
Chris H
1
Truco del separador de ruta de @ Mego ( ?Application.PathSeparator)="\"sería 32 ya que es un personaje único)
Chris H
6

Perl 6 ,  19  18 bytes

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

Tanto la salida True␤como False␤el sistema en el que se ejecuta.

Brad Gilbert b2gills
fuente
el segundo se basa en que los valores no de Windows de CWD no contienen ningún `` - no hay garantía de eso,
Jasen
5

APL (Dyalog) , 21 bytes

'W'∊∊#⎕WG'APLVersion'

Pruébalo en línea!

#⎕WG'APLVersion' Root ( # ) W indow G et property Versión APL

 alistarse (aplanar)

'W'∊ ¿Es W un miembro? (ningún valor de retorno que no sea de Windows contiene una W mayúscula)

Adán
fuente
4

tcl, 38 bytes

 expr [lsearch $tcl_platform windows]>0
hdrz
fuente
4

PHP 17 bytes

Lo siguiente generará 1 si Windows y nada si algo más. Ignorando los avisos de conversión de cadenas.

<?=PHP_OS==WINNT;

Pruebe en línea Pruebas en línea para Linux porque el sandbox es Linux para PoC.

DrWhat
fuente
¿Seguro que es suficiente? Preguntando porque los valores posibles para: PHP_OS .
manatwork
1
'<? = PHP_OS [0] == W; `es a la vez 1 byte más corto y captura todos los demás valores de Windows en la pregunta vinculada por manatwork. >Vpodría funcionar también.
user59178
manatwork depende de en qué versión de Windows se compiló PHP, desde Windows Visa \ 7, la versión de Windows ha sido representada con WINNT debido al NT Authority Kernel. antes de Windows XP e inferior era WIN32 y Windows Server 2003 era Windows.
DrWhat
4

Java 8, 49 bytes

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

Más largo que la otra respuesta de Java , pero adopta un enfoque diferente.

Esta lambda encaja en ay Supplier<Boolean>puede probarse con el siguiente programa:

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

}
Comunidad
fuente
Es muy, muy similar a la respuesta inicial que vincula (antes de las ediciones).
Olivier Grégoire
¿Por qué no solo .contains("W")?
Cyoce
@Cyoce en realidad, el sistema operativo variable parece ser específico de Windows.
4

Haskell, 39 31 bytes

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

Compruebo la salida de la primera letra de "m", que debería ser "mingw" para Windows. Por lo que pude ver, no hay otro sistema operativo que comience con M. La información proviene de https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs

Dylan Meeus
fuente
1
En mi sistema (Windows 10 de 64 bits, GHC 8.0.1 de 64 bits), osda "mingw32".
Mego
@Mego tienes razón, corregido por eso
Dylan Meeus
4

bash + coreutils, 5 bytes

rm $0

También funciona en la mayoría de los otros shells POSIXy. (Tenga en cuenta que los puertos de Windows existen bashy rm, aunque normalmente solo se usan con sistemas operativos POSIXy más pesados, esta no es una entrada completamente vacía.) Salidas a través del código de salida (0 = falso, 1 = verdadero). Se puede contar como 4 bytes si se le permite asumir un nombre de archivo (por ejemplo rm a). Tenga en cuenta que esto puede fallar en el caso de nombres de archivo muy extraños (que rmse interpretarán como argumentos debido a la falta de comillas, y posiblemente eliminen los archivos que le interesan, por lo que le aconsejaría que no ejecute este programa desde un archivo con un nombre extraño )

Nota: elimina el programa del disco como efecto secundario, o al menos lo intenta. En el caso en el que estamos ejecutando en Windows, el sistema operativo no podrá eliminar el archivo en ejecución (una operación que Windows no permite de forma predeterminada o por completo), y por rmlo tanto se producirá un error. bashdetecta el error y lo convierte en un código de salida (por lo tanto, el programa en su conjunto termina normalmente). La mayoría de las otras entradas aquí están usando 0 para falsey y 1 para la verdad en los códigos de salida, por lo que esto hace lo mismo; tenga en cuenta que bashla ifdeclaración no acepta enteros en absoluto (más bien, acepta comandos y ramas en función de si se ejecutan correctamente, y las pruebas aritméticas se realizan a través de programas comotestque informan intencionalmente un "bloqueo" en una comparación fallida), por lo que esto es más inestable en términos de legalidad que los programas que salen a través del código de salida en los idiomas donde 0 es válido en una ifprueba de declaración y envía el programa a la elserama.


fuente
4

8o , 11 bytes

 
os 1- not .
 

Imprime trueen Windows, falseen Linux y macOS. Otras plataformas compatibles con 8th son Android, iOS y Raspberry Pi, pero no puedo probarlas.

Versión sin golf (con comentarios)

 
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
fuente
4

Python 3 (13 bytes)

import winreg

Regresa con el código de salida cero (generalmente verdadero en shells) si está en Windows, y con un código de salida distinto de cero de lo contrario.

Si lo prefiere a la inversa, hay una solución de 12 bytes: import posix.

Jonas Schäfer
fuente
Creo que esto no funcionará si hay un archivo llamado winreg.pyen el mismo directorio.
Zacharý
1
Además, según las reglas: "El código que no se ejecuta / compila en una plataforma no cuenta como un valor falso".
Zacharý
4

TrumpScript , 17 bytes

America is great.

Pruébalo en línea!


Este programa, si se ejecuta en Windows, imprimirá:

The big problem this country has is being PC

Esto se considera un valor verdadero.


La salida vacía y el siguiente valor son falsos:

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

La salida vacía ocurrirá en cualquier sistema Linux (para este programa), la respuesta larga de Apple obviamente ocurre en Mac (para cualquier programa). En TIO, el backend (supongo) es un sistema operativo Unix, por lo que solo puede obtener el valor falso; en mi computadora recibo el mensaje de PC.


No estoy 100% seguro si esto cuenta como un mensaje de error (lo que invalidaría la respuesta), pero si no lo sabía, probablemente valiera la pena reírse por usted.

Urna de pulpo mágico
fuente
¿A qué ha llegado el mundo ...?
ooransoy
@avaragecoder ¡HAGA DE PYTHON GRAN OTRA VEZ!
Magic Octopus Urn