Detectar o MS Windows


80

Desafio

Crie um programa que retorne um valor verdadeiro quando executado no Microsoft Windows (por uma questão de simplicidade, usaremos o Windows 7, 8.1 e 10) e um valor falsey quando executado em qualquer outro sistema operacional (OSX, FreeBSD, Linux).

Regras

  • Código que falha ao executar / compilar em uma plataforma não conta como um valor falsey.

Critérios de vitória

Estou rotulando isso como , então a pontuação mais baixa vence, mas também estou muito interessado em encontrar soluções criativas para esse problema.


7
Os programas podem produzir pelo código de saída? ( normalmente permitido )
FlipTack

13
Você pode fornecer uma lista definitiva de quais sistemas operacionais eles precisam trabalhar?
FlipTack

2
Qual deve ser o resultado no Windows RT?
Adám

6
Você pode especificar alguns sistemas não-Windows específicos que devem ser suportados. Há alguns debates nos comentários sobre coisas como DOS e OS2.
Jpmc26 9/01

2
Provavelmente precisamos de um consenso sobre o que conta como verdade e falsey para códigos de saída; a convenção normal é 0 para true e qualquer outra coisa para false, mas muitas respostas estão tratando isso como o oposto, e a definição "if statement" obviamente não se aplica.

Respostas:


77

Vim, 2 bytes

<C-a>1

No Windows, <C-a>(ctrl + a) é mapeado por padrão para Select All. Se você digitar a 1no modo de seleção no Windows, ele substituirá a seleção pelo que você digitou (1), deixando 1 no buffer.

Em outros sistemas operacionais, <C-a>por padrão, é mapeado para Increment number. Como não há número para incrementar, é um no-op e o 1 aumenta a contagem, mas em termos de buffer é um no-op.

1 é verdade no Vim, e uma string vazia é falsa


Parece 3 pressionamentos de teclas. Ctrl + a + 1
Pavel

12
Acho que, nesta meta post, meta.codegolf.stackexchange.com/questions/8995/… As respostas do Vim geralmente são pontuadas sem os modificadores (especialmente porque a primeira resposta da postagem usa <ctrl + a> como exemplo para 1 byte)
nmjcman101

4
@Pavel é Ctrl + a, 1. Se fosse Ctrl + a + 1, seria contado como 1 pressionamento de tecla.
Capitão Man

7
Linda, adoro esta resposta!
DJMcMayhem

Isso é bastante elegante, eu gosto.
Dan

109

MATLAB, 4 bytes

ispc

A partir da documentação :

tf = ispcretorna 1 lógico (verdadeiro) se a versão do software MATLAB® for para a plataforma Microsoft® Windows®. Caso contrário, ele retornará 0 lógico (falso).

Existem também as funções ismace isunix. Vou deixar para o leitor descobrir o que essas funções fazem. Mego gentilmente pediu diagramas explicando ismace, isunixportanto, tentei ilustrá-lo aqui:

insira a descrição da imagem aqui

Não foi solicitado um diagrama de, ispcmas posso revelar que o comportamento é bastante semelhante, exceto substituto OSXe Unixcom Windows.


Segunda abordagem:

Aqui está uma segunda abordagem com o getenvuso de 23 bytes que deve ser à prova de balas, a menos que haja outro sistema operacional começando com W:

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

getenv 'name'procura na lista de ambiente do sistema operacional subjacente o texto do formulário name=value, onde nameestá o vetor de caracteres de entrada. Se encontrado, o MATLAB® retorna o valor do vetor de caracteres. Se o nome especificado não puder ser encontrado, uma matriz vazia será retornada.


4
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Dennis

55

Python 2.7.10 , 24 bytes

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

Graças ao FlipTack por 3 bytes

Este programa tira proveito do fato de o Windows ser o único sistema operacional a ser usado \como um separador de caminhos. Normalmente isso é frustrante e ruim, mas pela primeira vez é realmente uma vantagem. No Windows, '['>os.sepé falso e, portanto, 0/0é calculado, causando ZeroDivisionErrore saindo com um código de saída diferente de zero. Em plataformas não Windows, '['>os.sepé verdade, criando a expressão 0/1, que não faz nada, e o programa sai com o código de saída 0.


O DOS também usa uma barra invertida como separador de caminho e possui pelo menos uma implementação em Python 2.
isanae

5
@isanae Eu editei o título para especificar Python 2.7 - o único Python 2 implementação em DOS é um arcaico, de buggy 2.4.2
Mego

OS / 2 também usa uma barra invertida e tem um 2.7 implementação Python;)
isanae

9
@isanae Lá, especifiquei 2.7.10. Boa sorte para encontrar um porto disso.
Mego

2
aparentemente, ele só precisa fornecer resultados corretos em três versões recentes do Windows e provavelmente nos versos similarmente recentes dos três outros sistemas listados, OS2 e DOS não importam.
Jasen

45

Montagem x86, 7 bytes (Inspirado na resposta de Runemoro )

31 DB 89 D8 40 CD 80

Ou

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

Descrição

Primeiro de tudo, vamos definir eaxa 1(o número de chamada do sistema para exit(int val)para Linux, FreeBSDe OSX). Então, chamaremos o portão de interrupção, 0x80que é o portão de chamada do sistema para Linux, FreeBSDe OSX. Isso faria com que o programa para sair com o status de ebxque é 0(false ).

No Windows, int 0x80existe um portão inválido (ele usa 2ecomo um portão syscall) e travaria o programa, fazendo com que ele terminasse com um código de saída positivo ( true).

Editar: não funcionariaOSX pois possui uma convenção de passagem de argumentos diferente em 32 bits (pela pilha).

Referências e leituras adicionais


3
Isso é brilhante!
z0rberg's

Por que os casos de travamento têm um valor verdadeiro? É porque EAX (normalmente o valor de retorno) é 1? Além disso, o EAX tem garantia de 0 no início do programa? Ou você precisa xor eax, eaxaí?
Cole Johnson

3
@ColeJohnson: falhas detectadas pelo SO (nos sistemas operacionais normalmente usados ​​com x86) nunca deixam um código de saída 0, porque está reservado para uma finalização bem-sucedida. (Normalmente, o código de saída é um valor instável que o sistema operacional reserva especificamente para essa circunstância.) No entanto, não tenho certeza se faz sentido contar 0 como falsey e 1 como verdade nos códigos de saída do programa, uma vez que a convenção normal é a exatamente o oposto (com 0 sendo o único valor verdadeiro, por exemplo, o programa UNIX / Linux / POSIX padrão falsesai com o código 1 enquanto truesai com o código 0).

1
Esta resposta supõe implicitamente que os registros eaxe ebxsão zerados no início do programa (não Windows), o que não é garantido se bem me lembro. Também pressupõe explicitamente que a convenção de passagem de argumento syscall para Linux corresponde à do FreeBSD e OSX, o que seria realmente surpreendente.
Zwol

1
@ Sebastian-LaurenţiuPlesciuc Boa pergunta. mov eax, 1seria traduzido para \xB8\x01\x00\x00\x00, o que é muito mais longo do que apenas mover o registro e a chamada inc.
Shmuel H.

29

C, 44 43 38 36 bytes

Obrigado a @Downgoat por um byte! riscado 44 ainda é regular 44
Obrigado a @ Neil por dois bytes!

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

Originalmente, eu sugeria que você pode salvar um monte de bytes movendo o 0fora do ifdefe alterando o 1para !, mas acho que _WIN32+0funciona ainda melhor ainda.
Neil

Se c99 é OK você pode mudar f a principal e ficar return 1;dentro do ifdef e remover o resto, desde principal sem retorno em c99 deve retornar 0.
simon

11
Essa é uma diretiva de compilador. Se ele é compilado em um sistema Windows e executado em um sistema Linux, por exemplo, será ainda retornar 1.
Micheal Johnson

4
@MichealJohnson no. Eu posso compilá-lo no linux (usando mingw32gcc msvc) e obter código que retorna true quando executado no Windows. Não conheço nenhum compilador linux hospedado no Windows. se você quiser argumentar que camadas de emulação como "vinho" todas as outras respostas provavelmente sofrem o mesmo problema
Jasen

1
Não tenho certeza se WIN32 está apenas definido, mas está definido como diferente de zero. Se for o caso posterior, você pode apenas dizer #if WIN32. Em não-janelas, como WIN32 não está definido, o pré-processador deve tratá-lo como 0. #
Shahbaz

27

PHP, 22 bytes

`<?=PATH_SEPARATOR>":";`  

imprime 1se o separador de caminho é ponto-e-vírgula (dois pontos ou vazio para todos os outros sistemas operacionais, exceto para DOS e OS / 2), senão nada.

também 22 bytes , mas não tão seguro:

<?=strpos(__FILE__,92);

imprime um número inteiro positivo se o caminho do arquivo contiver uma barra invertida; mais nada.
Uma alternativa segura com 27 bytes : <?=DIRECTORY_SEPARATOR>"/";imprime 1ou nada.

Uma descoberta estranha : <?=__FILE__[1]==":";( 20 bytes ) também deve ser, não segura, mas ok. Mas, embora __FILE__finge ser um string (eu tentei var_dumpe gettype), indexando ele lança um erro, a menos que você copiá-lo em outro lugar (concatenação também funciona) ou usá-lo como um parâmetro de função.

Edit:
<?=(__FILE__)[1]==":";(também 22 bytes ) funciona no PHP 7; mas isso ocorre porque os parênteses copiam o valor da constante para uma variável temporária.

27 bytes : <?=stripos(PHP_OS,win)===0;
testa se a PHP_OSconstante predefinida começa com win(sem distinção entre maiúsculas e minúsculas; Windows, WIN32, WINNT, mas não CYGWIN ou Darwin); imprime 1para Windows, senão nada.

17/18 bytes :

<?=strlen("
")-1;

imprime 1se foi armazenado com quebra de linha do Windows (também no DOS, OS / 2 e Atari TOS - embora eu duvide que alguém tenha compilado o PHP para o TOS) 0.

Você também pode verificar a constante PHP_EOL.

mais opções:

PHP_SHLIB_SUFFIXestá dllno Windows, mas não necessariamente lá.
php_uname()retorna informações sobre o sistema operacional e muito mais; começa com Windowspara Windows.
$_SERVER['HTTP_USER_AGENT']conterá Windowsquando chamado em um navegador no Windows.
<?=defined(PHP_WINDOWS_VERSION_BUILD);(38 bytes) funciona em PHP> = 5.3

conclusão

A única maneira segura de dizer se é realmente o Windows, não algo parecido, parece ser uma verificação do nome do sistema operacional. Para PHP: php_os()pode ser desativado por motivos de segurança; mas PHP_OSprovavelmente sempre conterá as informações desejadas.


4
Os nomes de arquivo no * nix podem conter barras invertidas, portanto, isso não é à prova de falhas. As regras não dizem que tem que ser infalível, porém, assim ¯ \ _ (ツ) _ / ¯
Jordan

@ Jordan: Você está certo. Eu adicionei essa informação à descrição. Obrigado.
Titus

4
Uma alternativa: <?=class_exists(COM);. A turma COMestá disponível apenas no Windows, tanto quanto eu sei. Isso deve economizar um byte.
Ismael Miguel

@IsmaelMiguel Essa resposta é suficiente para você postar como tal. (No entanto, pode não valer a pena fazê-lo; esta resposta é muito bem escrito.)
wizzwizz4

1
@ wizzwizz4 Não vale a pena. A resposta seria levada ao esquecimento. Por isso, simplesmente deixei o comentário, em vez de escrever minha própria resposta.
Ismael Miguel

16

Befunge-98, 7 bytes

6y2%!.@

Experimente online!

Isso funciona consultando o separador de caminho do sistema, que está \no Windows e /em outros sistemas operacionais.

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 bytes

$OperatingSystem=="Windows"&

Qual o sentido de torná-lo uma função? Você pode remover oe comercial e salvar um byte, e o código avaliaria diretamente se ele é executado em um sistema Windows.
Ruslan

@Ruslan Todas as respostas devem ser programas completos que imprimem o resultado ou funções que podem ser chamadas. Se isso for declarado uma resposta do notebook do Mathematica, você poderá chamá-lo de programa completo, mas se eu chamar a linha de comando sem a linha &, ela não imprimirá nada (e também não será uma função que pode ser chamada) , mas apenas um snippet / expressão).
Martin Ender

@MartinEnder Realmente nenhuma saída? Recebo Out[1]= Falsesaída deste:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Ruslan

@Ruslan Eu acredito que também inicia um ambiente de notebook (apenas um baseado em linha de comando). O que quero dizer com executar um programa na linha de comando é usar o modo de script.
Martin Ender

13

Java 8, 33 bytes

Agradecimentos especiais a Olivier Grégoire por sugerir separatorChare a Kritixi Lithos por -1 byte!

Esta é uma expressão lambda que retorna um booleano. Isso pode ser atribuído Supplier<Boolean> f = ...;e chamado com f.get().

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

Experimente online! - o servidor não é o Windows, então isso é impressofalse. No entanto, na minha máquina Windows, o mesmo código é impressotrue.

O que esse código faz é obter o separador de arquivos do sistema e verificar se o ponto de código é maior que o caractere [. Isso vale para o Windows, pois é usado \como separador - mas todos os outros sistemas operacionais usam /, que possui um código mais baixo na tabela ASCII.


Isso não será interrompido em outros sistemas operacionais que começam com W?
Downgoat

()->java.io.File.separatorChar=='\\'tem apenas 36 bytes.
Olivier Grégoire

1
@ OlivierGrégoire nice - e eu posso jogar até 34 usando ()->java.io.File.separatorChar>'['!
FlipTack

2
@Titus WebOS, Whonix. Provavelmente ainda mais.
Olivier Grégoire

3
@Titus Espere, o que acontece com WAITS ?
NoOneIsHere

11

J, 7 bytes

6=9!:12

Este é um verbo (semelhante a uma função) que usa a conjunção externa interna 9!:12para adquirir o tipo de sistema em que 5 é Unix e 6 é Windows32.


J A documentação oficial mostra que ele retorna esse valor para o Windows antigo. "6 Windows32 (95/98/2000 / NT)" A documentação precisa ser atualizada? O que acontece quando o Windows é de 64 bits? jsoftware.com/help/dictionary/dx009.htm
Keeta

Testado no Windows 7 de 64 bits e retorna um 6. A documentação parece ser bastante antiga.
Keeta

@ Keeta Sim, eu acho que é velho, mas ele ainda retornou um 6 para mim no Windows 10 de 64 bits.
miles

11

R, 15 bytes

.Platform$O>"v"

Graças a plannapus pela sugestão de usar correspondência parcial para extração de elementos da lista.

.Platform é uma lista com alguns detalhes da plataforma sob a qual R foi construído. Há um elemento OS.type(o único elemento com o nome começando com "O") que é a cadeia de caracteres, fornecendo o sistema operacional (família) do computador. Um de"unix" ou "windows".

Então "unix"é menos então "v", mas "windows"é maior então "v". Outras respostas válidas de 15 bytes são

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

R está sendo desenvolvido para as famílias de sistemas operacionais do tipo Unix, Windows e Mac . Outras famílias de SO não são suportadas.


1
há outras que unix plataformas que não são janelas que você conhece ...
Azul

2
@muddyfish: .Platform [[1]] é definido como "unix" ou "windows" na documentação do R. github.com/wch/r-source/blob/…
liori

Desculpe, tudo bem então. A resposta provavelmente deve ser modificado para incluir este fato para parar o que está sendo perguntado novamente
Azul

10

Perl, 11 bytes

print$^O=~MS

^O deve ser substituído por um literal Control-O.

Saídas 1no Windows, nada em outro sistema operacional.

Note que eu não estou usando say , pois adiciona uma nova linha à direita, que é verdadeira no Perl.

-2 bytes graças ao primo. (e possíveis problemas corrigidos)
-1 bytes graças ao ais523.


AFAIR, isso não funcionará no Cygwin Perl.
Igor Skochinsky

Isso também não funcionará no Mingw Perl. Porém, o Perl trata esses dois como sistemas operacionais distintos do Windows (como eles geralmente obedecem às convenções do UNIX e não do Windows), e não está claro se eles devem contar para o objetivo da pergunta. Em outras notícias, você pode salvar um byte aqui usando um caractere literal control-O em vez de^O .

@ ais523 Eu editei isso, obrigado. Quanto a Cygwin e Mingw, excluirei a postagem se eles forem considerados Windows, mas como você diz, faria mais sentido considerá-los como sistemas operacionais separados (ou pelo menos como sistemas operacionais não Windows).
Dada

Delimitadores de regex não devem ser necessários $^O=~W, embora eu provavelmente comparasse MS. Como alternativa, você também pode corresponder $^X=~':'.
Primo

@primo certo, obrigado. Eu não conheço nenhum outro sistema operacional com um W, então eu assumi a verificação de um Wpor multa .. alguma razão pela qual você sugere MS?
Dada

9

julia, 10 bytes

is_windows

Uma função que retorna true para windows


9

código de máquina x86, 9 bytes

40 39 04 24 75 02 CD 80 C3

Compilado a partir de:

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
binário puro (COM) não será executado no Windows ou Linux por isso não sei se isso é válido
Igor Skochinsky

@IgorSkochinsky Deve haver um intérprete para montagem.
Shmuel H.

Você pode tornar o código ainda mais curto deixando apenas inc eaxe int 0x80acho que deve falhar no Windows e finalizar o processo.
Shmuel H.

2
@IgorSkochinsky Existem programas que executam binário bruto também. Veja o link no meu comentário anterior.
Shmuel H.

1
Bochs e QEMU simulam o ambiente bare metal e não executam o código binário no SO host. Então eles não vão funcionar IMO. Mas tudo isso pode ser uma discussão para a meta.
Igor Skochinsky

8

JavaScript, 42. 30 26 25 bytes

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

Testado com o Firefox. (O Chrome não possui a oscpupropriedade.) Como as letras minúsculas têm um código de caracteres mais alto que as letras maiúsculas, isso depende da primeira letra navigator.oscpuestar em maiúscula e não ser W , X , Y ou Z em qualquer plataforma compatível com o Firefox (exceto Windows, é claro). De acordo com este post , esse é o caso.

Editar% s

  1. Economizou 12 bytes graças a Neil .
  2. Salvo outros quatro bytes
  3. Salvo outro byte, graças ao Blender .

oscpué provavelmente a navigatorpropriedade mais curta que você pode usar. Além disso, testar um regexp provavelmente funcionará mais curto, mas eu não o medi.
Neil

Você pode remover !=-1e adicionar um ~logo após a seta gorda, economizando 3 bytes.
Lucas

Você precisa criar uma função? Você não pode apenas console.logo teste regex? Também seria navigator.oscpu[0]=='W'trabalhar ou existe outro sistema operacional que também começa com W.

2
Hmm, por algum motivo, meu Chrome não tem oscpu.
Muzer

2
navigator.oscpu>'V'pode funcionar também
Blender

8

C #, 61 48 bytes

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

Economizou 13 bytes graças ao TheLethalCoder

Ou um programa completo com 83 bytes:

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

Várias variantes do Windows usam valores de enumeração 0 a 3 na implementação do Microsoft .NET . 4 é Unix, 5 é Xbox [360] (que não considerarei "Windows"), 6 é MacOSX. Mono usa os mesmos valores , adicionando 128 para Unix / Linux em versões anteriores.

Portanto, qualquer coisa <4 é Windows e todo o resto não é Windows.


2
Não tenho certeza se estou faltando alguma coisa, mas por que você está lançando o valor para um int?
auhmaan

@auhmaan CS0019 Operator '<' cannot be applied to operands of type 'PlatformID' and 'int'- basicamente, as regras de digitação C # 's diz que não se pode comparar um PlatformIDe intdiretamente, e não há nenhuma conversão implícita de PlatformIDque int. Mas não é uma explícita elenco de todos os enums aos seus valores, que aproveito aqui ...
Bob

1
@ MustafaAKTAŞ Além disso, devo salientar que isso está direcionado para o C # / .NET Framework / .NET Core. No Xbox One, só é possível executar aplicativos UWP, que usam uma API diferente que não inclui System.Environment.OSVersionnada . Se você tiver problemas com isso, exclua todas as outras respostas que não sejam da UWP. Também acontece que você não pode (atualmente) executar aplicativos UWP em plataformas que não sejam Windows, para que você possa excluir todos eles também. O que deixa você com 0 respostas e uma pergunta sem resposta.
Bob

1
Você pode compilar a um Action<bool>no primeiro exemplo para 48 bytes (eu não testei isso, mas acredito que vai funcionar) _=>(int)System.Environment.OSVersion.Platform<4;Pode precisa ser ()=>...para 49 bytes embora
TheLethalCoder

1
Compilar com funções anônimas, como Funcs e Actions, é usado o tempo todo aqui. Acredito que esteja na página de dicas de golfe e uso-as quase o tempo todo. Também funções anônimas são usadas em outros idiomas muito, então eu acho que é seguro usá-los aqui
TheLethalCoder

7

Lote, 50 bytes

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

Editar: corrigido para ignorar o DOS em vez de afirmar que é o Windows.

A única outra maneira que eu conheço de correr Batch fora do Windows é usar vinho, que por padrão irá mapear Z:a /. Portanto, se Z:\bin\shexistir, é provável que sim /bin/sh, e não o MS Windows.

Não sei o que o WINE define% OS%, mas se não for Windows_NT, eu poderia salvar 23 bytes.


1
Outra maneira é o DOS, que não é o Windows.
Ruslan

Isso não apenas falha no DOS, mas também em um computador em que o Z: é mapeado e contém esse caminho.
Adám

1
Pelo menos estou tentando detectar o vinho. Nenhuma das outras respostas fornecerá o resultado correto quando executada no WINE.
Neil

3
@ Adám Claro, e se você compilar a resposta C com -DWIN32 = 1, ela também falhará. Seu ponto?
Neil

1
Sim, conjuntos de vinhoOS=Windows_NT
Jasen

7

QBasic, 31 bytes

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

Imprime diferente de zero no Windows, 0 em todo o resto.

COMSPECé uma variável de ambiente exclusiva para os SOs da Microsoft. Aponta para o intérprete de comando, normalmente command.comou cmd.exe. No Windows, o interpretador de comandos fica em algum lugar do diretório do Windows; no MS-DOS, ele fica no diretório DOS ou na raiz do disco e, em qualquer outro sistema operacional, ele não existe.

Ao verificar se o valor de COMSPECcontém um "W", podemos dizer a diferença entre Windows e não-Windows.


COMSPECnão está reservado para significar algo em particular no Linux (ou seja, está sob controle do usuário por padrão); portanto, não é possível que o usuário o defina com um valor que está usando para seus próprios fins (e contém um valor W)? É certo que isso é um caso de ponta.

1
@ ais523: Além disso, o diretório do Windows não precisa conter um W. É frágil em ambos os casos.
Joey

7

Node.js, 27 16 15 13 bytes

Graças a @Patrick , que removeu 12 bytes da minha solução usando o REPL do Node:

_=>os.EOL>`
`

Solução original:

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

Se você mudar isso para Node.js REPL, você pode salvar 16 bytes usando apenas_=>path.sep!='/'
Patrick Roberts

Eu sou novo no codegolf. Posso fazer isso?
GilZ

Sim, caso contrário, eu não teria sugerido. REPL significa ler, executar, imprimir loop, o programa que é executado quando você entra nodeno console. A partir daí, todos os módulos do nó do sistema estão disponíveis sem a necessidade require()deles.
Patrick Roberts

Oh sim, desculpe. Eu quis dizer 11. Você pode salvar outro byte mudando !=para >uma vez que o índice de ASCII para \ é 92 e /é 47.
Patrick Roberts

7

Excel VBA, 41 40 30 29 26 24 bytes

Função imediata do Windows que retorna truese o código do sistema operacional iniciar mais do que o comprimento 3, porque as informações estão restritas à saída macou pcdosretornam trueapenas nos computadores com Windows

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

Versões prévias

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

Alterar

-1 Agradecimentos a Neil por usar Left(...,1)maisMid(...,1,1)

-10 Obrigado a ChrisH por apontar o truque do separador de caminhos do Mego

-1 para verificar o WorkbookPathpara"\" vez de usarApplication.Path Separator

-4 Para mudar para Environ()

-2 Para mudar para [Len(Info(...

Solução nova, 51 bytes

Nova subrotina que gera, para o VBE, janela imediata, a 1 (truthy)sob janelas e 0 (falsey)sob mac pelo método de compilação condicional.

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

1
lefteconomiza um byte.
Neil

Você já experimentou no office365 online? Isso ainda suporta VBA? Apenas curioso.
Chris H

@ChrisH Para meu conhecimento, o office.com não suporta scripts VBA on-line (embora, se alguém souber melhor, diga-me, isso tornaria minha vida significativamente mais fácil); No entanto, com o O365, você tem o direito de baixar uma cópia do Office 2016 (ou o que estiver atual) na área de trabalho, e isso oferece suporte a scripts VBA.
Taylor Scott

Até agora, consegui evitá-lo; dado o seu comentário que parece destinada a continuar (as únicas máquinas Windows que eu uso tem uma cópia de mesa de escritório, máquinas pessoais são todos linux)
Chris H

1
@ Truque separador de caminhos do Mego ( ?Application.PathSeparator)="\"seria 32 como é um único caractere)
Chris H

6

Perl 6 ,  19  18 bytes

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

Saída True␤ou False␤dependendo do sistema em que é executado.


o segundo baseia-se nos valores não-janelas do CWD que não contêm nenhum `` - não há garantia disso, #
187 Jasen

5

APL (Dyalog) , 21 bytes

'W'∊∊#⎕WG'APLVersion'

Experimente online!

#⎕WG'APLVersion' Raiz ( # ) W indow G et propriedade APL Versão

 alistar-se (achatar)

'W'∊W  é um membro? (nenhum valor de retorno que não seja do Windows contém um W maiúsculo)


4

tcl, 38 bytes

 expr [lsearch $tcl_platform windows]>0

4

PHP 17 bytes

A seguir, será exibido 1 se janelas e nada se houver outra coisa. Ignorando avisos de conversão de string.

<?=PHP_OS==WINNT;

Experimente testes on- line on- line para linux porque o sandbox é linux para PoC.


Com certeza é o suficiente? Perguntando porque possíveis valores para: PHP_OS .
Manatwork

1
'<? = PHP_OS [0] == W; `é 1 byte mais curto e captura todos os outros valores de janelas na questão vinculada pelo manatwork. >Vpode funcionar também.
user59178

o manatwork depende da versão do Windows em que o PHP foi compilado, desde o Windows Visa \ 7, a versão do Windows foi representada pelo WINNT por causa do NT Authority Kernel. antes do Windows XP e abaixo era WIN32 e Windows Server 2003 era Windows.
DrWhat

4

Java 8, 49 bytes

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

Mais longo que a outra resposta Java , mas adota uma abordagem diferente.

Este lambda se encaixa em um Supplier<Boolean>e pode ser testado com o seguinte programa:

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

}

É muito, muito parecido com a resposta inicial que você vincula (antes das edições).
Olivier Grégoire

Por que não apenas .contains("W")?
precisa saber é o seguinte

@ Na verdade, a variável SO parece ser específica do Windows.


4

bash + coreutils, 5 bytes

rm $0

Também funciona na maioria dos outros shells POSIXy. (Observe que as portas Windows existem bashe rmexistem; mesmo sendo normalmente usadas apenas com sistemas operacionais POSIXy mais pesados, essa não é uma entrada totalmente vazia). Saídas via código de saída (0 = false, 1 = true). Pode ser contado como 4 bytes se você puder assumir um nome de arquivo (por exemplo rm a). Observe que isso pode falhar potencialmente no caso de nomes de arquivos muito estranhos (querm serão interpretados como argumentos devido à falta de citação e possivelmente excluirão os arquivos de seu interesse, por isso aconselho a não executar este programa a partir de um arquivo com um nome estranho )

Nota: exclui o programa do disco como efeito colateral, ou pelo menos tenta. No caso em que estamos executando no Windows, o sistema operacional falhará ao excluir o arquivo em execução (uma operação que o Windows não permite por padrão ou por ponto final) e, portanto, rmocorrerá um erro. bashcaptura o erro e o converte em um código de saída (assim, o programa como um todo termina normalmente). A maioria das outras entradas aqui estão usando 0 para falsey e 1 para verdade nos códigos de saída, portanto, isso faz o mesmo; observe que basha ifinstrução não aceita números inteiros (em vez disso, aceita comandos e ramificações com base em sua execução com êxito, e testes aritméticos são feitos por meio de programas comotestque relatam intencionalmente um "travamento" em uma comparação com falha), portanto, isso é mais embaraçoso em termos de legalidade do que os programas que saem via código de saída nos idiomas em que 0 é válido em umifteste de instrução e envia o programa para a elsefilial.


4

8o , 11 bytes

 
os 1- not .
 

Imprime trueno Windows, falseno Linux e no macOS. Outras plataformas suportadas pelo 8th são Android, iOS e Raspberry Pi, mas não consigo testá-las.

Versão ungolfed (com comentários)

 
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 bytes)

import winreg

Retorna com o código de saída zero (geralmente verdadeiro em shells) se estiver no Windows e com um código de saída diferente de zero.

Se preferir o contrário, há uma solução de 12 bytes: import posix.


Eu acho que isso não vai funcionar se houver um arquivo chamado winreg.pyno mesmo diretório.
Zacharý

1
Além disso, de acordo com as regras: "O código que falha ao executar / compilar em uma plataforma não conta como um valor falsey".
Zachary

4

TrumpScript , 17 bytes

America is great.

Experimente online!


Este programa, se executado no Windows, imprimirá:

The big problem this country has is being PC

Este é considerado um valor verdadeiro.


Saída vazia e o seguinte valor é falso:

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

A saída vazia ocorrerá em qualquer sistema Linux (para este programa), a longa resposta da Apple obviamente ocorre no Mac (para qualquer programa). No TIO, o back-end (suponho) é um sistema operacional Unix, então você só pode obter o valor falso; no meu computador, recebo a mensagem do PC.


Não tenho 100% de certeza se isso conta como uma mensagem de erro (o que invalidaria a resposta), mas se você não soubesse disso, provavelmente valeria a pena rir.


O que o mundo vêm para ...
ooransoy

@avaragecoder FAÇA PYTHON GRANDE NOVAMENTE!
Urna de polvo mágico
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.