Contexte :
Vous avez été chargé de convertir des nombres de base 10 en base 2 sans utiliser de fonctions de conversion de base prédéfinies. Vous ne pouvez pas non plus utiliser de bibliothèques importées.
Problème :
Convertissez une chaîne d'entrée de la base 10 (décimale) en base 2 (binaire). Vous ne pouvez pas utiliser de code / fonctions / méthodes de conversion de base prédéfinies, ni de bibliothèques importées. Puisqu'il s'agit de code-golf , la réponse la plus courte en octets gagnera.
L'entrée sera comprise entre -32768 et 32767 (incluez la gestion des octets de signe dans votre code)
the MSB of signed variables controls if they are negative
- cela ressemble à du bit de signe, mais comme la gamme le-32768..32767
suggère, vous voulez un complément à 2. Alors que voulez-vous? ..Réponses:
GolfScript - 17 octets
Pas trop verbeux que le intégré
~2base
.la source
~
"37"
, par exemple, l'opération"37" & 1
(en infixe) est une opération par ensemble. L'~
avant convertit l'entrée en un entier.10
sur la pile, il n'est pas nécessaire de l'évaluer. Cependant, lors de la lecturestdin
, l'entrée sera une chaîne ( testez ici ). La description du problème indique également explicitement que l'entrée est une chaîne.JavaScript, 46
la source
>>>=
) existait! +1 (En outre, si vous l'exécutez dans la console, vous pouvez enregistrer les 9 derniers caractères.)x=8; x>>>=1; x;
etx=8; x>>>1; x;
- dans le premier cas, la valeur de x a changé; dans le second, ce n'est pas le cas.>>>=
est un opérateur unique .Brainf * ck,
9877Évidemment, ce n'est pas dans le but de gagner, mais que serait une compétition si elle n'avait pas de solution brainfk
Étant donné que brainfk ne peut gérer que des entiers 8 bits et aucun négatif, je suppose qu'il ne respecte pas pleinement les règles, mais je n'ai jamais été là pour le gagner.
Cela fonctionne réellement pour une entrée 16 bits si votre interprète prend en charge
Je l'ai même obtenu en sortie en valeurs ascii
Voici le code annoté:
Algorithme plus court (77):
Celui-ci ne peut gérer que des entiers 8 bits.
L'algorithme fonctionne en utilisant un compteur binaire qui est en fait très court (un incrément permet de
>[->]++[-<+]-<-
disposer les bits. Le problème est qu'il est difficile d'imprimer tous les bitsCe dernier algorithme peut être adapté pour s'adapter à n'importe quel nombre de bits au détriment des octets. Pour pouvoir traiter des entiers N bits, il faut 53 + 3 * N octets pour coder.
exemples:
la source
Réponse APL obligatoire - 21
22Exemples:
la source
⎕IO←0
, et retourne un tableau de bits au lieu d'une chaîne:2|⌊⎕÷2*⊖⍳16
.Code machine de Turing, 272 octets
Comme d'habitude, j'utilise la syntaxe de table de règles définie ici. Vous pouvez le tester sur ce site ou, en variante, en utilisant cette implémentation java.
Une grande partie du code est copiée de mon convertisseur décimal-hexadécimal ici.
Compte à rebours à partir de l'entrée en base 10 tout en comptant à partir de 0 en base 2. En décrémentant zéro, il efface le bloc d'entrée et se termine.
la source
Javascript 59
la source
+x
place deparseInt(x)
Perl, 44
C'est mon tout premier programme Perl, alors pardonnez-moi si cela peut être facilement approfondi. Edit: Merci @primo d'avoir retiré 7 caractères de ma réponse.
La logique est essentiellement la même que ma précédente solution C.
Utilise également 64 bits.
la source
reverse
en construisant les arrière du tableau:@s=($x&1,@s)
.$\=$_%2 .$\while$_=$_>>1||<>;print
. Ou, si les options de ligne de commande comptent un octet chacune, 27:1while$\=$_%2 .$\,$_>>=1}{
using-p
.Javascript -
5648 et3628 caractèresMerci à @Blender d'avoir rasé 8 caractères.
Ce formulaire prend en entrée et affiche la sortie, 48 caractères:
Si juste une instruction qui met dans une variable
a
la forme binaire d'une variablex
est nécessaire (et vous ne vous embêtez pas à détruire lax
valeur comme effet secondaire), la voici avec 28 caractères:la source
Math.floor
par~~
, car la plage des nombres est petite.a=x%2+a
cela pourrait être raccourcia+=x%2
? Cela fonctionne dans toutes les langues que je connais.a=a+x%2
, mais c'est+
pour la concaténation de chaînes. C'est-à-dire que votre suggestion entraîne les chiffres dans l'ordre inverse.Python -
6160 caractèresla source
print
et""
.print
car il renvoie automatiquement le résultatC, 55 caractères
Imprime un zéro de tête supplémentaire (pour 2 octets).
La récursivité à l'intérieur
printf
inverse l'ordre d'impression, donc l'algorithme extrait les bits de droite à gauche mais imprime de gauche à droite.EDIT : a enregistré un caractère en utilisant
putchar
au lieu deprintf
.la source
Dyalog APL , 11 octets
2|
La division reste lorsqu'elle est divisée par deux de⌊
la valeur arrondie de⎕
l'entrée÷
divisée par chacun de2*
deux à la puissance de chacun de⍳16
{0, 1, 2, ..., 15}Requiert
⎕IO←0
ce qui est par défaut sur de nombreux systèmes.TryAPL en ligne!
la source
C, 81
La sortie a strictement 16 bits (y compris les zéros de remplissage)
la source
Script d'applications + Google Sheets,
147144121 octetsScénario
Feuille
Version modifiée de ce script par ZygD.
la source
Haskell, 66 octets
Appelez avec
b "-1023"
, ajoutermain=interact b
un programme complet ou essayer sur Ideon.c
effectue la conversion des entiers positifs.b r=show.c.read$r
convertit une chaîne en nombre, appliquec
et reconvertit en chaîne.b('-':r)='-':b r
supprime un début possible-
et le ré-ajoute au résultat.la source
PowerShell,
59878270 octets+28 octets pour prendre en charge les nombres négatifs.
-12 octets grâce à @ ASCII uniquement
Essayez-le en ligne!
Adapté de ce code . Prend l'entrée via un paramètre de ligne de commande
-d
.la source
APL (NARS), 17 caractères, 34 octets
Il s'agit d'une copie et d'une modification de la réponse d'Adam /codegolf//a/90107 de la façon dont on peut ajouter le paramètre pour la longueur des bits, et ⎕IO pour cette fonction (voici ⎕IO = 1) devrait n'ont aucune importance ...
il semble facile de gérer le nombre de bits de cette façon (j'ai vérifié que le dernier résultat devrait être correct)
la source
Smalltalk (Smalltalk / X), 63/78
la première version crée une chaîne intermédiaire (78):
en fait, il n'est pas nécessaire de créer la chaîne; il suffit de sortir les caractères (63):
mhmh - existe-t-il un moyen plus court de lire un nombre?
la source
Python 3.x: 65 caractères
la source
Bash, 44
Passez une valeur d'entrée au script via la variable d'environnement
n
. La représentation décimale du résultat binaire ne peut pas dépasserLONG_MAX
.Cela doit également être compatible avec
ksh93
etzsh
sib
ete
sont initialisés0
et une expansion arithmétique appropriée est utilisée.la source
n
est déjà défini, ce qui en fait un extrait. Cela pourrait être corrigé en prenant l'entrée comme argument de ligne de commande et en le définissantn
dans votre script.n=127 sh -c '...'
quesh -c 'n=$1 ...' _ 127
. Il n'y a aucune raison de préférer l'un à l'autre dans ce cas, car ils sont tous deux un moyen parfaitement typique de transmettre des valeurs.C # - 104
Cette méthode convertira les nombres décimaux en binaires jusqu'à
64
bits.Lorsqu'elle est exécutée, la méthode ci-dessus dans Linqpad - rr = p (-32768); rr.Dump ();
Production:
01111111111111111111111111111111111111111111111111000000000000000
la source
int
.Java 8,
8071 octets-9 octets en raison d'une règle dans les commentaires. Les entrées négatives en base 10 peuvent renvoyer la valeur positive / absolue en base 2 comme sortie apparemment.
Explication:
Essayez-le en ligne.
la source
Kotlin , 82 octets
Essayez-le en ligne!
la source
Petit de base , 133 octets
Un script qui entre et sort de la
TextWindow
console.Essayez-le sur SmallBasic.com Nécessite Silverlight et doit donc être exécuté dans IE.
Les E / S sont prises / données depuis la console noire.
-22 octets grâce à @Neil
la source
For i=0To c-1
?MATL ,
1517 octetsEssayez-le sur MATL en ligne
TIO
(+2 octets supprimant le premier 0 pour les nombres négatifs, le bit de signe doit être le premier bit.)
La sortie sur MATL Online doit être lue de bas en haut (MSB est en bas).
La partie principale est assez simple:
`2&\t
= alors que la valeur est supérieure à 0, divisez par 2 et accumulez les restes.Gérer les nombres négatifs et leur donner la représentation du complément à 2 était la partie délicate. En fin de compte, je suis allé avec le " soustraire de2N "méthode pour obtenir le complément d'un deux. Comme nous ne sommes tenus de gérer que les valeurs jusqu'à -32768, pour les nombres négatifs, le code crée 216= 65536 avec
16W
, ajoute l'entrée à cela (par exemple 65536 + (-42)), ce qui donne quelque chose que MATLAB voit comme un nombre positif mais représente la représentation binaire signée de l'entrée sous forme de 16 bits.la source
C (gcc) ,
5043 octets-7 octets grâce au plafond .
Essayez-le en ligne!
la source
PowerShell , 43 octets
Essayez-le en ligne!
la source
> <> ,
3433 octetsEssayez-le en ligne!
la source