Ini tidak terlalu penting lagi, tetapi sesekali seseorang perlu tahu.
Ini golf sederhana: Tanpa input pengguna, beri tahu saya jika komputer tempat kode dijalankan pada sistem operasi 64-bit, atau sistem operasi 32-bit!
Jika kode dijalankan pada sistem operasi 32-bit, cetak "32", jika kode dijalankan pada sistem operasi 64 bit, hasilkan "64". Penting: Cetak string alfanumerik non-kosong lainnya jika tidak 32 atau 64 bit.
Harap dicatat bahwa program 32 bit yang berjalan pada komputer dengan sistem operasi 64 bit akan menampilkan "64". Anda dapat mengasumsikan bahwa pengguna akan menggunakan perangkat lunak 64 bit bila memungkinkan.
Agar memenuhi syarat untuk masuk, kode Anda harus dapat dijalankan pada Windows 4.10 atau sistem Windows yang didukung Microsoft yang lebih baru , dan setidaknya satu rasa Linux yang Anda pilih (asalkan rasa itu gratis). Mod kompatibilitas dapat diinstal, selama program masih mengembalikan nilai yang tepat.
Biasa kode-golf aturan berlaku.
Catatan: Jika jawaban Anda hanya dimaksudkan untuk mencetak 32 atau 64, tetapi bukan huruf besar, saya akan menerimanya, tetapi itu bukan jawaban yang bersaing.
Saya akan mencoba dan memposting beberapa hasil menjalankan kode-kode ini pada OS yang berbeda nanti!
sumber
Jawaban:
x86 Assembly (polyglot), 13 byte
Bytecode:
Menentukan fungsi yang mengembalikan 32 jika ditafsirkan sebagai 32-bit, 64 jika 64-bit, dan 32767 jika 16-bit.
Saya ingin membuat polyglot yang berjalan pada Windows dan Linux, tetapi ini jauh lebih sulit daripada yang saya kira. Karena saya tidak yakin bahkan ada cara untuk mencetak nilai pada Windows non-16-bit tanpa menghubungkan.
Penjelasan
Kode ini menggunakan dua memberitahu untuk menentukan arsitektur yang sedang berjalan. Yang pertama adalah instruksi 0x48 — pada 16 dan 32 bit, ini
dec %eax
, tetapi pada 64 bit, ini adalah awalan ukuran instruksi. Tell kedua adalah instruksi yang sama, namun ketika kita mengeksekusinya pada nilai 0x8000, bit yang paling signifikan dibalik hanya jika ukuran register adalah 16 bit, mengatur flag overflow dan membiarkan kita menggunakanjo
.Dalam 16 bit, kode ini ditafsirkan sebagai berikut:
Dalam 32 bit, kode ini ditafsirkan sebagai berikut:
Dalam 64 bit, kode ini ditafsirkan sebagai berikut:
sumber
48
mewakilidec %eax
dalam mode 16-bit?kode mesin x86, 12 byte
Tidak Disatukan:
Fungsi ini berfungsi di Linux ketika digunakan dalam ELF32, mengikuti i386 SysV ABI, serta di Windows / Wine saat digunakan dalam PE32, mengikuti
stdcall
konvensi pemanggilan.sumber
eax
keax
. Jadi, jika pemilih dics
kebetulan0x23
, hasilnya akan menjadi 64, jika tidak 32.Mathematica, 17 byte
sumber
&
atau menentukan bahwa ini ada dalam REPL?Boot Loader
Tahukah Anda bahwa GRUB dan IPXE keduanya memiliki bahasa pemrograman lengkap Turing yang dapat diakses saat run-time? Keluarga Syslinux dari boot loader tidak tetapi mereka dapat melakukan ini.
IPXE, 36 byte
baris pertama diperlukan jika skrip dijalankan dari jarak jauh, tetapi tidak jika diketik langsung pada baris perintah.
GRUB, 42 byte
Syslinux, 186 byte
Ini mengambil tiga file yang pertama adalah syslinux.cfg (atau isolinux.cfg, dll.).
dan t.cfg
ans s.cfg
Untuk yang satu ini bagian yang sulit adalah syslinux tidak memiliki kemampuan tampilan teks sederhana, sehingga menu disalahgunakan.
sumber
## iPXE, 36 bytes
bukan### ipxe 36
Julia
1413 byteMenjelaskan:
nothing
) mengembalikan integer 32, atau 64Int
yang tergantung apakah 32 bit atau 64 bit, dapat berupaInt32
atauInt64
(1
bisa berupa angka apa saja)Sys.WORD_SIZE
, digunakan dalam jawaban rahnema1Jawaban lain yang menyenangkan adalah
()->"$(Int)"[4:5]
, tapi saya tidak bisa menghitungnya.-1 terima kasih kepada @Roman Gräf
sumber
julia,
201716 byte* Terima kasih kepada @LyndonWhite menghemat 3 byte * Terima kasih kepada @ RomanGräf menyimpan satu byte
Jawaban sebelumnya:
Cobalah online!
sumber
()->Sys.WORD_SIZE
JavaScript (Node.js), 24 byte
Ini adalah fungsi dan kembali
'32'
,'64'
atau jika tidak'rm'
.sumber
os
alih-alihprocess
:os.arch().slice(1)
C,
33312923 byteTerima kasih kepada komentator @ceilingcat dan @Dennis untuk kiat bermain golf!
sumber
PowerShell, 16 byte
Mendapat ukuran pointer dalam byte, dikalikan dengan 8 untuk mendapatkan bit.
sumber
your code must be able to run on Windows 4.10 or newer
Python 2,
52, 48, 4241 byteTerima kasih untuk benar-benar manusia!
sumber
from struct import*;print calcsize("P")*8
lebih pendek.Java 8, 45 byte
sumber
n=>System.getProperty("os.arch")
Perl 6 , 17 byte
Cobalah
Ada yang terkait
$?BITS
yang berisi jumlah bit yangint
dimiliki asli dalam runtime.Cobalah
sumber
Windows CMD,
5652 byte (terima kasih Bob!)Masih mengejutkan panjang - terpanjang sejauh ini!
sumber
%windir%\SysWOW64
bahkan lebih pendek, kurasa ...if EXIST "c:\Progra~3" (echo 64)else echo 32
Secara default Anda memilikiProgramData
danProgram Files
jadi jika yang ketiga ada, kita harus 64C, Win32 API,
103183 byteSebenarnya ada lebih dari 2 kasus di sini. Mari kita periksa
IsWow64Process
tidak ada: Kami menggunakan OS 32 bitUntuk dua kasus selanjutnya kita perlu memiliki pengetahuan bahwa biner kita akan dapat dieksekusi 32 bit. Dan uraian tentang apa yang akan keluar ke dalam parameter keluar
IsWow64Process
Itu membuat kita dengan dua kasus tambahan:
IsWow64Process
ada, dan menghasilkan BENAR -> Kami berada di mesin 64 bitIsWow64Process
ada, dan menghasilkan SALAH -> Kami berada di mesin 32 bitKami tidak khawatir tentang bagian di mana aplikasi 64-bit pada Windows 64-bit menghasilkan FALSE. Seperti yang kita ketahui bahwa aplikasi kita adalah 32-bit
Oh dan ada satu kasus tambahan yang tidak dicakup oleh tantangan ini dan harus jarang terjadi:
Ini harus mencakup sebagian besar Sistem Operasi Windows NT. Hanya diuji pada Win10 64-Bit, Win 7 64-Bit, Win 8.1 32-Bit dan WinXP SP1 32-Bit
Jawaban asli:
Yang pasti kita perlu membedakan hanya 2 kasus
IsWow64Process
tidak ada di kernel32.dll => Kami menggunakan mesin 32 bit.IsWow64Process
tidak ada => Kami berada di mesin 64 bit.Nilai aktual yang diberikan oleh
IsWow64Process
tidak relevan untuk tantangan ini, karena kami ingin biner 32bit dalam hal apa pun.Tidak seperti kebanyakan jawaban, ini tidak bergantung pada biner itu sendiri yang dikompilasi pada mesin yang dieksekusi.
Jika saya tahu fungsi yang lebih pendek yang hanya ada pada mesin 64bit dan bukan 32bit, saya bisa mempersingkat jawabannya.
sumber
.dll
dari string nama modul. Ini tidak hanya bagus untuk bermain golf, tetapi sebenarnya ini juga merupakan praktik yang lebih baik dalam penggunaan normal. Juga, untuk tujuan bermain golf, Anda dapat menjatuhkan ruang setelah#include
.wow64.dll
danWow64Win.dll
, tapi saya belum pernah mencoba meneleponGetModuleHandle
dengan itu. Masalahnya, bagaimanapun, adalah bahwa mereka hanya akan dimuat untuk proses 32-bit yang berjalan pada mesin 64-bit, bukan untuk proses 64-bit yang berjalan pada mesin 64-bit.C #,
6050 byteTerima kasih @TheLethalCoder
sumber
using static System.Environment;
danusing static System.Console;
WriteLine
keWrite
Ruby, 22 byte
["any string"].pack("p")
mengembalikan string yang byte-nya sesuai dengan pointer yang menunjuk ke arah"any string"
, dan 8 karakter jika OS 64-bit, atau 4 karakter jika OS 32-bit.sumber
You can assume that users will use 64 bit software whenever possible.
Jadi pengguna 64-bit akan dianggap menjalankan Ruby 64-bit.R, 16 byte
Mengembalikan ukuran pointer.
sumber
Perl,
181518 bytesumber
64
komputer 32 bit saya, karenaperl
dibangun dengan 64bit IV. Anda akan menemukan ini biasanya terjadi ketika berjalan pada Windows versi 32bit.kode mesin x86, 8 byte
Tidak Disatukan:
Jika dikompilasi sebagai 64-bit yang dapat dieksekusi, ia mengembalikan 64 in
eax
, dan jika dikompilasi sebagai 32-bit, kemudian mengembalikan 32 - terlepas dari OS.Jawaban ini bergantung pada aturan yang mengatakan:
sumber
PHP, 18 Bytes
Ini dengan benar menangani semua kasing 32, 64 dan CPU bit lainnya asalkan PHP_INT_SIZE benar, ia akan menampilkan ukuran CPU yang tepat, apa pun CPU yang dijalankan oleh PHP!
Jika PHP sedang berjalan
OS 32-bit PHP_INT_SIZE == 4,
OS 64-bit PHP_INT_SIZE == 8,
OS 16-bit PHP_INT_SIZE == 2 (secara teoritis)
OS 8-bit PHP_INT_SIZE == 1 (lagi secara teoritis)
128-bit OS PHP_INT_SIZE == 16 (Belum tercapai tetapi mungkin)
sumber
C # (29 byte)
sumber
PowerShell,
1752 byteMengembalikan 64 jika salah satu dari yang berikut ini benar:
Program Files (x86)
.arch
mengembalikan string yang diakhiri dengan4
(ASCII 52), sepertix86_64
, sebagai lawan dari misi686
.Try -catch dimaksudkan untuk menghindari kesalahan yang Anda dapatkan jika gci tidak mengembalikan apa pun dan Anda tidak memiliki lengkungan . Saya belum menemukan cara yang lebih singkat untuk melakukannya sejauh ini. gci digunakan lebih dari ls karena di Linux, ls akan menghasilkan kesalahan yang terlihat.
Versi ini harus mendeteksi apakah OS 64-bit daripada hanya PowerShell, dan diuji untuk bekerja pada Windows dan Linux. Untuk dukungan Mac, ganti
arch
denganuname -m
.Versi khusus Windows sebelumnya:
-!(ls \*`))*32+64
sumber
Swift 4 REPL / Playground, 12 byte
Int
berukuran kata, bertindak sepertiInt32
atauInt64
tergantung pada sistem.sumber
Ruby, 10 byte
Meskipun Ruby dapat menggunakan bilangan bulat dengan panjang berapa pun, secara internal Ruby menyimpan nilai yang sesuai dengan kata mesin
Fixnum
. Metode iniFixnum#size
selalu mengembalikan panjang dalam byte kata mesin.The
Fixnum
kelas telah dihapus pada Ruby 2.4.0, fungsinya termasuk dalam kelasInteger
. Kode tersebut berdiri.sumber
Shell, 26 byte
sumber
arch
bukanuname -m
.uname -m
->x86_64
, tapiarch
->i386
. Karena macos :( Juga, ini khusus untuk bash - gagal pada zsh.zsh
akan mencoba menafsirkan?
sebagai wildcard / karakter tunggal.Bash,
2517 byteTerima kasih kepada Dennis untuk bantuan bermain golf.
sumber
C, 22 byte
Ini adalah jawaban berbasis ukuran pointer yang mengasumsikan biner asli. Itu
0
dilemparkan keint**
(alamat0x0
). Kemudian kita tambahkan 8 ke 0, yang, dalam C advance, penunjuk dengansizeof(int*)*8
. 4 byte * 8 bit = 32, 8 byte * 8 bit = 64. Jadi kita dapatkan(int**)0x20
dan0x40
yang kemudian secara implisit dilemparkan sebagai bilangan bulat dengan mengembalikannya dariint
fungsi mengembalikan secara implisit .C, berdiri sendiri, 34 byte
C, bersenang-senang dengan Unicode, 30 poin kode, 34 byte (UTF-8)
sumber
Java, 50 byte
sumber
()->com.sun.jna.Native.POINTER_SIZE*8
PHP, 29 byte
https://3v4l.org/Y6JXv
sumber
php_uname('m')
kembalix86_64
pada OS 64 bit, kalau tidak sesuatu sepertii386
.4
menjadi karakter ke 6 (5th 0 diindeks) dari string'4' - 4 == 0 == false
,. Dan@
hanya menekan peringatan untuk string yang tidak dikutip, dan offset yang tidak diinisialisasi.php_uname('m')
kembali'i586'
.Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64
.Python 3 ,
77847159 59 byte-13 byte, terima kasih kepada @JonathanAllan!
Turun ke 59 oleh @Clearer
Cobalah online!
Tinju golf waktu saya :)
Harus menampilkan versi yang benar bahkan ketika menjalankan 32bit-Python pada 64bit-OS.
Dengan asumsi
platform.machine()
memberii*86
ataux86
untuk 32Bit-OS. Saya tidak punya satu tersedia untuk memeriksa ini. Output adalah0
ketika OS tidak dalamEdit 64 / 32Bit : Pernyataan cetak ditambahkan, sehingga mendapat 7 byte lebih lama
sumber
foo86
64 bit: p), tetapi jika itu dapat diterima maka Anda dapat menyimpan 9 (edit .. .13!) Byte denganprint((a==64)*a+32*(a==86))
.from platform import*;print({'4':64,'6':32}[machine()[-1]])
akan bekerja juga.from platform import*;print(architecture()[0][:2])
-> 50 byte