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 kod-golf , więc wygrywa najniższy wynik, ale jestem również bardzo zainteresowany kreatywnymi rozwiązaniami tego problemu.
code-golf
decision-problem
Daniel
źródło
źródło
Odpowiedzi:
Vim, 2 bajty
W systemie Windows
<C-a>
(ctrl + a) jest domyślnie mapowany naSelect All
. Jeśli wpiszesz „a”1
w 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 naIncrement 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
źródło
Ctrl + a
,1
. Gdyby tak byłoCtrl + a + 1
, byłoby to liczone jako jedno naciśnięcie klawisza.MATLAB, 4 bajty
Z dokumentacji :
Istnieją również funkcje
ismac
iisunix
.Pozostawię czytelnikowi ustalenie, jakie funkcje pełnią te funkcje.Mego proszeni o schematy wyjaśniająceismac
iisunix
tak starałem się zilustrować go tutaj:To nie było pytanie o schemat
ispc
, ale mogę ujawnić, że zachowanie jest dość podobna, z wyjątkiem substytutOSX
iUnix
zWindows
.Drugie podejście:
Oto drugie podejście z
getenv
wykorzystaniem 23 bajtów, które powinny być kuloodporne, chyba że istnieje inny system operacyjny zaczynający się odW
:źródło
Python 2.7.10 , 24 bajty
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.sep
jest fałszem, a zatem0/0
jest obliczany, powodującZeroDivisionError
i wychodzenie z niezerowym kodem wyjścia. Na platformach innych niż Windows'['>os.sep
jest to prawda, co powoduje wyrażenie0/1
, które nic nie robi, a program kończy działanie z kodem wyjścia 0.źródło
Zestawx86, 7 bajtów(zainspirowany odpowiedzią Runemoro )Lub
Opis
Przede wszystkim będziemy ustawiony
eax
na1
(liczba wywołań systemowych dlaexit(int val)
dlaLinux
,FreeBSD
iOSX
). Następnie wywołamy bramkę przerwania,0x80
która jest bramą wywołania systemowegoLinux
,FreeBSD
iOSX
. To by spowodować, że program, aby wyjść ze statusemebx
, który jest0
(false
).W systemie Windows
int 0x80
jest niepoprawna brama (służy2e
jako brama syscall) i powoduje awarię programu, powodując, że kończy się dodatnim kodem wyjścia (true
).Edycja: nie działałby,
OSX
ponieważ ma inną konwencję przekazywania argumentów w wersji 32-bitowej (stos).Referencje i dalsze czytanie
FreeBSD - System Calls
: Informacje o wywołaniach systemowychFreeBSD
.System calls in the Linux kernel. Part 2.
: Świetny artykuł na temat wywołań systemowych Linuksa.Linux Syscall Reference
: odniesienie do numerów wywołań systemowych dlaLinux
.Windows Syscall Shellcode
: Artykuł na temat bezpośredniego wywoływania wywołań systemowychwindows
z zestawu.Making system calls from Assembly in Mac OS X
: Artykuł na temat wywołań systemowychOSX
.źródło
xor eax, eax
tam?false
wychodzi z kodem 1, atrue
wychodzi z kodem 0).eax
iebx
są 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.mov eax, 1
zostałby przetłumaczony na\xB8\x01\x00\x00\x00
, co jest znacznie dłuższe niż przenoszenie rejestru i dzwonienieinc
.C,
44433836 bajtówDzięki @Downgoat za bajt! przekreślony 44 jest nadal regularny 44
Dzięki @Neil za dwa bajty!
źródło
0
OUTifdef
i zmieniając1
się!
, ale myślę, że_WIN32+0
działa nawet jeszcze lepiej.return 1;
wewnątrz ifdef i usunąć indziej, ponieważ główny bez powrotu w C99 musi zwrócić 0.#if WIN32
. W systemach innych niż Windows, ponieważ WIN32 nie jest zdefiniowany, preprocesor musi traktować go jako 0.PHP, 22 bajty
wypisuje,
1
jeś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:
wypisuje dodatnią liczbę całkowitą, jeśli ścieżka do pliku zawiera ukośnik odwrotny; inaczej nic.
Bezpieczna alternatywa z 27 bajtami :
<?=DIRECTORY_SEPARATOR>"/";
odbitki1
lub 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łemvar_dump
igettype
), 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_OS
stała zaczyna się odwin
(bez rozróżniania wielkości liter; Windows, WIN32, WINNT, ale nie CYGWIN lub Darwin); drukuje1
dla Windows, w przeciwnym razie nic.17/18 bajtów :
wypisuje,
1
jeś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), inaczej0
.Możesz także sprawdzić stałą
PHP_EOL
.więcej opcji:
PHP_SHLIB_SUFFIX
jestdll
w systemie Windows, ale niekoniecznie tylko tam.php_uname()
zwraca informacje o systemie operacyjnym i nie tylko; zaczyna sięWindows
na Windows.$_SERVER['HTTP_USER_AGENT']
będzie zawieraćWindows
po wywołaniu w przeglądarce w systemie Windows.<?=defined(PHP_WINDOWS_VERSION_BUILD);
(38 bajtów) działa w PHP> = 5.3wniosek
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; alePHP_OS
prawdopodobnie zawsze będzie zawierać pożądane informacje.źródło
<?=class_exists(COM);
. OCOM
ile mi wiadomo, klasa jest dostępna tylko pod Windows. To powinno zaoszczędzić jeden bajt.Befunge-98, 7 bajtów
Wypróbuj online!
Działa to poprzez zapytanie o separator ścieżki systemowej, który znajduje się
\
w systemie Windows i/
innych systemach operacyjnych.źródło
Mathematica, 28 bajtów
źródło
&
, nic nie wydrukuje (a wtedy nie będzie to również funkcja wywoływalna , ale tylko fragment / wyrażenie).Out[1]= False
dane wyjściowe z tego:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Java 8, 33 bajty
Specjalne podziękowania dla Oliviera Grégoire'a za sugestie
separatorChar
i 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()
.Wypróbuj online! - serwer nie jest systemem Windows, więc to się drukuje
false
. 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.źródło
()->java.io.File.separatorChar=='\\'
ma tylko 36 bajtów.()->java.io.File.separatorChar>'['
!J, 7 bajtów
Jest to czasownik (podobny do funkcji), który wykorzystuje wbudowaną koniunkcję obcą,
9!:12
aby uzyskać typ systemu, w którym 5 to Unix, a 6 to Windows32.źródło
R, 15 bajtów
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 toR jest opracowywany dla systemów operacyjnych z rodziny Unix, Windows i Mac . Inne rodziny systemów operacyjnych nie są obsługiwane.
źródło
Perl, 11 bajtów
^O
należy zastąpić dosłownie Control-O.Dane wyjściowe
1
w systemie Windows, nic w innym systemie operacyjnym.Zauważ, że nie używam,
say
ponieważ 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.
źródło
^O
.$^O=~W
, choć prawdopodobnie byłbym przeciwnyMS
. Alternatywnie możesz również dopasować$^X=~':'
.W
, więc założyłem, że sprawdzam, czy nie maW
w porządku. Czy są jakieś powody, dla których sugerujeszMS
?Julia, 10 bajtów
Funkcja, która zwraca wartość true dla systemu Windows
źródło
kod maszynowy x86, 9 bajtów
Opracowano z:
źródło
inc eax
iint 0x80
, myślę, że powinien zawieść w systemie Windows i zakończyć proces.JavaScript,
42302625 bajtówTestowane z Firefoksem. (Chrome nie ma tej
oscpu
właściwości.) Ponieważ małe litery mają większy kod znaków niż wielkie litery, zależy to od tego, czy pierwsza literanavigator.oscpu
ma 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
źródło
oscpu
jest prawdopodobnie najkrótsząnavigator
wł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.!=-1
i dodać~
prawo za grubą strzałką, oszczędzając 3 bajty.console.log
testu regex?navigator.oscpu[0]=='W'
navigator.oscpu>'V'
może również działaćC #,
6148 bajtówZaoszczędź 13 bajtów dzięki TheLethalCoder
Lub pełny program o wielkości 83 bajtów:
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.
źródło
int
?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ówPlatformID
aint
, i nie ma niejawnej obsady odPlatformID
doint
. Ale tam jest wyraźny odlewane ze wszystkich teksty stałe do ich wartości, które wykorzystują tutaj ...System.Environment.OSVersion
wcale . 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ć.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ówFunc
s iAction
s. 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ćPartia, 50 bajtów
Edycja: Naprawiono ignorowanie DOS zamiast twierdzenia, że to Windows.
Tylkoinny sposób znam działa Batch poza systemem Windows jest użycie wino, które domyślnie będzie mapowaćZ:
do/
. Dlatego jeśliZ:\bin\sh
istnieje, są szanse, że/bin/sh
tak, więc nie MS Windows.Nie wiem, do czego WINE ustawia% OS%, ale jeśli nie,
Windows_NT
to mogę zapisać 23 bajty.źródło
OS=Windows_NT
QBasic, 31 bajtów
Drukuje niezerowe pod Windows, 0 pod wszystkimi innymi.
COMSPEC
jest zmienną środowiskową unikalną dla systemów operacyjnych Microsoft. Wskazuje interpreter poleceń, zwyklecommand.com
lubcmd.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.źródło
COMSPEC
nie 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 zawieraW
)? Trzeba przyznać, że to trochę przypadek.Node.js,
27161513 bajtówDzięki @Patrick , który zgolił 12 bajtów mojego rozwiązania za pomocą REPL Node:
Oryginalne rozwiązanie:
źródło
Node.js REPL
, możesz zapisać 16 bajtów, używając_=>path.sep!='/'
node
na konsolę. Stamtąd wszystkie moduły węzłów systemu są dostępne bez ich potrzebyrequire()
.!=
na,>
ponieważ indeks ASCII dla\
to 92 i/
wynosi 47.Excel VBA,
414030292624 bajtówNatychmiastowa funkcja
true
systemu 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,mac
albopcdos
zwracatrue
tylko na Windows szt.Poprzednie wersje
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
WorkbookPath
za"\"
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
sub
procedura, która wyprowadza do VBE natychmiastowe okno, okno1 (truthy)
pod i okno0 (falsey)
pod mac, metodą kompilacji warunkowej.źródło
left
oszczędza bajt.?Application.PathSeparator)="\"
miałaby 32, ponieważ jest to pojedynczy znak)Perl 6 ,
1918 bajtówZarówno wyjście, jak
True
iFalse
zależnie od systemu, na którym jest uruchomiony.źródło
APL (Dyalog) , 21 bajtów
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)źródło
tcl, 38 bajtów
źródło
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.
źródło
>V
może też działać.Java 8, 49 bajtów
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:źródło
.contains("W")
?Haskell,
3931 bajtówSprawdzam, czy pierwsza litera ma „m”, która powinna być „mingw” dla systemu Windows. O ile mogę powiedzieć, nie ma innego systemu operacyjnego, który zaczyna się na M. Informacje pochodzą z https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs
źródło
os
daje"mingw32"
.bash + coreutils, 5 bajtów
Działa również w większości innych powłok POSIXy. (Zauważ, że istnieją
bash
irm
istnieją 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 (nprm a
.). Pamiętaj, że może to potencjalnie zakończyć się niepowodzeniem w przypadku bardzo dziwnych nazw plików (którerm
bę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
rm
wystąpi błąd.bash
wył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ć, żebash
„sif
oś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 jaktest
któ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óreif
wysyłają kod wyjściowy w językach, w których 0 jest poprawne w teście instrukcji i wysyła program doelse
oddziału.źródło
8 , 11 bajtów
Drukuje
true
w systemie Windows,false
Linux 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)
źródło
Python 3 (13 bajtów)
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
.źródło
winreg.py
w tym samym katalogu.TrumpScript , 17 bajtów
Wypróbuj online!
Ten program, jeśli zostanie uruchomiony w systemie Windows, wydrukuje:
Jest to uważane za prawdziwą wartość.
Puste wyjście i następująca wartość są fałszem:
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ć.
źródło