Différence BCD
Étant donné un entier n, convertissez-le en BCD ( décimal codé binaire ) en remplaçant chaque chiffre décimal par sa représentation binaire à 4 chiffres
234 -> 0 0 1 0 0 0 1 1 0 1 0 0
Faites ensuite pivoter la liste des chiffres binaires afin de trouver les plus grands et les plus petits nombres, représentables par cette liste sans autres réarrangements.
max: 1 1 0 1 0 0 0 0 1 0 0 0 (the entire list rotated left 6 times)
min: 0 0 0 0 1 0 0 0 1 1 0 1 (the entire list rotated right 2 times)
Convertissez ces nombres en décimal, en traitant la liste de bits comme un binaire normal et soustrayez le plus petit du plus grand:
1 1 0 1 0 0 0 0 1 0 0 0 -> 3336
0 0 0 0 1 0 0 0 1 1 0 1 -> 141
3336 - 141 -> 3195
La sortie est la différence entre le plus grand et le plus petit nombre trouvé.
Cas de test:
234 -> 3195
1234 -> 52155
12 -> 135
975831 -> 14996295
4390742 -> 235954919
9752348061 -> 1002931578825
la source
Max@#-Min@#&
enregistre un octet. droite?Max@#-Min@#&[#~FromDigits~2&/@Partition[s=Join@@(i=IntegerDigits)[i@#,2,4],Tr[1^s],1,1]]&
89 octets ET efficaces. bon sang cet octet!1-9,10-99,100-999...
voici quelques zooms différents: imgur.com/RXLMkcoGelée , 13 octets
Essayez-le en ligne!
Comment ça fonctionne
la source
Python 3 ,
115108 octetsmerci à Jonathan Frech pour -7 octets
Essayez-le en ligne!
la source
PowerShell , 153 octets
Essayez-le en ligne!
De longs appels .NET stupides pour convertir vers / à partir de binaires gonflent vraiment la longueur ici. ;-)
Nous prenons l'entrée comme
$args
, l'enveloppons dans une chaîne, puis lachar
convertissons en un tableau. Nous faisons une boucle sur chaque chiffre,convert
ing le chiffretoString
dans la base2
(c'est-à-dire, en transformant le chiffre en un nombre binaire), puis.padLeft
en en faisant un nombre binaire à quatre chiffres. Ce tableau de chaînes résultant est ensuite-join
édité en une seule chaîne et retransmis en tant quechar
tableau avant d'être enregistré dans$b
.Ensuite, nous bouclons
$b
, ce qui garantit que nous bouclons suffisamment de fois pour tenir compte de chaque rotation. Chaque itération, nous décollons le premier caractère$x
et les caractères restants pour$y
utiliser plusieurs affectations. Ensuite, nous les fusionnons à nouveau$b=$y+$x
pour déplacer le premier élément à la fin, c'est-à-dire en faisant tourner efficacement le tableau de un. C'est-join
ed dans une chaîne, qui est utilisée comme entrée de l'convert
appel pour transformer la chaîne de la base binaire2
en unInt64
. Nous avons ensuitesort
tous ces nombres résultants et les stockons dans$c
. Enfin, nous prenons le plus grand[-1]
et soustrayons le plus petit[0]
. Cela reste sur le pipeline et la sortie est implicite.la source
Ohm v2 , 15 octets
Essayez-le en ligne!
Explication:
la source
JavaScript (ES6),
11810099 octetsEdit: enregistré 11 octets grâce à @RickHitchcock. 1 octet enregistré grâce à @ETHproductions. Explication: Le
0x1
préfixe fait que l'entrée est analysée comme un nombre hexadécimal, dont le binaire est le même que le BCD du numéro d'origine avec un préfixe 1 (je pense que c'est plus golfique que toute autre façon de remplir un multiple de 4 chiffres) . En excluant le préfixe, qui est changé de 1 à 0, la chaîne résultante est ensuite tournée à chaque position possible et convertie du retour binaire en décimal. Enfin, le maximum et le minimum sont soustraits.la source
.join``
dans ce cas, vous avez besoin de triple backticks etc.n=>(g=m=>Math[m](...[...s=(+`0x1${n}`).toString(2).slice(1)].map(_=>`0b${s=s.slice(1)+s[0]}`)))`max`-g`min`
slice
aussi!m=>Math[m]
astuce est géniale. Peut-être changer(+`0x1${n}`)
à('0x1'+n-0)
ou similaire?Python 2 ,
115113 octetsEssayez-le en ligne!
la source
Pyth , 29 octets
Essayez-le ici!ou Découvrez la suite de tests.
la source
Décortiquer , 18 octets
Essayez-le en ligne!
Il devrait y avoir un moyen plus court de convertir un chiffre en sa représentation binaire 4 bits ...
Explication
la source
APL (Dyalog) , 31 octets
Corps du programme complet. Demande le numéro de STDIN. Imprime le résultat vers STDOUT.
Essayez-le en ligne!
⍞
invite pour la ligne de texte de STDIN⍎¨
exécuter (évaluer) chacun (caractère)(
…)⊤
Encoder (anti-base) dans le système de numérotation suivant:4/2
quatre bits binaires⍉
transposer,
défiler (aplatir)b←
stocker dansb
(pour b inaire)⊂
joindre (afin que nous utilisions toute cette liste pour chaque rotation)(
…)⌽¨
Tourner (à gauche) de chacun des montants suivants:≢b
longueur deb
⍳
les indices de cela2⊥¨
décoder chacun de la base-2.(
…)
Appliquer la fonction tacite suivante à ce⌈/
le max (-réduction)-
moins⌊/
le min (-réduction)la source
APL (Dyalog) ,
3734 octetsEssayez-le en ligne!
la source
Gelée , 21 octets
Essayez-le en ligne!
la source
Rubis ,
9691 octetsEssayez-le en ligne!
la source
Mathematica,
11099 octetsEssayez-le en ligne!
la source
Python 3, 141 octets
Essayez-le en ligne
la source
Rétine ,
9689 octetsEssayez-le en ligne! Un peu lent, donc le lien ne comprend qu'un petit cas de test. Edit: 7 octets enregistrés grâce à @MartinEnder. Explication:
Préfixez trois
@
s à chaque chiffre. (Ceux-ci représentent les0
s du BCD, mais sont plus golfeurs.)Remplacez le
@
s par_
s (représentant le1
s du BCD) le cas échéant.Fixez le dernier chiffre du BCD.
Générez toutes les rotations.
Triez-les par ordre croissant.
Convertissez-les en unaire.
Soustrayez le premier du dernier nombre, en ignorant les nombres intermédiaires, et convertissez-les en décimal.
la source
%
la conversion binaire en unaire et vous pouvez économiser quelques octets de plus en utilisant d'autres caractères que0
et1
pour le binaire: tio.run/##K0otycxL/…Haskell , 130 octets
Essayez-le en ligne!
Explication / Non golfé
Puisque nous allons utiliser
foldl1((+).(2*))
pour convertir du binaire en décimal, nous pourrions aussi bien ne pas utilisermaximum
etminimum
mais plutôtfoldl1 max
(ou même avecmin
respectivement) et utiliser un courtr = foldr1
.Maintenant, définissons un opérateur
f#x
qui convertitx
en BCD, génère toutes les rotations, réduisons celles-ci en utilisantf
et convertissons-le en décimal:Il ne reste plus qu'à utiliser cet opérateur une fois avec
max
et une fois avecmin
et à soustraire leurs résultats:la source
PHP,
156153 octetsEssayez-le en ligne!
la source
Japt
-x
, 20 octetsEssayez-le en ligne!
Entrez sous forme de tableau de chiffres.
Explication:
la source
-x
indicateur pour enregistrer 2 octets.Pyth, 24/26 octets
Prend l'entrée comme une chaîne entre guillemets. 26 octets s'il doit prendre l'entrée comme un entier; annexer
dz
dans ce cas.Cas de test (entrée sous forme de chaînes, 24 octets)
Cas de test (entrée sous forme de nombres, 26 octets)
la source
J, 43 octets
Essayez-le en ligne!
Parfois, le style tacite rend les choses difficiles. Mais il y a probablement un moyen de le faire tacitement qui est beaucoup plus concis que cela. Je pense que je me souviens d'une meilleure façon de diviser un nombre en chiffres autres que
"."0@":
mais je n'arrive pas à m'en souvenir ...Explication
Le préfixe et la suppression de 8 visent à garantir la présence du bon nombre de zéros (J remodèlera ses tableaux pour qu'ils correspondent à la taille de leur élément de longueur maximale, et 8 correspond à 4 chiffres en binaire, il est donc utilisé).
la source
APL (NARS), 34 caractères, 68 octets
un petit test:
la source
Perl 5 ,
979189 + 2 (-F
) =999391 octetsEssayez-le en ligne!
la source