Mon système d'exploitation est-il 32 bits ou 64 bits?


53

Ce n'est plus très important, mais il faut parfois que quelqu'un sache.

Voici un golf simple: Si vous ne faites aucune saisie, dites-moi si l'ordinateur sur lequel le code est exécuté utilise un système d'exploitation 64 bits ou un système d'exploitation 32 bits!

Si le code est exécuté sur un système d'exploitation 32 bits, imprimez "32", si le code est exécuté sur un système d'exploitation 64 bits, indiquez "64". Important: Imprimez toute autre chaîne de caractères alphanumériques non vide si elle n’est ni 32 ni 64 bits.

Veuillez noter qu'un programme 32 bits s'exécutant sur un ordinateur avec un système d'exploitation 64 bits doit générer "64". Vous pouvez supposer que les utilisateurs utiliseront un logiciel 64 bits autant que possible.

Pour pouvoir entrer, votre code doit pouvoir être exécuté sur les systèmes Windows pris en charge par Windows 4.10 ou une version plus récente de Microsoft, et sur au moins une version de Linux de votre choix (tant que cette version est gratuite). Des mods de compatibilité peuvent être installés, tant que le programme retourne toujours la bonne valeur.

Les règles habituelles de s'appliquent.

Remarque: si votre réponse vise uniquement à imprimer 32 ou 64, mais pas le cas alt, je l'accepterai, mais ce n'est pas une réponse en concurrence.

Je vais essayer de poster quelques résultats de l'exécution de ces codes sur différents systèmes d'exploitation plus tard!


5
Donc "Veuillez noter qu'un programme 32 bits exécuté sur un ordinateur avec un système d'exploitation 64 bits doit générer" 64 ". Vous pouvez supposer que les utilisateurs utiliseront un logiciel 64 bits chaque fois que cela sera possible." signifie que si l'interpréteur / compilateur, etc., est disponible en 32 bits et en 64 bits, un système d'exploitation 32 bits exécutera toujours la version 32 bits de l'interpréteur / etc, et le système d'exploitation 64 bits exécutera toujours l'interpréteur 64 bits. /etc. Donc , se soucier de la différence entre le programme étant 32 ou 64, et le système d' exploitation étant 32 ou 64, est fondamentalement seulement un problème pour les langues avec seulement 32 implémentations de bits. Droite?
Lyndon White

2
De nombreuses solutions ici imprimeraient "32" sur un système d'exploitation 64 bits si un compilateur 32 bits était utilisé pour compiler un programme. Est-ce correct?
Martin Rosenau

15
Qu'est-ce que "Windows 4.10" dans le monde? Est-ce que cela signifie Windows 98? Ou cela signifie-t-il Windows NT 4? Que considérez-vous être "plus récent" que cela? Cela semble être un défi exceptionnellement mal pensé.
Cody Grey

13
Il n'y a pas de "spécifications officielles de Windows" et personne ne désigne Windows 98 comme étant "Windows 4.10". Vous êtes littéralement le premier. Alors peut-être qu'au lieu d'essayer de paraître cool ou officiel en utilisant des numéros de version, vous devriez simplement utiliser le nom du produit . Soit dit en passant, Windows 9x n’était jamais disponible dans une version 64 bits, est-il donc légitime pour moi de soumettre une entrée qui ne fonctionne que sous Windows 98 et qui renvoie simplement «32»? Cela semble très injuste / non sportif / sans intérêt, mais serait techniquement autorisé par vos règles.
Cody Gray

3
Vous n'avez toujours pas répondu à la question sur la version Windows. Est-ce que doit être capable de fonctionner sous Windows 4.10 ou plus récent moyenne sur Windows 4.10 et toutes les versions plus récentes ou sur une version de Windows unique, 4.10 ou plus récent ?
Dennis

Réponses:


44

Assemblage x86 (polyglotte), 13 octets

Bytecode:

31 c0 b4 80 48 70 05 04 40 83 e0 60 c3

Définit une fonction qui renvoie 32 si interprété comme 32 bits, 64 si 64 bits et 32767 si 16 bits.

Je voulais créer un polyglotte fonctionnant sous Windows et Linux, mais c'est beaucoup plus difficile que je ne le pensais. En l'état actuel des choses, je ne suis même pas sûr qu'il soit possible d'imprimer une valeur sous Windows non 16 bits sans liaison.

Explication

Ce code utilise deux instructions pour déterminer l'architecture sur laquelle il s'exécute. La première est l'instruction 0x48, c'est-à-dire sur 16 et 32 ​​bits dec %eax, mais sur 64 bits, il s'agit d'un préfixe de taille d'instruction. Le second tell est la même instruction, cependant, lorsque nous l'exécutons sur la valeur 0x8000, le bit le plus significatif est inversé uniquement si la taille du registre est de 16 bits, en définissant l'indicateur de dépassement de capacité et en permettant son utilisation jo.

En 16 bits, ce code est interprété comme suit:

   0:   31 c0                   xor    %ax,%ax    /* 0x0000 */
   2:   b4 80                   mov    $0x80,%ah  /* 0x8000 */
   4:   48                      dec    %ax        /* 0x7fff */
   5:   70 05                   jo c              /* taken  */
   7:   04 40                   add    $0x40,%al
   9:   83 e0 60                and    $0x60,%ax
   c:   c3                      ret               /* 0x7fff */

En 32 bits, ce code est interprété comme suit:

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48                      dec    %eax        /* 0x00007fff */
   5:   70 05                   jo c               /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00007f3f */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000020 */
   c:   c3                      ret

En 64 bits, ce code est interprété comme suit:

   0:   31 c0                   xor    %eax,%eax   /* 0x00000000 */
   2:   b4 80                   mov    $0x80,%ah   /* 0x00008000 */
   4:   48 70 05                rex.W jo c         /* not taken  */
   7:   04 40                   add    $0x40,%al   /* 0x00008040 */
   9:   83 e0 60                and    $0x60,%eax  /* 0x00000040 */
   c:   c3                      ret

C'est en fait probablement dans la tête, très agréable
tuskiomi

1
Une idée très soignée, mais telle qu’elle est mise en œuvre, elle renverra la mauvaise valeur si elle est assemblée en tant que fichier binaire 32 bits et exécutée sur un système d’exploitation 64 bits.
Cody Grey

@CodyGray à partir des règles: Vous pouvez supposer que les utilisateurs utiliseront un logiciel 64 bits dans la mesure du possible. Je suppose que cela signifie également que pour les fonctions, nous pouvons supposer que le code de l'appelant est de 64 bits chaque fois que cela est possible.
Ruslan

Ah, je suppose que c'est une interprétation juste, @Ruslan. Et je vois que vous avez déjà posté la réponse que j'avais en tête , ne serait-ce pas pour ce problème. :-) Vous avez mon vote positif.
Cody Grey

l'octet 48représente dec %eax-t-il en mode 16 bits?
phuclv

48

code machine x86, 12 octets

8c c8 83 f8 23 b0 20 75 02 00 c0 c3

Ungolfed:

getKernelBitness:
    mov eax,cs
    cmp eax,0x23 ; 32 bit process on 64 bit kernel has this selector in CS
    mov al,32
    jne kernelIs32Bit
    add al,al    ; return value in eax
kernelIs32Bit:
    ret

Cette fonction fonctionne sous Linux lorsqu'elle est utilisée dans ELF32, après ABI i386 SysV, ainsi que sous Windows / Wine lorsqu'elle est utilisée dans PE32, conformément stdcallà la convention d'appel.


En fait, on peut réduire encore plus le nombre d'octets si on suit une autre approche .
Ruslan

qu'est-ce que cela ferait théoriquement dans un environnement non 32/64 bits?
Tuskiomi

1
@tuskiomi Dans tous les cas, ce code renverra quand même 32 ou 64. La seule différence pour interpréter cette séquence d'octets en mode 16 bits sera un changement de code mnémonique de eaxà ax. Donc, si le sélecteur csse trouve dans 0x23, le résultat sera 64, sinon 32.
Ruslan

cela semble cependant spécifique à deux systèmes d'exploitation. Vous pourriez facilement avoir un système 32 bits avec cs = 0x23. Voir à la place ma réponse de 8 octets qui cible le processeur à la place.
peter ferrie

@peterferrie ouais, c'est pourquoi j'ai une autre réponse . Mais le vôtre le sur-golf de 2 octets.
Ruslan

32

Mathematica, 17 octets

$SystemWordLength

13
Bien sûr, il y a un construit! \ s (+1)
tuskiomi

Ne devriez-vous pas ajouter un &ou spécifier que cela est dans le REPL?
LegionMammal978

5
@ LegionMammal978 "Si le code est exécuté sur un système d'exploitation 32 bits, imprimez" 32 ", si le code est exécuté sur un système d'exploitation 64 bits, indiquez" 64 ". Imprimez toute chaîne de caractères alphanumériques non vide. si ce n'est ni l'un ni l'autre. " Non "fournir une fonction qui, lorsqu'elle est exécutée, fait ceci"; juste "faire ceci".
Patrick Stevens

17
@PatrickStevens: Si la question ne spécifie pas la forme que doit prendre une soumission, il s'agit d' un programme ou d'une fonction, mais pas d'un extrait, par défaut .

3
@ ais523 Je soutiens qu'il n'y a pas de distinction dans Mathematica entre les programmes, les fonctions et les extraits. Tout n'est qu'une expression.
ngenisis

21

Chargeurs de démarrage

Saviez-vous que GRUB et IPXE disposent tous les langages de programmation complets de Turing accessibles au moment de l'exécution? Les chargeurs de démarrage de la famille Syslinux ne le font pas mais ils peuvent le faire.

IPXE, 36 octets

#!ipxe
cpuid --ext 29 && echo 64 || echo 32

la première ligne est nécessaire si le script est exécuté à distance, mais pas si elle est tapée directement sur la ligne de commande.

GRUB, 42 octets

if cpuid -l ; then
echo 64
else
echo 32
fi

Syslinux, 186 octets

Cela prend trois fichiers, le premier est syslinux.cfg (ou isolinux.cfg, etc.).

label a
  kernel ifcpu64.c32
  append s -- t

label s
  kernel menu.c32
  append s.cfg

label t
  kernel menu.c32
  append t.cfg

default a
prompt 0
timeout 0

et t.cfg

menu title 32

ans s.cfg

menu title 64

Pour ce qui est de l’essentiel, c’est que syslinux n’a aucune possibilité d’affichage de texte, ce qui rend le menu abusif.


Je ne sais pas si vous pouvez dire à la résolution os avec un chargeur de démarrage, mais je aime l'idée
tuskiomi

Il vérifie le processeur et est utilisé pour sélectionner le bon système d'exploitation. Il s’agit essentiellement d’un code de jeu de mon projet unboot.
Hildred

2
Cela change donc le système d'exploitation en fonction de l'architecture. Sortir des sentiers battus. J'aime.
Tuskiomi

Quel est le bytecount?
Restioson

1
@hildred Je crois que ce serait plus lisible si vous ## iPXE, 36 bytes### ipxe 36
utilisiez

21

Julia 14 13 octets

n->8sizeof(1)

Explique:

  • Anon fonction, prenant n'importe quoi (incluant nothing) retournant un entier 32, ou 64
  • Les littéraux entiers sont de type Intqui, selon qu’il s’agisse de 32 bits ou de 64 bits, est un Int32ou un Int64(le 1chiffre peut être n’importe quel chiffre)
  • placer un nombre avant un appel de fonction effectue une multiplication de juxtaposition
  • Ceci est essentiellement une version abrégée du codeSys.WORD_SIZE utilisé dans la réponse de rahnema1

Une autre réponse amusante est ()->"$(Int)"[4:5], mais je ne peux pas obtenir le compte à rebours sur celui-là.


-1 grâce à @Roman Gräf


Vous pouvez utiliser un argument factice: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

19

julia, 20 17 16 octets

n->Sys.WORD_SIZE

* Merci à @LyndonWhite enregistré 3 octets * Merci à @ RomanGräf enregistré un octet

Réponses précédentes:

()->Sys.WORD_SIZE
print(Sys.WORD_SIZE)

Essayez-le en ligne!


1
Personnellement, j'aime bien celui-ci!
Tuskiomi

2
Selon la convention suivante: codegolf.meta.stackexchange.com/q/2419/62131, vous pouvez supprimer 3 octets en procédant de la manière suivante:()->Sys.WORD_SIZE
Lyndon White le

1
Vous pouvez également utiliser un argument factice: codegolf.meta.stackexchange.com/a/12696/56341
Roman Gräf

14

JavaScript (Node.js), 24 octets

_=>process.arch.slice(1)

Ceci est une fonction et retourne '32', '64'ou si ni 'rm'.


+1, mais je suppose qu'une arche de 64 bits pourrait utiliser un système d'exploitation de 32 bits
Octopus,

1
Me donne '32' sur Windows 32 bits, donc cela semble fonctionner.
Ken YN

5
Vous pouvez supprimer 7 octets si vous utilisez le REPL et osau lieu de process:os.arch().slice(1)
GilZ

Cela renvoie l'architecture du système d'exploitation signalée au processus, pas l'architecture réelle du système d'exploitation. Donc, cela ne fonctionne pas sous Linux. (Punch "setarch" dans votre moteur de recherche préféré.)
David Schwartz

@DavidSchwartz cela fonctionne très bien sur ma machine Linux à moins que je ne comprenne mal, mais sur PPCG, nous pouvons supposer un environnement non modifié en termes de changement d'arche par l'utilisateur
Downgoat

13

C, 33 31 29 23 octets

f(){return sizeof&f*8;}

Merci aux commentateurs @ceilingcat et @Dennis pour leurs astuces de golf!


13
Il indique également que les règles habituelles du code de golf s'appliquent et que le retour d'une fonction fait partie de nos valeurs par défaut pour les E / S.
Dennis

11
Cela ne dépend-il pas du fait que vous compiliez un programme 32 ou 64 bits?
Ken YN

4
Cela ne respecte pas les exigences. " Veuillez noter qu'un programme 32 bits s'exécutant sur un ordinateur doté d'un système d'exploitation 64 bits doit générer" 64 ". " Cela vous indique comment le programme a été compilé, et non pas quel est le système d'exploitation.
David Schwartz

2
@DavidSchwartz "Vous pouvez supposer que les utilisateurs utiliseront un logiciel 64 bits dans la mesure du possible."
Klas Lindbäck

2
Désolé de le dire, mais sizeof est évalué au moment de la compilation. Donc, si vous compilez un fichier exe 32 bits et l’exécutez sur une machine 64 bits, il en sortira 32 tandis qu’il devrait en produire 64 ( stackoverflow.com/questions/2615203/… ). Belle idée quand même!
Dinaiz

11

PowerShell, 16 octets

8*[IntPtr]::Size

Obtient la taille du pointeur en octets, multiplie par 8 pour obtenir des bits.


-1 parce queyour code must be able to run on Windows 4.10 or newer
ub3rst4r

11
@ ub3rst4r ou plus récent, non et plus récent. Je suis prêt à parier qu'une bonne partie de ces réponses sont difficiles, au mieux, à fonctionner sur une version de Windows non prise en charge de longue date. Il est également déraisonnable de s’attendre à ce que les utilisateurs effectuent des tests sur 98 systèmes d’exploitation - il n’est même pas facile de les installer sur une machine virtuelle (croyez-moi, j’ai essayé. Ne fonctionne pas sur KVM et présente des interactions intéressantes avec les cartes graphiques VBox) . (Cela ne veut pas même avoir un concept de 64 bits ... qui est une exigence vraiment ridicule.)
Bob

1
@ ub3rst4r Je doute que tous les langages de programmation interprétés aient une implémentation fonctionnant sous Windows 4.10!
Martin Rosenau

1
Cela ressemble à un échec s'il s'agit d'un PowerShell 32 bits sur un système d'exploitation 64 bits.
Chris J

@ChrisJ Au moins sur Win10 et Win2012 R2, il renvoie le résultat correct de x86 PowerShell. Je n'ai pas testé sur Linux.
Booga Roo

10

Python 2, 52, 48, 42 41 octets

from struct import*;print calcsize("P")*8

Merci à totalement humain!


Zoom! à travers la ligne en moins d'une minute.
Tuskiomi

Je vais attendre de rentrer à la maison pour tester cela, mais je ne suis pas sûr que cela affiche "32" et "64", mais je suis confiant dans les autres cas.
Tuskiomi

@tuskiomi, cela affiche "32bit" ou "64bit"
Daniel

1
from struct import*;print calcsize("P")*8est plus courte.
totalement humain

12
Si vous utilisez ceci sur Python 32 bits dans un système d’exploitation 64 bits, je pense que cela vous mentira. La plupart des autres réponses semblent également sensibles à cela de toute façon ...
Nick T

10

Java 8, 45 octets

()->System.getProperty("sun.arch.data.model")

@Dopapp Ce qu'il veut dire, c'est qu'il s'agit d'un extrait de code, et non d'un programme ou d'une fonction. En Java 8, cela devrait fonctionner:n=>System.getProperty("os.arch")
NoOneIsHere, le

@NoOneIsHere, oh merci, ça m'a échappé
Daniel

2
"Si le code est exécuté sur un système d'exploitation 32 bits, imprimez" 32 ", si le code est exécuté sur un système d'exploitation 64 bits, indiquez" 64 ". Imprimez toute chaîne (autre) non vide de caractères alphanumériques si ni.". Ça ne fait pas ça du tout ...
Olivier Grégoire

4
Pouvez-vous obtenir Java 8 pour Windows 98 (v4.10)?
TessellatingHeckler

4
@TessellatingHeckler Java 8 nécessite "i586" (peu importe ce que cela signifie). L'entrée dit: "votre code doit pouvoir s'exécuter sur Windows 4.10 ou plus récent", pas "votre code doit pouvoir s'exécuter sur Windows 4.10 et plus récent". Il fonctionne sur un Windows plus récent .
Olivier Grégoire


8

Windows CMD, 56 52 octets (merci Bob!)

if EXIST "%ProgramFiles(x86)%" (echo 64)else echo 32

Encore étonnamment long - le plus long jusqu'à présent!


1
En fait, %windir%\SysWOW64c'est encore plus court, je pense ...
Bob Le

7
" doit pouvoir fonctionner sous Windows 4.10 ou plus récent et au moins une version de Linux de votre choix " - quelle version de Linux pour cela?
TessellatingHeckler

1
@TessellatingHeckler si vous installez Wine ...?
Ken YN

1
Qu'en est-il de la sténographie? if EXIST "c:\Progra~3" (echo 64)else echo 32Par défaut vous avez ProgramDataet Program Filesdonc si un tiers existe, nous devrions être 64
Marie

3
Qu'est-ce que cela va imprimer pour un système d'exploitation 8 bits?
tuskiomi

7

C, API Win32, 103 183 octets

#include <windows.h>
typedef int(WINAPI*F)(HANDLE,int*);b;main(){F f=GetProcAddress(GetModuleHandle("kernel32"),"IsWow64Process");return(f!=0&&f(GetCurrentProcess(),&b)&&!b)?32:64;}

En réalité, il y a plus de 2 cas ici. Examinons-les

  • Le plus simple: IsWow64Processn'existe pas: nous sommes sur un système d'exploitation 32 bits

Pour les deux prochains cas, nous devons savoir que notre binaire sera un exécutable de 32 bits. Et cette description de ce qui sera dans le paramètre out deIsWow64Process

Un pointeur sur une valeur définie sur TRUE si le processus s'exécute sous WOW64. Si le processus s'exécute sous Windows 32 bits, la valeur est définie sur FALSE. Si le processus est une application 64 bits s'exécutant sous Windows 64 bits, la valeur est également définie sur FALSE.

Cela nous laisse avec deux cas supplémentaires:

  • IsWow64Process existe et donne VRAI -> Nous sommes sur une machine 64 bits
  • IsWow64Process existe, et donne FAUX -> Nous sommes sur une machine 32 bits

Nous ne nous inquiétons pas de la partie où une application 64 bits sous Windows 64 bits donne FAUX. Comme nous savons que notre application est 32 bits

Oh, et il y a un cas supplémentaire qui n'est pas couvert par ce défi et devrait être rare de toute façon:

  • IsWow64Process existe, mais il échoue: nous utilisons par défaut une machine 32 bits.

Cela devrait couvrir la plupart des systèmes d'exploitation Windows NT. N'avoir testé que sur Win10 64 bits, Win 7 64 bits, Win 8.1 32 bits et WinXP SP1 32 bits


Réponse originale:

#include<windows.h>
main(){return GetProcAddress(GetModuleHandle("Kernel32"),"IsWow64Process")?64:32;}

Pour être sûr, nous n'avons besoin de distinguer que 2 cas

  • IsWow64Process n'existe pas dans kernel32.dll => Nous sommes sur une machine 32 bits.

  • IsWow64Process existe => Nous sommes sur une machine 64 bits.

La valeur réelle fournie par IsWow64Processest sans importance pour ce défi, car nous voulons que le binaire soit 32 bits dans tous les cas.

Contrairement à la plupart des réponses, cela ne repose pas sur le binaire lui-même compilé sur la machine sur laquelle il est exécuté.

Si je connaissais une fonction plus courte, présente uniquement sur les machines 64 bits et non 32 bits, je pourrais raccourcir la réponse.


2
Supprimez la .dllchaîne du nom du module. Non seulement c'est bon pour le golf, mais c'est aussi une meilleure pratique en utilisation normale. En outre, pour le golf, vous pouvez laisser l’espace après #include.
Cody Grey

Merci, je voulais en réalité réduire le tout en cherchant juste un module qui puisse être trouvé sur 64 bits mais pas sur 32 bits. Je suis toujours en train de regarder. Malheureusement (à cette fin), il n’existe pas de module appelé WoW64.
MrPaulch

Il y a effectivement un wow64.dllet Wow64Win.dll, mais je n'ai jamais essayé d'appeler GetModuleHandleavec ceux-là. Le problème, cependant, est qu'ils ne seraient chargés que pour un processus 32 bits s'exécutant sur un ordinateur 64 bits, et non pour un processus 64 bits s'exécutant sur un ordinateur 64 bits.
Cody Grey

J'ai. Ils retournent 0 même sur une machine 64bit. Fait sens en fait. Ils n'existent pas pour être liés directement. Le système prend en charge la redirection lors de l'exécution.
MrPaulch

Ooh, problème cependant. Dans la documentation du SDK: "Notez que cette technique n'est pas un moyen fiable de détecter si le système d'exploitation est une version 64 bits de Windows car le fichier Kernel32.dll des versions actuelles de Windows 32 bits contient également cette fonction."
Cody Grey

7

C #, 60 50 octets

_=>System.Environment.Is64BitOperatingSystem?64:32

Merci @TheLethalCoder


1
Bienvenue sur le site! :)
DJMcMayhem

4
Économisez 4 octets si vous supprimez 'Line'
John

1
peut également supprimer «Environnement». et 'console'. en supposant l'utilisation de using static System.Environment;etusing static System.Console;
John

1
aussi, changer WriteLinepourWrite
Thomas Ayoub

7
@John La dernière fois que j'ai vérifié, les importations doivent être incluses et ajouteraient donc au nombre d'octets
Ceshion le

6

Ruby, 22 octets

p [?a].pack(?p).size*8

["any string"].pack("p")renvoie une chaîne dont les octets correspondent au pointeur pointé vers "any string", et est composée de 8 caractères si le système d'exploitation est 64 bits ou de 4 caractères si le système d'exploitation est 32 bits.


Comme il utilise la taille du pointeur, cela imprimera en 32 bits lorsque l'interpréteur Ruby est un binaire 32 bits sur un système d'exploitation 64 bits. Donc, manque une règle.
DarkDust

1
@DarkDust You can assume that users will use 64 bit software whenever possible.On supposera donc que les utilisateurs 64 bits utilisent Ruby 64 bits.
Valeur d'encre

6

R, 16 octets

.Machine[[18]]*8

Retourne la taille du pointeur.


1
Comme toutes les solutions de la taille d'un pointeur, le résultat sera incorrect si le programme est un binaire 32 bits s'exécutant sur un système d'exploitation 64 bits.
DarkDust

1
@DarkDust R est interprété et nous pouvons supposer que l'utilisateur utilise un logiciel 64 bits dans la mesure du possible, ainsi qu'un interpréteur 64 bits. IMHO, la règle s'applique uniquement aux langages compilés
NieDzejkob

@NieDzejkob C'est exactement la même logique que j'ai utilisée pour ma réponse en PHP quand quelqu'un d'autre a mis le même type de commentaire en réponse à ma réponse, j'aimerais que les autres lisent le même texte de la question que si nous supposons que les utilisateurs l'utiliseront 64- logiciel binaire si possible avec des langages interprétés.
Bja

6

Perl, 18 15 18 octets

say length pack p8

Je suis 64␤sur mon ordinateur 32 bits, car a perlété construit avec un IV 64 bits. Vous constaterez que c'est généralement le cas lorsque vous utilisez une version 32 bits de Windows.
Brad Gilbert b2gills

@ BradGilbertb2gills J'ai retourné le code à la version précédente; celui-ci devrait fonctionner même dans ce cas. Faites-moi savoir si cela ne fonctionne toujours pas, je vais supprimer ma réponse.
Grimmy

1
Cela fonctionne correctement.
Brad Gilbert b2gills

Semble mal sur HP 9000/785. Donne 32. Mais je ne pense pas qu'il y ait eu de processeurs HP / PA-RISC 32 bits.
Ole Tange

6

code machine x86, 8 octets

31 C0 B0 40 48 24 60 C3

Ungolfed:

31 c0    xor eax,eax
b0 40    mov al, 0x40
48       dec al — in 32-bit mode; "REX.W" in 64-bit mode (ignored)
24 60    and al, 0x60
c3       ret

Si compilé en tant qu'exécutable 64 bits, il renvoie 64 po eaxet s'il est compilé en 32 bits, puis 32 - quel que soit le système d'exploitation.

Cette réponse s'appuie sur les règles disant:

Vous pouvez supposer que les utilisateurs utiliseront un logiciel 64 bits autant que possible.


Bien que cette approche soit intéressante, comment peut-elle être écrite dans un programme de telle sorte qu’elle puisse réellement être exécutée? Chaque méthode que je peux penser à exécuter du code binaire autre que l' écriture de votre propre fonction de chargeur utilise des fichiers spécifiques au code 64 bits ou 32 bits. Par conséquent, vous aurez besoin de deux copies de ce code pour pouvoir exécuter ...
Jules

@Jules Vous pouvez le mettre en tant qu'assemblage en ligne dans un programme de langage de haut niveau, comme ici . Ensuite, il vous suffit d'utiliser votre compilateur natif pour la plateforme avec ses options par défaut, et vous obtiendrez le bitness.
Ruslan

@ l4m2 pourquoi criez-vous à moi? Mais vous avez raison quand même, ces deux octets semblent être des débris laissés par mes expériences. Va supprimer.
Ruslan

5

PHP, 18 octets

<?=PHP_INT_SIZE*8;

Ceci gère correctement tous les cas de processeurs 32, 64 et autres bits, à condition que PHP_INT_SIZE soit correct, il montrera la taille précise du processeur, quel que soit le processeur utilisé par PHP!

Si PHP est en cours d'exécution sur

Système d'exploitation 32 bits PHP_INT_SIZE == 4,

Système d'exploitation 64 bits PHP_INT_SIZE == 8,

Système d'exploitation 16 bits PHP_INT_SIZE == 2 (en théorie)

Système d'exploitation 8 bits PHP_INT_SIZE == 1 (encore théoriquement)

Système d'exploitation 128 bits PHP_INT_SIZE == 16 (Pas encore atteint, mais possible)


2
cette constante a la taille du système d'exploitation où PHP a été construit, et non exécutée
Einacio

2
@Einacio Oui, mais dans le défi initial, l'affiche disait "Vous pouvez supposer que les utilisateurs utiliseront un logiciel 64 bits chaque fois que cela sera possible". Par conséquent, si le système d'exploitation est à 64 bits, la version de PHP exécutée sur le système d'exploitation devra alors être supposée. être 64 bits! (Note: Je ne vois pas cela comme une échappatoire juste la pure logique basée hors du défi initial.)
BJA

4

C # (29 octets)

Console.Write(IntPtr.Size*8);

10
Comme toutes les solutions de la taille d'un pointeur, le résultat sera incorrect si le programme est un binaire 32 bits s'exécutant sur un système d'exploitation 64 bits.
DarkDust

1
Nécessité de spécifier que cela est compilé pour "AnyCPU" avec la case à cocher "Préférer 32 bits" décochée.
Cody Grey

4

PowerShell, 17 52 octets

try{32+32*((gci \*`))-or(arch)[-1]-eq52)}catch{32}

Renvoie 64 si l'une des conditions suivantes est vraie:

  • Vous avez un répertoire sur votre lecteur actuel avec un nom de fichier se terminant par une parenthèse étroite, l’idée étant de détecter Program Files (x86).
  • archretourne une chaîne se terminant par 4(ASCII 52), comme x86_64, par opposition à eg i686.

Le try-catch est destiné à contourner l'erreur que vous obtenez si gci ne renvoie rien et que vous n'avez pas d' arche . Je n'ai pas trouvé de moyen plus court de le faire jusqu'à présent. gci est utilisé sur ls car sous Linux, ls produira une erreur visible.

Cette version doit détecter si le système d'exploitation est 64 bits plutôt que simplement PowerShell et si son fonctionnement sous Windows et Linux a été testé. Pour le support Mac, remplacez archpar uname -m.

Version précédente uniquement pour Windows: -!(ls \*`))*32+64


sur quelle distribution linux cela fonctionne-t-il?
Tuskiomi

@tuskiomi Oh, mon mauvais - je vois ce que tu veux dire. Je n'ai pas lu le défi correctement. Dois-je supprimer la réponse?
Andy C.

Si vous savez que cela fonctionnera avec WINE, vous devriez le garder.
Tuskiomi

@tuskiomi Au minimum, Ubuntu 14.04, 16.04, RHEL7, CentOS7 et une version de SUSE: github.com/PowerShell/PowerShell/releases
Xudonax le

4

Swift 4 REPL / Playground, 12 octets

Int.bitWidth

Intest la taille des mots, agissant comme l'un Int32ou l' autre ou Int64selon le système.


N'est-ce pas un code-snip, alors il devrait imprimer? Ou est-ce que dire que vous utilisez le REPL contourne cette restriction?
Lyndon White

1
Cela dépend des juges. L'utilisation de REPL n'est pas très courante, mais les espaces de jeux Swift sont très populaires (en particulier sur iPad). Personnellement, je pense que c'est un jeu juste. Les gens conçoivent des langages de programmation personnalisés pour le golf qui impriment implicitement des valeurs, et ce n'est pas différent
Alexander

4

Ruby, 10 octets

p 0.size*8

Bien que Ruby puisse utiliser des nombres entiers de toutes les longueurs, il stocke en interne les valeurs qui entrent dans un mot machine en tant que Fixnum. La méthode Fixnum#sizeretourne toujours la longueur en octets d'un mot machine.

La Fixnumclasse a été supprimée dans Ruby 2.4.0, ses fonctionnalités ont été incluses dans la classe Integer. Le code est valide.


4

Shell, 26 octets

uname -m|awk \$0=/_/?64:32

Vous pouvez utiliser arch au lieu de uname -m.
Dennis

1
@ Dennis Pas nécessairement. Sur macos: uname -m-> x86_64, mais arch-> i386. Parce que macos :( En outre, ceci est spécifique à bash - échoue sous zsh.
viraptor

@StevenPenny zshessaiera d'interpréter le ?caractère générique glob / single.
Poignée de porte

Est-ce que cela fonctionne sous Windows?
Ajasja

1
@Ajasja avec Cygwin
Steven Penny

4

Bash, 25 17 octets

getconf LONG_BIT

Merci à Dennis pour son aide au golf.


4

C, 22 octets

f(){return(int**)0+8;}

Ceci est une réponse basée sur la taille du pointeur qui suppose un binaire natif. Le 0est jeté sur int**(adresse0x0 ). Ensuite, nous ajoutons 8 à 0, qui, dans C, avance le pointeur de sizeof(int*)*8. 4 octets * 8 bits = 32, 8 octets * 8 bits = 64. Nous obtenons donc (int**)0x20et 0x40qui sont ensuite implicitement convertis en entiers en les renvoyant de manière impliciteint convertis en qu'entiers fonction de restitution .

C, autonome, 34 octets

main(){printf("%d\n",(int**)0+8);} 

C, amusant avec Unicode, 30 points de code, 34 octets (UTF-8)

main(){puts((int**)U" ㈳㐶"+1);}

J'ai essayé de comprendre comment cela fonctionne, mais je ne comprends pas. Pouvez-vous ajouter une explication?
NieDzejkob

@jbcreix clever ...
NieDzejkob

3

Java, 50 octets

int b(){return com.sun.jna.Native.POINTER_SIZE*8;}


Est-ce une bibliothèque? Si oui, vous devriez le mentionner! Je ne vois pas cette classe disponible dans le JDK 8 d’Oracle (je n’ai pas mes JDK 6 et 7 habituels à ma disposition, atm).
Olivier Grégoire

2
Cette réponse est invalide. Ça n'imprime pas.
Philipp

6
Citer Dennis:> Il est également indiqué que les règles de golf de code habituelles s’appliquent, et que le retour d’une fonction fait partie de nos valeurs par défaut pour les E / S.
Asu

Changez-le en une fonction lamba pour moins d'octets:()->com.sun.jna.Native.POINTER_SIZE*8
Ferrybig

3

PHP, 29 octets

<?=@php_uname(m)[-1]-4?32:64;

https://3v4l.org/Y6JXv


Ooh. J'aime celui la. Comment ça marche?
Tuskiomi

4
php_uname('m')retourne x86_64sur un système d'exploitation 64 bits, sinon quelque chose comme i386. 4étant le 6e caractère (5 0 indexées) de la chaîne, '4' - 4 == 0 == false. Et @supprime simplement les avertissements pour les chaînes sans guillemets et les décalages non initialisés.
Petah

2
Ceci détecte l'architecture de PHP, pas celle du système d'exploitation. J'exécute PHP 32 bits sur un Windows 64 bits, php_uname('m')retourne 'i586'.
Gras Double

@GrasDouble et bien je suppose que ymmv, je travaille pour moi avec Windows NT USER-PC 10.0 build 15063 (Windows 10) AMD64.
Petah

1
@tuskiomi cela affichera 64 s'il y a un système d'exploitation 8 bits
Bja

3

Python 3 , 77 84 71 59 octets

-13 octets, grâce à @JonathanAllan!
Jusqu'à 59 par @Clearer

from platform import*;print({'4':64,'6':32}[machine()[-1]])

Essayez-le en ligne!

Mon premier jeu de code temporel :)
Devrait produire la version correcte même lors de l'exécution de 32Bit-Python sur un système d'exploitation 64 bits.
En supposant que platform.machine()donne i*86ou x86pour 32Bit-OS. Je n'en ai pas pour vérifier cela. La sortie est 0lorsque le système d'exploitation n'est pas en 64 / 32Bit
Édition: instruction d'impression ajoutée, donc 7 octets plus


Vous ne savez pas si cela est acceptable, car il est possible d’exécuter un système d’exploitation 32 bits sur une machine 64 bits (ou d’avoir une machine appelée a foo8664 bits: p), mais si cela est acceptable, vous pouvez enregistrer 9 (édition .. .13!) Octets avec print((a==64)*a+32*(a==86)).
Jonathan Allan

from platform import*;print({'4':64,'6':32}[machine()[-1]])fonctionnerait aussi.
Clearer

@Clearer Cela manquerait la contrainte suivante: Important: Imprimez toute autre chaîne de caractères alphanumériques non vide si ce n'est ni 32 ou 64 bits. .
tOmAtE

@tOmAtE s'il ne s'agit ni de 32 ni de 64 bits, il lève une exception, qui affiche une chaîne non vide.
Clearer

2
Essayez architecture (), enregistre le dict: from platform import*;print(architecture()[0][:2])-> 50 octets
bugmenot123
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.