Это уже не так важно, но иногда кому-то нужно знать.
Вот простой пример: не вводя пользователя, скажите, работает ли компьютер, на котором выполняется код, в 64-битной операционной системе или 32-битной операционной системе!
Если код выполняется в 32-разрядной операционной системе, выведите «32», если код выполняется в 64-разрядной операционной системе, выведите «64». Важное замечание: Напечатайте любую другую непустую строку буквенно-цифровых символов, если она не 32- или 64-разрядная.
Обратите внимание, что 32-разрядная программа, работающая на компьютере с 64-разрядной операционной системой, должна выдавать «64». Вы можете предположить, что пользователи будут использовать 64-битное программное обеспечение, когда это возможно.
Чтобы иметь право на участие, ваш код должен быть в состоянии работать в Windows 4.10 или более новых системах Windows, поддерживаемых Microsoft, и по крайней мере один вариант Linux на ваш выбор (при условии, что этот вариант предоставляется бесплатно). Могут быть установлены моды совместимости, при условии, что программа все еще возвращает правильное значение.
Применяются обычные правила игры в гольф .
Примечание. Если ваш ответ предназначен только для распечатки 32 или 64, но не для альтернативного случая, я приму его, но это не конкурирующий ответ.
Я постараюсь позже опубликовать некоторые результаты запуска этих кодов на разных ОС!
источник
Ответы:
Сборка x86 (полиглот), 13 байт
Bytecode:
Определяет функцию, которая возвращает 32, если интерпретируется как 32-разрядная, 64, если 64-разрядная, и 32767, если 16-разрядная.
Я хотел создать полиглот, работающий на Windows и Linux, но это намного сложнее, чем я думал. Поскольку я не уверен, что есть какой-либо способ напечатать значение в не-16-битной Windows без связывания.
объяснение
Этот код использует две команды для определения архитектуры, на которой он работает. Первая - это инструкция 0x48 - на 16 и 32 битах
dec %eax
, но на 64 битах это префикс размера инструкции. Второе сообщение - это та же инструкция, однако, когда мы выполняем ее со значением 0x8000, старший бит переворачивается, только если размер регистра равен 16 битам, устанавливая флаг переполнения и позволяя нам использоватьjo
.В 16 битах этот код интерпретируется следующим образом:
В 32 битах этот код интерпретируется следующим образом:
В 64 битах этот код интерпретируется следующим образом:
источник
48
представляетdec %eax
в 16-битном режиме?машинный код x86, 12 байт
Ungolfed:
Эта функция работает в Linux при использовании в ELF32, после i386 SysV ABI, а также в Windows / Wine при использовании в PE32, в соответствии с
stdcall
соглашением о вызовах.источник
eax
наax
. Так что, если селектор в,cs
оказывается0x23
, результат будет 64, в противном случае 32.Mathematica, 17 байт
источник
&
или указать, что это в REPL?Загрузчики
Знаете ли вы, что GRUB и IPXE имеют полные языки программирования Turing, доступные во время выполнения? Семейство загрузчиков Syslinux этого не делает, но они могут это сделать.
IPXE, 36 байт
первая строка необходима, если скрипт запускается удаленно, но не если он вводится непосредственно в командной строке.
GRUB, 42 байта
Syslinux, 186 байт
Для этого требуется три файла: первый - syslinux.cfg (или isolinux.cfg и т. Д.).
и t.cfg
ans s.cfg
Сложность заключается в том, что syslinux не имеет простых возможностей отображения текста, поэтому меню злоупотребляет.
источник
## iPXE, 36 bytes
вместо### ipxe 36
Юлия
1413 байтОбъясните:
nothing
), возвращающая целое число 32 или 64Int
который в зависимости от того, 32-битный или 64-битный, являетсяInt32
илиInt64
(1
может быть любая цифра)Sys.WORD_SIZE
, используемая в ответе rahnema1Другой забавный ответ
()->"$(Int)"[4:5]
, но я не могу подсчитать это.-1 благодаря @Roman Gräf
источник
юлия,
201716 байт* Благодаря @LyndonWhite сэкономлено 3 байта * Благодаря @ RomanGräf сохранено байт
Предыдущие ответы:
Попробуйте онлайн!
источник
()->Sys.WORD_SIZE
JavaScript (Node.js), 24 байта
Это функция и возвращает
'32'
,'64'
или если ни'rm'
.источник
os
вместоprocess
:os.arch().slice(1)
C,
33312923 байтаСпасибо комментаторам @ceilingcat и @Dennis за советы по игре в гольф!
источник
PowerShell, 16 байт
Получает размер указателя в байтах, умножается на 8, чтобы получить биты.
источник
your code must be able to run on Windows 4.10 or newer
Python 2,
52, 48, 4241 байтСпасибо полностью человеку!
источник
from struct import*;print calcsize("P")*8
корочеJava 8, 45 байт
источник
n=>System.getProperty("os.arch")
Perl 6 , 17 байт
Попробуй
Существует взаимосвязь,
$?BITS
которая содержит количество битов, которые имеет нативныйint
в среде выполнения.Попробуй
источник
Windows CMD,
5652 байта (спасибо, Боб!)Все еще удивительно длинный - самый длинный до сих пор!
источник
%windir%\SysWOW64
даже короче, я думаю ...if EXIST "c:\Progra~3" (echo 64)else echo 32
По умолчанию у вас есть,ProgramData
иProgram Files
поэтому, если третий существует, мы должны быть 64C, Win32 API,
103183 байтаНа самом деле здесь более 2 случаев. Давайте рассмотрим их
IsWow64Process
не существует: мы находимся на 32-битной ОСВ следующих двух случаях нам нужно знать, что наш двоичный файл будет 32-битным исполняемым файлом. И это описание того, что будет в выходной параметр
IsWow64Process
Это оставляет нас с двумя дополнительными случаями:
IsWow64Process
существует и выдает TRUE -> Мы находимся на 64-битной машинеIsWow64Process
существует и выдает FALSE -> Мы находимся на 32-битной машинеМы не беспокоимся о той части, где 64-битное приложение в 64-битной Windows дает FALSE. Как мы знаем что наше приложение является 32-битным
Да, и есть еще один случай, который не охватывается этой проблемой и в любом случае должен быть редким:
Это должно охватывать большинство операционных систем Windows NT. Были протестированы только на Win10 64-битной, Win 7 64-битной, Win 8.1 32-битной и WinXP SP1 32-битной
Оригинальный ответ:
Чтобы быть уверенным, мы должны различать только 2 случая
IsWow64Process
не существует в kernel32.dll => Мы находимся на 32-битной машине.IsWow64Process
действительно существует => Мы находимся на 64-битной машине.Фактическое значение, предоставленное
IsWow64Process
имеет значения для этого вызова, поскольку мы хотим, чтобы двоичный файл был 32-разрядным в любом случае.В отличие от большинства ответов, это не связано с тем, что сам двоичный файл компилируется на компьютере, на котором он выполняется.
Если бы я знал более короткую функцию, которая присутствует только на 64-битных, а не 32-битных машинах, я мог бы сократить ответ.
источник
.dll
из имени модуля строку. Это не только хорошо для игры в гольф, но и для нормальной практики. Кроме того, в целях игры в гольф, вы можете оставить место после#include
.wow64.dll
иWow64Win.dll
, но я никогда не пытался звонитьGetModuleHandle
с такими. Проблема, однако, заключается в том, что они будут загружаться только для 32-разрядного процесса, выполняющегося на 64-разрядной машине, а не для 64-разрядного процесса, выполняющегося на 64-разрядной машине.C #,
6050 байтСпасибо @TheLethalCoder
источник
using static System.Environment;
иusing static System.Console;
WriteLine
наWrite
Рубин, 22 байта
["any string"].pack("p")
возвращает строку, байты которой соответствуют указателю, который указывает на"any string"
, и составляет 8 символов, если ОС является 64-разрядной, или 4 символа, если ОС является 32-разрядной.источник
You can assume that users will use 64 bit software whenever possible.
Итак, предполагается, что 64-битные пользователи используют 64-битный Ruby.R, 16 байт
Возвращает размер указателя.
источник
Perl,
181518 байтисточник
64
на мой 32-битный компьютер, потому чтоperl
был построен с 64- битным IV. Вы обнаружите, что это обычно имеет место при работе на 32-битной версии Windows.машинный код x86, 8 байт
Ungolfed:
Если скомпилирован как 64-битный исполняемый файл, он возвращает 64 в
eax
, а если скомпилирован как 32-битный, то возвращает 32 - независимо от ОС.Этот ответ опирается на правила, гласящие:
источник
PHP, 18 байт
Это правильно обрабатывает все случаи 32, 64 и других битовых процессоров, при условии, что PHP_INT_SIZE верен, он покажет точный размер процессора независимо от того, на каком процессоре работает PHP!
Если PHP работает на
32-битная ОС PHP_INT_SIZE == 4,
64-битная ОС PHP_INT_SIZE == 8,
16-битная ОС PHP_INT_SIZE == 2 (теоретически)
8-битная ОС PHP_INT_SIZE == 1 (опять теоретически)
128-битная ОС PHP_INT_SIZE == 16 (пока не достигнуто, но возможно)
источник
C # (29 байт)
источник
PowerShell,
1752 байтаВозвращает 64, если выполняется одно из следующих условий:
Program Files (x86)
.arch
возвращает строку, заканчивающуюся на4
(ASCII 52), напримерx86_64
, в отличие от egi686
.Try -catch предназначен для обхода ошибки, которую вы получаете, если gci ничего не возвращает и у вас нет арки . Я не нашел более короткий способ сделать это до сих пор. gci используется поверх ls, потому что в Linux ls выдаст видимую ошибку.
Эта версия должна определять, является ли ОС 64-разрядной, а не только PowerShell, и протестирована для работы в Windows и Linux. Для поддержки Mac замените
arch
наuname -m
.Предыдущая версия только для Windows:
-!(ls \*`))*32+64
источник
Swift 4 REPL / Детская площадка, 12 байт
Int
имеет размер слова, действует как одинInt32
или вInt64
зависимости от системы.источник
Рубин, 10 байт
Хотя Ruby может использовать целые числа любой длины, внутри он хранит значения, которые вписываются в машинное слово как
Fixnum
. МетодFixnum#size
всегда возвращает длину в байтах машинного слова.Fixnum
Класс был удален в Руби 2.4.0, его функциональность была включена в классеInteger
. Код стоит.источник
Оболочка, 26 байт
источник
arch
вместоuname -m
.uname -m
->x86_64
, ноarch
->i386
. Потому что macos :( Кроме того, это зависит от bash - не работает на zsh.zsh
попытается интерпретировать?
подстановочный знак как глобальный / односимвольный.Баш,
2517 байтСпасибо Деннису за помощь в игре в гольф.
источник
C, 22 байта
Это ответ на основе размера указателя, который предполагает собственный двоичный файл. Приведение
0
кint**
(адрес0x0
). Затем мы добавляем 8 к 0, что в C продвигает указатель наsizeof(int*)*8
. 4 байта * 8 битов = 32, 8 байтов * 8 битов = 64. Таким образом, мы получаем(int**)0x20
и0x40
которые затем неявно преобразуются в целые числа, возвращая их неявноint
-returning функции.C, автономный, 34 байта
C, забавно с Unicode, 30 кодовых точек, 34 байта (UTF-8)
источник
Java, 50 байт
источник
()->com.sun.jna.Native.POINTER_SIZE*8
PHP, 29 байт
https://3v4l.org/Y6JXv
источник
php_uname('m')
возвращаетx86_64
на 64-битную ОС, иначе что-то вродеi386
.4
будучи шестым символом (пятые 0 индексируются) строка,'4' - 4 == 0 == false
. И@
просто подавляет предупреждения для строк без кавычек и неинициализированных смещений.php_uname('m')
возвращается'i586'
.Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64
.Python 3 ,
77847159 байт-13 байт, спасибо @JonathanAllan!
До 59 по @Clearer
Попробуйте онлайн!
Мой первый раз код игры в гольф :)
Должен выводить правильную версию даже при работе 32Bit-Python на 64-битной ОС.
Предположим,
platform.machine()
даетi*86
илиx86
для 32-битной ОС. У меня нет одного, чтобы проверить это. Вывод происходит,0
когда ОС не в 64/32-битном режиме.Редактирование: добавлен оператор печати, поэтому он получил на 7 байт больше
источник
foo86
которая является 64-битной: p), но если это приемлемо, вы можете сохранить 9 (правка .. .13!) Байт сprint((a==64)*a+32*(a==86))
.from platform import*;print({'4':64,'6':32}[machine()[-1]])
будет работать тоже.from platform import*;print(architecture()[0][:2])