Ya no es demasiado importante, pero de vez en cuando alguien necesita saberlo.
Aquí hay un simple golf: sin tener en cuenta la opinión del usuario, ¡dígame si la computadora en la que se ejecuta el código está en un sistema operativo de 64 bits o en un sistema operativo de 32 bits!
Si el código se ejecuta en un sistema operativo de 32 bits, imprima "32", si el código se ejecuta en un sistema operativo de 64 bits, envíe "64". Importante: Imprima cualquier otra cadena no vacía de caracteres alfanuméricos si no tiene 32 o 64 bits.
Tenga en cuenta que un programa de 32 bits que se ejecuta en una computadora con un sistema operativo de 64 bits debe generar "64". Puede suponer que los usuarios utilizarán software de 64 bits siempre que sea posible.
Para ser elegible para la entrada, su código debe poder ejecutarse en Windows 4.10 o sistemas Windows más nuevos compatibles con Microsoft, y al menos una versión de Linux de su elección (siempre que esa versión sea gratuita). Se pueden instalar modificaciones de compatibilidad, siempre y cuando el programa todavía devuelva el valor correcto.
Se aplican las reglas habituales de código de golf .
Nota: Si su respuesta solo pretende imprimir 32 o 64, pero no el caso alternativo, lo aceptaré, pero no es una respuesta competitiva.
¡Intentaré publicar algunos resultados de ejecutar estos códigos en diferentes sistemas operativos más adelante!
fuente
Respuestas:
Conjunto x86 (políglota), 13 bytes
Bytecode:
Define una función que devuelve 32 si se interpreta como 32 bits, 64 si es de 64 bits y 32767 si es de 16 bits.
Quería hacer un políglota que se ejecutara en Windows y Linux, pero esto es mucho más difícil de lo que pensaba. Como es, no estoy seguro de que haya alguna forma de imprimir un valor en Windows que no sea de 16 bits sin vinculación.
Explicación
Este código usa dos tell para determinar la arquitectura en la que se está ejecutando. La primera es la instrucción 0x48, en 16 y 32 bits, esto es
dec %eax
, pero en 64 bits, es un prefijo de tamaño de instrucción. El segundo indicador es la misma instrucción, sin embargo, cuando lo ejecutamos en el valor 0x8000, el bit más significativo se voltea solo si el tamaño del registro es de 16 bits, configurando el indicador de desbordamiento y permitiéndonos usarlojo
.En 16 bits, este código se interpreta de la siguiente manera:
En 32 bits, este código se interpreta de la siguiente manera:
En 64 bits, este código se interpreta de la siguiente manera:
fuente
48
representa el bytedec %eax
en modo de 16 bits?código de máquina x86, 12 bytes
Sin golf:
Esta función funciona en Linux cuando se usa en ELF32, siguiendo i386 SysV ABI, así como en Windows / Wine cuando se usa en PE32, después de la
stdcall
convención de llamada.fuente
eax
aax
. Por lo tanto, si el selector encs
pasa a ser0x23
, el resultado será 64, de lo contrario 32.Mathematica, 17 bytes
fuente
&
o especificar que esto está en REPL?Cargadores de arranque
¿Sabía que GRUB e IPXE tienen lenguajes de programación completos de Turing accesibles en tiempo de ejecución? La familia de cargadores de arranque Syslinux no, pero pueden hacer esto.
IPXE, 36 bytes
la primera línea es necesaria si el script se ejecuta de forma remota, pero no si se escribe directamente en la línea de comando.
GRUB, 42 bytes
Syslinux, 186 bytes
Esto toma tres archivos, el primero es syslinux.cfg (o isolinux.cfg, etc.).
y t.cfg
ans s.cfg
Para este, la parte difícil es que syslinux no tiene capacidades simples de visualización de texto, por lo que se abusa del menú.
fuente
## iPXE, 36 bytes
### ipxe 36
Julia
1413 bytesExplique:
nothing
) devolver un número entero 32 o 64Int
que, dependiendo de si 32 bits o 64 bits, es unInt32
o unInt64
(1
podría ser cualquier dígito)Sys.WORD_SIZE
, utilizada en la respuesta de rahnema1Otra respuesta divertida es
()->"$(Int)"[4:5]
, pero no puedo contar la cuenta atrás de esa.-1 gracias a @Roman Gräf
fuente
julia,
201716 bytes* Gracias a @LyndonWhite guardó 3 bytes * Gracias a @ RomanGräf guardó un byte
Respuestas anteriores:
Pruébalo en línea!
fuente
()->Sys.WORD_SIZE
JavaScript (Node.js), 24 bytes
Esta es una función y regresa
'32'
,'64'
o si ninguno'rm'
.fuente
os
lugar deprocess
:os.arch().slice(1)
C,
33312923 bytes¡Gracias a los comentaristas @ceilingcat y @Dennis por los consejos de golf!
fuente
PowerShell, 16 bytes
Obtiene el tamaño del puntero en bytes, se multiplica por 8 para obtener bits.
fuente
your code must be able to run on Windows 4.10 or newer
Python 2,
52, 48, 4241 bytesGracias a totalmente humano!
fuente
from struct import*;print calcsize("P")*8
Es más corto.Java 8, 45 bytes
fuente
n=>System.getProperty("os.arch")
Perl 6 , 17 bytes
Intentalo
Hay un relacionado
$?BITS
que contiene el número de bits que tiene un nativoint
en el tiempo de ejecución.Intentalo
fuente
Windows CMD,
5652 bytes (¡gracias Bob!)Todavía sorprendentemente largo, ¡el más largo hasta ahora!
fuente
%windir%\SysWOW64
es aún más corto, creo ...if EXIST "c:\Progra~3" (echo 64)else echo 32
De manera predeterminada, usted tieneProgramData
y,Program Files
si existe un tercero, deberíamos ser 64C, Win32 API,
103183 bytesEn realidad hay más de 2 casos aquí. Vamos a examinarlos
IsWow64Process
no existe: estamos en un sistema operativo de 32 bitsPara los próximos dos casos, necesitamos saber que nuestro binario será un ejecutable de 32 bits. Y esta descripción de lo que estará fuera del parámetro out de
IsWow64Process
Eso nos deja con dos casos adicionales:
IsWow64Process
existe, y produce VERDADERO -> Estamos en una máquina de 64 bitsIsWow64Process
existe, y produce FALSO -> Estamos en una máquina de 32 bitsNo nos preocupa la parte en que una aplicación de 64 bits en un Windows de 64 bits produce FALSO. Como sabemos que nuestra aplicación es de 32 bits
Ah, y hay un caso adicional que no está cubierto por este desafío y que debería ser raro de todos modos:
Esto debería cubrir la mayoría de los sistemas operativos Windows NT. Solo he probado en Win10 de 64 bits, Win 7 de 64 bits, Win 8.1 de 32 bits y WinXP SP1 de 32 bits
Respuesta original:
Para estar seguros, necesitamos distinguir solo 2 casos
IsWow64Process
no existe en kernel32.dll => Estamos en una máquina de 32 bits.IsWow64Process
existe => Estamos en una máquina de 64 bits.El valor real proporcionado por
IsWow64Process
es irrelevante para este desafío, ya que queremos que el binario sea de 32 bits en cualquier caso.A diferencia de la mayoría de las respuestas, esto no depende de que el binario se compile en la máquina en la que se ejecuta.
Si conociera una función más corta que está presente solo en máquinas de 64 bits y no en máquinas de 32 bits, podría acortar la respuesta.
fuente
.dll
cadena del nombre del módulo. Esto no solo es bueno para el golf, sino que también es una mejor práctica en el uso normal. Además, para fines de golf, puede dejar el espacio después#include
.wow64.dll
yWow64Win.dll
, pero nunca he tratado de llamarGetModuleHandle
con ellos. Sin embargo, el problema es que solo se cargarían para un proceso de 32 bits que se ejecuta en una máquina de 64 bits, no para un proceso de 64 bits que se ejecuta en una máquina de 64 bits.C #,
6050 bytesGracias @TheLethalCoder
fuente
using static System.Environment;
yusing static System.Console;
WriteLine
aWrite
Ruby, 22 bytes
["any string"].pack("p")
devuelve una cadena cuyos bytes corresponden al puntero que apunta hacia"any string"
, y tiene 8 caracteres si el sistema operativo es de 64 bits, o 4 caracteres si el sistema operativo es de 32 bits.fuente
You can assume that users will use 64 bit software whenever possible.
Por lo tanto, se supondrá que los usuarios de 64 bits ejecutarán Ruby de 64 bits.R, 16 bytes
Devuelve el tamaño del puntero.
fuente
Perl,
181518 bytesfuente
64
a mi computadora de 32 bits, porqueperl
fue construida con un IV de 64 bits. Encontrarás que este suele ser el caso cuando se ejecuta en la versión de Windows de 32 bits.código de máquina x86, 8 bytes
Sin golf:
Si se compila como un ejecutable de 64 bits, devuelve 64 in
eax
, y si se compila como 32 bits, devuelve 32, independientemente del sistema operativo.Esta respuesta se basa en las reglas que dicen:
fuente
PHP, 18 bytes
Esto maneja correctamente todos los casos de 32, 64 y otras CPU de bits siempre que PHP_INT_SIZE sea correcto, ¡mostrará el tamaño preciso de la CPU sin importar en qué CPU se esté ejecutando PHP!
Si PHP se está ejecutando en
SO de 32 bits PHP_INT_SIZE == 4,
SO de 64 bits PHP_INT_SIZE == 8,
Sistema operativo de 16 bits PHP_INT_SIZE == 2 (teóricamente)
Sistema operativo de 8 bits PHP_INT_SIZE == 1 (nuevamente teóricamente)
Sistema operativo de 128 bits PHP_INT_SIZE == 16 (Todavía no se ha logrado pero es posible)
fuente
C # (29 bytes)
fuente
Potencia Shell,
1752 bytesDevuelve 64 si alguno de los siguientes es verdadero:
Program Files (x86)
.arch
devuelve una cadena que termina en4
(ASCII 52), al igual quex86_64
, a diferencia de, por ejemploi686
.El intento de captura está destinado a eludir el error que obtienes si gci no devuelve nada y no tienes un arco . No he encontrado una forma más corta de hacerlo hasta ahora. gci se usa sobre ls porque en Linux, ls producirá un error visible.
Esta versión debería detectar si el sistema operativo es de 64 bits en lugar de solo PowerShell, y se ha probado que funciona en Windows y Linux. Para soporte de Mac, reemplace
arch
conuname -m
.Versión anterior solo para Windows:
-!(ls \*`))*32+64
fuente
Swift 4 REPL / Playground, 12 bytes
Int
tiene el tamaño de una palabra, actúa comoInt32
oInt64
dependiendo del sistema.fuente
Rubí, 10 bytes
Si bien Ruby puede usar enteros de cualquier longitud, internamente almacena los valores que se ajustan a una palabra de máquina como
Fixnum
. El métodoFixnum#size
siempre devuelve la longitud en bytes de una palabra de máquina.La
Fixnum
clase se eliminó en Ruby 2.4.0, su funcionalidad se incluyó en la claseInteger
. El código se mantiene.fuente
Shell, 26 bytes
fuente
arch
lugar deuname -m
.uname -m
->x86_64
, peroarch
->i386
. Porque macos :( Además, esto es específico de bash - falla en zsh.zsh
intentará interpretarlo?
como un comodín de carácter único / glob.Bash,
2517 bytesGracias a Dennis por la ayuda en el golf.
fuente
C, 22 bytes
Esta es una respuesta basada en el tamaño del puntero que asume un binario nativo. El
0
se envía aint**
(dirección0x0
). Luego agregamos 8 a 0, que, en C avanza, el puntero porsizeof(int*)*8
. 4 bytes * 8 bits = 32, 8 bytes * 8 bits = 64. Entonces obtenemos(int**)0x20
y0x40
que luego seint
convierten implícitamente como enteros al devolverlos de una función de retorno implícito .C, independiente, 34 bytes
C, divertido con Unicode, 30 puntos de código, 34 bytes (UTF-8)
fuente
Java, 50 bytes
fuente
()->com.sun.jna.Native.POINTER_SIZE*8
PHP, 29 bytes
https://3v4l.org/Y6JXv
fuente
php_uname('m')
regresax86_64
en un sistema operativo de 64 bits, de lo contrario, algo asíi386
.4
siendo el sexto personaje (5ª 0 indexado) de la cadena,'4' - 4 == 0 == false
. Y@
solo suprime las advertencias para cadenas sin comillas y compensaciones sin inicializar.php_uname('m')
vuelve'i586'
.Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64
.Python 3 ,
77847159 bytes-13 bytes, gracias a @JonathanAllan!
Hasta 59 por @Clearer
Pruébalo en línea!
Mi primer código de golf:
debería mostrar la versión correcta incluso cuando se ejecuta 32Bit-Python en 64bit-OS.
Suponiendo que
platform.machine()
dai*86
ox86
para 32Bit-OS. No tengo uno disponible para verificar esto. La salida es0
cuando el sistema operativo no está en 64 / 32BitEdit: se agregó una declaración de impresión, por lo que tiene 7 bytes más
fuente
foo86
que sea de 64 bits: p), pero si es aceptable, puede guardar 9 (editar ... .13!) Bytes conprint((a==64)*a+32*(a==86))
.from platform import*;print({'4':64,'6':32}[machine()[-1]])
funcionaría tambiénfrom platform import*;print(architecture()[0][:2])
-> 50 bytes