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 código de golf , por lo que gana la puntuación más baja, pero también estoy muy interesado en ver soluciones creativas a este problema.
code-golf
decision-problem
Daniel
fuente
fuente
Respuestas:
Vim, 2 bytes
En Windows,
<C-a>
(ctrl + a) se asigna de forma predeterminada aSelect All
. Si escribe un1
modo 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 aIncrement 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
fuente
Ctrl + a
,1
. Si lo fueraCtrl + a + 1
, se contaría como 1 pulsación de tecla.MATLAB, 4 bytes
De la documentación :
También están las funciones
ismac
yisunix
.Le dejaré al lector que descubra qué hacen esas funciones.Mego amablemente pidió diagramas para explicarismac
yisunix
por lo que he tratado de ilustrar aquí:No se le pidió un diagrama de,
ispc
pero puedo revelar que el comportamiento es bastante similar, excepto sustitutoOSX
yUnix
conWindows
.Segundo enfoque:
Aquí hay un segundo enfoque con el
getenv
uso de 23 bytes que deberían ser a prueba de balas, a menos que haya otro sistema operativo que comience conW
:fuente
Python 2.7.10 , 24 bytes
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.sep
es falso y, por lo tanto,0/0
se calcula, provocando unaZeroDivisionError
salida y un código de salida distinto de cero. En plataformas que no son Windows,'['>os.sep
es cierto, haciendo la expresión0/1
, que no hace nada, y el programa sale con el código de salida 0.fuente
Ensamblaje x86, 7 bytes(inspirado por la respuesta de Runemoro )O
Descripción
En primer lugar, vamos a establecer
eax
a1
(el número de llamadas al sistema paraexit(int val)
paraLinux
,FreeBSD
yOSX
). Luego, llamaremos a la puerta de interrupción,0x80
que es la puerta de llamada del sistemaLinux
,FreeBSD
yOSX
. Eso haría que el programa salga con el estado deebx
que es0
(false
).En Windows
int 0x80
es una puerta inválida (se usa2e
como puerta syscall) y bloqueará el programa, haciendo que termine con un código de salida positivo (true
).Editar: no funcionaría
OSX
ya que tiene una convención de paso de argumento diferente en 32 bits (por la pila).Referencias y lecturas adicionales
FreeBSD - System Calls
: Información sobre llamadas del sistemaFreeBSD
.System calls in the Linux kernel. Part 2.
: Un gran artículo sobre las llamadas al sistema de Linux.Linux Syscall Reference
: una referencia de números de llamada del sistema paraLinux
.Windows Syscall Shellcode
: Un artículo sobre cómo llamar directamente al sistemawindows
desde el ensamblado.Making system calls from Assembly in Mac OS X
: Un artículo sobre llamadas al sistemaOSX
.fuente
xor eax, eax
allí?false
sale con el código 1 mientras quetrue
sale con el código 0).eax
yebx
se 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.mov eax, 1
se traduciría a\xB8\x01\x00\x00\x00
, que es mucho más larga que sólo mover registro y llamadasinc
.C,
44433836 bytes¡Gracias a @Downgoat por un byte! tachado 44 sigue siendo regular 44 ¡
Gracias a @Neil por dos bytes!
fuente
0
elifdef
y cambiando el1
a!
, pero creo que_WIN32+0
funciona aún mejor.return 1;
dentro de ifdef y eliminar lo demás, ya que main sin return en c99 debe devolver 0.#if WIN32
. En ventanas que no son Windows, dado que WIN32 no está definido, el preprocesador debe tratarlo como 0.PHP, 22 bytes
se imprime
1
si 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:
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>"/";
impresiones1
o 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_dump
ygettype
), 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_OS
constante predefinida comienza conwin
(mayúsculas y minúsculas; Windows, WIN32, WINNT, pero no CYGWIN o Darwin); impresiones1
para Windows, de lo contrario nada.17/18 bytes :
imprime
1
si 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 contrario0
.También puede verificar la constante
PHP_EOL
.mas opciones:
PHP_SHLIB_SUFFIX
estádll
en Windows, pero no necesariamente solo allí.php_uname()
devuelve información sobre el sistema operativo y más; comienza conWindows
para Windows.$_SERVER['HTTP_USER_AGENT']
contendráWindows
cuando se llame en un navegador en Windows.<?=defined(PHP_WINDOWS_VERSION_BUILD);
(38 bytes) funciona en PHP> = 5.3conclusió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; peroPHP_OS
probablemente siempre contendrá la información deseada.fuente
<?=class_exists(COM);
. La claseCOM
solo está disponible en Windows, que yo sepa. Eso debería ahorrarte un byte.Befunge-98, 7 bytes
Pruébalo en línea!
Esto funciona consultando el separador de ruta del sistema, que está
\
en Windows y/
en otros sistemas operativos.fuente
Mathematica, 28 bytes
fuente
&
, no imprimirá nada (y tampoco es una función invocable , pero simplemente un fragmento / expresión).Out[1]= False
de esto:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
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 conf.get()
.Pruébalo en línea! - el servidor no es Windows, así que esto se imprime
false
. 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.fuente
()->java.io.File.separatorChar=='\\'
tiene solo 36 bytes.()->java.io.File.separatorChar>'['
!J, 7 bytes
Este es un verbo (similar a una función) que utiliza la conjunción extranjera incorporada
9!:12
para adquirir el tipo de sistema donde 5 es Unix y 6 es Windows32.fuente
R, 15 bytes
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 sonR se está desarrollando para las familias de sistemas operativos tipo Unix, Windows y Mac . No se admiten otras familias de sistemas operativos.
fuente
Perl, 11 bytes
^O
debe ser reemplazado por un Control-O literal.Salidas
1
en Windows, nada en otro sistema operativo.Tenga en cuenta que no estoy usando,
say
ya 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.
fuente
^O
.$^O=~W
, aunque probablemente coincida con ellosMS
. Alternativamente, también podría coincidir$^X=~':'
.W
, así que asumí que estaba buscando unW
bien ... ¿alguna razón por la que sugieresMS
?julia, 10 bytes
Una función que devuelve verdadero para windows
fuente
código de máquina x86, 9 bytes
Compilado de:
fuente
inc eax
yint 0x80
, creo que debería fallar en Windows y finalizar el proceso.JavaScript
42302625 bytesProbado con Firefox. (Chrome no tiene la
oscpu
propiedad). 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 letranavigator.oscpu
sea 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
fuente
oscpu
es probablemente lanavigator
propiedad más corta que puede usar. Además, probar una expresión regular probablemente saldrá más corto, pero no lo he medido.!=-1
y agregar un~
derecho después de la flecha gruesa, ahorrando 3 bytes.console.log
la prueba de expresiones regulares? Tambiénnavigator.oscpu[0]=='W'
funcionaría o hay otro sistema operativo que también comience con W.navigator.oscpu>'V'
podría funcionar tambiénC #,
6148 bytesGuardado 13 bytes gracias a TheLethalCoder
O un programa completo a 83 bytes:
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.
fuente
int
?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 unaPlatformID
yint
directamente, y no hay conversión implícita dePlatformID
aint
. Pero no es una explícita elenco de todas las enumeraciones de sus valores, que aprovecho aquí ...System.Environment.OSVersion
en 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.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 bytesFunc
s yAction
s 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íLote, 50 bytes.
Editar: arreglado para ignorar DOS en lugar de afirmar que es Windows.
La
únicaotra forma que conozco de ejecutar Batch fuera de Windows es usar WINE, que por defecto se asignaráZ:
a/
. Por lo tanto, siZ:\bin\sh
existe, 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_NT
así, podría ahorrar 23 bytes.fuente
OS=Windows_NT
QBasic, 31 bytes
Imprime no cero en Windows, 0 en todo lo demás.
COMSPEC
es una variable de entorno exclusiva de los sistemas operativos de Microsoft. Apunta al intérprete de comandos, típicamentecommand.com
ocmd.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
COMSPEC
contiene una "W", podemos ver la diferencia entre Windows y no Windows.fuente
COMSPEC
no 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 unW
)? Es cierto que es un caso marginal.Node.js,
27161513 bytesGracias a @Patrick , que eliminó 12 bytes de mi solución usando REPL de Node:
Solución original:
fuente
Node.js REPL
, puede guardar 16 bytes simplemente usando_=>path.sep!='/'
node
en la consola. A partir de ahí, todos los módulos de nodo del sistema están disponibles sin necesidad derequire()
ellos.!=
a>
ya que el índice ASCII para\
es 92 y/
es 47.Excel VBA,
414030292624 BytesLa función de Windows inmediata que se devuelve
true
si el código del sistema operativo del sistema comienza es mayor que la longitud 3, porque la información está restringida a la salidamac
o solo sepcdos
devuelvetrue
en PC con WindowsVersión anterior
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
WorkbookPath
en"\"
lugar de usarApplication.Path Separator
-4 Para cambiar a
Environ()
-2 Para cambiar a
[Len(Info(...
Solución nueva, 51 bytes
sub
Rutina novedosa que emite, a la ventana VBE inmediata, una ventana1 (truthy)
debajo y0 (falsey)
debajo de mac por método de compilación condicional.fuente
left
te ahorra un byte.?Application.PathSeparator)="\"
sería 32 ya que es un personaje único)Perl 6 ,
1918 bytesTanto la salida
True
comoFalse
el sistema en el que se ejecuta.fuente
APL (Dyalog) , 21 bytes
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)fuente
tcl, 38 bytes
fuente
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.
fuente
>V
podría funcionar también.Java 8, 49 bytes
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:fuente
.contains("W")
?Haskell,
3931 bytesCompruebo 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
fuente
os
da"mingw32"
.bash + coreutils, 5 bytes
También funciona en la mayoría de los otros shells POSIXy. (Tenga en cuenta que los puertos de Windows existen
bash
yrm
, 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 ejemplorm a
). Tenga en cuenta que esto puede fallar en el caso de nombres de archivo muy extraños (querm
se 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
rm
lo tanto se producirá un error.bash
detecta 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 quebash
laif
declaració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 comotest
que 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 unaif
prueba de declaración y envía el programa a laelse
rama.fuente
8o , 11 bytes
Imprime
true
en Windows,false
en Linux y macOS. Otras plataformas compatibles con 8th son Android, iOS y Raspberry Pi, pero no puedo probarlas.Versión sin golf (con comentarios)
fuente
Python 3 (13 bytes)
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
.fuente
winreg.py
en el mismo directorio.TrumpScript , 17 bytes
Pruébalo en línea!
Este programa, si se ejecuta en Windows, imprimirá:
Esto se considera un valor verdadero.
La salida vacía y el siguiente valor son falsos:
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.
fuente