Pour les fans de nandgame: veuillez également essayer DPD en décimal dans les portes logiques !
Contexte
La décimale dense (DPD) est un moyen de stocker efficacement les chiffres décimaux en binaire. Il stocke trois chiffres décimaux (000 à 999) sur 10 bits, ce qui est beaucoup plus efficace que BCD naïf (qui stocke un chiffre sur 4 bits).
Notations
- Les lettres minuscules
a
ài
sont les bits copiés dans la représentation décimale. 0
et1
sont les bits exacts dans les modèles de bits d'entrée ou de sortie.x
les bits sont ignorés dans la conversion.
Table de conversion
Ce qui suit est la table de conversion de 10 bits de DPD à trois chiffres décimaux. Chaque chiffre décimal est représenté en binaire 4 bits (BCD). Les deux côtés sont écrits de gauche à droite du chiffre le plus significatif au moins.
Bits => Decimal (Digit range)
a b c d e f 0 g h i => 0abc 0def 0ghi (0-7) (0-7) (0-7)
a b c d e f 1 0 0 i => 0abc 0def 100i (0–7) (0–7) (8–9)
a b c g h f 1 0 1 i => 0abc 100f 0ghi (0–7) (8–9) (0–7)
g h c d e f 1 1 0 i => 100c 0def 0ghi (8–9) (0–7) (0–7)
g h c 0 0 f 1 1 1 i => 100c 100f 0ghi (8–9) (8–9) (0–7)
d e c 0 1 f 1 1 1 i => 100c 0def 100i (8–9) (0–7) (8–9)
a b c 1 0 f 1 1 1 i => 0abc 100f 100i (0–7) (8–9) (8–9)
x x c 1 1 f 1 1 1 i => 100c 100f 100i (8–9) (8–9) (8–9)
Tâche
Convertissez 10 bits de DPD en 3 chiffres décimaux.
Cas de test
DPD Decimal
0000000101 005
0001100011 063
0001111001 079
0000011010 090
0001011110 098
1010111010 592
0011001101 941
1100111111 879
1110001110 986
0011111111 999
1111111111 999 * Output is same regardless of the `x` bits
Contribution
Le format d'entrée par défaut est une liste de 10 bits. Les bits doivent suivre l'ordre exact ci-dessus, ou l'inverse. Vous pouvez choisir d'utiliser une chaîne équivalente ou une représentation entière à la place. Contrairement à mes autres défis, la réorganisation ou l'utilisation de structures imbriquées n'est pas autorisée .
Pour l'entrée [1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
, les formats suivants sont autorisés:
- Liste de bits:
[1, 1, 0, 0, 0, 1, 0, 1, 0, 0]
- Chaîne:
"1100010100"
- Entier binaire:
788
ou0b1100010100
- Entier décimal:
1100010100
- Inversé:
[0, 0, 1, 0, 1, 0, 0, 0, 1, 1]
et inversé dans tous les autres formats ci-dessus
Les formats suivants ne sont PAS autorisés:
- Réorganisation arbitraire des bits:
[0, 0, 0, 0, 0, 1, 1, 1, 0, 1]
- Structures imbriquées:
[[1, 1, 0], [0, 0, 1], [0, 1, 0, 0]]
ou[0b110, 0b001, 0b0100]
Sortie
Le format de sortie par défaut est une liste de 3 chiffres décimaux. Chaque chiffre doit être représenté de 0 à 9, soit un entier soit un caractère. Comme en entrée, vous pouvez choisir une représentation sous forme de chaîne ou d'entier. Si vous choisissez une représentation entière, les zéros non significatifs peuvent être omis.
Critère de notation et de victoire
Les règles de code-golf standard s'appliquent. Le programme ou la fonction la plus courte en octets pour chaque langue gagne.
la source
Python 3 ,
229 ... 9796 octetsEssayez-le en ligne!
-4 octets par @xnor
-6 octets par @nwellnhof
Formaté:
Explication
Parce que je voulais à l'origine l'implémenter dans Jelly, j'adopte une approche différente de la plupart des réponses ici, qui est simple et peut-être adaptée à un langage de golf. Bien que la fonction golfed prenne un entier, laissez l'entrée sous forme de liste de bits
[a0,a1,...,a9]
. Ensuite, nous pouvons dériver trois valeurs de l'entrée[a2,a5,a9]
: ce seront toujours les bits bas de[d0,d1,d2]
respectivement.[2*a0a1,2*a3a4,2*a7a8,8]
: les bits hauts de chaque chiffre seront l'un d'entre eux.[a3,a4,a5,a7,a8]
déterminant comment obtenir les bits hauts de chaque chiffre. Nous calculons l'indicateur (entre 1 et 8) comme suit:Ensuite, le nième chiffre peut être calculé avec élégance comme
high_bits[arr[indicator][n]] | low_bits[n]
dans le tableau ci-dessous, qui est compressé en une chaîne.la source
b"..."
pour remplacer la conversion parord
.b"$>6;-/'?"[a&8and(~a&6or a>>4&6|1)]
enregistre quatre autres octets.JavaScript (Node.js) ,
126119117 117112111 octetsEssayez-le en ligne!
-5 octets merci @tsh (et 2 par moi-même) Donc, je
l
peux faire plus d'efforts que prévu.-2 octets de plus en utilisant la technique de @ tsh!
-5 octets merci @Arnauld
-1 octet merci @Neil
Entrée sous forme de liste de 10 bits (sous forme de 10 arguments), sortie sous forme de liste de 3 chiffres.
la source
(!i|!d|e)
->i+l!=5
;(d|e|!h)
->h+l!=1
(g?h-i|h&!e?h?b:e:8:h*4+i*2)
->(g?h<i?e:h>i*e?b:8:h*4+i*2)
enregistre un autre octet. (J'ai vérifié cette fois ...)C (gcc) ,
138129 octetsEssayez-le en ligne!
Extrait d'abord quelques bits en variables
s
ett
, afin que les huit lignes de la table de conversion puissent être identifiées par:Ensuite, configure
u
etv
avec des divisions (décalages à droite), de sorte queu
,v
et l'entréew
contient les trois bits BCD inférieurs aux positions 0-2. Le reste est un peu aléatoire selons
ett
. Deux astuces notables sont:Un portage de la solution Javascript de Shieru Asakoto ne fait que 124 octets :
Essayez-le en ligne!
la source
f(b){int a=b/2%8,e=b&110,c=b/16,d=c/8;b=10*(10*(d%2|(6>a|78==e?d:8))+c%2+(3<a&a%2?e-46?8:d&6:c&6))+b%2+(4>a?b&6:a-5?a-6&&e-14?8:d&6:c&6)};
Ruby ,
153 ... 119117 octetsEssayez-le en ligne!
Comment ça marche:
C'est le point de départ: convertir en BCD en décalant de 3 bits vers la gauche, ce qui fonctionne pour la plupart des motifs.
Obtenez les bits du milieu de chaque quartet (et un bit supplémentaire du troisième quartet, mais masquez le bit le moins significatif).
Si le troisième chiffre est inférieur à 10 (inférieur à 9 car nous ne nous sommes jamais souciés du LSB de toute façon), nous sommes définis: c'est du BCD simple, nous pouvons sortir l'hex sans rien changer
Sinon, faites de la magie noire en déplaçant les bits et en ajoutant des nombres magiques jusqu'à ce que nous obtenions le résultat que nous voulons.
la source
Retina 0.8.2 ,
191181 octetsEssayez-le en ligne! Le lien inclut des cas de test. Edit: enregistré 10 octets en ne remplissant pas les chiffres à 4 bits, sauf si nécessaire. Explication:
Insérez des séparateurs afin que chaque chiffre puisse être converti en décimal séparément. Cela gère efficacement les deux premiers cas dans la table de conversion.
Gérez le dernier (huitième) cas dans la table de conversion.
Gérez les sixième et septième cas dans la table de conversion.
Gérez le cinquième cas dans la table de conversion.
Gérez les troisième et quatrième cas dans la table de conversion.
Effectuez une conversion binaire en décimale.
la source
Gelée ,
51484039 octetsEssayez-le en ligne!
Algorithme
À l'exception des index de liste, tous les entiers de cette section sont écrits en binaire.
Étant donné l'entrée , nous construisons d'abord les tableaux , et .α βγδε ζηθ ι κ [ ηη, θ ι , δε ] [ α β, δε , θ ι ] [ γ, ζ, κ ]
Code
la source
Python 2 , 157 octets
Essayez-le en ligne!
la source
Nettoyer ,
238... 189 octets-2 octets grâce à Neil
Essayez-le en ligne!
Prend une «liste» de 10 bits sous la forme de 10 arguments, en utilisant une formule directe pour calculer le résultat.
la source
i*(9*e+19*d+i*...)
, cette secondei*
semble inutile.Perl 5, 195 octets
Essayez-le en ligne
Je sais que 195 octets, c'est beaucoup trop pour ce concours, mais je ne savais pas comment compresser davantage le code Perl. Suggestions?
Explication du code
Dans une version plus lisible, l'intention du code devrait devenir évidente:
Dans les règles de codage DPD, chaque ligne est codée en une valeur de 18 bits, segmentation en (6,6, (2,2,2)) bits.
@p
pour les séquences de 3 bits qui doivent être épissées en bits 11-9, 7-5 et 3-1 du résultat.@p
est construit à partir des bits 9-8, 6-5, 3-2 de l'entrée et du nombre en8
tant que quatrième membrePar exemple, le premier nombre de la liste,
16390
qui est100000000000110
un champ de bits, contient les informations suivantes:la source
05AB1E , 84 octets
Réponse du port de KimOyhus au 05AB1E.
Essayez-le en ligne!
Explication grossière:
la source
05AB1E ,
104103101 octetsCertainement pas la bonne langue pour ce genre de défi, mais ah bien ..
Entrée sous forme de chaîne, sortie sous forme de liste de trois chiffres.
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Nous avons les huit scénarios suivants à considérer:
J'ai d'abord divisé l'entrée (implicite) en morceaux de taille
[2,1,2,1,3,1]
et stocke cette liste dans le registre:Voir cette astuce de mes 05AB1E (section Comment compresser les grands entiers? ) Pour comprendre pourquoi
•3γã•
est212131
Maintenant, nous allons d'abord construire les 0 et les 1 pour le premier chiffre de la sortie. Utilisation des scénarios 1,2,3,7
'0'+1st+2nd
; et les scénarios 4,5,6,8 utilisent'100'+2nd
:Ensuite, nous allons construire les 0 et les 1 pour le deuxième chiffre de la sortie. Utilisation des scénarios 1,2,4
'0'+3rd+4th
; utilisation des scénarios 3,5,7,8'100'+4th
; et le scénario 6 utilise'0'+1st+4th
:Ensuite, nous allons construire les 0 et les 1 pour le troisième chiffre de la sortie. Scénarios 1,2 utilisation
5th+6th
; utilisations du scénario 3'0'+3rd+6th
; scénarios 4,5 utilisation'0'+1st+6th
; et les scénarios 6,7,8 utilisent'100'+6th
:Maintenant, nous avons tous les 0 et les 1 sur la pile, nous pouvons donc les convertir en trois chiffres de sortie:
la source