Вызов
Создайте программу, которая возвращает истинное значение при запуске в Microsoft Windows (для простоты мы будем придерживаться Windows 7, 8.1 и 10) и неверное значение при запуске в любой другой операционной системе (OSX, FreeBSD, Linux).
правила
- Код, который не запускается / компилируется на платформе, не считается ошибочным значением.
Критерии победы
Я маркирую это как code-golf , поэтому выигрывает самый низкий балл, но я также очень заинтересован в том, чтобы найти креативные решения этой проблемы.
code-golf
decision-problem
Даниил
источник
источник
Ответы:
Vim, 2 байта
В Windows
<C-a>
(ctrl + a) по умолчанию отображается наSelect All
. Если вы1
набираете в режиме выбора в Windows, он заменяет выделение на то, что вы ввели (1), оставляя 1 в буфере.В других операционных системах
<C-a>
по умолчанию отображается наIncrement number
. Поскольку нет никакого числа, чтобы увеличить, это - неоперация, и затем 1 увеличивает количество, но с точки зрения буфера является неоперацией.1 - правда в Vim, а пустая строка - ложь
источник
Ctrl + a
,1
. Если бы это было так,Ctrl + a + 1
это считалось бы одним нажатием клавиши.MATLAB, 4 байта
Из документации :
Есть также функции
ismac
иisunix
.Я оставлю читателю понять, что делают эти функции.Mego любезно попросил схемы объясненияismac
иisunix
поэтому я попытался проиллюстрировать его здесь:Не было предложено представить диаграмму,
ispc
но я могу показать, что поведение довольно схоже, за исключением заменыOSX
иUnix
сWindows
.Второй подход:
Вот второй подход с
getenv
использованием 23 байтов, который должен быть пуленепробиваемым, если только нет другой операционной системы, начинающейся сW
:источник
Python 2.7.10 , 24 байта
Благодаря FlipTack за 3 байта
Эта программа использует тот факт, что Windows является единственной ОС, используемой
\
в качестве разделителя пути. Обычно это расстраивает и плохо, но на самом деле это преимущество. В Windows'['>os.sep
имеет значение false и, таким образом0/0
, вычисляется, вызываяZeroDivisionError
и завершая работу с ненулевым кодом выхода. На платформах, отличных от Windows,'['>os.sep
это правда, делает выражение0/1
, которое ничего не делает, и программа завершается с кодом выхода 0.источник
Сборка x86, 7 байт(вдохновлено ответом Рунеморо )Или же
Описание
Прежде всего, мы установим
eax
в1
(номер системного вызова дляexit(int val)
дляLinux
,FreeBSD
иOSX
). Затем мы будем вызывать шлюз прерывания,0x80
который является шлюзом системного вызоваLinux
,FreeBSD
иOSX
. Это приведет к выходу программы со статусомebx
которого0
(false
).В Windows
int 0x80
недопустимый гейт (он используется2e
как гейт-системный шлюз) и может привести к сбою программы, что приведет к завершению с положительным кодом выхода (true
).Изменить: не будет работать,
OSX
так как он имеет другое соглашение о передаче аргументов на 32 бит (стека).Ссылки и дальнейшее чтение
FreeBSD - System Calls
: Информация о системных звонках вFreeBSD
.System calls in the Linux kernel. Part 2.
: Отличная статья о системных вызовах Linux.Linux Syscall Reference
: ссылка на номера системных вызовов дляLinux
.Windows Syscall Shellcode
: Статья о прямых вызовах системных вызововwindows
из сборки.Making system calls from Assembly in Mac OS X
: Статья о системных вызовахOSX
.источник
xor eax, eax
?false
завершается с кодом 1, аtrue
завершается с кодом 0).eax
иebx
сбрасываются в ноль при запуске программы (не в Windows), что не гарантируется, если я правильно помню. Это также явно предполагает, что соглашение о передаче аргументов системного вызова для Linux совпадает с соглашением для FreeBSD и OSX, что было бы действительно удивительно.mov eax, 1
будет переведено на\xB8\x01\x00\x00\x00
, что намного дольше, чем просто переместить регистр и позвонитьinc
.C,
44433836 байтСпасибо @Downgoat за байт! вычеркнуто 44 все еще регулярно 44
Спасибо @Neil за два байта!
источник
0
из рядаifdef
и изменений1
к!
, но я думаю , что_WIN32+0
работает даже еще лучше.return 1;
в ifdef и удалить else, так как main без возврата в c99 должен вернуть 0.#if WIN32
. В не-окнах, поскольку WIN32 не определен, препроцессор должен обрабатывать его как 0.PHP, 22 байта
печатает,
1
если разделитель пути является точкой с запятой (двоеточие или пустой для всех других ОС, кроме DOS и OS / 2), иначе ничего.также 22 байта , но не так безопасно:
печатает положительное целое число, если путь к файлу содержит обратную косую черту; остальное ничего.
Безопасная альтернатива с 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 байт :
печатает,
1
если он был сохранен с переводом строки Windows (также в DOS, OS / 2 и Atari TOS - хотя я сомневаюсь, что кто-нибудь когда-либо компилировал PHP для TOS), в противном случае0
.Вы также можете проверить постоянную
PHP_EOL
.больше опций:
PHP_SHLIB_SUFFIX
находитсяdll
на Windows, но не обязательно только там.php_uname()
возвращает информацию об операционной системе и многое другое; начинается сWindows
Windows.$_SERVER['HTTP_USER_AGENT']
будет содержатьWindows
при вызове в браузере на Windows.<?=defined(PHP_WINDOWS_VERSION_BUILD);
(38 байт) работает в PHP> = 5.3заключение
Единственный отказоустойчивый способ узнать, действительно ли это Windows, а не что-то похожее на нее, похоже, проверка имени ОС. Для PHP:
php_os()
может быть отключен по соображениям безопасности; ноPHP_OS
, вероятно, всегда будет содержать нужную информацию.источник
<?=class_exists(COM);
.COM
Насколько я знаю, класс доступен только под Windows. Это должно сэкономить вам один байт.Befunge-98, 7 байт
Попробуйте онлайн!
Это работает путем запроса разделителя системного пути, который есть
\
в Windows и/
в других операционных системах.источник
Mathematica, 28 байт
источник
&
, она ничего не напечатает (и тогда это тоже не вызываемая функция). , но просто фрагмент / выражение).Out[1]= False
вывод из этого:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Java 8, 33 байта
Отдельное спасибо Оливье Грегуару за предложение
separatorChar
и Критиси Литосу за -1 байт!Это лямбда-выражение, которое возвращает логическое значение. Это может быть назначено
Supplier<Boolean> f = ...;
и вызвано сf.get()
.Попробуйте онлайн! - сервер не Windows, поэтому он печатает
false
. Тем не менее, в моей машине Windows, тот же код печатаетtrue
.Этот код получает системный файловый разделитель и проверяет, больше ли его кодовая точка, чем символ
[
. Это верно для Windows, так как она используется\
в качестве разделителя - но используется для любой другой ОС/
, код которой в таблице ASCII ниже.источник
()->java.io.File.separatorChar=='\\'
только 36 байтов.()->java.io.File.separatorChar>'['
!J 7 байт
Это глагол (аналог функции), который использует встроенное внешнее соединение
9!:12
для определения типа системы, где 5 - Unix, а 6 - Windows32.источник
R 15 байт
Спасибо plannapus за предложение использовать частичное совпадение для извлечения элементов списка.
.Platform - это список с некоторыми деталями платформы, под которой был построен R. Существует элемент
OS.type
(единственный элемент с именем, начинающимся с «O»), который является символьной строкой, задающей операционную систему (семейство) компьютера. Один из"unix"
или"windows"
.Так
"unix"
меньше"v"
, но"windows"
больше"v"
. Другие действительные 15-байтовые ответыR разрабатывается для операционных систем семейства Unix-like, Windows и Mac . Другие семейства ОС не поддерживаются.
источник
Perl, 11 байт
^O
должен быть заменен буквальным Control-O.Выходы
1
на окнах, ничего на другой ОС.Обратите внимание, что я не использую, так
say
как он добавляет завершающий перевод строки, что правда в Perl.-2 байта благодаря primo. (и исправлены потенциальные проблемы)
-1 байт благодаря ais523.
источник
^O
.$^O=~W
, хотя, вероятно, я бы совпал с нимиMS
. В качестве альтернативы, вы также можете соответствовать$^X=~':'
.W
поэтому я предполагал проверить на наличиеW
штрафа. Какие причины вы предлагаетеMS
вместо этого?юлия, 10 байт
Функция, которая возвращает истину для окон
источник
машинный код x86, 9 байт
Составлено из:
источник
inc eax
иint 0x80
, я думаю, он должен выйти из строя в Windows и завершить процесс.JavaScript,
42302625 байтПротестировано с Firefox. (Chrome не имеет
oscpu
свойства.) Поскольку строчные буквы имеют более высокий код символа, чем заглавные буквы, это зависит от того, является ли первая букваnavigator.oscpu
заглавной, а не W , X , Y или Z на любой платформе, поддерживаемой Firefox (кроме Windows, конечно). Согласно этому посту , это так.Правки
источник
oscpu
вероятно, самое короткоеnavigator
свойство, которое вы можете использовать. Кроме того, тестирование регулярного выражения, вероятно, будет работать быстрее, но я его не измерял.!=-1
и добавить~
сразу после жирной стрелки, сэкономив 3 байта.console.log
проверить регулярные выражения? Также будетnavigator.oscpu[0]=='W'
работать или есть другая ОС, которая также начинается с W.navigator.oscpu>'V'
может также сработатьC #,
6148 байтовСохранено 13 байтов благодаря TheLethalCoder
Или полная программа на 83 байта:
Различные варианты Windows используют значения перечисления от 0 до 3 в реализации Microsoft .NET . 4 - Unix, 5 - Xbox [360] (который я не буду рассматривать как «Windows»), 6 - MacOSX. Mono использует те же значения , добавив 128 для Unix / Linux в более ранних версиях.
Следовательно, все, что <4, является Windows, а все остальное не Windows.
источник
int
?CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'
- в основном, правила набора в C # говорят, что я не могу сравнивать aPlatformID
иint
напрямую, и нет явного приведения изPlatformID
вint
. Но это явное приведение всех перечислений к их значениям, которые я воспользоваться отсюда ...System.Environment.OSVersion
вообще . Если вы собираетесь с этим поспорить, то вам также следует удалить все остальные ответы, не относящиеся к UWP. Также оказывается, что вы не можете (в настоящее время) запускать приложения UWP на платформах, отличных от Windows, поэтому вы также можете удалить их все. Что оставляет вас с 0 ответами и без ответа на вопрос.Action<bool>
в первом примере для 48 байтов (я не проверял это, но считаю, что это будет работать)._=>(int)System.Environment.OSVersion.Platform<4;
Возможно, потребуется()=>...
49 байтовFunc
s иAction
s, используется здесь все время. Я верю, что это на странице советов по гольфу, и я использую их почти все время. Также анонимные функции часто используются в других языках, поэтому я думаю, что их можно использовать здесьПакетный, 50 байтов
Изменить: Исправлено игнорировать DOS вместо того, чтобы утверждать, что это Windows.
Толькодругой способ я знаю, работает Batch вне Windows , заключается в использовании WINE , который по умолчанию будет отображатьZ:
в/
. Поэтому, еслиZ:\bin\sh
существует, скорее всего/bin/sh
, так, а не MS Windows.Я не знаю, для чего WINE устанавливает% OS%, но если это не так,
Windows_NT
я мог бы сэкономить 23 байта.источник
OS=Windows_NT
QBasic, 31 байт
Печатает ненулевой под Windows, 0 под всем остальным.
COMSPEC
переменная среды, уникальная для ОС Microsoft Указывает на интерпретатор команд, как правило,command.com
илиcmd.exe
. Под Windows интерпретатор команд находится где-то в каталоге Windows; под MS-DOS он находится в каталоге DOS или в корне диска, а под любой другой ОС его не существует.Проверяя,
COMSPEC
содержит ли значение «W», мы можем определить разницу между Windows и не-Windows.источник
COMSPEC
не зарезервирован для того, чтобы что-то значить под Linux (то есть по умолчанию он находится под контролем пользователя), поэтому не возможно, чтобы пользователь установил для него значение, которое он использует для своих собственных целей (и, как оказалось, содержитW
)? По общему признанию, это немного крайний случай.Node.js,
27161513 байтСпасибо @Patrick , который срезал 12 байт моего решения, используя REPL Node:
Оригинальное решение:
источник
Node.js REPL
, вы можете сохранить 16 байтов, просто используя_=>path.sep!='/'
node
в консоль. Оттуда все модули системного узла доступны без необходимости вrequire()
них.!=
на,>
поскольку индекс ASCII для\
92/
равен 47, а для него - 47.Excel VBA,
414030292624 байтФункция непосредственного windows, которая возвращает,
true
если длина системного кода ОС превышает длину 3, потому что информация ограничена для вывода либо в противном случае,mac
либоpcdos
возвращаетсяtrue
только для окон ПКПредыдущие версии
изменения
-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 методом условной компиляции.источник
left
экономит вам байт.?Application.PathSeparator)="\"
будет 32, так как это один символ)Perl 6 ,
1918 байтОба выхода
True
или вFalse
зависимости от системы, на которой он запущен.источник
APL (Дьялог) , 21 байт
Попробуйте онлайн!
#⎕WG'APLVersion'
Root ( # ) W indow G et property APL Version∊
подключить'W'∊
это W члена? (никакие не-Windows возвращаемые значения не содержат заглавных букв W)источник
tcl, 38 байт
источник
PHP 17 байт
Следующий выводит 1, если окна и ничего, если что-нибудь еще. Игнорирование уведомлений о преобразовании строк.
<?=PHP_OS==WINNT;
Попробуйте онлайн- тесты для Linux, потому что песочница - это Linux для PoC.
источник
>V
может сработать тоже.Java 8, 49 байт
Дольше, чем другой ответ Java , но использует другой подход.
Эта лямбда вписывается в
Supplier<Boolean>
и может быть проверена с помощью следующей программы:источник
.contains("W")
?Haskell,
3931 байтЯ проверяю вывод первой буквы «m», которая должна быть «mingw» для windows. Насколько я могу судить, нет другой ОС, которая начинается с M. Информация поступает с https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs.
источник
os
дает"mingw32"
.bash + coreutils, 5 байт
Также работает в большинстве других POSIXy оболочек. (Обратите внимание, что порты Windows существуют
bash
иrm
существуют; хотя они обычно используются только в более тяжелых операционных системах POSIXy, это не совсем пустая запись.) Выводится через код выхода (0 = false, 1 = true). Может быть посчитано как 4 байта, если вы можете использовать имя файла (напримерrm a
). Обратите внимание, что это может привести к сбою в случае очень странных имен файлов (которыеrm
будут интерпретироваться как аргументы из-за отсутствия цитирования и, возможно, удалять файлы, которые вам интересны, поэтому я бы рекомендовал не запускать эту программу из файла со странным именем ).Примечание: удаляет программу с диска как побочный эффект или, по крайней мере, пытается. В случае, когда мы работаем в Windows, ОС не сможет удалить запущенный файл (операция, которую Windows запрещает либо по умолчанию, либо с полной остановкой), и, таким образом,
rm
произойдет ошибка.bash
ловит ошибку и преобразует ее в код выхода (таким образом, программа в целом завершается нормально). Большинство других записей здесь используют 0 для фальси и 1 для истинного в кодах выхода, так что это делает то же самое; обратите внимание , чтоbash
«sif
заявление не принимает целые числа на всех (точнее, он принимает команды и филиалы , основанные на ли они работают, и арифметические тесты выполняются с помощью средств таких программ , какtest
которые намеренно сообщают об «сбое» при неудачном сравнении), так что это более шаткое основание с точки зрения легальности, чем программы, которые выводят через кодif
завершения на языках, где 0 допустим в тесте операторов и отправляет программу вelse
ветку.источник
8 , 11 байт
Печать
true
на Windows,false
на Linux и MacOS. Другими платформами, поддерживаемыми 8-й, являются Android, iOS и Raspberry Pi, но я не могу их протестировать.Беззвучная версия (с комментариями)
источник
Python 3 (13 байт)
Возвращает с нулевым кодом выхода (обычно это верно в оболочках), если в Windows, и с ненулевым кодом выхода в противном случае.
Если вы предпочитаете наоборот, есть решение 12 байт:
import posix
.источник
winreg.py
в том же каталоге.TrumpScript , 17 байт
Попробуйте онлайн!
Эта программа, если она запускается в Windows, напечатает:
Это считается истинной ценностью.
Пустой вывод и следующее значение ложно:
Пустой вывод будет происходить в любой системе Linux (для этой программы), длинный ответ Apple, очевидно, происходит на Mac (для любой программы). В TIO бэкэнд (я предполагаю) - это операционная система Unix, так что вы можете получить только ложное значение; на моем компьютере я получаю сообщение ПК.
Не уверен на 100%, если это считается сообщением об ошибке (что приведет к аннулированию ответа), но если вы не знали об этом, это, вероятно, стоило посмеяться над вами.
источник