Détecter MS Windows


80

Défi

Créez un programme qui renvoie une valeur de vérité lorsqu'il est exécuté sur Microsoft Windows (par souci de simplicité, nous nous en tiendrons à Windows 7, 8.1 et 10) et une valeur falsey lorsqu'il est exécuté sur un autre système d'exploitation (OSX, FreeBSD, Linux).

Règles

  • Le code qui ne parvient pas à être exécuté / compilé sur une plate-forme ne compte pas comme une valeur falsey.

Critères gagnants

Je qualifie cela de , donc le score le plus bas l'emporte, mais je suis également très intéressé par des solutions créatives à ce problème.


7
Les programmes peuvent-ils sortir par code de sortie? ( normalement autorisé )
FlipTack

14
Pouvez-vous donner une liste précise des systèmes d’exploitation sur lesquels il doit fonctionner?
FlipTack

2
Quel devrait être le résultat sous Windows RT?
Adám

7
Vous souhaiterez peut-être spécifier quelques systèmes non Windows spécifiques devant être pris en charge. Certains commentaires dans des commentaires sur des choses comme DOS et OS2.
jpmc26

2
Nous avons probablement besoin d'un consensus sur ce qui compte comme véracité et falsey pour les codes de sortie; la convention normale est 0 pour vrai et tout autre chose pour faux, mais beaucoup de réponses le traitent comme le contraire, et la définition de "if statement" ne s'applique évidemment pas.

Réponses:


78

Vim, 2 octets

<C-a>1

Sous Windows, <C-a>(ctrl + a) est associé par défaut à Select All. Si vous tapez un 1mode de sélection in dans Windows, il remplace la sélection par ce que vous avez saisi (1) en laissant un 1 dans la mémoire tampon.

Sur d'autres systèmes d'exploitation, il <C-a>est mappé par défaut Increment number. Comme il n'y a pas de nombre à incrémenter, c'est un no-op, puis le 1 augmente le nombre, mais en termes de tampon, il s'agit d'un no-op.

1 est la vérité dans Vim et une chaîne vide est une fausseté


Ressemble à 3 frappes. Ctrl + a + 1
Pavel

12
Je pense que par cette meta post meta.codegolf.stackexchange.com/questions/8995/… les réponses Vim sont généralement marquées sans les modificateurs (d'autant plus que la première réponse de la publication utilise <ctrl + a> comme exemple pour 1 octet)
nmjcman101

4
@Pavel il est Ctrl + a, 1. Si c'était le cas, cela Ctrl + a + 1compterait comme 1 frappe.
Captain Man

7
Magnifique, j'adore cette réponse!
DJMcMayhem

C'est plutôt élégant, j'aime bien.
Dan

109

MATLAB, 4 octets

ispc

De la documentation :

tf = ispcrenvoie logique 1 (vrai) si la version du logiciel MATLAB® est destinée à la plate-forme Microsoft® Windows®. Sinon, il renvoie 0 logique (faux).

Il y a aussi les fonctions ismacet isunix. Je laisserai au lecteur le soin de comprendre ce que font ces fonctions. Mego a gentiment demandé des schémas explicatifs ismacet isunixj'ai donc essayé de l'illustrer ici:

entrez la description de l'image ici

Il n'a pas été demandé de diagramme, ispcmais je peux révéler que le comportement est assez similaire, sauf substitut OSXet Unixavec Windows.


Deuxième approche:

Voici une deuxième approche getenvutilisant 23 octets qui devrait être à l'épreuve des balles, sauf s'il existe un autre système d'exploitation commençant par W:

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

getenv 'name'recherche dans la liste d'environnement de système d'exploitation sous - jacent le texte du formulaire name=value, où se nametrouve le vecteur de caractères saisi. Si trouvé, MATLAB® renvoie la valeur du vecteur de caractère. Si le nom spécifié est introuvable, une matrice vide est renvoyée.


4
Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été déplacée pour discuter .
Dennis

55

Python 2.7.10 , 24 octets

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

Merci à FlipTack pour 3 octets

Ce programme tire parti du fait que Windows est le seul système d'exploitation à utiliser en \tant que séparateur de chemin. Normalement, c'est frustrant et mauvais, mais pour une fois, c'est un avantage. Sous Windows, la valeur '['>os.sepest false et 0/0est donc calculée, ce qui provoque une ZeroDivisionErrorsortie avec un code de sortie non nul. Sur les plateformes non-Windows, '['>os.septrue est utilisé, ce qui rend l'expression 0/1qui ne fait rien et le programme se ferme avec le code de sortie 0.


DOS utilise également une barre oblique inversée comme séparateur de chemin et comporte au moins une implémentation de Python 2.
Isanae

5
@isanae J'ai modifié le titre pour spécifier Python 2.7 - la seule implémentation de Python 2 sous DOS est une version archaïque buggy 2.4.2
Mego

OS / 2 utilise également une barre oblique inverse et a une implémentation de Python 2.7;)
isanae

9
@isanae Là, j'ai spécifié 2.7.10. Bonne chance pour trouver un port de cela.
Mego

2
apparemment, il suffit de donner des résultats corrects sur 3 versions récentes de Windows et sans doute sur les versions récentes des trois autres systèmes énumérés, OS2 et DOS importent peu,
Jasen

45

Assemblage x86, 7 octets (inspiré de la réponse de Runemoro )

31 DB 89 D8 40 CD 80

Ou

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

La description

Tout d’abord, nous allons régler eaxsur 1(numéro d’appel système pour exit(int val)pour Linux, FreeBSDet OSX). Ensuite, nous appellerons la porte d’interruption 0x80qui est la porte d’appel système pour Linux, FreeBSDet OSX. Cela entraînerait la fermeture du programme dont le statut ebxest 0( false).

Sous Windows, la porte int 0x80est invalide (elle 2es’utilise en tant que porte syscall) et ferait planter le programme, le faisant terminer par un code de sortie positif ( true).

Edit: Ne fonctionnerait pas OSXcar il a une convention de passage d'argument différente sur 32 bits (par la pile).

Références et lectures complémentaires


3
C'est brillant!
Le

Pourquoi le crash a-t-il une valeur de vérité? Est-ce parce que EAX (généralement la valeur de retour) est 1? En outre, EAX est-il garanti d’être égal à 0 au démarrage du programme? Ou avez-vous besoin xor eax, eaxde là?
Cole Johnson

3
@ColeJohnson: les plantages détectés par le système d'exploitation (sur les systèmes d'exploitation généralement utilisés avec x86) ne laissent jamais un code de sortie de 0, car ils sont réservés à la résiliation. (Normalement, le code de sortie est une valeur insignifiante que le système d'exploitation réserve spécifiquement à cette situation.) Cependant, je ne suis pas sûr qu'il soit logique de compter 0 comme falsey et 1 comme étant la vérité dans les codes de sortie du programme, étant donné que la convention normale est la suivante: exactement le contraire (0 étant la seule valeur véridique, par exemple, le programme standard UNIX / Linux / POSIX se falsetermine avec le code 1 et se truetermine avec le code 0).

1
Cette réponse suppose implicitement que les registres eaxet ebxsont effacés à zéro au démarrage du programme (sous Windows), ce qui n'est pas garanti si mes souvenirs sont exacts. Cela suppose aussi explicitement que la convention de passage d'arguments syscall pour Linux correspond à celle de FreeBSD et OSX, ce qui serait très surprenant.
dimanche

1
@ Sebastian-LaurenţiuPlesciuc Bonne question. mov eax, 1serait traduit \xB8\x01\x00\x00\x00, ce qui est beaucoup plus long que le simple fait de déplacer un registre et un appel inc.
Shmuel H.

29

C, 44 43 38 36 octets

Merci à @Downgoat pour un octet! 44 est toujours normal.
Merci à @Neil pour deux octets!

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

À l'origine, j'allais suggérer que vous puissiez économiser beaucoup d'octets en déplaçant les éléments 0hors de ifdefet en changeant 1de !, mais je pense que cela _WIN32+0fonctionne encore mieux.
Neil

Si c99 est OK, vous pouvez changer f en main et coller return 1;à l'intérieur de l'ifdef et supprimer le reste, puisque main sans retour en c99 doit retourner 0.
simon

11
C'est une directive du compilateur. S'il est compilé sur un système Windows et exécuté sur un système Linux, par exemple, il retournera toujours 1.
Micheal Johnson

4
@ MichealJohnson no. Je peux le compiler sur linux (à l’aide de mingw32gcc msvc) et obtenir le code qui retourne vrai s’il est exécuté sur Windows. Je ne connais aucun compilateur Linux hébergé par Windows. si vous voulez discuter des couches d'émulation comme "du vin", toutes les autres réponses souffrent probablement du même problème
Jasen

1
Pas sûr si WIN32 est juste défini, mais est défini à différent de zéro. Si c'est le dernier cas, vous pouvez simplement dire #if WIN32. Sur les non-fenêtres, étant donné que WIN32 n'est pas défini, le préprocesseur doit le traiter en tant que 0.
Shahbaz

27

PHP, 22 octets

`<?=PATH_SEPARATOR>":";`  

Imprime 1si le séparateur de chemin est un point-virgule (deux points ou vide pour tous les autres systèmes d’exploitation à l'exception de DOS et OS / 2), sinon rien.

également 22 octets , mais pas si sûr:

<?=strpos(__FILE__,92);

affiche un entier positif si le chemin du fichier contient une barre oblique inverse; sinon rien.
Une alternative sûre avec 27 octets : <?=DIRECTORY_SEPARATOR>"/";impressions 1ou rien.

Une découverte étrange : <?=__FILE__[1]==":";( 20 octets ) devrait être, pas sûr non plus, mais ok. Mais bien que __FILE__prétende être une chaîne (j'ai essayé var_dumpet gettype), l'indexation génère une erreur, à moins que vous ne la copiiez ailleurs (la concaténation fonctionne également) ou que vous l'utilisiez comme paramètre de fonction.

Edit:
<?=(__FILE__)[1]==":";(également 22 octets ) fonctionne en PHP 7; mais c’est parce que les parenthèses copient la valeur de la constante dans une variable temporaire.

27 octets : <?=stripos(PHP_OS,win)===0;
teste si la PHP_OSconstante prédéfinie commence par win(insensible à la casse; Windows, WIN32, WINNT, mais pas CYGWIN ni Darwin); imprime 1pour Windows, sinon rien.

17/18 octets :

<?=strlen("
")-1;

imprime 1s'il a été stocké avec le saut de ligne Windows (également sous DOS, OS / 2 et Atari TOS - bien que je doute que quiconque ait déjà compilé PHP pour TOS), sinon 0.

Vous pouvez également vérifier la constante PHP_EOL.

plus d'options:

PHP_SHLIB_SUFFIXest dllsur Windows, mais pas nécessairement seulement là.
php_uname()renvoie des informations sur le système d'exploitation et plus encore; commence par Windowspour Windows.
$_SERVER['HTTP_USER_AGENT']contiendra Windowslorsqu’il sera appelé dans un navigateur sous Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 octets) fonctionne en PHP> = 5.3

conclusion

Le seul moyen sûr de savoir s’il s’agit bien de Windows, ce qui ne ressemble à rien, semble être une vérification du nom du système d’exploitation. Pour PHP: php_os()peut être désactivé pour des raisons de sécurité; mais PHP_OScontiendra probablement toujours les informations souhaitées.


4
Les noms de fichiers sur * nix peuvent contenir des barres obliques inverses. Ce n'est donc pas vraiment infaillible. Les règles ne disent pas que cela doit être infaillible, cependant, alors ¯ \ _ () _ / ¯
Jordan

@ Jordan: Vous avez raison. J'ai ajouté cette information à la description. Merci.
Titus

4
Une alternative: <?=class_exists(COM);. Le cours COMn'est disponible que sous Windows, à ma connaissance. Cela devrait vous faire économiser un octet.
Ismael Miguel

@IsmaelMiguel C'est assez d'une réponse différente pour que vous puissiez l'afficher comme telle. (Cependant, cela ne vaut peut-être pas la peine de le faire; cette réponse est très bien écrite.)
wizzwizz4

1
@ wizzwizz4 Cela n'en vaut pas la peine. La réponse serait poussée à l'oubli. C'est pourquoi j'ai simplement laissé le commentaire, au lieu d'écrire ma propre réponse.
Ismael Miguel

16

Befunge-98, 7 octets

6y2%!.@

Essayez-le en ligne!

Cela fonctionne en interrogeant le séparateur de chemin système, qui se trouve \sur Windows et /sur d'autres systèmes d'exploitation.

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 octets

$OperatingSystem=="Windows"&

A quoi ça sert de faire une fonction? Vous pouvez supprimer l'esperluette en enregistrant un octet et le code devrait simplement évaluer directement s'il est exécuté sur un système Windows-ish.
Ruslan

@Ruslan Toutes les réponses doivent être des programmes complets imprimant le résultat ou des fonctions appelables. Si ceci est déclaré comme une réponse du cahier Mathematica, vous pourrez alors l'appeler programme complet, mais si j'appelle l'objet depuis la ligne de commande sans le &, il n'imprimera rien (et ce n'est pas non plus une fonction appelable). , mais simplement un extrait / expression).
Martin Ender

@MartinEnder Vraiment pas de sortie? Je reçois la Out[1]= Falsesortie de ceci:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan

@Ruslan Je crois que cela démarre également un environnement de cahier (juste un en ligne de commande). Ce que je veux dire en exécutant un programme à partir de la ligne de commande utilise le mode script.
Martin Ender

13

Java 8, 33 octets

Un merci spécial à Olivier Grégoire pour avoir suggéré separatorChar, et Kritixi Lithos pour -1 octet!

C'est une expression lambda qui renvoie un booléen. Ceci peut être assigné à Supplier<Boolean> f = ...;et appelé avec f.get().

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

Essayez-le en ligne! - le serveur n'est pas Windows, donc cela s'imprimefalse. Cependant, sur ma machine Windows, le même code est imprimétrue.

Ce code ne fait qu'obtenir le séparateur de fichiers du système et vérifier si son point de code est plus grand que le caractère [. Cela est vrai pour Windows, car il utilise \comme séparateur - mais tous les autres systèmes d’exploitation utilisent /, qui a un code inférieur dans la table ASCII.


Cette pause ne sera-t-elle pas effectuée sur d'autres systèmes d'exploitation commençant par W?
Downgoat

()->java.io.File.separatorChar=='\\'est seulement 36 octets.
Olivier Grégoire

1
@ OlivierGrégoire nice one - et je peux jouer au golf à 34 en utilisant ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, Whonix. Probablement encore plus.
Olivier Grégoire

3
@ Titus Attends, qu'en est-il de WAITS ?
NoOneIsHere

11

J, 7 octets

6=9!:12

Il s'agit d'un verbe (similaire à une fonction) qui utilise la conjonction étrangère intégrée 9!:12pour acquérir le type de système où 5 correspond à Unix et 6 à Windows32.


J La documentation officielle indique qu’elle renvoie cette valeur pour les anciennes versions de Windows. "6 Windows32 (95/98/2000 / NT)" La documentation doit-elle être mise à jour? Que se passe-t-il lorsqu'il s'agit de Windows 64 bits? jsoftware.com/help/dictionary/dx009.htm
Keeta

Testé sous Windows 7 64 bits et renvoie un 6. La documentation semble être assez ancienne.
Keeta

@Keeta Oui, je pense que c'est vieux, mais il m'a tout de même renvoyé un 6 sous Windows 10 64 bits.
miles

11

R, 15 octets

.Platform$O>"v"

Merci à plannapus pour la suggestion d'utiliser la correspondance partielle pour l'extraction d'éléments de liste.

.Platform est une liste avec quelques détails de la plate-forme sous laquelle R a été construit. Il existe un élément OS.type(le seul élément dont le nom commence par "O") est une chaîne de caractères, indiquant le système d'exploitation (la famille) de l'ordinateur. Un des "unix"ou "windows".

Donc "unix"est moins alors "v", mais "windows"est plus grande alors "v". D'autres réponses valides de 15 octets sont

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

R est en cours de développement pour les familles de systèmes d'exploitation de type Unix, Windows et Mac . Les autres familles de systèmes d'exploitation ne sont pas prises en charge.


1
il existe des plates-formes autres qu'Unix qui ne sont pas des fenêtres, vous savez ...
Blue

2
@muddyfish: .Platform [[1]] est défini comme "unix" ou "windows" dans la documentation de R. github.com/wch/r-source/blob/…
liori

Désolé, ça va alors. La réponse devrait probablement être modifiée pour inclure ce fait pour que cela ne soit plus demandé
Blue

10

Perl, 11 octets

print$^O=~MS

^O doit être remplacé par un littéral Control-O.

Sorties 1sur Windows, rien sur un autre OS.

Notez que je n'utilise pas say car cela ajoute une nouvelle ligne, ce qui est la vérité en Perl.

-2 octets grâce à primo. (et problèmes potentiels résolus)
-1 octets grâce à ais523.


AFAIR, cela ne fonctionnera pas dans Cygwin Perl.
Igor Skochinsky

Cela ne fonctionnera pas non plus avec Mingw Perl. Cependant, Perl considère ces deux systèmes comme des systèmes d'exploitation distincts de Windows (car ils obéissent généralement à UNIX plutôt qu'aux conventions Windows), et il n'est pas clair s'ils doivent être pris en compte pour les besoins de la question. Dans d'autres nouvelles, vous pouvez enregistrer un octet ici en utilisant un caractère de contrôle-O littéral plutôt que ^O.

@ ais523 J'ai édité ça, merci. En ce qui concerne Cygwin et Mingw, je supprimerai le message si elles doivent être considérées comme Windows, mais comme vous le dites, il serait plus logique de les considérer comme un système d’exploitation séparé (ou du moins, comme un système non Windows).
Dada

Les délimiteurs de regex ne devraient pas être nécessaires $^O=~W, bien que je sois probablement contre MS. Alternativement, vous pouvez également correspondre $^X=~':'.
dimanche

@primo droit, merci. Je ne connais pas d’autre système d’exploitation, Walors j’ai supposé qu’il fallait vérifier pour une Wamende .. des raisons pour lesquelles vous suggérez MSplutôt?
Dada

9

julia, 10 octets

is_windows

Une fonction qui retourne vrai pour Windows


9

code machine x86, 9 octets

40 39 04 24 75 02 CD 80 C3

Compilé à partir 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)

3
Le binaire pur (COM) ne fonctionnera pas sous Windows ou Linux, donc vous ne savez pas si cela est valide
Igor Skochinsky

@IgorSkochinsky Il doit y avoir un interprète pour l'assemblage.
Shmuel H.

Vous pouvez rendre le code encore plus court en laissant seulement inc eaxet int 0x80je pense qu'il devrait échouer sous Windows et mettre fin au processus.
Shmuel H.

2
@IgorSkochinsky Il existe des programmes qui exécutent également des fichiers binaires bruts. Voir le lien dans mon commentaire précédent.
Shmuel H.

1
Bochs et QEMU simulent un environnement nu-métal et n'exécutent pas le code binaire sous le système d'exploitation hôte. Donc, ils ne vont pas travailler à l'OMI. Mais tout cela pourrait être une discussion pour le méta.
Igor Skochinsky

8

JavaScript, 42 30 26 25 octets

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

Testé avec Firefox. (Chrome n’a pas la oscpupropriété.) Les lettres minuscules ayant un code de caractères plus élevé que les lettres majuscules, cela dépend de la première lettre navigator.oscpumajuscule et non W , X , Y ou Z sur une plate-forme prise en charge par Firefox (autre que Windows, bien sûr). Selon ce post , c'est le cas.

Édite

  1. Sauvegardé 12 octets grâce à Neil .
  2. Enregistré quatre autres octets
  3. Sauvegardé un autre octet grâce à Blender .

oscpuest probablement la navigatorpropriété la plus courte que vous pouvez utiliser. En outre, tester une expression rationnelle sera probablement plus court, mais je ne l'ai pas encore mesuré.
Neil

Vous pouvez supprimer !=-1et ajouter une ~droite après la grosse flèche, économisant 3 octets.
Luc

Devez-vous créer une fonction? Tu ne peux pas juste console.logle test de regex? Serait également navigator.oscpu[0]=='W'travailler ou est - il un autre système d' exploitation qui commence aussi avec W.

2
Hmm, pour une raison quelconque, mon Chrome n'a pas oscpu.
Muzer

2
navigator.oscpu>'V'pourrait fonctionner aussi bien
Blender

8

C #, 61 48 octets

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

Sauvegardé 13 octets grâce à TheLethalCoder

Ou un programme complet à 83 octets:

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

Différentes variantes de Windows utilisent les valeurs enum 0 à 3 dans l' implémentation de Microsoft .NET . 4 correspond à Unix, 5 à la Xbox [360] (que je ne considérerai pas comme "Windows"), 6 à MacOSX. Mono utilise les mêmes valeurs , en ajoutant 128 pour Unix / Linux dans les versions antérieures.

Par conséquent, tout élément <4 correspond à Windows et tout le reste n’est pas Windows.


2
Vous ne savez pas si quelque chose me manque, mais pourquoi attribuez-vous la valeur à un int?
vendredi

@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- En gros, les règles de dactylographie de C # disent que je ne peux pas comparer a PlatformIDet intdirectement, et qu'il n'y a pas de conversion implicite de PlatformIDà int. Mais il y a un casting explicite de tous les enums sur leurs valeurs, dont je profite ici ...
Bob

1
@ MustafaAKTAŞ En outre, je dois souligner que cela cible C # / .NET Framework / .NET Core. Sur Xbox One, il est uniquement possible d'exécuter des applications UWP, qui utilisent une API différente, mais pas System.Environment.OSVersiondu tout . Si cela ne vous convient pas, vous devez également supprimer toutes les autres réponses non-UWP. Il s'avère également que vous ne pouvez pas (actuellement) exécuter des applications UWP sur des plateformes autres que Windows. Vous pouvez donc supprimer toutes ces applications. Ce qui vous laisse avec 0 réponses et une question sans réponse.
Bob le

1
Vous pouvez compiler un Action<bool>dans le premier exemple pour 48 octets (je ne l’ai pas testé mais je crois que cela fonctionnera). _=>(int)System.Environment.OSVersion.Platform<4;Il se peut ()=>...que vous
ayez

1
La compilation en fonctions anonymes telles que Funcs et Actions est utilisée tout le temps ici. Je crois que cela se trouve dans la page des astuces de golf et je les utilise presque tout le temps. De plus, les fonctions anonymes sont beaucoup utilisées dans d'autres langues, je pense donc qu'il est prudent de les utiliser ici
TheLethalCoder

7

Lot, 50 octets

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

Edit: Corrigé pour ignorer DOS au lieu de prétendre que c'est Windows.

Le seul autre moyen que je connaisse d’exécuter Batch en dehors de Windows consiste à utiliser WINE, qui par défaut mappera Z:sur /. Par conséquent, s'il Z:\bin\shexiste, il y a de fortes chances que ce soit le cas /bin/sh, donc pas Windows.

Je ne sais pas ce que WINE attribue à% OS%, mais si ce n'est pas Windows_NTle cas, je pourrais économiser 23 octets.


1
DOS est un autre moyen, qui n’est pas Windows.
Ruslan

Non seulement cela échoue sous DOS, mais également sur un ordinateur où Z: est mappé et qui contient un tel chemin.
Adám

1
Au moins j'essaie de détecter le vin. Aucune des autres réponses ne donnera le résultat correct si elles sont exécutées sous WINE.
Neil

3
@ Adám Bien sûr, et si vous compilez la réponse C avec -DWIN32 = 1, cela échouera également. Votre point?
Neil

1
oui, ensembles à vinOS=Windows_NT
Jasen

7

QBasic, 31 octets

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

Imprime non nul sous Windows, 0 sous tout le reste.

COMSPECest une variable d'environnement unique aux systèmes d'exploitation Microsoft. Il pointe vers l'interpréteur de commande, généralement command.comou cmd.exe. Sous Windows, l'interpréteur de commandes est situé quelque part dans le répertoire Windows. sous MS-DOS, il se trouve dans le répertoire DOS ou à la racine du disque, et sous aucun autre système d'exploitation, il n'existe pas.

En vérifiant si la valeur de COMSPEC contient un "W", nous pouvons faire la différence entre Windows et non-Windows.


COMSPECn'est pas réservé pour signifier quoi que ce soit en particulier sous Linux (c'est-à-dire qu'il est sous le contrôle de l'utilisateur par défaut), de sorte qu'il n'est pas possible que l'utilisateur le définisse à une valeur qu'il utilise pour ses propres besoins (et qui contient un W)? Certes, c'est un peu un cas de bord.

1
@ ais523: De plus, le répertoire Windows ne doit pas nécessairement contenir un W. C'est cassant dans les deux cas.
Joey

7

Node.js, 27 16 15 13 octets

Merci à @Patrick , qui a rasé 12 octets de ma solution à l'aide de la réplique de Node:

_=>os.EOL>`
`

Solution originale:

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

Si vous le changez en Node.js REPL, vous pouvez économiser 16 octets en utilisant simplement_=>path.sep!='/'
Patrick Roberts

Je suis nouveau à CodeGolf. Ai-je le droit de faire ça?
GilZ

Oui, sinon je ne l'aurais pas suggéré. REPL signifie lire, exécuter, imprimer en boucle, le programme qui s'exécute lorsque vous entrez nodesur la console. À partir de là, tous les modules de nœud système sont disponibles sans qu'il soit nécessaire de les utiliser require().
Patrick Roberts

Oh oui désolé. Je voulais dire 11. Vous pouvez sauvegarder un autre octet en changeant !=à >puisque l'indice ASCII \ est 92 et /47.
Patrick Roberts

7

Excel VBA, 41 40 30 29 26 24 octets

La fonction Windows immédiate renvoyée truesi le code du système d'exploitation démarrant est plus longue que la longueur 3, car les informations sont limitées à la sortie, macou si pcdoscela truene retourne que sur les ordinateurs Windows.

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

Versions précédentes

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

Changements

-1 Merci à Neil d'avoir utilisé Left(...,1) plusMid(...,1,1)

-10 Merci à ChrisH d'avoir souligné le truc du séparateur de chemins de Mego

-1 pour vérifier le WorkbookPathpour"\" plutôt que d'utiliserApplication.Path Separator

-4 Pour passer à Environ()

-2 pour passer à [Len(Info(...

Nouvelle solution, 51 octets

Une nouvelle subroutine qui affiche, pour le VBE, une fenêtre, un 1 (truthy)sous-fenêtre et un 0 (falsey)sous-Mac par une méthode de compilation conditionnelle.

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

1
leftvous sauve un octet.
Neil

L'avez-vous essayé sur office365 en ligne? Est-ce que cela supporte même VBA? Juste curieux.
Chris H

@ChrisH À ma connaissance, office.com ne prend pas en charge les scripts VBA en ligne (bien que, si quelqu'un d'autre le sait mieux, dites-le-moi, cela me faciliterait considérablement la vie); Cependant, avec O365, vous avez le droit de télécharger une copie d'Office 2016 (ou de l'actuelle) sur votre bureau, ce qui prend en charge les scripts VBA.
Taylor Scott

J'ai jusqu'à présent réussi à l'éviter; compte tenu de votre commentaire qui semble devoir continuer (les seules machines Windows que j'utilise ont une copie de bureau, les machines personnelles sont toutes linux)
Chris H

1
Astuce de séparateur de chemin @ Mego ( ?Application.PathSeparator)="\"serait 32 car il s'agit d'un caractère unique)
Chris H

6

Perl 6 ,  19  18 octets

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

Les deux sorties True␤ou False␤selon le système sur lequel il est exécuté.


la seconde s'appuie sur les valeurs non windows de CWD ne contenant pas de `` - il n'y a aucune garantie de cela,
Jasen

5

APL (Dyalog) , 21 octets

'W'∊∊#⎕WG'APLVersion'

Essayez-le en ligne!

#⎕WG'APLVersion' Racine ( # ) W indow G et propriété APL Version

 enrôler (aplatir)

'W'∊W  est un membre? (aucune valeur de retour non-Windows ne contient un W majuscule)


4

tcl, 38 octets

 expr [lsearch $tcl_platform windows]>0

4

PHP 17 octets

Ce qui suit affichera 1 si windows et rien si rien d’autre. Ignorer les avis de conversion de chaîne.

<?=PHP_OS==WINNT;

Essayez les tests en ligne en ligne pour linux car le sandbox est linux pour le PoC.


Sûr que c'est suffisant? Demander parce que valeurs possibles pour: PHP_OS .
Manatwork

1
'<? = PHP_OS [0] == W; `est à la fois plus court d'un octet et intercepte toutes les autres valeurs windows de la question liée par manatwork. >Vpourrait fonctionner aussi.
user59178

Le travail dépend de la version de Windows sur laquelle PHP a été compilé. Depuis Windows Visa \ 7, la version de Windows est représentée avec WINNT en raison du noyau d'autorité NT. avant Windows XP et inférieur était Win32 et Windows Server 2003 était Windows.
DrWhat

4

Java 8, 49 octets

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

Plus long que l' autre réponse Java , mais adopte une approche différente.

Ce lambda entre dans un Supplier<Boolean> et peut être testé avec le programme suivant:

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

}

Cela ressemble beaucoup à la réponse initiale que vous associez (avant les modifications).
Olivier Grégoire

Pourquoi pas juste .contains("W")?
Cyoce

@Cyoce en fait, le système d'exploitation variable semble être spécifique à Windows.

4

Haskell, 39 à 31 octets

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

Je vérifie la sortie de la première lettre de "m", qui devrait être "mingw" pour Windows. Autant que je sache, il n'y a pas d'autre système d'exploitation qui commence par M. Les informations proviennent de https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs


1
Sur mon système (Windows 10 64 bits, GHC 8.0.1 64 bits), osdonne "mingw32".
Mego

@Mego vous avez raison, corrigé pour cela
Dylan Meeus

4

bash + coreutils, 5 octets

rm $0

Fonctionne également dans la plupart des autres coques POSIXy. (Notez que les ports Windows de bashetrm existent; même s'ils ne sont normalement utilisés qu'avec des systèmes d'exploitation plus lourds, cela ne constitue pas une entrée totalement vide.) Sorties via le code de sortie (0 = false, 1 = true). Peut être compté comme 4 octets si vous êtes autorisé à assumer un nom de fichier (par exemple rm a). Notez que cela peut potentiellement échouer dans le cas de noms de fichiers très étranges (qui rmseront interprétés comme des arguments en raison de l'absence de guillemets, et éventuellement de supprimer des fichiers qui vous intéressent, je vous déconseille donc d'exécuter ce programme à partir d'un fichier avec un nom étrange. ).

Remarque: supprime le programme du disque en tant qu'effet secondaire, ou du moins tente de le faire. Dans le cas où nous fonctionnons sous Windows, le système d'exploitation ne parviendra pas à supprimer le fichier en cours d'exécution (opération que Windows n'autorise pas par défaut ou à l'arrêt complet) et générera donc une rmerreur. bashintercepte l'erreur et la convertit en un code de sortie (ainsi l'ensemble du programme se termine normalement). La plupart des autres entrées utilisent 0 pour falsey et 1 pour la vérité dans les codes de sortie, ce qui revient au même; notez ce test et envoyez le programme à la branche.bash leif énoncé n'accepte pas du tout entiers (plutôt, il accepte les commandes et les branches selon qu'ils réussissent, et des tests arithmétiques sont effectués par les moyens de programmes tels quetestintentionnellement un "crash" sur une comparaison échouée), il s’agit donc d’un terrain plus fragile en termes de légalité que les programmes qui sortent par le code de sortie dans des langues où 0 est valide dans unifelse


4

8ème , 11 octets

 
os 1- not .
 

Imprime truesous Windows, falsesous Linux et macOS. Les autres plates-formes prises en charge par 8th sont Android, iOS et Raspberry Pi, mais je ne suis pas en mesure de les tester.

Version non-golfée (avec commentaires)

 
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 octets)

import winreg

Retourne avec le code de sortie zéro (généralement vrai dans les shells) si sous Windows, et avec un code de sortie différent de zéro sinon.

Si vous préférez l'inverse, il y a une solution de 12 octets: import posix.


Je pense que cela ne fonctionnera pas s’il existe un fichier appelé winreg.pydans le même répertoire.
Zacharý

2
En outre, selon les règles: "Le code qui ne parvient pas à s'exécuter / compiler sur une plate-forme ne compte pas comme une valeur falsey."
Zacharý

4

TrumpScript , 17 octets

America is great.

Essayez-le en ligne!


Ce programme, s’il est exécuté sur Windows, imprimera:

The big problem this country has is being PC

Ceci est considéré comme une valeur de vérité.


La sortie vide et la valeur suivante sont faussement:

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

La sortie vide se produira sur n’importe quel système Linux (pour ce programme), la réponse Apple longue se produira évidemment sur Mac (pour n’importe quel programme). Sur TIO, le backend (je suppose) est un système d'exploitation Unix, vous ne pouvez donc obtenir que la valeur falsy; je reçois le message PC sur mon ordinateur.


Pas tout à fait sûr que cela compte comme un message d'erreur (ce qui invaliderait la réponse), mais si vous ne le saviez pas, cela valait probablement la peine de rire.


Qu'est-ce que le monde est venu à ...
ooransoy

@avaragecoder FAITES DE GRANDS PYTHON!
Magic Octopus Urn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.