MS Windows erkennen

78

Herausforderung

Erstellen Sie ein Programm, das unter Microsoft Windows einen Wahrheitswert (der Einfachheit halber bleiben wir bei Windows 7, 8.1 und 10) und unter jedem anderen Betriebssystem (OSX, FreeBSD, Linux) einen Falsey-Wert zurückgibt.

Regeln

  • Code, der auf einer Plattform nicht ausgeführt / kompiliert werden kann, zählt nicht als falscher Wert.

Gewinnkriterien

Ich bezeichne dies als , also gewinnt die niedrigste Punktzahl, aber ich bin auch sehr daran interessiert, kreative Lösungen für dieses Problem zu finden.

Daniel
quelle
7
Können die Programme per Exit-Code ausgeben? ( normalerweise erlaubt )
FlipTack
13
Können Sie eine genaue Liste der Betriebssysteme angeben, auf denen diese ausgeführt werden müssen?
FlipTack
2
Was soll das Ergebnis unter Windows RT sein?
Adám
6
Möglicherweise möchten Sie einige bestimmte Nicht-Windows-Systeme angeben, die unterstützt werden müssen. Es gibt einige Debatten in Kommentaren über Dinge wie DOS und OS2.
jpmc26
2
Wir brauchen wahrscheinlich einen Konsens darüber, was für Exit-Codes als wahr und falsch gilt. Die normale Konvention ist 0 für wahr und alles andere für falsch, aber viele Antworten behandeln es als das Gegenteil, und die Definition "if statement" trifft offensichtlich nicht zu.

Antworten:

75

Vim, 2 Bytes

<C-a>1

Unter Windows ist <C-a>(Strg + a) standardmäßig zugeordnet Select All. Wenn Sie 1in Windows einen im Auswahlmodus eingeben, wird die Auswahl durch die von Ihnen eingegebene (1) ersetzt, wobei eine 1 im Puffer verbleibt.

Auf anderen Betriebssystemen ist <C-a>standardmäßig zugeordnet Increment number. Da es keine zu inkrementierende Zahl gibt, ist es ein No-Op, und dann erhöht die 1 die Anzahl, aber in Bezug auf den Puffer ist es ein No-Op.

1 ist in Vim wahr, und eine leere Zeichenfolge ist falsch

nmjcman101
quelle
Sieht aus wie 3 Tastenanschläge. Strg + a + 1
Pavel
12
Ich denke, in diesem Metapost wird meta.codegolf.stackexchange.com/questions/8995/… Vim-Antworten werden im Allgemeinen ohne die Modifikatoren bewertet (insbesondere, da die erste Antwort auf den Post <Strg + a> als Beispiel für 1 Byte verwendet).
nmjcman101
4
@Pavel es ist Ctrl + a, 1. Wenn es Ctrl + a + 1so wäre, würde es als 1 Tastendruck gezählt.
Captain Man
7
Schön, ich liebe diese Antwort!
DJMcMayhem
Das ist ziemlich elegant, ich mag es.
Dan
108

MATLAB, 4 Bytes

ispc

Aus der Dokumentation :

tf = ispcGibt logisch 1 (wahr) zurück, wenn die Version der MATLAB®-Software für die Microsoft® Windows®-Plattform bestimmt ist. Andernfalls wird eine logische 0 (falsch) zurückgegeben.

Es gibt auch die Funktionen ismacund isunix. Ich überlasse es dem Leser, herauszufinden, was diese Funktionen bewirken. Mego hat mich freundlich um Diagramme gebeten ismacund isunixdeshalb habe ich versucht, es hier zu veranschaulichen:

Bildbeschreibung hier eingeben

Es wurde nicht nach einem Diagramm von gefragt, ispcaber ich kann zeigen, dass das Verhalten ziemlich ähnlich ist, außer ersatzweise OSXund Unixmit Windows.


Zweiter Ansatz:

Hier ist ein zweiter Ansatz mit getenv23 Bytes, der kugelsicher sein sollte, es sei denn, es gibt ein anderes Betriebssystem, das mit Folgendem beginnt W:

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

getenv 'name'Durchsucht die zugrunde liegende Liste der Betriebssystemumgebung nach dem Text des Formulars name=value, wobei namees sich um den eingegebenen Zeichenvektor handelt. Wenn gefunden, gibt MATLAB® den Zeichenvektorwert zurück. Wenn der angegebene Name nicht gefunden werden kann, wird eine leere Matrix zurückgegeben.

Stewie Griffin
quelle
4
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Dennis
54

Python 2.7.10 , 24 Bytes

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

Danke an FlipTack für 3 Bytes

Dieses Programm nutzt die Tatsache, dass Windows das einzige Betriebssystem ist, das \als Pfadtrennzeichen verwendet wird. Normalerweise ist das frustrierend und schlecht, aber ausnahmsweise ist es tatsächlich ein Vorteil. Unter Windows '['>os.sepist false und wird daher 0/0berechnet, wodurch ein ZeroDivisionErrorExit mit einem Exit-Code ungleich Null verursacht und beendet wird. Auf Nicht-Windows-Plattformen '['>os.sepist true, wenn der Ausdruck 0/1nichts bewirkt und das Programm mit dem Beendigungscode 0 beendet wird.

Mego
quelle
DOS verwendet auch einen Backslash als Pfadtrennzeichen und hat mindestens eine Python 2-Implementierung.
Isanae
5
@isanae Ich habe den Titel bearbeitet, um Python 2.7 anzugeben - die einzige Python 2-Implementierung unter DOS ist ein archaischer,
Mego
OS / 2 verwendet auch einen Backslash und hat eine Python 2.7-Implementierung;)
isanae
9
@isanae Dort habe ich 2.7.10 angegeben. Viel Glück beim Finden eines Hafens.
Mego
2
anscheinend muss es nur bei 3 neueren Windows-Versionen korrekte Ergebnisse liefern und vermutlich sind auch die neueren Versionen der drei anderen aufgeführten Systeme, OS2 und DOS, unwichtig
Jasen
45

x86-Assembly, 7 Byte (Inspiriert von Runemoros Antwort )

31 DB 89 D8 40 CD 80

Oder

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

Beschreibung

Zunächst setzen wir eaxauf 1(die Systemrufnummer exit(int val)für Linux, FreeBSDund OSX). Dann rufen wir das Interrupt-Gate auf, für 0x80das das System-Call-Gate ist Linux, FreeBSDund OSX. Das würde das Programm führen verlassen mit dem Status von ebxdenen 0( false).

Unter Windows int 0x80ist das Gate ungültig (es wird 2eals Syscall-Gate verwendet) und würde das Programm zum Absturz bringen, sodass es mit einem positiven Beendigungscode endet ( true).

Bearbeiten: Würde nicht funktionieren, OSXda es eine andere Konvention für die Übergabe von Argumenten auf 32 Bit (vom Stapel) gibt.

Referenzen und weiterführende Literatur

Shmuel H.
quelle
3
Das ist hervorragend!
z0rbergs
Warum hat der Absturz einen wahren Wert? Liegt es daran, dass EAX (normalerweise der Rückgabewert) 1 ist? Ist EAX beim Programmstart garantiert auf 0? Oder brauchst du da drin xor eax, eax?
Cole Johnson
3
@ColeJohnson: Vom Betriebssystem erkannte Abstürze (auf den normalerweise mit x86 verwendeten Betriebssystemen) hinterlassen niemals den Beendigungscode 0, da dies für eine erfolgreiche Beendigung reserviert ist. (Normalerweise ist der Exit-Code ein Wonky-Wert, den das Betriebssystem speziell für diesen Umstand reserviert.) Ich bin mir jedoch nicht sicher, ob es Sinn macht, 0 als falsch und 1 als wahrheitsgemäß in Programm-Exit-Codes zu zählen, da die normale Konvention die ist genau das Gegenteil (wobei 0 das einzig wahre ist, z. B. wird das Standardprogramm UNIX / Linux / POSIX falsemit Code 1 und das Programm truemit Code 0 beendet).
1
Bei dieser Antwort wird implizit davon ausgegangen, dass beim Programmstart (unter Nicht-Windows-Betriebssystemen) Register registriert eaxund ebxauf Null zurückgesetzt werden. Wenn ich mich richtig erinnere , kann dies nicht garantiert werden. Es wird auch explizit davon ausgegangen, dass die Konvention zur Übergabe von syscall-Argumenten für Linux mit der für FreeBSD und OSX übereinstimmt, was in der Tat sehr überraschend wäre.
zwol
1
@ Sebastian-LaurenţiuPlesciuc Gute Frage. mov eax, 1würde übersetzt werden \xB8\x01\x00\x00\x00, was viel länger dauert, als sich nur zu registrieren und anzurufen inc.
Shmuel H.
29

C 44 43 38 36 Bytes

Danke an @Downgoat für ein Byte! durchgestrichen 44 ist immer noch normal 44
Danke an @Neil für zwei Bytes!

f(){return
#ifdef WIN32
!
#endif
0;}
betseg
quelle
Ursprünglich wollte ich vorschlagen , dass Sie eine Reihe von Bytes durch Bewegen des speichern können 0aus dem ifdefund der Änderung der 1zu !, aber ich denke , _WIN32+0funktioniert sogar noch besser.
Neil
Wenn c99 in Ordnung ist, können Sie f in main ändern und return 1;im ifdef bleiben und das else entfernen, da main ohne return in c99 0 zurückgeben muss.
simon
11
Das ist eine Compiler-Direktive. Wenn es auf einem Windows-System kompiliert und beispielsweise auf einem Linux-System ausgeführt wird, wird es weiterhin 1 zurückgeben.
Micheal Johnson,
4
@ MichaelJohnson Nr. Ich kann es unter Linux kompilieren (mit mingw32gcc msvc) und Code erhalten, der true zurückgibt, wenn es unter Windows ausgeführt wird. Ich kenne keinen von Windows gehosteten Linux-Compiler. Wenn Sie Emulationsebenen wie "Wein" argumentieren möchten, haben alle anderen Antworten wahrscheinlich das gleiche Problem
Jasen
1
Ich bin mir nicht sicher, ob WIN32 nur definiert ist, aber auf einen Wert ungleich Null festgelegt ist. Wenn es der spätere Fall ist, können Sie einfach sagen #if WIN32. Da WIN32 nicht unter Windows definiert ist, muss es vom Präprozessor als 0 behandelt werden.
Shahbaz,
27

PHP, 22 Bytes

`<?=PATH_SEPARATOR>":";`  

Gibt aus, 1ob das Pfadtrennzeichen ein Semikolon ist (Doppelpunkt oder leer für alle anderen Betriebssysteme außer DOS und OS / 2), sonst nichts.

auch 22 bytes , aber nicht so sicher:

<?=strpos(__FILE__,92);

Gibt eine positive Ganzzahl aus, wenn der Dateipfad einen Backslash enthält. sonst nichts.
Eine sichere Alternative mit 27 Bytes : <?=DIRECTORY_SEPARATOR>"/";Drucke 1oder nichts.

Ein seltsamer Fund : <?=__FILE__[1]==":";( 20 Bytes ) sollte auch nicht sicher sein, aber ok. Aber obwohl __FILE__ich vorgab, ein String zu sein (ich habe es versucht var_dumpund gettype), löst die Indizierung einen Fehler aus, es sei denn, Sie kopieren ihn an eine andere Stelle (Verkettung funktioniert auch) oder verwenden ihn als Funktionsparameter.

Edit:
<?=(__FILE__)[1]==":";(auch 22 Bytes ) funktioniert in PHP 7; aber das liegt daran, dass die Klammern den Wert der Konstanten in eine temporäre Variable kopieren.

27 Byte : Testet, <?=stripos(PHP_OS,win)===0;
ob die vordefinierte PHP_OSKonstante mit beginnt win(Groß- / Kleinschreibung wird nicht berücksichtigt; Windows, WIN32, WINNT, aber nicht CYGWIN oder Darwin); druckt 1für Windows, sonst nichts.

17/18 Bytes :

<?=strlen("
")-1;

Gibt aus, 1ob es mit Windows Linebreak gespeichert wurde (auch unter DOS, OS / 2 und Atari TOS - obwohl ich bezweifle, dass jemals jemand PHP für TOS kompiliert hat) 0.

Sie können auch die Konstante überprüfen PHP_EOL.

Mehr Optionen:

PHP_SHLIB_SUFFIXist dllunter Windows, aber nicht unbedingt nur da.
php_uname()Gibt Informationen zum Betriebssystem und mehr zurück. beginnt mit Windowsfür Windows.
$_SERVER['HTTP_USER_AGENT']wird enthalten, Windowswenn in einem Browser unter Windows aufgerufen.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 Bytes) funktioniert in PHP> = 5.3

Fazit

Der einzige ausfallsichere Weg, um festzustellen, ob es sich wirklich um Windows handelt, und nichts, was so aussieht, scheint eine Überprüfung des Betriebssystemnamens zu sein. Für PHP: php_os()Kann aus Sicherheitsgründen deaktiviert werden. wird aber PHP_OSwohl immer die gewünschten infos enthalten.

Titus
quelle
4
Dateinamen auf * nix können umgekehrte Schrägstriche enthalten, daher ist dies nicht wirklich narrensicher. Die Regeln besagen jedoch nicht, dass es narrensicher sein muss. \ _ (ツ) _ / ¯
Jordan
@Jordan: Du hast recht. Diese Information habe ich der Beschreibung hinzugefügt. Vielen Dank.
Titus
4
Eine Alternative: <?=class_exists(COM);. Die Klasse COMist meines Wissens nur unter Windows verfügbar. Das sollte dir ein Byte sparen.
Ismael Miguel
@IsmaelMiguel Das reicht von einer anderen Antwort für Sie, um es als solche zu posten. (Allerdings kann es sich nicht lohnen, dies zu tun; diese Antwort ist sehr gut geschrieben.)
wizzwizz4
1
@ wizzwizz4 Das ist es nicht wert. Die Antwort würde in Vergessenheit geraten. Deshalb habe ich einfach den Kommentar hinterlassen, anstatt meine eigene Antwort zu schreiben.
Ismael Miguel
16

Befunge-98, 7 Bytes

6y2%!.@

Probieren Sie es online!

Dies funktioniert durch Abfragen des Systempfadtrennzeichens \unter Windows und /anderen Betriebssystemen.

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

Mathematica, 28 Bytes

$OperatingSystem=="Windows"&
Alephalpha
quelle
Was bringt es, eine Funktion daraus zu machen? Sie könnten das kaufmännische Und entfernen, indem Sie ein Byte sparen, und der Code würde direkt auswerten, ob es auf einem Windows-System ausgeführt wird.
Ruslan
@ Ruslan Alle Antworten müssen entweder vollständige Programme sein, die das Ergebnis ausgeben, oder aufrufbare Funktionen. Wenn dies als Mathematica-Notizbuch-Antwort deklariert ist, können Sie davon ausgehen, ein vollständiges Programm aufzurufen. Wenn ich das Objekt jedoch über die Befehlszeile ohne das &aufrufe, wird nichts gedruckt (und es ist dann auch keine aufrufbare Funktion) , sondern nur ein Schnipsel / Ausdruck).
Martin Ender
@MartinEnder Wirklich keine Ausgabe? Ich erhalte folgende Out[1]= FalseAusgabe:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan
@ Ruslan Ich glaube, das startet auch eine Notebook-Umgebung (nur eine befehlszeilenbasierte). Was ich meine, indem ich ein Programm über die Befehlszeile starte, ist die Verwendung des Skriptmodus.
Martin Ender
13

Java 8, 33 Bytes

Besonderer Dank geht an Olivier Grégoire für den Vorschlag separatorCharund an Kritixi Lithos für -1 Byte!

Dies ist ein Lambda-Ausdruck, der einen Booleschen Wert zurückgibt. Dieser kann mit zugeordnet Supplier<Boolean> f = ...;und aufgerufen werden f.get().

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

Probieren Sie es online! - Der Server ist kein Windows-Server, daher wird dieser gedrucktfalse. Auf meinem Windows-Computer wird jedoch derselbe Code gedruckttrue.

Mit diesem Code wird der Dateiseparator des Systems abgerufen und überprüft, ob sein Codepunkt größer als das Zeichen ist [. Dies gilt für Windows, da es \als Trennzeichen verwendet - aber jedes andere Betriebssystem verwendet /, das einen niedrigeren Code in der ASCII-Tabelle hat.

FlipTack
quelle
Wird das nicht auf anderen Betriebssystemen, die mit W beginnen, brechen?
Downgoat
()->java.io.File.separatorChar=='\\'ist nur 36 Bytes.
Olivier Grégoire
1
@OlivierGrégoire Schöne - und ich kann damit bis 34 golfen ()->java.io.File.separatorChar>'['!
FlipTack
2
@ Titus WebOS, Whonix. Wahrscheinlich noch mehr.
Olivier Grégoire
3
@Titus Warte, was ist mit WAITS ?
NoOneIsHere
11

J, 7 Bytes

6=9!:12

Dies ist ein Verb (ähnlich einer Funktion), das die eingebaute Fremdkonjunktion verwendet, um den Systemtyp 9!:12zu ermitteln, bei dem 5 Unix und 6 Windows32 ist.

Meilen
quelle
J Die offizielle Dokumentation zeigt, dass dieser Wert für ältere Windows zurückgegeben wird. "6 Windows32 (95/98/2000 / NT)" Muss die Dokumentation aktualisiert werden? Was passiert, wenn es sich um 64-Bit-Windows handelt? jsoftware.com/help/dictionary/dx009.htm
Keeta
Getestet auf 64-Bit-Windows 7 und es gibt eine 6. Die Dokumentation scheint ziemlich alt zu sein.
Keeta
@Keeta Ja, ich denke, es ist alt, aber es hat immer noch eine 6 für mich unter Windows 10 64-Bit zurückgegeben.
Meilen
11

R, 15 Bytes

.Platform$O>"v"

Vielen Dank an plannapus für den Vorschlag, eine teilweise Übereinstimmung für die Extraktion von Listenelementen zu verwenden.

.Plattform ist eine Liste mit einigen Details der Plattform, unter der R erstellt wurde. Es gibt ein Element OS.type(das einzige Element, dessen Name mit "O" beginnt), eine Zeichenfolge, die das Betriebssystem (die Familie) des Computers angibt. Einer von "unix"oder "windows".

Also "unix"ist weniger dann "v", aber "windows"ist dann größer "v". Andere gültige 15-Byte-Antworten sind

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

R wird für die Betriebssystemfamilien Unix, Windows und Mac entwickelt . Andere Betriebssystemfamilien werden nicht unterstützt.

Djhurio
quelle
1
Es gibt andere Plattformen als Unix, die keine Windows sind, die Sie kennen ...
Blau
2
@muddyfish: .Platform [[1]] ist in der R-Dokumentation entweder als "Unix" oder als "Windows" definiert. github.com/wch/r-source/blob/…
liori
Entschuldigung, dann ist das okay. Die Antwort sollte wahrscheinlich geändert werden, um diese Tatsache einzubeziehen, um zu verhindern, dass diese Frage erneut gestellt wird
Blau
10

Perl, 11 Bytes

print$^O=~MS

^O sollte durch ein literales Control-O ersetzt werden.

Ausgaben 1unter Windows, nichts auf einem anderen Betriebssystem.

Beachten Sie, dass ich keine sayZeilenvorschubzeile verwende, da diese eine abschließende Zeilenvorschubzeile hinzufügt, was in Perl der Wahrheit entspricht.

-2 Bytes dank primo. (und mögliche Probleme behoben)
-1 Bytes dank ais523.

Dada
quelle
AFAIR das wird in Cygwin Perl nicht funktionieren.
Igor Skochinsky
Dies funktioniert auch in mingw Perl nicht. Perl behandelt diese beiden Betriebssysteme jedoch als unterschiedliche Windows-Betriebssysteme (da sie im Allgemeinen eher UNIX als Windows-Konventionen gehorchen), und es ist nicht klar, ob sie für den Zweck der Frage berücksichtigt werden sollten. In anderen Nachrichten können Sie hier ein Byte speichern, indem Sie ein literales Steuer-O-Zeichen anstelle von verwenden ^O.
@ ais523 Das habe ich bearbeitet, danke. Was Cygwin und Mingw betrifft, werde ich den Beitrag löschen, wenn sie als Windows betrachtet werden sollen. Wie Sie jedoch sagen, wäre es sinnvoller, sie als separates Betriebssystem (oder zumindest als Nicht-Windows-Betriebssystem) zu betrachten.
Dada
Regex-Trennzeichen sollten nicht erforderlich sein $^O=~W, obwohl ich wahrscheinlich dagegen passen würde MS. Alternativ könnten Sie auch übereinstimmen $^X=~':'.
Primo
@primo richtig, danke. Ich kenne kein anderes Betriebssystem mit einem Wdarin, also ging ich davon aus, dass ich nach einem WBußgeld Ausschau halten würde. Warum schlagen Sie MSstattdessen vor?
Dada
9

Julia, 10 Bytes

is_windows

Eine Funktion, die für Windows true zurückgibt

rahnema1
quelle
9

x86-Maschinencode, 9 Byte

40 39 04 24 75 02 CD 80 C3

Zusammengestellt aus:

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)

quelle
3
pure binary (COM) läuft nicht unter Windows oder Linux, also nicht sicher, ob dies gültig ist
Igor Skochinsky
@IgorSkochinsky Für die Assemblierung muss ein Interpreter vorhanden sein.
Shmuel H.
Sie können den Code noch kürzer machen, indem Sie nur verlassen, inc eaxund int 0x80ich denke, es sollte unter Windows fehlschlagen und den Prozess beenden.
Shmuel H.
2
@IgorSkochinsky Es gibt Programme, die auch rohe Binärdateien ausführen. Siehe den Link in meinem vorherigen Kommentar.
Shmuel H.
1
Bochs und QEMU simulieren eine Bare-Metal-Umgebung und führen den Binärcode nicht unter dem Host-Betriebssystem aus. Also werden sie IMO nicht funktionieren. Aber das alles könnte eine Diskussion für das Meta sein.
Igor Skochinsky
8

JavaScript, 42 30 26 25 Bytes

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

Getestet mit Firefox. (Chrome verfügt nicht über die oscpuEigenschaft.) Da Kleinbuchstaben einen höheren Zeichencode als Großbuchstaben haben, hängt dies davon ab, ob der erste Buchstabe navigator.oscpuGroßbuchstabe ist und nicht W , X , Y oder Z auf einer von Firefox unterstützten Plattform (außer Windows natürlich). Dies ist laut diesem Beitrag der Fall.

Bearbeitungen

  1. 12 Bytes dank Neil gespart .
  2. Weitere vier Bytes gespeichert
  3. Dank Blender wurde ein weiteres Byte gespeichert .
user2428118
quelle
oscpuist wahrscheinlich die kürzeste navigatorEigenschaft, die Sie verwenden können. Auch das Testen eines regulären Ausdrucks wird wahrscheinlich kürzer ausfallen, aber ich habe es nicht gemessen.
Neil
Sie können direkt nach dem !=-1Fettpfeil ein entfernen und hinzufügen ~, wodurch 3 Byte eingespart werden.
Luke
Müssen Sie eine Funktion erstellen? Kannst du nicht einfach console.logden Regex-Test? Würde auch navigator.oscpu[0]=='W'funktionieren oder gibt es ein anderes Betriebssystem, das ebenfalls mit W beginnt
2
Hmm, aus irgendeinem Grund hat mein Chrome kein Oscar.
Muzer
2
navigator.oscpu>'V'könnte auch funktionieren
Blender
8

C #, 61 48 Bytes

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

13 Bytes dank TheLethalCoder gespart

Oder ein volles Programm mit 83 Bytes:

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

Verschiedene Windows-Varianten verwenden in der Microsoft .NET-Implementierung die Enum-Werte 0 bis 3 . 4 ist Unix, 5 ist Xbox [360] (was ich nicht als "Windows" bezeichne), 6 ist MacOSX. Mono verwendet dieselben Werte und fügt in früheren Versionen 128 für Unix / Linux hinzu.

Daher ist alles <4 Windows, und alles andere ist nicht Windows.

Bob
quelle
2
Ich bin mir nicht sicher, ob mir etwas fehlt, aber warum legst du den Wert auf einen fest int?
auhmaan
@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- Grundsätzlich besagen C # 's Tippregeln , dass ich a PlatformIDund nicht intdirekt vergleichen kann und es keine implizite Besetzung von PlatformIDbis gibt int. Aber es gibt eine explizite Besetzung aller Aufzählungen zu ihren Werten, die ich hier ausnütze ...
Bob
1
@ MustafaAKTAŞ Außerdem muss ich darauf hinweisen, dass dies auf C # / .NET Framework / .NET Core abzielt. Auf Xbox One ist es nur möglich , UWP Anwendungen zu laufen, die eine andere API verwenden , ohne System.Environment.OSVersionüberhaupt . Wenn Sie Probleme damit haben, sollten Sie auch alle anderen Nicht-UWP-Antworten löschen. Es stellt sich außerdem heraus, dass Sie UWP-Apps (derzeit) nicht auf Nicht-Windows-Plattformen ausführen können, sodass Sie auch alle diese löschen können. So bleiben Ihnen 0 Antworten und eine unbeantwortete Frage.
Bob
1
Sie können eine Action<bool>im ersten Beispiel für 48 Bytes kompilieren (ich habe es nicht getestet, aber glaube, es wird funktionieren). _=>(int)System.Environment.OSVersion.Platform<4;Möglicherweise muss es jedoch ()=>...für 49 Bytes sein
TheLethalCoder
1
Das Kompilieren zu anonymen Funktionen wie Funcs und Actions wird hier ständig verwendet. Ich glaube, es ist in der Golf-Tipps-Seite und ich benutze sie fast die ganze Zeit. Auch anonyme Funktionen werden häufig in anderen Sprachen verwendet, daher halte ich es für sicher, sie hier zu verwenden
TheLethalCoder
7

Batch, 50 Bytes

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

Bearbeiten: Es wurde behoben, dass DOS ignoriert wurde, anstatt zu behaupten, dass es Windows ist.

Der einzige andere Weg , ich weiß Batch außerhalb von Windows laufen Weinbereitung verwendet werden, die standardmäßig wird Karte Z:zu /. Wenn also welche Z:\bin\shexistieren, ist es wahrscheinlich /bin/sh, also nicht MS Windows.

Ich weiß nicht, auf was WINE% OS% setzt, aber wenn dies nicht der Windows_NTFall ist, könnte ich 23 Bytes sparen.

Neil
quelle
1
Ein anderer Weg ist DOS, das nicht Windows ist.
Ruslan
Dies schlägt nicht nur unter DOS fehl, sondern auch auf einem Computer, auf dem Z: zugeordnet ist und zufällig einen solchen Pfad enthält.
Adám
1
Zumindest versuche ich , WEIN zu entdecken. Keine der anderen Antworten liefert das richtige Ergebnis, wenn sie unter WEIN ausgeführt werden.
Neil
3
@ Adám Klar, und wenn Sie die C-Antwort mit -DWIN32 = 1 kompilieren, schlägt auch dies fehl. Dein Punkt?
Neil
1
Ja, Wein-SetsOS=Windows_NT
Jasen
7

QBasic, 31 Bytes

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

Druckt unter Windows ungleich Null, unter allem anderen 0.

COMSPECist eine für Microsoft-Betriebssysteme eindeutige Umgebungsvariable. Es zeigt auf den Befehlsinterpreter, normalerweise command.comoder cmd.exe. Unter Windows befindet sich der Befehlsinterpreter im Windows-Verzeichnis. Unter MS-DOS befindet es sich im DOS-Verzeichnis oder im Stammverzeichnis der Festplatte, und unter anderen Betriebssystemen ist es nicht vorhanden.

Indem COMSPECwir prüfen, ob der Wert von ein "W" enthält, können wir den Unterschied zwischen Windows und Nicht-Windows erkennen.

Kennzeichen
quelle
COMSPECEs ist daher nicht möglich, dass der Benutzer einen Wert festlegt, den er für seine eigenen Zwecke verwendet (und der zufällig a enthält) W)? Zugegeben, das ist ein Randfall.
1
@ ais523: Außerdem muss das Windows-Verzeichnis kein W enthalten. In beiden Fällen ist es spröde.
Joey
7

Node.js, 27 16 15 13 Bytes

Vielen Dank an @Patrick , der meine Lösung mithilfe von Node's REPL um 12 Byte reduziert hat:

_=>os.EOL>`
`

Ursprüngliche Lösung:

_=>require('path').sep!='/'
GilZ
quelle
Wenn Sie dies auf ändern Node.js REPL, können Sie 16 Bytes sparen, indem Sie einfach_=>path.sep!='/'
Patrick Roberts
Ich bin neu in Codegolf. Darf ich das?
GilZ
Ja, sonst hätte ich es nicht vorgeschlagen. REPL bedeutet read, execute, print loop, das Programm, das ausgeführt wird, wenn Sie nodedie Konsole betreten . Von dort aus sind alle Systemknotenmodule verfügbar, ohne dass require()sie benötigt werden.
Patrick Roberts
Oh ja, tut mir leid. Ich meinte 11. Sie können ein weiteres Byte speichern, indem Sie auf ändern !=, >da der ASCII-Index für \ 92 und /47 ist.
Patrick Roberts
7

Excel VBA, 41 40 30 29 26 24 Bytes

Immediate Fenster - Funktion , die zurückgibt , truewenn das Systems des OS - Code beginnt , ist länger als die Länge 3, weil die Informationen zur Ausgabe beschränkt sind entweder anders macoder pcdosdiese wieder truenur auf Windows - PCs

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

Vorherige Versionen

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

Änderungen

-1 Danke an Neil für die Verwendung von Left(...,1)overMid(...,1,1)

-10 Danke an ChrisH für den Hinweis auf @ Megos Path Separator Trick

-1 Zum Prüfen WorkbookPathauf "\" anstatt zu verwendenApplication.Path Separator

-4 Zum Umschalten auf Environ()

-2 Zum Umschalten auf [Len(Info(...

Neuartige Lösung, 51 Bytes

Neuartige subRoutine, die 1 (truthy)unter Windows und 0 (falsey)unter Mac nach der Methode der bedingten Kompilierung ein unmittelbares Fenster an die VBE ausgibt .

Sub a
i=1
#If Mac Then
i=0
#End If
Debug.?i
End Sub
Taylor Scott
quelle
1
leftSpart dir ein Byte.
Neil
Haben Sie es bei office365 online ausprobiert? Unterstützt das überhaupt VBA? Nur neugierig.
Chris H
@ChrisH Meines Wissens unterstützt office.com keine Online-VBA-Skripte. Mit O365 haben Sie jedoch das Recht, eine Kopie von Office 2016 (oder was auch immer aktuell ist) auf Ihren Desktop herunterzuladen, und dies unterstützt VBA-Skripte.
Taylor Scott
Ich habe es bisher geschafft, es zu vermeiden; Angesichts Ihres Kommentars, der voraussichtlich fortgesetzt wird (die einzigen Windows-Computer, die ich verwende, haben eine Desktop-Kopie von Office, Personal Machines sind alle Linux)
Chris H
1
@ Megos Pfadtrenner-Trick ( ?Application.PathSeparator)="\"wäre 32, da es ein einzelnes Zeichen ist)
Chris H
6

Perl 6 ,  19  18 Bytes

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

Sowohl Ausgabe True␤als auch False␤abhängig vom System, auf dem es ausgeführt wird.

Brad Gilbert b2gills
quelle
die zweite stützt sich auf die Nicht - Windows - Werte von CWD enthält keine `` - es gibt keine Garantie , dass,
Jasen
5

APL (Dyalog) , 21 Bytes

'W'∊∊#⎕WG'APLVersion'

Probieren Sie es online!

#⎕WG'APLVersion' Root ( # ) W indow G et Eigenschaft APL Version

 eintreten (abflachen)

'W'∊ Ist W ein Mitglied? (Keine Nicht-Windows-Rückgabewerte enthalten ein W in Großbuchstaben.)

Adam
quelle
4

tcl, 38 bytes

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

PHP 17 Bytes

Das Folgende gibt 1 aus, wenn Windows und nichts, wenn etwas anderes. Hinweise zur Stringkonvertierung ignorieren.

<?=PHP_OS==WINNT;

Testen Sie die Online Online - Tests für Linux , weil die Sandbox - Linux für PoC ist.

DrWhat
quelle
Ist das sicher genug? Fragen, weil Mögliche Werte für: PHP_OS .
manatwork
1
'<? = PHP_OS [0] == W; `ist beide 1 Byte kürzer und fängt alle anderen Windows-Werte in der durch manatwork verknüpften Frage ab. >Vkönnte auch funktionieren.
user59178
Manatwork hängt davon ab, auf welcher Windows-Version PHP kompiliert wurde. Seit Windows Visa \ 7 ist die Windows-Version aufgrund des NT Authority-Kernels mit WINNT vertreten. Vor Windows XP und darunter war WIN32 und Windows Server 2003 war Windows.
DrWhat
4

Java 8, 49 Bytes

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

Länger als die andere Java-Antwort , geht aber anders vor.

Dieses Lambda passt in ein Supplier<Boolean>und kann mit folgendem Programm getestet werden:

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

}
Gemeinschaft
quelle
Es ist sehr, sehr ähnlich zu der ursprünglichen Antwort, die Sie verknüpfen (vor den Änderungen).
Olivier Grégoire
Warum nicht einfach .contains("W")?
Cyoce
@Cyoce Tatsächlich scheint das variable Betriebssystem Windows-spezifisch zu sein.
4

Haskell, 39 31 Bytes

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

Ich überprüfe, ob der erste Buchstabe von "m" ausgegeben wird, der für Windows "mingw" sein sollte. Soweit ich das beurteilen kann, gibt es kein anderes Betriebssystem, das mit M beginnt. Die Informationen stammen von https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs

Dylan Meeus
quelle
1
Auf meinem System (Windows 10 64-Bit, GHC 8.0.1 64-Bit) osgibt "mingw32".
Mego
@ Mego Sie haben Recht, das korrigiert
Dylan Meeus
4

Bash + Coreutils, 5 Bytes

rm $0

Funktioniert auch in den meisten anderen POSIXy-Shells. (Beachten Sie, dass Windows-Ports von bashund rmexistieren; obwohl sie normalerweise nur mit POSIXy-Betriebssystemen verwendet werden, ist dies kein leerer Eintrag.) Ausgabe über den Exit-Code (0 = false, 1 = true). Kann als 4 Byte gezählt werden, wenn Sie einen Dateinamen annehmen dürfen (z rm a. B. ). Beachten Sie, dass dies möglicherweise bei sehr seltsamen Dateinamen fehlschlagen kann (was rmaufgrund fehlender Anführungszeichen als Argumente interpretiert wird und möglicherweise Dateien löscht, die Sie interessieren). Ich rate daher davon ab, dieses Programm von einer Datei mit einem seltsamen Namen auszuführen ).

Hinweis: Löscht das Programm als Nebeneffekt von der Festplatte oder versucht es zumindest. In dem Fall, in dem Windows ausgeführt wird, kann das Betriebssystem die ausgeführte Datei nicht löschen (ein Vorgang, den Windows entweder standardmäßig oder durch vollständigen Stopp nicht zulässt) und tritt daher rmein Fehler auf. bashfängt den Fehler ab und konvertiert ihn in einen Exit-Code (das gesamte Programm wird also normal beendet). Die meisten anderen Einträge hier verwenden 0 für Falsey und 1 für Truthy in Exit-Codes. Beachten Sie, dass bashdie ifAnweisung überhaupt keine Ganzzahlen akzeptiert (vielmehr werden Befehle und Verzweigungen akzeptiert, die davon abhängen, ob sie erfolgreich ausgeführt werden, und arithmetische Tests werden mithilfe von Programmen wie ztestdas absichtlich einen "Absturz" bei einem fehlgeschlagenen Vergleich meldet), was aus Legalitätsgründen verwackelter ist als Programme, die über einen Exit-Code in Sprachen ausgegeben werden, in denen 0 in einem ifAnweisungstest gültig ist und das Programm an die elseZweigstelle sendet .


quelle
4

8 , 11 Bytes

 
os 1- not .
 

Druckt trueunter Windows, falseLinux und macOS. Andere Plattformen, die von 8th unterstützt werden, sind Android, iOS und Raspberry Pi, aber ich kann sie nicht testen.

Ungolfed-Version (mit Kommentaren)

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

Python 3 (13 Bytes)

import winreg

Gibt unter Windows mit dem Exit-Code Null zurück (in Shells im Allgemeinen), andernfalls mit einem Exit-Code ungleich Null.

Wenn Sie es anders herum bevorzugen, gibt es eine 12 Byte Lösung: import posix.

Jonas Schäfer
quelle
Ich denke, das wird nicht funktionieren, wenn sich eine Datei winreg.pyim selben Verzeichnis befindet.
Zacharý
1
Außerdem lauten die Regeln: "Code, der auf einer Plattform nicht ausgeführt / kompiliert werden kann, zählt nicht als falscher Wert."
Zacharý
4

TrumpScript , 17 Bytes

America is great.

Probieren Sie es online!


Wenn dieses Programm unter Windows ausgeführt wird, wird Folgendes gedruckt:

The big problem this country has is being PC

Dies wird als wahrer Wert angesehen.


Leere Ausgabe und der folgende Wert sind falsch:

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

Die leere Ausgabe erfolgt auf jedem Linux-System (für dieses Programm), die lange Apple-Antwort erfolgt offensichtlich auf einem Mac (für jedes Programm). Unter TIO ist das Backend (nehme ich an) ein Unix-Betriebssystem, sodass Sie nur den falschen Wert abrufen können. Auf meinem Computer erhalte ich die PC-Nachricht.


Nicht 100% sicher, ob dies als Fehlermeldung gilt (was die Antwort ungültig machen würde), aber wenn Sie nicht darüber Bescheid wussten, war es wahrscheinlich ein Lachen für Sie wert.

Magische Kraken-Urne
quelle
Was ist die Welt gekommen, um ...
ooransoy
@avaragecoder MACHEN SIE PYTHON WIEDER GROSS!
Magic Octopus Urn