Определить MS Windows


80

Вызов

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

правила

  • Код, который не запускается / компилируется на платформе, не считается ошибочным значением.

Критерии победы

Я маркирую это как , поэтому выигрывает самый низкий балл, но я также очень заинтересован в том, чтобы найти креативные решения этой проблемы.


7
Могут ли программы выводить по коду выхода? ( обычно разрешено )
FlipTack

14
Можете ли вы дать определенный список, на каких операционных системах нужно работать?
FlipTack

2
Каким должен быть результат под Windows RT?
Адам

7
Вы можете указать несколько конкретных систем, отличных от Windows, которые должны поддерживаться. В комментариях обсуждаются такие вещи, как DOS и OS2.
jpmc26

2
Нам, вероятно, нужен консенсус о том, что считается истинным и ложным для кодов выхода; обычное соглашение - 0 для истины и все остальное для ложных, но многие ответы рассматривают его как противоположное, и определение «если утверждение» явно не применяется.

Ответы:


78

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

Это довольно элегантно, мне это нравится.
Дан

109

MATLAB, 4 байта

ispc

Из документации :

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

Есть также функции ismacи isunix. Я оставлю читателю понять, что делают эти функции. Mego любезно попросил схемы объяснения ismacи isunixпоэтому я попытался проиллюстрировать его здесь:

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

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


Второй подход:

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

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

getenv 'name'ищет в основном списке среды операционной системы текст формы name=value, где nameнаходится входной символьный вектор. Если найдено, MATLAB® возвращает значение вектора символов. Если указанное имя не может быть найдено, возвращается пустая матрица.


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

55

Python 2.7.10 , 24 байта

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

Благодаря FlipTack за 3 байта

Эта программа использует тот факт, что Windows является единственной ОС, используемой \в качестве разделителя пути. Обычно это расстраивает и плохо, но на самом деле это преимущество. В Windows '['>os.sepимеет значение false и, таким образом 0/0, вычисляется, вызывая ZeroDivisionErrorи завершая работу с ненулевым кодом выхода. На платформах, отличных от Windows, '['>os.sepэто правда, делает выражение 0/1, которое ничего не делает, и программа завершается с кодом выхода 0.


DOS также использует обратную косую черту в качестве разделителя пути и имеет по крайней мере одну реализацию Python 2.
Исана

5
@isanae Я отредактировал заголовок, чтобы указать Python 2.7 - единственная реализация Python 2 в DOS - это архаичная, с ошибками 2.4.2
Mego

OS / 2 также использует обратную косую черту и имеет реализацию Python 2.7;)
isanae

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

Почему падение дает истинную ценность? Это потому, что EAX (обычно возвращаемое значение) равен 1? Кроме того, гарантируется ли EAX значение 0 при запуске программы? Или тебе там нужно xor eax, eax?
Коул Джонсон

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

1
Этот ответ подразумевает, что регистры eaxи ebxсбрасываются в ноль при запуске программы (не в Windows), что не гарантируется, если я правильно помню. Это также явно предполагает, что соглашение о передаче аргументов системного вызова для Linux совпадает с соглашением для FreeBSD и OSX, что было бы действительно удивительно.
Звол

1
@ Себастьян-LaurenţiuPlesciuc Хороший вопрос. 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 на main и вставить return 1;в ifdef и удалить else, так как main без возврата в c99 должен вернуть 0.
simon

11
Это директива компилятора. Например, если он скомпилирован в системе Windows и запущен в системе Linux, он все равно вернет 1.
Майкл Джонсон

4
@MichealJohnson нет. Я могу скомпилировать его в Linux (используя mingw32gcc msvc) и получить код, который возвращает true при запуске в Windows. Я не знаю ни одного Windows-компилятора Linux. если вы хотите поспорить с эмуляционными слоями, такими как «вино», то все остальные ответы, вероятно, будут
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 (также в 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 могут содержать обратную косую черту, так что это не совсем надежно. Правила не гласят, что он должен быть надежным, поэтому ¯ \ _ (ツ) _ / ¯
Иордания

@ Джордан: Ты прав. Я добавил эту информацию в описание. Благодарю.
Титус

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

Mathematica, 28 байт

$OperatingSystem=="Windows"&

Какой смысл делать это функцией? Вы можете удалить амперсанд, сохранив один байт, и код просто оценит, выполняется ли он в системе Windows-ish.
Руслан

@Ruslan Все ответы должны быть либо полными программами, которые печатают результат, либо вызываемыми функциями. Если это объявлено как ответ в записной книжке Mathematica, то вам может не понравиться назвать его полной программой, но если я вызову эту вещь из командной строки без &, она ничего не напечатает (и тогда это тоже не вызываемая функция). , но просто фрагмент / выражение).
Мартин Эндер

@MartinEnder Действительно нет выхода? Я получаю Out[1]= Falseвывод из этого:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Руслан

@Ruslan Я считаю, что это также запускает среду ноутбука (только основанную на командной строке). Что я имею в виду, запустив программу из командной строки, используя режим сценария.
Мартин Эндер

13

Java 8, 33 байта

Отдельное спасибо Оливье Грегуару за предложение separatorCharи Критиси Литосу за -1 байт!

Это лямбда-выражение, которое возвращает логическое значение. Это может быть назначено Supplier<Boolean> f = ...;и вызвано с f.get().

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

Попробуйте онлайн! - сервер не Windows, поэтому он печатаетfalse. Тем не менее, в моей машине Windows, тот же код печатаетtrue.

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


Разве это не сломается на других ОС, которые начинаются с W?
Downgoat

()->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
Кита

Протестировано на 64-битной Windows 7 и возвращает 6. Документация выглядит довольно старой.
Кита

@Keeta Да, я думаю, что он старый, но он все равно вернул мне 6 в Windows 10 64 бит.
миль

11

R 15 байт

.Platform$O>"v"

Спасибо plannapus за предложение использовать частичное совпадение для извлечения элементов списка.

.Platform - это список с некоторыми деталями платформы, под которой был построен R. Существует элемент OS.type(единственный элемент с именем, начинающимся с «O»), который является символьной строкой, задающей операционную систему (семейство) компьютера. Один из "unix"или "windows".

Так "unix"меньше "v", но "windows"больше "v". Другие действительные 15-байтовые ответы

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

R разрабатывается для операционных систем семейства Unix-like, Windows и Mac . Другие семейства ОС не поддерживаются.


1
Есть платформы, кроме Unix, которые не являются окнами, вы знаете ...
Blue

2
@muddyfish: .Platform [[1]] определяется как "unix" или "windows" в документации R. github.com/wch/r-source/blob/...
liori

Извини, тогда все в порядке. Вероятно, следует изменить ответ, включив в него этот факт, чтобы не задавать этот вопрос снова
Blue

10

Perl, 11 байт

print$^O=~MS

^O должен быть заменен буквальным Control-O.

Выходы 1на окнах, ничего на другой ОС.

Обратите внимание, что я не использую, так sayкак он добавляет завершающий перевод строки, что правда в Perl.

-2 байта благодаря primo. (и исправлены потенциальные проблемы)
-1 байт благодаря ais523.


AFAIR это не сработает в Cygwin Perl.
Игорь Скочинский

Это не будет работать в Mingw Perl либо. Тем не менее, Perl рассматривает их как отдельные операционные системы от Windows (поскольку они, как правило, подчиняются соглашениям UNIX, а не Windows), и неясно, должны ли они учитываться для цели вопроса. В других новостях вы можете сохранить байт, используя вместо него буквальный символ control-O ^O.

@ ais523 Я редактировал это, спасибо. Что касается Cygwin и Mingw, я удалю пост, если они будут рассматриваться как Windows, но, как вы говорите, было бы более целесообразно рассматривать их как отдельные ОС (или, по крайней мере, как не-ОС Windows).
Дада

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

@ Хорошо, спасибо. Я не знаю ни одной другой ОС, в которой есть буква a, Wпоэтому я предполагал проверить на наличие Wштрафа. Какие причины вы предлагаете MSвместо этого?
Дада

9

юлия, 10 байт

is_windows

Функция, которая возвращает истину для окон


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 имитируют среду с открытым исходным кодом и не запускают двоичный код под операционной системой хоста. Таким образом, они не будут работать IMO. Но это все может быть обсуждение мета.
Игорь Скочинский

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свойство, которое вы можете использовать. Кроме того, тестирование регулярного выражения, вероятно, будет работать быстрее, но я его не измерял.
Нил

Вы можете удалить !=-1и добавить ~сразу после жирной стрелки, сэкономив 3 байта.
Люк

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

2
Хм, почему-то у моего Chrome нет oscpu.
Музер

2
navigator.oscpu>'V'может также сработать
Blender

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. Также оказывается, что вы не можете (в настоящее время) запускать приложения 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 Конечно, и если вы компилируете ответ C с параметром -DWIN32 = 1, он тоже не будет выполнен. Ваша точка зрения?
Нил

1
да, винные наборыOS=Windows_NT
Jasen

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!='/'
Патрик Робертс

Я новичок в Codegolf. Могу ли я это сделать?
GilZ

Да, иначе я бы не предложил это. REPL означает чтение, выполнение, печать цикла, программу, которая запускается при входе nodeв консоль. Оттуда все модули системного узла доступны без необходимости в require()них.
Патрик Робертс

Ах да, извините. Я имел в виду 11. Вы можете сохранить еще один байт, изменив его !=на, >поскольку индекс ASCII для \ 92 /равен 47, а для него - 47.
Патрик Робертс

7

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

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

?[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 Спасибо Нейлу за использование Left(...,1)болееMid(...,1,1)

-10 Спасибо ChrisH за указание на трюк с разделителем путей в Mego

-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? Просто любопытно.
Крис Х

@ ChhrisH Насколько мне известно, 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, не относящихся к windows, которые не содержат `` - это не гарантируется,
Jasen



4

PHP 17 байт

Следующий выводит 1, если окна и ничего, если что-нибудь еще. Игнорирование уведомлений о преобразовании строк.

<?=PHP_OS==WINNT;

Попробуйте онлайн- тесты для Linux, потому что песочница - это Linux для PoC.


Конечно, этого достаточно? Запрашиваемая потому что возможные значения для: PHP_OS .
manatwork

1
'<? = PHP_OS [0] == W; `на 1 байт короче и перехватывает все остальные значения окон в вопросе, связанном с manatwork. >Vможет сработать тоже.
user59178

manatwork зависит от того, на какой версии Windows была скомпилирована PHP, начиная с Windows Visa \ 7, версия Windows была представлена ​​с WINNT из-за ядра авторизации NT. до 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. Насколько я могу судить, нет другой ОС, которая начинается с M. Информация поступает с https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs.


1
На моей системе (Windows 10 64-разрядная, GHC 8.0.1 64-разрядная), osдает "mingw32".
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 для фальси и 1 для истинного в кодах выхода, так что это делает то же самое; обратите внимание , что bash«s ifзаявление не принимает целые числа на всех (точнее, он принимает команды и филиалы , основанные на ли они работают, и арифметические тесты выполняются с помощью средств таких программ , какtestкоторые намеренно сообщают об «сбое» при неудачном сравнении), так что это более шаткое основание с точки зрения легальности, чем программы, которые выводят через код ifзавершения на языках, где 0 допустим в тесте операторов и отправляет программу в 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в том же каталоге.
Захари

2
Кроме того, согласно правилам: «Код, который не запускается / компилируется на платформе, не считается ошибочным значением».
Захари

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 (для этой программы), длинный ответ Apple, очевидно, происходит на Mac (для любой программы). В TIO бэкэнд (я предполагаю) - это операционная система Unix, так что вы можете получить только ложное значение; на моем компьютере я получаю сообщение ПК.


Не уверен на 100%, если это считается сообщением об ошибке (что приведет к аннулированию ответа), но если вы не знали об этом, это, вероятно, стоило посмеяться над вами.


Что мир пришел к ...
ooransoy

@avaragecoder СДЕЛАЙТЕ ПИТОНА БОЛЬШИМ!
Волшебная урна осьминога
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.