Wykryj MS Windows


78

Wyzwanie

Utwórz program, który zwraca prawdziwą wartość podczas uruchamiania w systemie Microsoft Windows (dla uproszczenia będziemy trzymać się Windows 7, 8.1 i 10) oraz wartość falsey w przypadku uruchamiania w dowolnym innym systemie operacyjnym (OSX, FreeBSD, Linux).

Zasady

  • Kod, który nie działa / nie kompiluje się na platformie, nie jest liczony jako wartość falsey.

Kryteria wygranej

Oznaczam to jako , więc wygrywa najniższy wynik, ale jestem również bardzo zainteresowany kreatywnymi rozwiązaniami tego problemu.


7
Czy programy mogą generować kod wyjścia? ( normalnie dozwolone )
FlipTack

13
Czy możesz podać konkretną listę systemów operacyjnych, na których musi działać?
FlipTack

2
Jaki powinien być wynik w systemie Windows RT?
Adám

6
Możesz określić kilka konkretnych systemów innych niż Windows, które muszą być obsługiwane. W komentarzach pojawiają się debaty na temat DOS i OS2.
jpmc26

2
Prawdopodobnie potrzebujemy konsensusu co do tego, co uznaje się za prawdziwe i falsey dla kodów wyjścia; normalna konwencja to 0 dla prawdy, a cokolwiek innego dla fałszu, ale wiele odpowiedzi traktuje ją jako coś przeciwnego, a definicja „instrukcji if” oczywiście nie ma zastosowania.

Odpowiedzi:


75

Vim, 2 bajty

<C-a>1

W systemie Windows <C-a>(ctrl + a) jest domyślnie mapowany na Select All. Jeśli wpiszesz „a” 1w trybie wyboru w systemie Windows, zastąpi on to, co wpisałeś (1), pozostawiając 1 w buforze.

W innych systemach operacyjnych <C-a>domyślnie jest mapowany na Increment number. Ponieważ nie ma liczby do zwiększenia, jest to brak operacji, a następnie 1 zwiększa liczbę, ale pod względem bufora jest to brak operacji.

1 jest prawdą w Vimie, a pusty ciąg znaków to fałsz


Wygląda na 3 naciśnięcia klawiszy. Ctrl + a + 1
Pavel

12
Myślę, że według tego meta postu meta.codegolf.stackexchange.com/questions/8995/... Odpowiedzi Vima są ogólnie oceniane bez modyfikatorów (zwłaszcza biorąc pod uwagę, że pierwsza odpowiedź na post używa <ctrl + a> jako przykład na 1 bajt)
nmjcman101

4
@Pavel to Ctrl + a, 1. Gdyby tak było Ctrl + a + 1, byłoby to liczone jako jedno naciśnięcie klawisza.
Kapitan Man,

7
Piękna, uwielbiam tę odpowiedź!
DJMcMayhem

To raczej eleganckie, podoba mi się.
Dan

108

MATLAB, 4 bajty

ispc

Z dokumentacji :

tf = ispczwraca logiczną 1 (prawda), jeśli wersja oprogramowania MATLAB® jest przeznaczona dla platformy Microsoft® Windows®. W przeciwnym razie zwraca logiczne 0 (fałsz).

Istnieją również funkcje ismaci isunix. Pozostawię czytelnikowi ustalenie, jakie funkcje pełnią te funkcje. Mego proszeni o schematy wyjaśniające ismaci isunixtak starałem się zilustrować go tutaj:

wprowadź opis zdjęcia tutaj

To nie było pytanie o schemat ispc, ale mogę ujawnić, że zachowanie jest dość podobna, z wyjątkiem substytut OSXi Unixz Windows.


Drugie podejście:

Oto drugie podejście z getenvwykorzystaniem 23 bajtów, które powinny być kuloodporne, chyba że istnieje inny system operacyjny zaczynający się od W:

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

getenv 'name'przeszukuje bazową listę środowisk systemu operacyjnego w celu znalezienia tekstu formularza name=value, gdzie namejest wejściowy wektor znaków. Jeśli znaleziono, MATLAB® zwraca wartość wektora znaku. Jeśli nie można znaleźć określonej nazwy, zwracana jest pusta macierz.


4
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
Dennis

54

Python 2.7.10 , 24 bajty

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

Dzięki FlipTack za 3 bajty

Ten program wykorzystuje fakt, że Windows jest jedynym systemem operacyjnym używanym \jako separator ścieżek. Zwykle jest to frustrujące i złe, ale choć raz jest to zaleta. W systemie Windows '['>os.sepjest fałszem, a zatem 0/0jest obliczany, powodując ZeroDivisionErrori wychodzenie z niezerowym kodem wyjścia. Na platformach innych niż Windows '['>os.sepjest to prawda, co powoduje wyrażenie 0/1, które nic nie robi, a program kończy działanie z kodem wyjścia 0.


DOS używa również odwrotnego ukośnika jako separatora ścieżek i ma co najmniej jedną implementację w języku Python 2.
isanae

5
@isanae Zredagowałem tytuł, aby określić Python 2.7 - jedyną implementacją Pythona 2 w DOS jest archaiczne, błędne 2.4.2
Mego

OS / 2 również używa odwrotnego ukośnika i ma implementację Python 2.7;)
isanae

9
@isanae Tam określiłem 2.7.10. Powodzenia w znalezieniu tego.
Mego

2
najwyraźniej musi dać prawidłowe wyniki tylko w 3 ostatnich wersjach systemu Windows i przypuszczalnie podobnie w ostatnich trzech wersjach wymienionych systemów, OS2 i DOS nie mają znaczenia,
Jasen

45

Zestaw x86, 7 bajtów (zainspirowany odpowiedzią Runemoro )

31 DB 89 D8 40 CD 80

Lub

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

Opis

Przede wszystkim będziemy ustawiony eaxna 1(liczba wywołań systemowych dla exit(int val)dla Linux, FreeBSDi OSX). Następnie wywołamy bramkę przerwania, 0x80która jest bramą wywołania systemowego Linux, FreeBSDi OSX. To by spowodować, że program, aby wyjść ze statusem ebx, który jest 0( false).

W systemie Windows int 0x80jest niepoprawna brama (służy 2ejako brama syscall) i powoduje awarię programu, powodując, że kończy się dodatnim kodem wyjścia ( true).

Edycja: nie działałby, OSXponieważ ma inną konwencję przekazywania argumentów w wersji 32-bitowej (stos).

Referencje i dalsze czytanie


3
To wspaniale!
z0rberg's

Dlaczego przypadki awarii mają prawdziwą wartość? Czy to dlatego, że EAX (zazwyczaj wartość zwracana) wynosi 1? Ponadto, czy EAX ma gwarantowaną wartość 0 przy starcie programu? A może potrzebujesz xor eax, eaxtam?
Cole Johnson

3
@ColeJohnson: Awarie wykryte przez system operacyjny (w systemach operacyjnych zwykle używanych z x86) nigdy nie pozostawiają kodu wyjścia 0, ponieważ jest on zarezerwowany dla pomyślnego zakończenia. (Zwykle kod wyjścia jest pewną nieprzyjemną wartością, którą system operacyjny rezerwuje specjalnie na tę okoliczność.) Nie jestem jednak pewien, czy warto liczyć 0 jako falsey i 1 jako prawdę w kodach wyjścia programu, biorąc pod uwagę, że normalną konwencją jest dokładnie odwrotnie (gdzie 0 jest jedyną prawdziwą wartością, np. standardowy program UNIX / Linux / POSIX falsewychodzi z kodem 1, a truewychodzi z kodem 0).

1
Ta odpowiedź domyślnie zakłada, że ​​rejestry eaxi ebxsą zerowane po uruchomieniu programu (w systemach innych niż Windows), co nie jest gwarantowane, jeśli dobrze pamiętam. Zakłada również wyraźnie, że konwencja przekazywania argumentów syscall dla Linuksa jest zgodna z konwencją dla FreeBSD i OSX, co byłoby bardzo zaskakujące.
zwolnienie

1
@ Sebastian-LaurenţiuPlesciuc Dobre pytanie. mov eax, 1zostałby przetłumaczony na \xB8\x01\x00\x00\x00, co jest znacznie dłuższe niż przenoszenie rejestru i dzwonienie inc.
Shmuel H.

29

C, 44 43 38 36 bajtów

Dzięki @Downgoat za bajt! przekreślony 44 jest nadal regularny 44
Dzięki @Neil za dwa bajty!

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

Początkowo miałem zamiar zasugerować, że można zaoszczędzić kilka bajtów przesuwając 0OUT ifdefi zmieniając 1się !, ale myślę, że _WIN32+0działa nawet jeszcze lepiej.
Neil

Jeśli c99 jest OK można zmienić f główny i trzymać return 1;wewnątrz ifdef i usunąć indziej, ponieważ główny bez powrotu w C99 musi zwrócić 0.
Simon

11
To dyrektywa kompilatora. Jeśli na przykład zostanie skompilowany w systemie Windows i uruchomiony w systemie Linux, nadal zwróci 1.
Micheal Johnson

4
@MichealJohnson no. Mogę go skompilować na systemie Linux (używając msvc mingw32gcc) i pobrać kod, który zwraca wartość true, gdy jest uruchamiany w systemie Windows. Nie znam żadnego kompilatora Linux-a obsługiwanego przez system Windows. jeśli chcesz dyskutować o warstwach emulacji takich jak „wino”, wszystkie inne odpowiedzi prawdopodobnie napotykają ten sam problem
Jasen

1
Nie jestem pewien, czy WIN32 jest właśnie zdefiniowany, ale jest zdefiniowany jako niezerowy. Jeśli jest to późniejszy przypadek, możesz po prostu powiedzieć #if WIN32. W systemach innych niż Windows, ponieważ WIN32 nie jest zdefiniowany, preprocesor musi traktować go jako 0.
Shahbaz

27

PHP, 22 bajty

`<?=PATH_SEPARATOR>":";`  

wypisuje, 1jeśli separator ścieżek jest średnikiem (dwukropek lub pusty dla wszystkich innych systemów operacyjnych oprócz DOS i OS / 2), w przeciwnym razie nic.

także 22 bajty , ale nie tak bezpieczne:

<?=strpos(__FILE__,92);

wypisuje dodatnią liczbę całkowitą, jeśli ścieżka do pliku zawiera ukośnik odwrotny; inaczej nic.
Bezpieczna alternatywa z 27 bajtami : <?=DIRECTORY_SEPARATOR>"/";odbitki 1lub nic.

Dziwne znalezisko : <?=__FILE__[1]==":";( 20 bajtów ) również nie powinno być bezpieczne, ale jest w porządku. Ale chociaż __FILE__udaje, że jest łańcuchem (próbowałem var_dumpi gettype), indeksowanie generuje błąd, chyba że skopiujesz go gdzie indziej (konkatenacja również działa) lub użyjesz go jako parametru funkcji.

Edycja:
<?=(__FILE__)[1]==":";(także 22 bajty ) działa w PHP 7; ale to dlatego, że nawiasy kopiują wartość stałej do zmiennej tymczasowej.

27 bajtów : <?=stripos(PHP_OS,win)===0;
sprawdza, czy wstępnie zdefiniowana PHP_OSstała zaczyna się od win(bez rozróżniania wielkości liter; Windows, WIN32, WINNT, ale nie CYGWIN lub Darwin); drukuje 1dla Windows, w przeciwnym razie nic.

17/18 bajtów :

<?=strlen("
")-1;

wypisuje, 1jeśli był przechowywany z łamaniem linii systemu Windows (także na DOS, OS / 2 i Atari TOS - chociaż wątpię, aby ktokolwiek kiedykolwiek skompilował PHP dla TOS), inaczej 0.

Możesz także sprawdzić stałą PHP_EOL.

więcej opcji:

PHP_SHLIB_SUFFIXjest dllw systemie Windows, ale niekoniecznie tylko tam.
php_uname()zwraca informacje o systemie operacyjnym i nie tylko; zaczyna się Windowsna Windows.
$_SERVER['HTTP_USER_AGENT']będzie zawierać Windowspo wywołaniu w przeglądarce w systemie Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 bajtów) działa w PHP> = 5.3

wniosek

Jedyny niezawodny sposób stwierdzenia, czy to naprawdę Windows, a nie coś takiego, wygląda na sprawdzenie nazwy systemu operacyjnego. Dla PHP: php_os()może być wyłączone ze względów bezpieczeństwa; ale PHP_OSprawdopodobnie zawsze będzie zawierać pożądane informacje.


4
Nazwy plików w * nix mogą zawierać odwrotne ukośniki, więc nie jest to tak naprawdę niezawodne. Zasady nie mówią jednak, że musi być niezawodny, więc ¯ \ _ (ツ) _ / ¯
Jordan

@Jordan: Masz rację. Dodałem tę informację do opisu. Dzięki.
Tytus

4
Alternatywą: <?=class_exists(COM);. O COMile mi wiadomo, klasa jest dostępna tylko pod Windows. To powinno zaoszczędzić jeden bajt.
Ismael Miguel

@IsmaelMiguel To wystarczy innej odpowiedzi, abyś mógł opublikować ją jako taką. (Jednak może nie być tego warte; ta odpowiedź jest bardzo dobrze napisana.)
wizzwizz4

1
@ wizzwizz4 To nie jest tego warte. Odpowiedź zostałaby zepchnięta w zapomnienie. Dlatego po prostu zostawiłem komentarz, zamiast pisać własną odpowiedź.
Ismael Miguel

16

Befunge-98, 7 bajtów

6y2%!.@

Wypróbuj online!

Działa to poprzez zapytanie o separator ścieżki systemowej, który znajduje się \w systemie Windows i /innych systemach operacyjnych.

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 bajtów

$OperatingSystem=="Windows"&

Po co tworzyć funkcję? Możesz usunąć znak amp i zaoszczędzić jeden bajt, a kod po prostu bezpośrednio oceni, czy jest wykonywany w systemie Windows.
Ruslan

@ Ruslan Wszystkie odpowiedzi muszą być albo pełnymi programami, które drukują wynik, albo funkcjami, które można wywołać. Jeśli zostanie to zadeklarowane jako odpowiedź Mathematica, możesz uciec od nazwania go pełnym programem, ale jeśli wywołam tę rzecz z wiersza poleceń bez &, nic nie wydrukuje (a wtedy nie będzie to również funkcja wywoływalna , ale tylko fragment / wyrażenie).
Martin Ender

@MartinEnder Naprawdę brak wyników? Otrzymuję Out[1]= Falsedane wyjściowe z tego:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan

@ Ruslan Uważam, że również uruchamia środowisko notebooka (tylko oparte na wierszu poleceń). Mam na myśli to, że uruchamiając program z wiersza poleceń, korzystam z trybu skryptowego.
Martin Ender

13

Java 8, 33 bajty

Specjalne podziękowania dla Oliviera Grégoire'a za sugestie separatorChari Kritixi Lithos za -1 bajt!

To wyrażenie lambda, które zwraca wartość logiczną. Można to przypisać Supplier<Boolean> f = ...;i wywołać za pomocą f.get().

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

Wypróbuj online! - serwer nie jest systemem Windows, więc to się drukujefalse. Jednak w moim komputerze z systemem Windows drukowany jest ten sam kodtrue.

Ten kod pobiera separator plików Systemu i sprawdza, czy jego kod jest większy niż znak [. Dotyczy to systemu Windows, ponieważ używa go \jako separatora - ale używa go każdy inny system operacyjny /, który ma niższy kod w tabeli ASCII.


Czy to nie przerwa w innych systemach operacyjnych, które zaczynają się na W?
Downgoat

()->java.io.File.separatorChar=='\\'ma tylko 36 bajtów.
Olivier Grégoire

1
@ OlivierGrégoire miło - i mogę grać w golfa do 34 za pomocą ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, Whonix. Prawdopodobnie nawet więcej.
Olivier Grégoire,

3
@Titus Czekaj, co powiesz na WAITS ?
NoOneIsHere

11

J, 7 bajtów

6=9!:12

Jest to czasownik (podobny do funkcji), który wykorzystuje wbudowaną koniunkcję obcą, 9!:12aby uzyskać typ systemu, w którym 5 to Unix, a 6 to Windows32.


J Oficjalna dokumentacja pokazuje, że zwraca tę wartość dla starszych systemów Windows. „6 Windows32 (95/98/2000 / NT)” Czy dokumentacja wymaga aktualizacji? Co się stanie, gdy jest to 64-bitowy system Windows? jsoftware.com/help/dictionary/dx009.htm
Keeta

Przetestowany na 64-bitowym systemie Windows 7 i zwraca 6. Dokumentacja wydaje się być dość stara.
Keeta

@Keeta Tak, myślę, że jest stary, ale nadal zwraca 6 dla mnie w systemie Windows 10 64-bit.
mile

11

R, 15 bajtów

.Platform$O>"v"

Dzięki plannapusowi za sugestię użycia częściowego dopasowania do wyodrębnienia elementu listy.

.Platform to lista z niektórymi szczegółami platformy, na której zbudowano R. Istnieje element OS.type(jedyny element o nazwie zaczynającej się od „O”), który jest ciągiem znaków, podającym system operacyjny (rodzinę) komputera. Jeden z "unix"lub "windows".

Więc "unix"jest mniej niż "v", ale "windows"jest większy niż "v". Inne prawidłowe 15 bajtów odpowiedzi to

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

R jest opracowywany dla systemów operacyjnych z rodziny Unix, Windows i Mac . Inne rodziny systemów operacyjnych nie są obsługiwane.


1
istnieją platformy inne niż unix, które nie są oknami, które znasz ...
Blue

2
@muddyfish: .Platform [[1]] jest zdefiniowany jako „unix” lub „windows” w dokumentacji R. github.com/wch/r-source/blob/…
liori

Przepraszam, więc w porządku. Odpowiedź powinna prawdopodobnie zostać zmodyfikowana, aby uwzględnić ten fakt, aby przestać być pytanym
Blue

10

Perl, 11 bajtów

print$^O=~MS

^O należy zastąpić dosłownie Control-O.

Dane wyjściowe 1w systemie Windows, nic w innym systemie operacyjnym.

Zauważ, że nie używam, sayponieważ dodaje końcowy znak nowej linii, co jest prawdą w Perlu.

-2 bajty dzięki primo. (i naprawiono potencjalne problemy)
-1 bajtów dzięki ais523.


AFAIR to nie zadziała w Cygwin Perl.
Igor Skochinsky

To też nie zadziała w mingw Perl. Perl traktuje oba systemy jako odrębne systemy operacyjne od Windows (ponieważ zazwyczaj przestrzegają konwencji UNIX zamiast konwencji Windows) i nie jest jasne, czy powinny one liczyć się do celów pytania. W innych wiadomościach możesz zapisać bajt tutaj, używając dosłownie znaku sterującego-O, a nie ^O.

@ ais523 Zredagowałem to, dzięki. Jeśli chodzi o Cygwin i Mingw, usunę post, jeśli powinny być one uważane za Windows, ale jak mówisz, bardziej sensowne byłoby rozważenie ich jako osobnego systemu operacyjnego (a przynajmniej takiego jak system inny niż Windows).
Dada,

Ograniczniki wyrażenia regularnego nie powinny być konieczne $^O=~W, choć prawdopodobnie byłbym przeciwny MS. Alternatywnie możesz również dopasować $^X=~':'.
primo

@primo racja, dzięki. Nie znam żadnego innego systemu operacyjnego W, więc założyłem, że sprawdzam, czy nie ma Ww porządku. Czy są jakieś powody, dla których sugerujesz MS?
Dada

9

Julia, 10 bajtów

is_windows

Funkcja, która zwraca wartość true dla systemu Windows


9

kod maszynowy x86, 9 bajtów

40 39 04 24 75 02 CD 80 C3

Opracowano z:

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
czysty plik binarny (COM) nie będzie działał w systemie Windows ani Linux, więc nie jestem pewien, czy jest to poprawne
Igor Skochinsky

@IgorSkochinsky Musi istnieć tłumacz do zgromadzenia.
Shmuel H.

Możesz jeszcze bardziej skrócić kod, pozostawiając tylko inc eaxi int 0x80, myślę, że powinien zawieść w systemie Windows i zakończyć proces.
Shmuel H.

2
@IgorSkochinsky Istnieją również programy, które uruchamiają surowy plik binarny. Zobacz link w moim poprzednim komentarzu.
Shmuel H.

1
Bochs i QEMU symulują środowisko bez systemu operacyjnego i nie uruchamiają kodu binarnego w systemie operacyjnym hosta. Więc nie będą działać IMO. Ale to wszystko może być dyskusją dla meta.
Igor Skochinsky,

8

JavaScript, 42 30 26 25 bajtów

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

Testowane z Firefoksem. (Chrome nie ma tej oscpuwłaściwości.) Ponieważ małe litery mają większy kod znaków niż wielkie litery, zależy to od tego, czy pierwsza litera navigator.oscpuma duże litery, a nie W , X , Y lub Z na dowolnej platformie obsługiwanej przez Firefox (innej niż Windows oczywiście). Według tego postu tak właśnie jest.

Edycje

  1. Zaoszczędzono 12 bajtów dzięki Neilowi .
  2. Zapisano kolejne cztery bajty
  3. Zaoszczędź kolejny bajt dzięki Blenderowi .

oscpujest prawdopodobnie najkrótszą navigatorwłaściwością, której można użyć. Testowanie wyrażenia regularnego prawdopodobnie będzie działało krócej, ale go nie zmierzyłem.
Neil

Możesz usunąć !=-1i dodać ~prawo za grubą strzałką, oszczędzając 3 bajty.
Łukasz

Czy musisz stworzyć funkcję? Nie możesz po prostu console.logtestu regex? navigator.oscpu[0]=='W'

2
Hmm, z jakiegoś powodu mój Chrome nie ma oscpu.
Muzer

2
navigator.oscpu>'V'może również działać
Blender

8

C #, 61 48 bajtów

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

Zaoszczędź 13 bajtów dzięki TheLethalCoder

Lub pełny program o wielkości 83 bajtów:

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

Różne warianty systemu Windows używają wartości wyliczeniowych od 0 do 3 w implementacji Microsoft .NET . 4 to Unix, 5 to Xbox [360] (którego nie będę uważał za „Windows”), 6 to MacOSX. Mono używa tych samych wartości , dodając 128 dla Unix / Linux we wcześniejszych wersjach.

Dlatego wszystko <4 to Windows, a wszystko inne to nie Windows.


2
Nie jestem pewien, czy coś mi umknęło, ale dlaczego przekazujesz wartość na wartość int?
auhmaan

@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- w zasadzie reguły pisania w języku C # mówią, że nie mogę bezpośrednio porównywać znaków PlatformIDa int, i nie ma niejawnej obsady od PlatformIDdo int. Ale tam jest wyraźny odlewane ze wszystkich teksty stałe do ich wartości, które wykorzystują tutaj ...
Bob

1
@ MustafaAKTAŞ Muszę również zaznaczyć, że jest to ukierunkowane na C # / .NET Framework / .NET Core. Na Xbox One można uruchamiać tylko aplikacje UWP, które używają innego interfejsu API, w tym System.Environment.OSVersionwcale . Jeśli masz z tym problem, powinieneś również usunąć każdą inną odpowiedź spoza UWP. Okazuje się również, że nie możesz (obecnie) uruchamiać aplikacji UWP na platformach innych niż Windows, więc możesz je również usunąć. Co pozostawia 0 odpowiedzi i pytanie, na które nie można odpowiedzieć.
Bob

1
Możesz skompilować do Action<bool>pierwszego przykładu dla 48 bajtów (nie przetestowałem go, ale wierzę, że zadziała) _=>(int)System.Environment.OSVersion.Platform<4;Może to wymagać ()=>...49 bajtów
TheLethalCoder

1
Przez cały czas używane są kompilacje do anonimowych funkcji, takich jak Funcs i Actions. Wierzę, że jest na stronie wskazówek golfowych i używam ich prawie cały czas. Również anonimowe funkcje są często używane w innych językach, więc myślę, że można z nich bezpiecznie korzystać
TheLethalCoder

7

Partia, 50 bajtów

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

Edycja: Naprawiono ignorowanie DOS zamiast twierdzenia, że ​​to Windows.

Tylko inny sposób znam działa Batch poza systemem Windows jest użycie wino, które domyślnie będzie mapować Z:do /. Dlatego jeśli Z:\bin\shistnieje, są szanse, że /bin/shtak, więc nie MS Windows.

Nie wiem, do czego WINE ustawia% OS%, ale jeśli nie, Windows_NTto mogę zapisać 23 bajty.


1
Innym sposobem jest DOS, który nie jest systemem Windows.
Ruslan

Nie działa to nie tylko w systemie DOS, ale także na komputerze, na którym Z: jest mapowany, i zawiera taką ścieżkę.
Adám

1
Przynajmniej próbuję wykryć WINO. Żadna z pozostałych odpowiedzi nie da poprawnego wyniku, gdy będzie uruchamiana w WINE.
Neil

3
@ Adám Pewnie, a jeśli skompilujesz odpowiedź C z -DWIN32 = 1, to również się nie powiedzie. Twój punkt?
Neil

1
tak, zestawy do winaOS=Windows_NT
Jasen

7

QBasic, 31 bajtów

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

Drukuje niezerowe pod Windows, 0 pod wszystkimi innymi.

COMSPECjest zmienną środowiskową unikalną dla systemów operacyjnych Microsoft. Wskazuje interpreter poleceń, zwykle command.comlub cmd.exe. W systemie Windows interpreter poleceń znajduje się gdzieś w katalogu Windows; pod MS-DOS, znajduje się w katalogu DOS lub w katalogu głównym dysku, a pod żadnym innym systemem operacyjnym nie istnieje.

Sprawdzając, czy wartość COMSPEC„W” zawiera wartość „W”, możemy odróżnić system Windows od systemu innego niż Windows.


COMSPECnie jest zarezerwowany, aby oznaczać coś w szczególności pod Linuksem (co oznacza, że ​​domyślnie jest pod kontrolą użytkownika), więc nie jest możliwe, aby użytkownik ustawił wartość, której używa do własnych celów (i zdarza się, że zawiera W)? Trzeba przyznać, że to trochę przypadek.

1
@ ais523: Ponadto katalog Windows nie musi zawierać W. W każdym przypadku jest kruchy.
Joey,

7

Node.js, 27 16 15 13 bajtów

Dzięki @Patrick , który zgolił 12 bajtów mojego rozwiązania za pomocą REPL Node:

_=>os.EOL>`
`

Oryginalne rozwiązanie:

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

Jeśli zmienisz to na Node.js REPL, możesz zapisać 16 bajtów, używając_=>path.sep!='/'
Patrick Roberts

Jestem nowy w codegolf. Czy mogę to zrobić?
GilZ,

Tak, inaczej nie zasugerowałbym tego. REPL oznacza odczyt, wykonywanie, drukowanie pętli, program uruchamiany po wejściu nodena konsolę. Stamtąd wszystkie moduły węzłów systemu są dostępne bez ich potrzeby require().
Patrick Roberts,

O tak, przepraszam. Miałem na myśli 11. Możesz zapisać kolejny bajt, zmieniając !=na, >ponieważ indeks ASCII dla \ to 92 i /wynosi 47.
Patrick Roberts

7

Excel VBA, 41 40 30 29 26 24 bajtów

Natychmiastowa funkcja truesystemu Windows, która zwraca się, jeśli kod systemu zaczyna się, jest dłuższy niż 3, ponieważ informacje są ograniczone do wyjścia albo inaczej, macalbo pcdoszwraca truetylko na Windows szt.

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

Poprzednie wersje

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

Zmiany

-1 Podziękowania dla Neila za korzystanie Left(...,1)z niegoMid(...,1,1)

-10 Podziękowania dla ChrisH za wskazanie sztuczki Separator ścieżek @ Mego

-1 Kontrola WorkbookPathza "\" zamiast używaćApplication.Path Separator

-4 Do przełączania na Environ()

-2 Do przełączania na [Len(Info(...

Nowe rozwiązanie, 51 bajtów

Nowa subprocedura, która wyprowadza do VBE natychmiastowe okno, okno 1 (truthy)pod i okno 0 (falsey)pod mac, metodą kompilacji warunkowej.

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

1
leftoszczędza bajt.
Neil

Próbowałeś już tego na office365 online? Czy to w ogóle obsługuje VBA? Po prostu ciekawy.
Chris H

@ChrisH Według mojej wiedzy office.com nie obsługuje skryptów VBA online (chociaż jeśli ktoś inny wie lepiej, powiedz mi, to znacznie ułatwi moje życie); Jednak dzięki O365 masz prawo pobrać kopię Office 2016 (lub cokolwiek aktualnego) na pulpit, co obsługuje skrypty VBA.
Taylor Scott,

Jak dotąd udało mi się tego uniknąć; biorąc pod uwagę swój komentarz, który zapowiada się kontynuować (jedyne okna maszyny używam mieć kopię stacjonarnego biura, maszyny osobiste są wszystkie linux)
Chris H

1
@ Sztuczka separatora ścieżek Mego ( ?Application.PathSeparator)="\"miałaby 32, ponieważ jest to pojedynczy znak)
Chris H

6

Perl 6 ,  19  18 bajtów

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

Zarówno wyjście, jak True␤i False␤zależnie od systemu, na którym jest uruchomiony.


drugi opiera się na wartościach innych niż Windows CWD, które nie zawierają żadnych `` - nie ma na to gwarancji,
Jasen

5

APL (Dyalog) , 21 bajtów

'W'∊∊#⎕WG'APLVersion'

Wypróbuj online!

#⎕WG'APLVersion' Root ( # ) W indow G et właściwość Wersja APL

 zaciągnąć się (spłaszczyć)

'W'∊ Jest W członka? (żadne wartości zwracane poza Windows nie zawierają dużej W)


4

tcl, 38 bajtów

 expr [lsearch $tcl_platform windows]>0

4

PHP 17 bajtów

Poniższe wyświetli 1 jeśli Windows i nic, jeśli cokolwiek innego. Ignorowanie powiadomień o konwersji łańcucha.

<?=PHP_OS==WINNT;

Wypróbuj online testy online dla systemu Linux, ponieważ piaskownica jest systemem Linux dla PoC.


Jasne, że to wystarczy? Pytanie, ponieważ możliwe wartości: PHP_OS .
manatwork

1
„<? = PHP_OS [0] == W;” jest zarówno o 1 bajt krótszy, jak i przechwytuje wszystkie pozostałe wartości okna w pytaniu powiązanym z manatwork. >Vmoże też działać.
user59178,

manatwork zależy od tego, na której wersji Windows została skompilowana PHP, ponieważ Windows Visa \ 7, wersja Windows jest reprezentowana przez WINNT z powodu jądra NT Authority. przed Windows XP i niższymi wersjami był WIN32, a Windows Server 2003 był Windows.
DrWhat

4

Java 8, 49 bajtów

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

Dłuższy niż druga odpowiedź Java , ale ma inne podejście.

Ta lambda pasuje do a Supplier<Boolean>i można ją przetestować za pomocą następującego programu:

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

}

Jest bardzo, bardzo podobny do początkowej odpowiedzi, którą łączysz (przed edycją).
Olivier Grégoire,

Dlaczego nie tylko .contains("W")?
Cyoce

@Cyoce faktycznie, zmienny system operacyjny wydaje się być specyficzny dla systemu Windows.


4

bash + coreutils, 5 bajtów

rm $0

Działa również w większości innych powłok POSIXy. (Zauważ, że istnieją bashi rmistnieją porty Windows ; chociaż są one zwykle używane tylko z większymi systemami operacyjnymi POSIXy, nie jest to całkowicie pusta pozycja.) Dane wyjściowe za pośrednictwem kodu wyjścia (0 = fałsz, 1 = prawda). Może być liczony jako 4 bajty, jeśli możesz założyć nazwę pliku (np rm a.). Pamiętaj, że może to potencjalnie zakończyć się niepowodzeniem w przypadku bardzo dziwnych nazw plików (które rmbędą interpretowane jako argumenty z powodu braku cytowania i prawdopodobnie usuwają pliki, na których Ci zależy, więc odradzam uruchamianie tego programu z pliku o dziwnej nazwie ).

Uwaga: usuwa program z dysku jako efekt uboczny lub przynajmniej próbuje. W przypadku, gdy działamy w systemie Windows, system operacyjny nie usunie uruchomionego pliku (operacja, którą system Windows domyślnie wyklucza lub zatrzyma), a zatem rmwystąpi błąd. bashwyłapuje błąd i konwertuje go na kod wyjścia (w ten sposób program jako całość kończy się normalnie). Większość innych wpisów tutaj używa 0 dla falsey i 1 dla prawdy w kodach wyjścia, więc robi to samo; pamiętać, że bash„s ifoświadczenie nie akceptuje liczby całkowite na wszystkich (raczej akceptuje polecenia i gałęzie na podstawie tego, czy działają one poprawnie, a testy arytmetyczne są wykonywane za pośrednictwem środków programów jaktestktóre celowo zgłaszają „awarię” przy nieudanym porównaniu), więc dzieje się to na chwiejniejszych podstawach pod względem legalności niż programy, które ifwysyłają kod wyjściowy w językach, w których 0 jest poprawne w teście instrukcji i wysyła program do elseoddziału.


4

8 , 11 bajtów

 
os 1- not .
 

Drukuje truew systemie Windows, falseLinux i macOS. Inne platformy obsługiwane przez 8th to Android, iOS i Raspberry Pi, ale nie jestem w stanie ich przetestować.

Wersja bez golfa (z komentarzami)

 
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 bajtów)

import winreg

Zwraca kod wyjścia zero (ogólnie prawda w powłokach), jeśli w systemie Windows, a kod niezerowy w przeciwnym razie.

Jeśli wolisz, to w drugą stronę, nie jest rozwiązaniem 12 bajtów: import posix.


Myślę, że to nie zadziała, jeśli plik będzie wywoływany winreg.pyw tym samym katalogu.
Zacharý

1
Ponadto, zgodnie z regułami: „Kod, który nie działa / nie kompiluje się na platformie, nie jest liczony jako wartość falsey”.
Zacharý

4

TrumpScript , 17 bajtów

America is great.

Wypróbuj online!


Ten program, jeśli zostanie uruchomiony w systemie Windows, wydrukuje:

The big problem this country has is being PC

Jest to uważane za prawdziwą wartość.


Puste wyjście i następująca wartość są fałszem:

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

Puste wyjście pojawi się na dowolnym systemie Linux (dla tego programu), odpowiedź długiego jabłka oczywiście występuje na Macu (dla dowolnego programu). W TIO backend (zakładam, że) jest systemem operacyjnym uniksowym, więc możesz uzyskać tylko wartość fałsz; na moim komputerze pojawia się komunikat PC.


Nie jestem w 100% pewien, czy liczy się to jako komunikat o błędzie (który unieważniłby odpowiedź), ale jeśli nie wiedziałeś o tym, prawdopodobnie warto się z ciebie pośmiać.


Co świat przyszedł ...
ooransoy

@avaragecoder ZRÓB PYTHON WIELKI PONOWNIE!
Magic Octopus Urn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.