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 code-golf , donc le score le plus bas l'emporte, mais je suis également très intéressé par des solutions créatives à ce problème.
code-golf
decision-problem
Daniel
la source
la source
Réponses:
Vim, 2 octets
Sous Windows,
<C-a>
(ctrl + a) est associé par défaut àSelect All
. Si vous tapez un1
mode 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éfautIncrement 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é
la source
Ctrl + a
,1
. Si c'était le cas, celaCtrl + a + 1
compterait comme 1 frappe.MATLAB, 4 octets
De la documentation :
Il y a aussi les fonctions
ismac
etisunix
.Je laisserai au lecteur le soin de comprendre ce que font ces fonctions.Mego a gentiment demandé des schémas explicatifsismac
etisunix
j'ai donc essayé de l'illustrer ici:Il n'a pas été demandé de diagramme,
ispc
mais je peux révéler que le comportement est assez similaire, sauf substitutOSX
etUnix
avecWindows
.Deuxième approche:
Voici une deuxième approche
getenv
utilisant 23 octets qui devrait être à l'épreuve des balles, sauf s'il existe un autre système d'exploitation commençant parW
:la source
Python 2.7.10 , 24 octets
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.sep
est false et0/0
est donc calculée, ce qui provoque uneZeroDivisionError
sortie avec un code de sortie non nul. Sur les plateformes non-Windows,'['>os.sep
true est utilisé, ce qui rend l'expression0/1
qui ne fait rien et le programme se ferme avec le code de sortie 0.la source
Assemblage x86, 7 octets(inspiré de la réponse de Runemoro )Ou
La description
Tout d’abord, nous allons régler
eax
sur1
(numéro d’appel système pourexit(int val)
pourLinux
,FreeBSD
etOSX
). Ensuite, nous appellerons la porte d’interruption0x80
qui est la porte d’appel système pourLinux
,FreeBSD
etOSX
. Cela entraînerait la fermeture du programme dont le statutebx
est0
(false
).Sous Windows, la porte
int 0x80
est invalide (elle2e
s’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
OSX
car il a une convention de passage d'argument différente sur 32 bits (par la pile).Références et lectures complémentaires
FreeBSD - System Calls
: Informations sur les appels système dansFreeBSD
.System calls in the Linux kernel. Part 2.
: Un excellent article sur les appels système de Linux.Linux Syscall Reference
: une référence aux numéros de système pourLinux
.Windows Syscall Shellcode
: Un article sur l'appel direct des appels systèmewindows
depuis l'assembly.Making system calls from Assembly in Mac OS X
: Un article sur les appels système surOSX
.la source
xor eax, eax
de là?false
termine avec le code 1 et setrue
termine avec le code 0).eax
etebx
sont 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.mov eax, 1
serait traduit\xB8\x01\x00\x00\x00
, ce qui est beaucoup plus long que le simple fait de déplacer un registre et un appelinc
.C,
44433836 octetsMerci à @Downgoat pour un octet! 44 est toujours normal.
Merci à @Neil pour deux octets!
la source
0
hors deifdef
et en changeant1
de!
, mais je pense que cela_WIN32+0
fonctionne encore mieux.return 1;
à l'intérieur de l'ifdef et supprimer le reste, puisque main sans retour en c99 doit retourner 0.#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.PHP, 22 octets
Imprime
1
si 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:
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>"/";
impressions1
ou 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_dump
etgettype
), 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_OS
constante prédéfinie commence parwin
(insensible à la casse; Windows, WIN32, WINNT, mais pas CYGWIN ni Darwin); imprime1
pour Windows, sinon rien.17/18 octets :
imprime
1
s'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), sinon0
.Vous pouvez également vérifier la constante
PHP_EOL
.plus d'options:
PHP_SHLIB_SUFFIX
estdll
sur Windows, mais pas nécessairement seulement là.php_uname()
renvoie des informations sur le système d'exploitation et plus encore; commence parWindows
pour Windows.$_SERVER['HTTP_USER_AGENT']
contiendraWindows
lorsqu’il sera appelé dans un navigateur sous Windows.<?=defined(PHP_WINDOWS_VERSION_BUILD);
(38 octets) fonctionne en PHP> = 5.3conclusion
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é; maisPHP_OS
contiendra probablement toujours les informations souhaitées.la source
<?=class_exists(COM);
. Le coursCOM
n'est disponible que sous Windows, à ma connaissance. Cela devrait vous faire économiser un octet.Befunge-98, 7 octets
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.la source
Mathematica, 28 octets
la source
&
, il n'imprimera rien (et ce n'est pas non plus une fonction appelable). , mais simplement un extrait / expression).Out[1]= False
sortie de ceci:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
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é avecf.get()
.Essayez-le en ligne! - le serveur n'est pas Windows, donc cela s'imprime
false
. 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.la source
()->java.io.File.separatorChar=='\\'
est seulement 36 octets.()->java.io.File.separatorChar>'['
!J, 7 octets
Il s'agit d'un verbe (similaire à une fonction) qui utilise la conjonction étrangère intégrée
9!:12
pour acquérir le type de système où 5 correspond à Unix et 6 à Windows32.la source
R, 15 octets
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 sontR 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.
la source
Perl, 11 octets
^O
doit être remplacé par un littéral Control-O.Sorties
1
sur 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.
la source
^O
.$^O=~W
, bien que je sois probablement contreMS
. Alternativement, vous pouvez également correspondre$^X=~':'
.W
alors j’ai supposé qu’il fallait vérifier pour uneW
amende .. des raisons pour lesquelles vous suggérezMS
plutôt?julia, 10 octets
Une fonction qui retourne vrai pour Windows
la source
code machine x86, 9 octets
Compilé à partir de:
la source
inc eax
etint 0x80
je pense qu'il devrait échouer sous Windows et mettre fin au processus.JavaScript,
42302625 octetsTesté avec Firefox. (Chrome n’a pas la
oscpu
propriété.) Les lettres minuscules ayant un code de caractères plus élevé que les lettres majuscules, cela dépend de la première lettrenavigator.oscpu
majuscule 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
la source
oscpu
est probablement lanavigator
proprié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é.!=-1
et ajouter une~
droite après la grosse flèche, économisant 3 octets.console.log
le test de regex? Serait égalementnavigator.oscpu[0]=='W'
travailler ou est - il un autre système d' exploitation qui commence aussi avec W.navigator.oscpu>'V'
pourrait fonctionner aussi bienC #,
6148 octetsSauvegardé 13 octets grâce à TheLethalCoder
Ou un programme complet à 83 octets:
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.
la source
int
?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 aPlatformID
etint
directement, et qu'il n'y a pas de conversion implicite dePlatformID
àint
. Mais il y a un casting explicite de tous les enums sur leurs valeurs, dont je profite ici ...System.Environment.OSVersion
du 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.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 vousFunc
s etAction
s 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 iciLot, 50 octets
Edit: Corrigé pour ignorer DOS au lieu de prétendre que c'est Windows.
Le
seulautre moyen que je connaisse d’exécuter Batch en dehors de Windows consiste à utiliser WINE, qui par défaut mapperaZ:
sur/
. Par conséquent, s'ilZ:\bin\sh
existe, 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_NT
le cas, je pourrais économiser 23 octets.la source
OS=Windows_NT
QBasic, 31 octets
Imprime non nul sous Windows, 0 sous tout le reste.
COMSPEC
est une variable d'environnement unique aux systèmes d'exploitation Microsoft. Il pointe vers l'interpréteur de commande, généralementcommand.com
oucmd.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.la source
COMSPEC
n'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 unW
)? Certes, c'est un peu un cas de bord.Node.js,
27161513 octetsMerci à @Patrick , qui a rasé 12 octets de ma solution à l'aide de la réplique de Node:
Solution originale:
la source
Node.js REPL
, vous pouvez économiser 16 octets en utilisant simplement_=>path.sep!='/'
node
sur la console. À partir de là, tous les modules de nœud système sont disponibles sans qu'il soit nécessaire de les utiliserrequire()
.!=
à>
puisque l'indice ASCII\
est 92 et/
47.Excel VBA,
414030292624 octetsLa fonction Windows immédiate renvoyée
true
si le code du système d'exploitation démarrant est plus longue que la longueur 3, car les informations sont limitées à la sortie,mac
ou sipcdos
celatrue
ne retourne que sur les ordinateurs Windows.Versions précédentes
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
WorkbookPath
pour"\"
plutôt que d'utiliserApplication.Path Separator
-4 Pour passer à
Environ()
-2 pour passer à
[Len(Info(...
Nouvelle solution, 51 octets
Une nouvelle
sub
routine qui affiche, pour le VBE, une fenêtre, un1 (truthy)
sous-fenêtre et un0 (falsey)
sous-Mac par une méthode de compilation conditionnelle.la source
left
vous sauve un octet.?Application.PathSeparator)="\"
serait 32 car il s'agit d'un caractère unique)Perl 6 ,
1918 octetsLes deux sorties
True
ouFalse
selon le système sur lequel il est exécuté.la source
APL (Dyalog) , 21 octets
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)la source
tcl, 38 octets
la source
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.
la source
>V
pourrait fonctionner aussi.Java 8, 49 octets
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:la source
.contains("W")
?Haskell,
39 à31 octetsJe 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
la source
os
donne"mingw32"
.bash + coreutils, 5 octets
Fonctionne également dans la plupart des autres coques POSIXy. (Notez que les ports Windows de
bash
etrm
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 exemplerm a
). Notez que cela peut potentiellement échouer dans le cas de noms de fichiers très étranges (quirm
seront 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
rm
erreur.bash
intercepte 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 quetest
intentionnellement 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 unif
else
la source
8ème , 11 octets
Imprime
true
sous Windows,false
sous 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)
la source
Python 3 (13 octets)
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
.la source
winreg.py
dans le même répertoire.TrumpScript , 17 octets
Essayez-le en ligne!
Ce programme, s’il est exécuté sur Windows, imprimera:
Ceci est considéré comme une valeur de vérité.
La sortie vide et la valeur suivante sont faussement:
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.
la source