Não é mais tão importante, mas, ocasionalmente, alguém precisa saber.
Aqui está um exemplo simples: não tendo nenhuma entrada do usuário, diga-me se o computador no qual o código é executado está em um sistema operacional de 64 bits ou em um sistema operacional de 32 bits!
Se o código for executado em um sistema operacional de 32 bits, imprima "32"; se o código for executado em um sistema operacional de 64 bits, produza "64". Importante: imprima qualquer outra sequência não vazia de caracteres alfanuméricos se não tiver 32 ou 64 bits.
Observe que um programa de 32 bits em execução em um computador com sistema operacional de 64 bits deve gerar "64". Você pode assumir que os usuários usarão software de 64 bits sempre que possível.
Para se qualificar para a entrada, seu código deve ser capaz de executar nos sistemas Windows 4.10 ou mais recentes suportados pela Microsoft e pelo menos um tipo de Linux de sua escolha (desde que esse tipo seja gratuito). Mods de compatibilidade podem ser instalados, desde que o programa ainda retorne o valor correto.
Aplicam-se as regras usuais de código-golfe .
Nota: Se a sua resposta tiver apenas a intenção de imprimir 32 ou 64, mas não o caso alt, aceitarei, mas não é uma resposta concorrente.
Vou tentar publicar alguns resultados da execução desses códigos em diferentes sistemas operacionais mais tarde!
fonte
Respostas:
Montagem x86 (poliglota), 13 bytes
Bytecode:
Define uma função que retorna 32 se interpretada como 32 bits, 64 se 64 bits e 32767 se 16 bits.
Eu queria criar um poliglota que rodasse no Windows e Linux, mas isso é muito mais difícil do que eu pensava. Como é, não tenho certeza de que exista alguma maneira de imprimir um valor no Windows que não seja de 16 bits sem vincular.
Explicação
Este código usa duas instruções para determinar a arquitetura em que está sendo executado. A primeira é a instrução 0x48 - em 16 e 32 bits
dec %eax
, mas em 64 bits, é um prefixo do tamanho da instrução. A segunda indicação é a mesma instrução, no entanto, quando a executamos no valor 0x8000, o bit mais significativo é invertido apenas se o tamanho do registro for 16 bits, configurando o sinalizador de estouro e nos permitindo usarjo
.Em 16 bits, esse código é interpretado da seguinte maneira:
Em 32 bits, esse código é interpretado da seguinte maneira:
Em 64 bits, esse código é interpretado da seguinte maneira:
fonte
48
representadec %eax
no modo de 16 bits?código de máquina x86, 12 bytes
Ungolfed:
Esta função funciona no Linux quando usado no ELF32, seguindo o i386 SysV ABI, bem como no Windows / Wine quando usado no PE32, seguindo a
stdcall
convenção de chamada.fonte
eax
paraax
. Então, se o selector nacs
passa a ser0x23
, o resultado será 64, caso contrário, 32.Mathematica, 17 bytes
fonte
&
ou especificar que isso está no REPL?Carregadores de inicialização
Você sabia que o GRUB e o IPXE possuem linguagens de programação completas de Turing acessíveis em tempo de execução? A família Syslinux de gerenciadores de inicialização não, mas eles podem fazer isso.
IPXE, 36 bytes
a primeira linha é necessária se o script for executado remotamente, mas não se digitado diretamente na linha de comando.
GRUB, 42 bytes
Syslinux, 186 bytes
São necessários três arquivos, o primeiro é o syslinux.cfg (ou isolinux.cfg, etc.).
e t.cfg
ans s.cfg
Para este, a parte mais difícil é que o syslinux não possui recursos simples de exibição de texto; portanto, o menu é abusado.
fonte
## iPXE, 36 bytes
em vez de### ipxe 36
Julia
1413 bytesExplicar:
nothing
) retornando um número inteiro 32 ou 64Int
que, dependendo de 32 ou 64 bits, é umInt32
ou umInt64
(1
pode ser qualquer dígito)Sys.WORD_SIZE
usada na resposta de rahnema1Outra resposta divertida é
()->"$(Int)"[4:5]
, mas não consigo contar a contagem.-1 graças a @Roman Gräf
fonte
julia,
201716 bytes* Graças a @LyndonWhite salvou 3 bytes * Graças a @ RomanGräf salvou um byte
Respostas anteriores:
Experimente online!
fonte
()->Sys.WORD_SIZE
JavaScript (Node.js), 24 bytes
Esta é uma função e retorna
'32'
,'64'
ou, se nenhuma'rm'
.fonte
os
em vez deprocess
:os.arch().slice(1)
C,
33312923 bytesObrigado aos comentadores @ceilingcat e @Dennis pelas dicas de golfe!
fonte
PowerShell, 16 bytes
Obtém o tamanho do ponteiro em bytes, multiplica por 8 para obter bits.
fonte
your code must be able to run on Windows 4.10 or newer
Python 2,
52, 48, 4241 bytesGraças a totalmente humano!
fonte
from struct import*;print calcsize("P")*8
é mais curto.Java 8, 45 bytes
fonte
n=>System.getProperty("os.arch")
Perl 6 , 17 bytes
Tente
Existe um relacionado
$?BITS
que contém o número de bits que um nativoint
possui no tempo de execução.Tente
fonte
Windows CMD,
5652 bytes (obrigado Bob!)Ainda surpreendentemente demorado - o mais longo até agora!
fonte
%windir%\SysWOW64
é ainda mais curto, eu acho ...if EXIST "c:\Progra~3" (echo 64)else echo 32
Por padrão, você temProgramData
eProgram Files
por isso, se um terceiro existe, devemos ser 64C, API Win32,
103183 bytesNa verdade, existem mais de 2 casos aqui. Vamos examiná-los
IsWow64Process
não existe: estamos em um sistema operacional de 32 bitsPara os próximos dois casos, precisamos ter o conhecimento de que nosso binário será um executável de 32 bits. E essa descrição do que será exibido no parâmetro out de
IsWow64Process
Isso nos deixa com dois casos adicionais:
IsWow64Process
existe e gera VERDADEIRO -> Estamos em uma máquina de 64 bitsIsWow64Process
existe e gera FALSE -> Estamos em uma máquina de 32 bitsNão nos preocupamos com a parte em que um aplicativo de 64 bits no Windows de 64 bits gera FALSE. Como sabemos que nosso aplicativo é de 32 bits
Ah, e há um caso adicional que não é coberto por esse desafio e deve ser raro de qualquer maneira:
Isso deve abranger a maioria dos sistemas operacionais Windows NT. Foram testados apenas no Win10 de 64 bits, no Win 7 de 64 bits, no Win 8.1 de 32 bits e no WinXP SP1 de 32 bits
Resposta original:
Para ter certeza, precisamos distinguir apenas 2 casos
IsWow64Process
não existe no kernel32.dll => Estamos em uma máquina de 32 bits.IsWow64Process
existe => Estamos em uma máquina de 64 bits.O valor real fornecido por
IsWow64Process
é irrelevante para esse desafio, pois queremos que o binário seja de 32 bits em qualquer caso.Ao contrário da maioria das respostas, isso não depende do próprio binário sendo compilado na máquina em que é executado.
Se eu conhecesse uma função mais curta que está presente apenas em máquinas de 64 bits e não de 32 bits, poderia reduzir a resposta.
fonte
.dll
da cadeia de nome do módulo. Isso não só é bom para o golfe, como também é uma prática melhor no uso normal. Além disso, para fins de golfe, você pode deixar o espaço depois#include
.wow64.dll
eWow64Win.dll
, mas nunca tentei ligarGetModuleHandle
com eles. O problema, porém, é que eles seriam carregados apenas para um processo de 32 bits em execução em uma máquina de 64 bits, não para um processo de 64 bits em execução em uma máquina de 64 bits.C #,
6050 bytesObrigado @TheLethalCoder
fonte
using static System.Environment;
eusing static System.Console;
WriteLine
paraWrite
Ruby, 22 bytes
["any string"].pack("p")
retorna uma cadeia de caracteres cujos bytes correspondem ao ponteiro apontado para"any string"
e possui 8 caracteres se o sistema operacional for de 64 bits ou 4 caracteres se o sistema operacional for de 32 bits.fonte
You can assume that users will use 64 bit software whenever possible.
Então, supõe -se que os usuários de 64 bits estejam executando o Ruby de 64 bits.R, 16 bytes
Retorna o tamanho do ponteiro.
fonte
Perl,
181518 bytesfonte
64
no meu computador de 32 bits, porqueperl
foi construído com um IV de 64 bits. Você verá que esse geralmente é o caso ao executar na versão de 32 bits do Windows.código de máquina x86, 8 bytes
Ungolfed:
Se compilado como um executável de 64 bits, ele retornará 64 pol
eax
e, se compilado como 32 bits, retornará 32 - independentemente do sistema operacional.Esta resposta se baseia nas regras que dizem:
fonte
PHP, 18 bytes
Isso lida corretamente com todos os casos de CPUs de 32, 64 e outros bits, desde que PHP_INT_SIZE esteja correto, mostrando o tamanho preciso da CPU, independentemente da CPU em que a PHP esteja sendo executada!
Se o PHP estiver sendo executado em
SO PHP_INT_SIZE == 4 de 32 bits,
SO de 64 bits PHP_INT_SIZE == 8,
SO de 16 bits PHP_INT_SIZE == 2 (teoricamente)
SO de 8 bits PHP_INT_SIZE == 1 (novamente teoricamente)
SO de 128 bits PHP_INT_SIZE == 16 (Ainda não foi alcançado, mas é possível)
fonte
C # (29 bytes)
fonte
PowerShell,
1752 bytesRetorna 64 se um dos seguintes for verdadeiro:
Program Files (x86)
.arch
retorna uma string terminada em4
(ASCII 52), comox86_64
, ao contrário de por exemploi686
.O try-catch visa contornar o erro que você obtém se gci não retornar nada e você não tiver um arco . Eu não encontrei uma maneira mais curta de fazê-lo até agora. gci é usado sobre ls porque no Linux, ls produzirá um erro visível.
Esta versão deve detectar se o sistema operacional é de 64 bits e não apenas o PowerShell, e foi testado para funcionar no Windows e Linux. Para suporte ao Mac, substitua
arch
poruname -m
.Versão anterior apenas para Windows:
-!(ls \*`))*32+64
fonte
Swift 4 REPL / Parque infantil, 12 bytes
Int
tem tamanho de palavra, agindo como umInt32
ouInt64
dependendo do sistema.fonte
Ruby, 10 bytes
Enquanto Ruby pode usar números inteiros de qualquer tamanho, internamente ele armazena os valores que cabem em uma palavra de máquina como
Fixnum
. O métodoFixnum#size
sempre retorna o comprimento em bytes de uma palavra de máquina.A
Fixnum
classe foi removida no Ruby 2.4.0, sua funcionalidade foi incluída na classeInteger
. O código permanece.fonte
Shell, 26 bytes
fonte
arch
vez deuname -m
.uname -m
->x86_64
, masarch
->i386
. Porque macos :( Além disso, isso é específico do bash - falha no zsh.zsh
tentará interpretar o?
caractere curinga como um caractere glob / único.Bash,
2517 bytesAgradecimentos a Dennis pela ajuda no golfe.
fonte
C, 22 bytes
Esta é uma resposta baseada no tamanho do ponteiro que assume um binário nativo. O
0
é convertido paraint**
(endereço0x0
). Em seguida, adicionamos 8 a 0, que, em C, avança, o ponteiro porsizeof(int*)*8
. 4 bytes * 8 bits = 32, 8 bytes * 8 bits = 64. Então, obtemos(int**)0x20
e0x40
que são convertidos implicitamente como números inteiros, retornando-os de umaint
função de retorno implícito .C, autônomo, 34 bytes
C, divertido com Unicode, 30 pontos de código, 34 bytes (UTF-8)
fonte
Java, 50 bytes
fonte
()->com.sun.jna.Native.POINTER_SIZE*8
PHP, 29 bytes
https://3v4l.org/Y6JXv
fonte
php_uname('m')
retornax86_64
em um sistema operacional de 64 bits, caso contrário, algo comoi386
.4
sendo o sexto caractere (quinto 0 indexado) da string'4' - 4 == 0 == false
,. E@
apenas suprime avisos para cadeias não citadas e compensações não inicializadas.php_uname('m')
retorna'i586'
.Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64
.Python 3 ,
77847159 bytes-13 bytes, graças a @ Jonathanon Allan!
Até 59 por @Clearer
Experimente online!
Meu primeiro código de golfe :)
Deve produzir a versão correta, mesmo ao executar 32Bit-Python no sistema operacional de 64 bits.
Supondo que você
platform.machine()
fornecei*86
oux86
para 32Bit-OS. Não tenho um disponível para verificar isso. A saída ocorre0
quando o SO não está no 64 / 32BitEdit: Adicionada instrução de impressão, por isso possui 7 bytes a mais
fonte
foo86
64 bits: p), mas se for aceitável, você poderá salvar 9 (editar .. .13!) Bytes comprint((a==64)*a+32*(a==86))
.from platform import*;print({'4':64,'6':32}[machine()[-1]])
funcionaria também.from platform import*;print(architecture()[0][:2])
-> 50 bytes