Виявити MS Windows


78

Виклик

Створіть програму, яка повертає просте значення при запуску в Microsoft Windows (для простоти ми будемо дотримуватися Windows 7, 8.1 та 10) та значення фальси при запуску в будь-якій іншій операційній системі (OSX, FreeBSD, Linux).

Правила

  • Код, який не запускається / компілюється на платформі, не враховується як значення фальси.

Критерії виграшу

Я маркую це як , тому найнижчий бал виграє, але мені також дуже цікаво бачити творчі рішення цієї проблеми.


7
Чи можуть програми виводити код виходу? ( як правило, дозволено )
FlipTack

13
Чи можете ви дати чіткий перелік, над якими операційними системами потрібно працювати?
FlipTack

2
Яким повинен бути результат під Windows RT?
Адам

6
Ви можете вказати декілька конкретних систем, не для Windows, які потрібно підтримувати. У коментарях є деякі дебати про такі речі, як DOS та OS2.
jpmc26

2
Нам, мабуть, потрібен консенсус щодо того, що для коду виходу вважається трибуном і фальсиєю; нормальна умова - 0 для істинного, а все інше - для помилкового, але багато відповідей трактують це як протилежне, і визначення "якщо твердження" очевидно не застосовується.

Відповіді:


75

Vim, 2 байти

<C-a>1

У Windows <C-a>(ctrl + a) відображено за замовчуванням на Select All. Якщо ви введете 1режим вибору у Windows, він замінить вибір тим, що ви ввели (1), залишивши 1 у буфері.

В інших операційних системах <C-a>за замовчуванням відображається карта Increment number. Оскільки збільшення кількості немає, це не-оп, і тоді 1 збільшує кількість, але з точки зору буфера - неоперативний.

1 - це правда у Vim, а порожня струна - хибна


Схоже, 3 натискання клавіш. Ctrl + a + 1
Павло

12
Я думаю, що відповідно до цього мета-повідомлення meta.codegolf.stackexchange.com/questions/8995/… Відповіді Vim, як правило, набираються без модифікаторів (особливо якщо врахувати, що перша відповідь у публікації використовує <ctrl + a> як приклад для 1 байта)
nmjcman101

4
@Pavel це Ctrl + a, 1. Якби це було, Ctrl + a + 1це вважалося б одним натисканням клавіші.
Людина капітана

7
Красиво, я люблю цю відповідь!
DJMcMayhem

Це досить елегантно, мені це подобається.
Дан

108

MATLAB, 4 байти

ispc

З документації :

tf = ispcповертає логічний 1 (вірно), якщо версія програмного забезпечення MATLAB® призначена для платформи Microsoft® Windows®. В іншому випадку він повертає логічний 0 (false).

Є також функції ismacі isunix. Я залишу це читачеві, щоб зрозуміти, що ці функції виконують. Мего ласкаво попросив пояснити схеми, ismacі isunixтому я спробував проілюструвати це тут:

введіть тут опис зображення

Це не було запитання для діаграми, ispcале я можу виявити, що поведінка досить схожа, за винятком замінника OSXі Unixз Windows.


Другий підхід:

Ось другий підхід із getenvвикористанням 23 байтів, які мають бути захищеними від куль, якщо тільки інша операційна система не починається з W:

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

getenv 'name'здійснює пошук у нижньому списку середовища операційної системи для тексту форми name=value, де nameзнаходиться вектор вхідних символів. Якщо його знайдено, MATLAB® повертає значення векторного символу. Якщо вказане ім'я неможливо знайти, повертається порожня матриця.


4
Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Денніс

54

Python 2.7.10 , 24 байти

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

Завдяки FlipTack за 3 байти

Ця програма користується тим, що Windows є єдиною ОС, яка використовується \як роздільник шляхів. Зазвичай це розчаровує і погано, але колись це фактично перевага. У Windows, '['>os.sepпомилково, і, таким чином 0/0, обчислюється, спричиняючи ZeroDivisionErrorі виходить із ненульовим кодом виходу. На платформах, що не '['>os.sepє Windows, є істинним, роблячи вираз 0/1, який нічого не робить, і програма виходить з кодом виходу 0.


DOS також використовує зворотну косу рису як роздільник шляху, і вона має щонайменше одну реалізацію Python 2.
isanae

5
@isanae Я відредагував заголовок, щоб вказати Python 2.7 - єдина реалізація Python 2 в DOS - це архаїка, баггі 2.4.2
Mego

OS / 2 також використовує зворотну косу
рису

9
@isanae Там я вказав 2.7.10. Успіхів знайти порт цього.
Mego

2
Мабуть, потрібно лише дати правильні результати для 3-х останніх версій Windows та, мабуть, аналогічно останніх версій трьох інших перерахованих систем, OS2 та DOS не мають значення,
Jasen

45

x86 Асамблея, 7 байт (натхненний відповіддю Рунеморо )

31 DB 89 D8 40 CD 80

Або

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

Опис

Перш за все, ми встановимо eaxв 1(номер системного виклику для exit(int val)для Linux, FreeBSDі OSX). Потім ми зателефонуємо на ворота переривання, 0x80що є воротом системного виклику Linux, FreeBSDі OSX. Це призведе до виходу програми зі статусом ebxякого є 0( false).

У Windows int 0x80є недійсним 2eворотом (він використовується як шлюз системного виклику), і він призведе до збою програми, що призведе до завершення позитивним кодом виходу ( true).

Редагувати: Не працюватиме, OSXоскільки у нього є інша конвенція про передачу аргументів щодо 32-бітного (стеком).

Список літератури та подальше читання


3
Це геніально!
z0rberg

Чому випадки аварії мають суттєве значення? Це тому, що EAX (як правило, повернене значення) дорівнює 1? Крім того, чи гарантовано EAX 0 при запуску програми? Або вам xor eax, eaxтам потрібно ?
Коул Джонсон

3
@ColeJohnson: Збої, виявлені ОС (в операційних системах, які зазвичай використовуються з x86) ніколи не залишають код виходу 0, оскільки це зарезервовано для успішного припинення. (Зазвичай код виходу - це якесь химерне значення, яке ОС зберігає спеціально для цієї обставини.) Однак я не впевнений, що в кодах виходу з програми має сенс рахувати 0 як фальси, а 1 - як правду, враховуючи, що нормальною умовою є з точністю до навпаки (при цьому 0 є єдиною правдою, наприклад, стандартна програма UNIX / Linux / POSIX falseвиходить з кодом 1, поки trueвиходить з кодом 0).

1
Ця відповідь неявно передбачає, що при запуску програми (у не для Windows) реєструється eaxта ebxочищається до нуля, що не гарантується, якщо я правильно пам’ятаю. Він також чітко передбачає, що умова про передачу аргументів syscall для Linux збігається з FreeBSD та OSX, що було б дуже дивно.
zwol

1
@ Себастьян-ЛоренцюПлесьюк Добре запитання. mov eax, 1було б переведено на \xB8\x01\x00\x00\x00, що набагато довше, ніж просто переміщення реєстру та виклику inc.
Шмуель Х.

29

C, 44 43 38 36 байт

Дякуємо @Downgoat за байт! перекреслено 44 все ще регулярно 44
Дякуємо @Neil за два байти!

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

Спочатку я збирався запропонувати, що ви можете зберегти купу байтів, перемістивши 0вихід ifdefі змінивши 1на !, але, думаю, _WIN32+0працює ще краще.
Ніл

Якщо з c99 все в порядку, ви можете змінити f на основний і вставити return 1;всередину ifdef та видалити інше, оскільки main без повернення в c99 повинен повернути 0.
simon

11
Це директива компілятора. Якщо вона складена в системі Windows і працює в системі Linux, наприклад, вона все одно повернеться 1.
Мішель Джонсон

4
@MichealJohnson ні. Я можу компілювати його на Linux (використовуючи mingw32gcc msvc) snd отримати код, який повертає true під час запуску на Windows. Я не знаю жодного компілятора Linux, розміщеного під Windows. якщо ви хочете сперечатися з емуляційними шарами на зразок "вина", всі інші відповіді, ймовірно, зазнають тієї ж проблеми
Jasen

1
Не впевнений, чи WIN32 визначений тільки що, але визначено не-нульовим. Якщо це пізніший випадок, ви можете просто сказати #if WIN32. Що стосується невіконних вікон, оскільки WIN32 не визначений, препроцесор зобов'язаний трактувати це як 0.
Шахбаз

27

PHP, 22 байти

`<?=PATH_SEPARATOR>":";`  

друкує, 1якщо роздільник шляху є крапкою з комою (двокрапка або порожня для всіх інших ОС, крім DOS та OS / 2), нічого іншого.

також 22 байти , але це не так безпечно:

<?=strpos(__FILE__,92);

друкує додатне ціле число, якщо шлях до файлу містить зворотну косу рису; інше нічого.
Безпечна альтернатива з 27 байтами : <?=DIRECTORY_SEPARATOR>"/";відбитки 1чи нічого.

Дивна знахідка : <?=__FILE__[1]==":";( 20 байт ) має бути, не безпечним, але добре. Але хоча __FILE__видає себе за рядок (я намагався var_dumpі gettype), його індексація видає помилку, якщо ви не скопіюєте її деінде (конкатенація також працює) або не використаєте її як функціональний параметр.

Правка:
<?=(__FILE__)[1]==":";(також 22 байти ) працює в PHP 7; але це тому, що дужки копіюють значення константи у тимчасову змінну.

27 байт : <?=stripos(PHP_OS,win)===0;
тестує, якщо заздалегідь визначена PHP_OSконстанта починається win(регістр нечутливий; Windows, WIN32, WINNT, але не CYGWIN чи Darwin); принти 1для Windows, інакше нічого.

17/18 байт :

<?=strlen("
")-1;

друкує, 1якщо він зберігався з Windows linebreak (також на DOS, OS / 2 та Atari TOS - хоча я сумніваюся, що хтось коли-небудь компілював PHP для TOS), інше 0.

Ви також можете перевірити константу PHP_EOL.

більше опцій:

PHP_SHLIB_SUFFIXє dllв Windows, але не обов'язково тільки там.
php_uname()повертає інформацію про операційну систему та інше; починається з WindowsWindows.
$_SERVER['HTTP_USER_AGENT']міститиме, Windowsколи викликається в браузері в Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 байт) працює в PHP> = 5.3

висновок

Єдиний надійний спосіб визначити, чи справді це Windows, а не все схоже на це, здається, перевірка назви ОС. Для PHP: php_os()може бути відключено з міркувань безпеки; але PHP_OS, ймовірно, завжди буде містити бажану інформацію.


4
Імена файлів на * nix можуть містити зворотні риси, тому це насправді не є надійним. Правила не кажуть, що це повинно бути безпроблемним, тому ¯ \ _ (ツ) _ / ¯
Йорданія

@Jordan: Ти маєш рацію. Я додав цю інформацію до опису. Дякую.
Тит

4
Альтернатива: <?=class_exists(COM);. COMНаскільки я знаю, клас доступний лише під Windows. Це повинно заощадити один байт.
Ісмаїл Мігель

@IsmaelMiguel Для цього достатньо різної відповіді, щоб опублікувати її як таку. (Однак цього, можливо, не варто цього робити; ця відповідь дуже добре написана.)
wizzwizz4

1
@ wizzwizz4 Це не варто. Відповідь підштовхнула до забуття. Тому я просто залишив коментар, а не писав власну відповідь.
Ісмаїл Мігель

16

Befunge-98, 7 байт

6y2%!.@

Спробуйте в Інтернеті!

Це працює за допомогою запиту роздільника системного шляху, який знаходиться \в Windows та /інших операційних системах.

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

Математика, 28 байт

$OperatingSystem=="Windows"&

Який сенс зробити його функцією? Ви можете видалити ампер і зберегти один байт, і код буде просто визначати, чи виконується він у системі Windows-ish.
Руслан

@Ruslan Усі відповіді повинні бути або повними програмами, які друкують результат, або функціями, що викликаються. Якщо це буде оголошено відповіддю ноутбука Mathematica, ви можете піти, називаючи його повноцінною програмою, але якщо я викликаю річ з командного рядка без &, вона нічого не надрукує (і це також не є функцією дзвінка , а лише фрагмент / вираз).
Мартін Ендер

@MartinEnder Дійсно немає виводу? Я отримую Out[1]= Falseвисновок з цього:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Руслан

@ Руслан Я вважаю, що це також запускає середовище для ноутбука (просто на основі командного рядка). Що я маю на увазі під запуском програми з командного рядка, це використання режиму скрипту.
Мартін Ендер

13

Java 8, 33 байти

Особлива подяка Олів'є Грегоару за те separatorChar, що вони запропонували , та Критіксі Літос за -1 байт!

Це лямбда-вираз, який повертає булеве. Це можна призначити Supplier<Boolean> f = ...;та зателефонувати за допомогою f.get().

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

Спробуйте в Інтернеті! - сервер не windows, тому це друкуєfalse. Однак у моїй машині Windows той же код друкуєtrue.

Цей код робить, це отримати сепаратор файлів системи та перевірити, чи більша його кодова точка, ніж символ [. Це справедливо для Windows, оскільки він використовується \як сепаратор, але використовує будь-яка інша ОС /, яка має нижчий код у таблиці ASCII.


Не буде це перерва на інших ОС, які починаються з W?
Пуховина

()->java.io.File.separatorChar=='\\'складає всього 36 байт.
Олів’є Грегоар

1
@ OlivierGrégoire приємний - і я можу гольфувати його до 34 за допомогою ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, Whonix. Напевно, навіть більше.
Олів'є Грегоар

3
@Titus Зачекайте, що про Вейтса ?
NoOneIshere

11

J, 7 байт

6=9!:12

Це дієслово (подібне до функції), яке використовує вбудований іноземний сполучник 9!:12для придбання системного типу, де 5 - Unix, а 6 - Windows32.


J Офіційна документація показує, що вона повертає це значення для старих Windows. "6 Windows32 (95/98/2000 / NT)" Чи потрібно оновлювати документацію? Що відбувається, коли це 64-бітна Windows? jsoftware.com/help/dictionary/dx009.htm
Keeta

Тестується на 64-бітному Windows 7, і він повертає 6. Документація, здається, досить стара.
Кіта

@Keeta Так, я думаю, що він старий, але він все ще повернув 6 для мене на Windows 10 64 біт.
милі

11

R, 15 байт

.Platform$O>"v"

Завдяки планувалу за пропозицію використовувати часткове узгодження для вилучення елементів списку.

.Platform - це список із деякими деталями платформи, під якою побудований R. Є елемент OS.type(єдиний елемент з ім'ям, що починається з "O"), який є рядком символів, що дає Операційній системі (сім'ї) комп'ютера. Один з "unix"або "windows".

Так "unix"менше "v", але "windows"більше, ніж тоді "v". Інші дійсні відповіді на 15 байт є

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

R розробляється для сімейств операційних систем, схожих на Unix, Windows та Mac . Інші сімейства ОС не підтримуються.


1
є інші платформи, крім unix, які не вікна, яких ви знаєте ...
Синій

2
@muddyfish: .Platform [[1]] визначається як "unix" або "windows" в R документації. github.com/wch/r-source/blob/…
liori

Вибачте, тоді все нормально. Відповідь, ймовірно, слід змінити, щоб включити цей факт, щоб перестати запитувати знову
Синій

10

Perl, 11 байт

print$^O=~MS

^O слід замінити буквальним Control-O.

Виходи 1на Windows, нічого на іншій ОС.

Зауважте, що я не використовую, sayоскільки він додає зворотний новий рядок, який є перламутровим в Perl

-2 байти завдяки приму. (і виправлені потенційні проблеми)
-1 байт завдяки ais523.


ПОСЛУГА це не працюватиме в Cygwin Perl.
Ігор Скочинський

Це також не працюватиме в mingw Perl. Хоча Perl розглядає ці як окремі операційні системи від Windows (оскільки вони, як правило, підкоряються UNIX, а не конвенціям Windows), і незрозуміло, чи варто їх розраховувати для мети питання. Іншими новинами ви можете зберегти тут байт, скориставшись буквальним символом управління-O, а не ^O.

@ ais523 Я це відредагував, дякую. Що стосується Cygwin та Mingw, я видаляю публікацію, якщо їх слід вважати Windows, але, як ви кажете, було б більше сенсу вважати їх як окремі ОС (або, принаймні, як не ОС Windows).
Дада

Розмежувачі Regex не повинні бути необхідними $^O=~W, хоча, мабуть, я б протистояв MS. Крім того, ви також можете відповідати $^X=~':'.
прим

@primo правильно, спасибі Я не знаю жодної іншої ОС з Wв ній, тому я припустив перевірку на наявність Wштрафу .. будь-які причини, чому ви пропонуєте MSзамість цього?
Дада


9

машинний код x86, 9 байт

40 39 04 24 75 02 CD 80 C3

Складено з:

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
чистий бінарний (COM) не працюватиме в Windows або Linux, тому не впевнений, чи дійсно це
Ігор Скочинський

@IgorSkochinsky Для монтажу повинен бути перекладач.
Шмуель Х.

Ви можете зробити код ще коротшим, залишивши лише, inc eaxі int 0x80, я думаю, він повинен вийти з ладу у Windows та припинити процес.
Шмуель Х.

2
@IgorSkochinsky Є програми, які також працюють в сирому двійковому форматі. Дивіться посилання в моєму попередньому коментарі.
Шмуель Х.

1
Bochs та QEMU моделюють середовище голого металу та не виконують бінарний код у хост-операційній системі. Тому вони не працюватимуть ІМО. Але все це може бути дискусією для мета.
Ігор Скочинський

8

JavaScript, 42 30 26 25 байт

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

Тестували за допомогою Firefox. (У Chrome немає oscpuвластивості.) Оскільки малі літери мають вищий код символів, ніж великі літери, це залежить від того, що перша літера navigator.oscpuє великими і не має значення W , X , Y або Z на будь-якій платформі, що підтримує Firefox (крім Windows, звичайно). Відповідно до цієї посади , це так.

Правки

  1. Збережено 12 байт завдяки Нілу .
  2. Збережено ще чотири байти
  3. Збережено ще один байт завдяки Blender .

oscpuце, мабуть, найкоротша navigatorвластивість, яку ви можете використовувати. Крім того, тестування regexp, ймовірно, вийде коротше, але я його не вимірював.
Ніл

Ви можете видалити !=-1та додати ~відразу після жирової стрілки, заощадивши 3 байти.
Лука

Чи потрібно створити функцію? Ви не можете просто console.logтест на регулярний вираз? Також буде navigator.oscpu[0]=='W'працювати чи є інша ОС, яка також починається з W.

2
Хм, чомусь у мого Chrome немає oscpu.
Мюзер

2
navigator.oscpu>'V'може працювати також
Блендер

8

C #, 61 48 байт

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

Збережено 13 байт завдяки TheLethalCoder

Або повна програма на 83 байти:

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

Різні варіанти Windows використовують значення перерахунків від 0 до 3 у впровадженні Microsoft .NET . 4 - Unix, 5 - Xbox [360] (який я не вважатиму "Windows"), 6 - MacOSX. Mono використовує ті самі значення , додаючи 128 для Unix / Linux у попередніх версіях.

Тому що-небудь <4 - це Windows, а все інше - це не Windows.


2
Не впевнений, чи щось мені не вистачає, але чому ви кидаєте значення на int?
auhmaan

@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- в основному правила набору тексту C # говорять, що я не можу порівнювати a PlatformIDі intбезпосередньо, і немає неявного відтворення з PlatformIDдо int. Але це явне приведення всіх перерахувань до їх значень, які я скористатися звідси ...
Боб

1
@ MustafaAKTAŞ Також я мушу зазначити, що це орієнтування на C # /. NET Framework / .NET Core. На Xbox One можна запускати лише програми UWP, які використовують інший API, не включаючи System.Environment.OSVersionзовсім . Якщо ви збираєтеся вирішити проблему з цим, то вам слід також видалити будь-яку іншу відповідь, що не відповідає ППЗ. Також виявляється, що ви не можете (на даний момент) запускати програми UWP на платформах, які не є Windows, тому ви можете також видалити всі ці. Що залишає у вас 0 відповідей та непереборне питання.
Боб

1
Ви можете скласти до Action<bool>першого прикладу до 48 байт (я не перевіряв його, але вважаю, що він спрацює). _=>(int)System.Environment.OSVersion.Platform<4;Можливо, це буде потрібно ()=>...для 49 байтів
TheLethalCoder,

1
Тут постійно використовується компіляція до анонімних функцій, таких як Funcs та Actions. Я вважаю, що це на сторінці порад з гольфу, і я їх використовую майже весь час. Також анонімні функції багато використовуються в інших мовах, тому я вважаю, що їх тут безпечно використовувати
TheLethalCoder

7

Пакет, 50 байт

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

Редагувати: виправлено ігнорування DOS, а не твердження, що це Windows.

Тільки інший спосіб я знаю, працює Batch поза Windows , полягає в використанні WINE , який за замовчуванням буде відображати Z:в /. Тому, якщо Z:\bin\shіснує, шанси на те, що це /bin/shтак, а не MS Windows.

Я не знаю, на що WINE встановлює% OS%, але якщо це не так, Windows_NTя міг би зберегти 23 байти.


1
Інший спосіб - DOS, який не є Windows.
Руслан

Це не виходить тільки в DOS, але й на комп'ютері, де відображено Z: і, можливо, містить такий шлях.
Адам

1
Принаймні я намагаюся виявити ВИНО. Жоден з інших відповідей не дасть правильного результату під час роботи під WINE.
Ніл

3
@ Adám Sure, і якщо ви складете відповідь C з -DWIN32 = 1, вона теж не вдається. Ваша думка?
Ніл

1
так, винні набориOS=Windows_NT
Ясен

7

QBasic, 31 байт

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

Друкує без нуля під Windows, 0 під усім рештою.

COMSPEC- це змінна середовище, унікальна для ОС Microsoft. Він вказує на інтерпретатора команд, як правило, command.comабо cmd.exe. У Windows командний інтерпретатор сидить десь у каталозі Windows; в MS-DOS він знаходиться в каталозі DOS або в корені диска, а в будь-якій іншій ОС він не існує.

Перевіривши, чи не COMSPECмістить значення "W", ми можемо визначити різницю між Windows та не-Windows.


COMSPECне зарезервовано для того, щоб означати що-небудь, зокрема, під Linux (це означає, що він за замовчуванням знаходиться під контролем користувача), тому чи не можливо, щоб користувач встановив його значення, яке він використовує для власних цілей (і, можливо, містить W)? Справді, це трохи крайній випадок.

1
@ ais523: Також каталог Windows не повинен містити W. Це крихко в будь-якому випадку.
Джої

7

Node.js, 27 16 15 13 байт

Завдяки @Patrick , який збрив 12 байт мого рішення, використовуючи REPL Node:

_=>os.EOL>`
`

Оригінальне рішення:

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

Якщо змінити це Node.js REPL, ви можете зберегти 16 байт, просто скориставшись_=>path.sep!='/'
Патрік Робертс

Я новачок у кодегольфі. Мені дозволено це робити?
GilZ

Так, інакше я б не запропонував цього. REPL означає читання, виконання, друк циклу, програма, яка запускається при введенні nodeна консоль. Звідти всі модулі системних вузлів доступні без потреби в require()них.
Патрік Робертс

О так, вибачте. Я мав у виду 11. Ви можете зберегти інші байти, змінивши !=в >з індексом ASCII для \ 92 і /становить 47.
Патрік Робертс

7

Excel VBA, 41 40 30 29 26 24 байт

Функція негайного вікна, яка повертається, trueякщо код ОС системи запускається довше тривалості 3, тому що інформація обмежена для виведення або інакше, macабо pcdosповертається trueлише на ПК Windows

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

Попередні версії

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

Зміни

-1 Завдяки Neil для використання Left(...,1)більшMid(...,1,1)

-10 Дякую Крішу за те, що він вказав трюк @ Mego's Path Separator Trick

-1 для перевірки WorkbookPathдля "\" замість того щоб використовуватиApplication.Path Separator

-4 Для переходу на Environ()

-2 Для переходу на [Len(Info(...

Нове рішення, 51 байт

Новий subрозпорядок, який виводить у вікно VBE безпосередньо, вікно 1 (truthy)під вікном та 0 (falsey)під mac методом умовної компіляції.

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

1
leftекономить вам байт.
Ніл

Ви пробували це на office365 в Інтернеті? Це навіть підтримує VBA? Просто цікаво.
Кріс Х

@ChrisH Наскільки мені відомо, office.com не підтримує сценарії VBA в Інтернеті (хоча якщо хтось інший знає краще, скажіть, це значно полегшить моє життя); Однак з O365 ви маєте права завантажити копію Office 2016 (або будь-яку іншу актуальну) на робочий стіл, і це підтримує сценарій VBA.
Тейлор Скотт

Я поки що встигаю цього уникнути; враховуючи ваш коментар, який виглядає налаштованим на продовження (у єдиних машинах Windows, які я використовую, є копія офісу на робочому столі, персональні машини - це Linux)
Кріс Х

1
@ Трюк роздільника шляху Мего ( ?Application.PathSeparator)="\"було б 32, оскільки це одна чара)
Кріс Х

6

Perl 6 ,  19  18 байт

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

Як вихід, так True␤і False␤залежно від системи, на якій він працює.


другий покладається на значення, що не містять вікон CWD, не містять жодної `` - немає гарантії цього,
Jasen



4

PHP 17 байт

Далі буде виведено 1, якщо windows, і нічого, якщо нічого іншого. Ігнорування повідомлень про перетворення рядків.

<?=PHP_OS==WINNT;

Спробуйте в Інтернеті Інтернет-тести для Linux, тому що пісочниця є Linux для PoC.


Впевнені, що цього достатньо? Запитання, оскільки можливі значення для: PHP_OS .
манатура

1
'<? = PHP_OS [0] == W; `обоє на 1 байт коротше і фіксує всі інші значення вікна у питанні, пов'язаному манаторною роботою. >Vможе також працювати.
користувач59178

Manatwork залежить від того, на якій версії було складено PHP версії Windows, оскільки Windows Visa \ 7, версія Windows була представлена ​​WINNT через ядро ​​NT Authority. до Windows XP і нижче був WIN32, а Windows Server 2003 був Windows.
DrWhat

4

Java 8, 49 байт

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

Більше, ніж інші відповіді на Java , але використовує інший підхід.

Ця лямбда вписується в Supplier<Boolean>і може бути протестована за допомогою наступної програми:

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

}

Це дуже-дуже схоже на початкову відповідь, яку ви посилаєте (перед правками).
Олів’є Грегоар

Чому б не просто .contains("W")?
Кіос

@Cyoce насправді змінна ОС схожа на Windows.

4

Haskell, 39 31 байт

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

Я перевіряю наявність виводу першої літери "m", яка повинна бути "mingw" для windows. Наскільки я міг сказати, немає іншої ОС, яка починається з М. Інформація надходить з https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs


1
У моїй системі (Windows 10 64-розрядна, GHC 8.0.1 64-розрядна) osдає "mingw32".
Mego

@Mego ви маєте рацію, виправили це
Ділан Меус

4

bash + coreutils, 5 байт

rm $0

Також працює в більшості інших оболонок POSIXy. (Зверніть увагу, що порти Windows існують bashі rmіснують; хоча вони зазвичай використовуються лише в більш інтенсивних операційних системах POSIXy, це не зовсім вакуумний запис.) Виводиться через вихідний код (0 = false, 1 = true). Можна вважати 4 байтами, якщо вам дозволяється приймати ім’я файлу (наприклад, rm a). Зауважте, що це може бути невдалим у випадку дуже дивних імен файлів (що rmтрактуватиметься як аргументи через відсутність цитування, і можливо видалення файлів, які вас хвилюють, тому я б радив не запускати цю програму з файлу із дивним іменем ).

Примітка: видаляє програму з диска як побічний ефект, або принаймні намагається. У випадку, коли ми працюємо в Windows, ОС не вдасться видалити запущений файл (операція, яку Windows забороняє або за замовчуванням, або повну зупинку), і, таким чином, rmвийде помилка. bashвиявляє помилку і перетворює її в код виходу (таким чином програма в цілому закінчується нормально). Більшість інших записів тут використовують 0 для falsey та 1 для truthy у вихідних кодах, тому це робить те саме; зауважте, що оператор bash's ifвзагалі не приймає цілі числа (скоріше, він приймає команди та гілки залежно від того, чи успішно вони працюють, а тести арифметики виконуються за допомогою таких програм, якtestщо навмисно повідомляють про «збій» при невдалому порівнянні), тож це є більш хитким в плані законності, ніж програми, які виводять за допомогою коду виходу мовами, де 0 є дійсним у ifтесті операторів і надсилає програму у elseвідділення.


4

8-й , 11 байт

 
os 1- not .
 

Друкує trueв Windows, falseна Linux та macOS. Інші платформи, які підтримують 8-й, - це Android, iOS та Raspberry Pi, але я не в змозі перевірити їх.

Безгольова версія (з коментарями)

 
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 байт)

import winreg

Повертається з кодом виходу нуля (як правило, в оболонках), якщо у Windows, а з ненульовим кодом виходу в іншому випадку.

Якщо ви віддаєте перевагу навпаки, є рішення 12 байт: import posix.


Я думаю, що це не спрацює, якщо winreg.pyв тому самому каталозі є файл, який називається .
Zacharý

1
Також за правилами: "Код, який не запускається / компілюється на платформі, не вважається значенням фальси."
Zacharý

4

TrumpScript , 17 байт

America is great.

Спробуйте в Інтернеті!


Ця програма, якщо вона запущена на Windows, буде друкувати:

The big problem this country has is being PC

Це вважається правдивою цінністю.


Порожній вихід і наступне значення є хибними:

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

Порожній вихід буде відбуватися в будь-якій системі Linux (для цієї програми), тривалий відгук яблука, очевидно, відбувається на Mac (для будь-якої програми). У TIO, бекенд (я припускаю) є операційною системою Unix, тому ви можете отримати лише хибне значення; на комп’ютері я отримую повідомлення на ПК.


Не на 100% впевнений, що це вважатиметься повідомленням про помилку (що може визнати недійсною відповідь), але якщо ви про це не знали, то, мабуть, варто сміятися над вами.


До чого прийшов світ ...
ooransoy

@avaragecoder ЗРОБИТИ ПІТОНА ВЕЛИКИЙ!
Чарівна восьминога урна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.