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 código-golfe , então a pontuação mais baixa vence, mas também estou muito interessado em encontrar soluções criativas para esse problema.
code-golf
decision-problem
Daniel
fonte
fonte
Respostas:
Vim, 2 bytes
No Windows,
<C-a>
(ctrl + a) é mapeado por padrão paraSelect All
. Se você digitar a1
no 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 paraIncrement 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
fonte
Ctrl + a
,1
. Se fosseCtrl + a + 1
, seria contado como 1 pressionamento de tecla.MATLAB, 4 bytes
A partir da documentação :
Existem também as funções
ismac
eisunix
.Vou deixar para o leitor descobrir o que essas funções fazem.Mego gentilmente pediu diagramas explicandoismac
e,isunix
portanto, tentei ilustrá-lo aqui:Não foi solicitado um diagrama de,
ispc
mas posso revelar que o comportamento é bastante semelhante, exceto substitutoOSX
eUnix
comWindows
.Segunda abordagem:
Aqui está uma segunda abordagem com o
getenv
uso de 23 bytes que deve ser à prova de balas, a menos que haja outro sistema operacional começando comW
:fonte
Python 2.7.10 , 24 bytes
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, causandoZeroDivisionError
e saindo com um código de saída diferente de zero. Em plataformas não Windows,'['>os.sep
é verdade, criando a expressão0/1
, que não faz nada, e o programa sai com o código de saída 0.fonte
Montagem x86, 7 bytes(Inspirado na resposta de Runemoro )Ou
Descrição
Primeiro de tudo, vamos definir
eax
a1
(o número de chamada do sistema paraexit(int val)
paraLinux
,FreeBSD
eOSX
). Então, chamaremos o portão de interrupção,0x80
que é o portão de chamada do sistema paraLinux
,FreeBSD
eOSX
. Isso faria com que o programa para sair com o status deebx
que é0
(false
).No Windows,
int 0x80
existe um portão inválido (ele usa2e
como 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 funcionaria
OSX
pois possui uma convenção de passagem de argumentos diferente em 32 bits (pela pilha).Referências e leituras adicionais
FreeBSD - System Calls
: Informações sobre chamadas do sistemaFreeBSD
.System calls in the Linux kernel. Part 2.
: Um ótimo artigo sobre as chamadas de sistema do Linux.Linux Syscall Reference
: uma referência de números de telefone do sistema paraLinux
.Windows Syscall Shellcode
: Um artigo sobre como chamar diretamente o sistema chamawindows
da montagem.Making system calls from Assembly in Mac OS X
: Um artigo sobre o sistema é chamadoOSX
.fonte
xor eax, eax
aí?false
sai com o código 1 enquantotrue
sai com o código 0).eax
eebx
sã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.mov eax, 1
seria traduzido para\xB8\x01\x00\x00\x00
, o que é muito mais longo do que apenas mover o registro e a chamadainc
.C,
44433836 bytesObrigado a @Downgoat por um byte! riscado 44 ainda é regular 44
Obrigado a @ Neil por dois bytes!
fonte
0
fora doifdef
e alterando o1
para!
, mas acho que_WIN32+0
funciona ainda melhor ainda.return 1;
dentro do ifdef e remover o resto, desde principal sem retorno em c99 deve retornar 0.#if WIN32
. Em não-janelas, como WIN32 não está definido, o pré-processador deve tratá-lo como 0. #PHP, 22 bytes
imprime
1
se 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:
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>"/";
imprime1
ou 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 tenteivar_dump
egettype
), 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_OS
constante predefinida começa comwin
(sem distinção entre maiúsculas e minúsculas; Windows, WIN32, WINNT, mas não CYGWIN ou Darwin); imprime1
para Windows, senão nada.17/18 bytes :
imprime
1
se 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_SUFFIX
estádll
no Windows, mas não necessariamente lá.php_uname()
retorna informações sobre o sistema operacional e muito mais; começa comWindows
para Windows.$_SERVER['HTTP_USER_AGENT']
conteráWindows
quando chamado em um navegador no Windows.<?=defined(PHP_WINDOWS_VERSION_BUILD);
(38 bytes) funciona em PHP> = 5.3conclusã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; masPHP_OS
provavelmente sempre conterá as informações desejadas.fonte
<?=class_exists(COM);
. A turmaCOM
está disponível apenas no Windows, tanto quanto eu sei. Isso deve economizar um byte.Befunge-98, 7 bytes
Experimente online!
Isso funciona consultando o separador de caminho do sistema, que está
\
no Windows e/
em outros sistemas operacionais.fonte
Mathematica, 28 bytes
fonte
&
, ela não imprimirá nada (e também não será uma função que pode ser chamada) , mas apenas um snippet / expressão).Out[1]= False
saída deste:~/opt/Mathematica/11.0/Executables/math <<< '$OperatingSystem=="Windows"'
Java 8, 33 bytes
Agradecimentos especiais a Olivier Grégoire por sugerir
separatorChar
e 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 comf.get()
.Experimente online! - o servidor não é o Windows, então isso é impresso
false
. 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.fonte
()->java.io.File.separatorChar=='\\'
tem apenas 36 bytes.()->java.io.File.separatorChar>'['
!J, 7 bytes
Este é um verbo (semelhante a uma função) que usa a conjunção externa interna
9!:12
para adquirir o tipo de sistema em que 5 é Unix e 6 é Windows32.fonte
R, 15 bytes
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ãoR 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.
fonte
Perl, 11 bytes
^O
deve ser substituído por um literal Control-O.Saídas
1
no 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.
fonte
^O
.$^O=~W
, embora eu provavelmente comparasseMS
. Como alternativa, você também pode corresponder$^X=~':'
.W
, então eu assumi a verificação de umW
por multa .. alguma razão pela qual você sugereMS
?julia, 10 bytes
Uma função que retorna true para windows
fonte
código de máquina x86, 9 bytes
Compilado a partir de:
fonte
inc eax
eint 0x80
acho que deve falhar no Windows e finalizar o processo.JavaScript,
42.302625 bytesTestado com o Firefox. (O Chrome não possui a
oscpu
propriedade.) Como as letras minúsculas têm um código de caracteres mais alto que as letras maiúsculas, isso depende da primeira letranavigator.oscpu
estar 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
fonte
oscpu
é provavelmente anavigator
propriedade mais curta que você pode usar. Além disso, testar um regexp provavelmente funcionará mais curto, mas eu não o medi.!=-1
e adicionar um~
logo após a seta gorda, economizando 3 bytes.console.log
o teste regex? Também serianavigator.oscpu[0]=='W'
trabalhar ou existe outro sistema operacional que também começa com W.navigator.oscpu>'V'
pode funcionar tambémC #,
6148 bytesEconomizou 13 bytes graças ao TheLethalCoder
Ou um programa completo com 83 bytes:
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.
fonte
int
?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 umPlatformID
eint
diretamente, e não há nenhuma conversão implícita dePlatformID
queint
. Mas não é uma explícita elenco de todos os enums aos seus valores, que aproveito aqui ...System.Environment.OSVersion
nada . 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.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 emboraFunc
s eAction
s, é 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 aquiLote, 50 bytes
Editar: corrigido para ignorar o DOS em vez de afirmar que é o Windows.
A
únicaoutra maneira que eu conheço de correr Batch fora do Windows é usar vinho, que por padrão irá mapearZ:
a/
. Portanto, seZ:\bin\sh
existir, é 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.fonte
OS=Windows_NT
QBasic, 31 bytes
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, normalmentecommand.com
oucmd.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
COMSPEC
contém um "W", podemos dizer a diferença entre Windows e não-Windows.fonte
COMSPEC
nã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 valorW
)? É certo que isso é um caso de ponta.Node.js,
27161513 bytesGraças a @Patrick , que removeu 12 bytes da minha solução usando o REPL do Node:
Solução original:
fonte
Node.js REPL
, você pode salvar 16 bytes usando apenas_=>path.sep!='/'
node
no console. A partir daí, todos os módulos do nó do sistema estão disponíveis sem a necessidaderequire()
deles.!=
para>
uma vez que o índice de ASCII para\
é 92 e/
é 47.Excel VBA,
414030292624 bytesFunção imediata do Windows que retorna
true
se o código do sistema operacional iniciar mais do que o comprimento 3, porque as informações estão restritas à saídamac
oupcdos
retornamtrue
apenas nos computadores com WindowsVersões prévias
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
WorkbookPath
para"\"
vez de usarApplication.Path Separator
-4 Para mudar para
Environ()
-2 Para mudar para
[Len(Info(...
Solução nova, 51 bytes
Nova
sub
rotina que gera, para o VBE, janela imediata, a1 (truthy)
sob janelas e0 (falsey)
sob mac pelo método de compilação condicional.fonte
left
economiza um byte.?Application.PathSeparator)="\"
seria 32 como é um único caractere)Perl 6 ,
1918 bytesSaída
True
ouFalse
dependendo do sistema em que é executado.fonte
APL (Dyalog) , 21 bytes
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)fonte
tcl, 38 bytes
fonte
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.
fonte
>V
pode funcionar também.Java 8, 49 bytes
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:fonte
.contains("W")
?Haskell,
3931 bytesVerifico a saída da primeira letra de "m", que deve ser "mingw" para janelas. Até onde eu sei, não há outro sistema operacional que comece com M. As informações vêm de https://github.com/ghc/ghc/blob/master/compiler/utils/Platform.hs
fonte
os
dá"mingw32"
.bash + coreutils, 5 bytes
Também funciona na maioria dos outros shells POSIXy. (Observe que as portas Windows existem
bash
erm
existem; 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 exemplorm 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,
rm
ocorrerá um erro.bash
captura 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 quebash
aif
instruçã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 comotest
que 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 umif
teste de instrução e envia o programa para aelse
filial.fonte
8o , 11 bytes
Imprime
true
no Windows,false
no 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)
fonte
Python 3 (13 bytes)
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
.fonte
winreg.py
no mesmo diretório.TrumpScript , 17 bytes
Experimente online!
Este programa, se executado no Windows, imprimirá:
Este é considerado um valor verdadeiro.
Saída vazia e o seguinte valor é falso:
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.
fonte