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 Code-Golf , also gewinnt die niedrigste Punktzahl, aber ich bin auch sehr daran interessiert, kreative Lösungen für dieses Problem zu finden.
code-golf
decision-problem
Daniel
quelle
quelle
Antworten:
Vim, 2 Bytes
Unter Windows ist
<C-a>
(Strg + a) standardmäßig zugeordnetSelect All
. Wenn Sie1
in 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 zugeordnetIncrement 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
quelle
Ctrl + a
,1
. Wenn esCtrl + a + 1
so wäre, würde es als 1 Tastendruck gezählt.MATLAB, 4 Bytes
Aus der Dokumentation :
Es gibt auch die Funktionen
ismac
undisunix
.Ich überlasse es dem Leser, herauszufinden, was diese Funktionen bewirken.Mego hat mich freundlich um Diagramme gebetenismac
undisunix
deshalb habe ich versucht, es hier zu veranschaulichen:Es wurde nicht nach einem Diagramm von gefragt,
ispc
aber ich kann zeigen, dass das Verhalten ziemlich ähnlich ist, außer ersatzweiseOSX
undUnix
mitWindows
.Zweiter Ansatz:
Hier ist ein zweiter Ansatz mit
getenv
23 Bytes, der kugelsicher sein sollte, es sei denn, es gibt ein anderes Betriebssystem, das mit Folgendem beginntW
:quelle
Python 2.7.10 , 24 Bytes
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.sep
ist false und wird daher0/0
berechnet, wodurch einZeroDivisionError
Exit mit einem Exit-Code ungleich Null verursacht und beendet wird. Auf Nicht-Windows-Plattformen'['>os.sep
ist true, wenn der Ausdruck0/1
nichts bewirkt und das Programm mit dem Beendigungscode 0 beendet wird.quelle
x86-Assembly, 7 Byte(Inspiriert von Runemoros Antwort )Oder
Beschreibung
Zunächst setzen wir
eax
auf1
(die Systemrufnummerexit(int val)
fürLinux
,FreeBSD
undOSX
). Dann rufen wir das Interrupt-Gate auf, für0x80
das das System-Call-Gate istLinux
,FreeBSD
undOSX
. Das würde das Programm führen verlassen mit dem Status vonebx
denen0
(false
).Unter Windows
int 0x80
ist das Gate ungültig (es wird2e
als Syscall-Gate verwendet) und würde das Programm zum Absturz bringen, sodass es mit einem positiven Beendigungscode endet (true
).Bearbeiten: Würde nicht funktionieren,
OSX
da es eine andere Konvention für die Übergabe von Argumenten auf 32 Bit (vom Stapel) gibt.Referenzen und weiterführende Literatur
FreeBSD - System Calls
: Informationen zu SystemaufrufenFreeBSD
.System calls in the Linux kernel. Part 2.
: Ein großartiger Artikel über die Systemaufrufe von Linux.Linux Syscall Reference
: eine Systemrufnummernreferenz fürLinux
.Windows Syscall Shellcode
: Ein Artikel zum direkten Aufrufen von Systemaufrufenwindows
aus Assembly.Making system calls from Assembly in Mac OS X
: Ein Artikel über Systemaufrufe aufOSX
.quelle
xor eax, eax
?false
mit Code 1 und das Programmtrue
mit Code 0 beendet).eax
undebx
auf 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.mov eax, 1
würde übersetzt werden\xB8\x01\x00\x00\x00
, was viel länger dauert, als sich nur zu registrieren und anzurufeninc
.C
44433836 BytesDanke an @Downgoat für ein Byte! durchgestrichen 44 ist immer noch normal 44
Danke an @Neil für zwei Bytes!
quelle
0
aus demifdef
und der Änderung der1
zu!
, aber ich denke ,_WIN32+0
funktioniert sogar noch besser.return 1;
im ifdef bleiben und das else entfernen, da main ohne return in c99 0 zurückgeben muss.#if WIN32
. Da WIN32 nicht unter Windows definiert ist, muss es vom Präprozessor als 0 behandelt werden.PHP, 22 Bytes
Gibt aus,
1
ob 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:
Gibt eine positive Ganzzahl aus, wenn der Dateipfad einen Backslash enthält. sonst nichts.
Eine sichere Alternative mit 27 Bytes :
<?=DIRECTORY_SEPARATOR>"/";
Drucke1
oder 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 versuchtvar_dump
undgettype
), 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_OS
Konstante mit beginntwin
(Groß- / Kleinschreibung wird nicht berücksichtigt; Windows, WIN32, WINNT, aber nicht CYGWIN oder Darwin); druckt1
für Windows, sonst nichts.17/18 Bytes :
Gibt aus,
1
ob 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_SUFFIX
istdll
unter Windows, aber nicht unbedingt nur da.php_uname()
Gibt Informationen zum Betriebssystem und mehr zurück. beginnt mitWindows
für Windows.$_SERVER['HTTP_USER_AGENT']
wird enthalten,Windows
wenn in einem Browser unter Windows aufgerufen.<?=defined(PHP_WINDOWS_VERSION_BUILD);
(38 Bytes) funktioniert in PHP> = 5.3Fazit
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 aberPHP_OS
wohl immer die gewünschten infos enthalten.quelle
<?=class_exists(COM);
. Die KlasseCOM
ist meines Wissens nur unter Windows verfügbar. Das sollte dir ein Byte sparen.Befunge-98, 7 Bytes
Probieren Sie es online!
Dies funktioniert durch Abfragen des Systempfadtrennzeichens
\
unter Windows und/
anderen Betriebssystemen.quelle
Mathematica, 28 Bytes
quelle
&
aufrufe, wird nichts gedruckt (und es ist dann auch keine aufrufbare Funktion) , sondern nur ein Schnipsel / Ausdruck).Out[1]= False
Ausgabe:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Java 8, 33 Bytes
Besonderer Dank geht an Olivier Grégoire für den Vorschlag
separatorChar
und 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 werdenf.get()
.Probieren Sie es online! - Der Server ist kein Windows-Server, daher wird dieser gedruckt
false
. 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.quelle
()->java.io.File.separatorChar=='\\'
ist nur 36 Bytes.()->java.io.File.separatorChar>'['
!J, 7 Bytes
Dies ist ein Verb (ähnlich einer Funktion), das die eingebaute Fremdkonjunktion verwendet, um den Systemtyp
9!:12
zu ermitteln, bei dem 5 Unix und 6 Windows32 ist.quelle
R, 15 Bytes
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 sindR wird für die Betriebssystemfamilien Unix, Windows und Mac entwickelt . Andere Betriebssystemfamilien werden nicht unterstützt.
quelle
Perl, 11 Bytes
^O
sollte durch ein literales Control-O ersetzt werden.Ausgaben
1
unter Windows, nichts auf einem anderen Betriebssystem.Beachten Sie, dass ich keine
say
Zeilenvorschubzeile 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.
quelle
^O
.$^O=~W
, obwohl ich wahrscheinlich dagegen passen würdeMS
. Alternativ könnten Sie auch übereinstimmen$^X=~':'
.W
darin, also ging ich davon aus, dass ich nach einemW
Bußgeld Ausschau halten würde. Warum schlagen SieMS
stattdessen vor?Julia, 10 Bytes
Eine Funktion, die für Windows true zurückgibt
quelle
x86-Maschinencode, 9 Byte
Zusammengestellt aus:
quelle
inc eax
undint 0x80
ich denke, es sollte unter Windows fehlschlagen und den Prozess beenden.JavaScript,
42302625 BytesGetestet mit Firefox. (Chrome verfügt nicht über die
oscpu
Eigenschaft.) Da Kleinbuchstaben einen höheren Zeichencode als Großbuchstaben haben, hängt dies davon ab, ob der erste Buchstabenavigator.oscpu
Groß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
quelle
oscpu
ist wahrscheinlich die kürzestenavigator
Eigenschaft, die Sie verwenden können. Auch das Testen eines regulären Ausdrucks wird wahrscheinlich kürzer ausfallen, aber ich habe es nicht gemessen.!=-1
Fettpfeil ein entfernen und hinzufügen~
, wodurch 3 Byte eingespart werden.console.log
den Regex-Test? Würde auchnavigator.oscpu[0]=='W'
funktionieren oder gibt es ein anderes Betriebssystem, das ebenfalls mit W beginntnavigator.oscpu>'V'
könnte auch funktionierenC #,
6148 Bytes13 Bytes dank TheLethalCoder gespart
Oder ein volles Programm mit 83 Bytes:
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.
quelle
int
?CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'
- Grundsätzlich besagen C # 's Tippregeln , dass ich aPlatformID
und nichtint
direkt vergleichen kann und es keine implizite Besetzung vonPlatformID
bis gibtint
. Aber es gibt eine explizite Besetzung aller Aufzählungen zu ihren Werten, die ich hier ausnütze ...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.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 seinFunc
s undAction
s 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 verwendenBatch, 50 Bytes
Bearbeiten: Es wurde behoben, dass DOS ignoriert wurde, anstatt zu behaupten, dass es Windows ist.
Der
einzigeandere Weg , ich weiß Batch außerhalb von Windows laufen Weinbereitung verwendet werden, die standardmäßig wird KarteZ:
zu/
. Wenn also welcheZ:\bin\sh
existieren, ist es wahrscheinlich/bin/sh
, also nicht MS Windows.Ich weiß nicht, auf was WINE% OS% setzt, aber wenn dies nicht der
Windows_NT
Fall ist, könnte ich 23 Bytes sparen.quelle
OS=Windows_NT
QBasic, 31 Bytes
Druckt unter Windows ungleich Null, unter allem anderen 0.
COMSPEC
ist eine für Microsoft-Betriebssysteme eindeutige Umgebungsvariable. Es zeigt auf den Befehlsinterpreter, normalerweisecommand.com
odercmd.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
COMSPEC
wir prüfen, ob der Wert von ein "W" enthält, können wir den Unterschied zwischen Windows und Nicht-Windows erkennen.quelle
COMSPEC
Es 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.Node.js,
27161513 BytesVielen Dank an @Patrick , der meine Lösung mithilfe von Node's REPL um 12 Byte reduziert hat:
Ursprüngliche Lösung:
quelle
Node.js REPL
, können Sie 16 Bytes sparen, indem Sie einfach_=>path.sep!='/'
node
die Konsole betreten . Von dort aus sind alle Systemknotenmodule verfügbar, ohne dassrequire()
sie benötigt werden.!=
,>
da der ASCII-Index für\
92 und/
47 ist.Excel VBA,
414030292624 BytesImmediate Fenster - Funktion , die zurückgibt ,
true
wenn das Systems des OS - Code beginnt , ist länger als die Länge 3, weil die Informationen zur Ausgabe beschränkt sind entweder andersmac
oderpcdos
diese wiedertrue
nur auf Windows - PCsVorherige Versionen
Ä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
WorkbookPath
auf"\"
anstatt zu verwendenApplication.Path Separator
-4 Zum Umschalten auf
Environ()
-2 Zum Umschalten auf
[Len(Info(...
Neuartige Lösung, 51 Bytes
Neuartige
sub
Routine, die1 (truthy)
unter Windows und0 (falsey)
unter Mac nach der Methode der bedingten Kompilierung ein unmittelbares Fenster an die VBE ausgibt .quelle
left
Spart dir ein Byte.?Application.PathSeparator)="\"
wäre 32, da es ein einzelnes Zeichen ist)Perl 6 ,
1918 BytesSowohl Ausgabe
True
als auchFalse
abhängig vom System, auf dem es ausgeführt wird.quelle
APL (Dyalog) , 21 Bytes
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.)quelle
tcl, 38 bytes
quelle
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.
quelle
>V
könnte auch funktionieren.Java 8, 49 Bytes
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:quelle
.contains("W")
?Haskell,
3931 BytesIch ü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
quelle
os
gibt"mingw32"
.Bash + Coreutils, 5 Bytes
Funktioniert auch in den meisten anderen POSIXy-Shells. (Beachten Sie, dass Windows-Ports von
bash
undrm
existieren; 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 (zrm a
. B. ). Beachten Sie, dass dies möglicherweise bei sehr seltsamen Dateinamen fehlschlagen kann (wasrm
aufgrund 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
rm
ein Fehler auf.bash
fä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, dassbash
dieif
Anweisung ü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 ztest
das 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 einemif
Anweisungstest gültig ist und das Programm an dieelse
Zweigstelle sendet .quelle
8 , 11 Bytes
Druckt
true
unter Windows,false
Linux 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)
quelle
Python 3 (13 Bytes)
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
.quelle
winreg.py
im selben Verzeichnis befindet.TrumpScript , 17 Bytes
Probieren Sie es online!
Wenn dieses Programm unter Windows ausgeführt wird, wird Folgendes gedruckt:
Dies wird als wahrer Wert angesehen.
Leere Ausgabe und der folgende Wert sind falsch:
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.
quelle