Codes à barres de 4 états
De nombreux services postaux (Royal Mail UK, Postes Canada, US Mail, etc.) utilisent un code-barres à 4 états pour coder les informations relatives à leur courrier. Rendu en ASCII, cela peut ressembler à ceci:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Un code à barres à 4 états est une rangée de barres. Chaque barre peut être étendue vers le haut, vers le bas ou les deux, offrant ainsi 4 possibilités. Cela signifie que chaque barre représente essentiellement un chiffre de base 4:
| | Bar: | | | | | | Chiffre: 0 1 2 3
Le problème de cette symbologie est qu’il s’agit d’un code à barres différent, valide et inversé: il change radicalement la signification si l’orientation est incorrecte. Par conséquent, une séquence de démarrage et une séquence d' arrêt sont normalement implémentées afin que l'analyseur puisse calculer dans quel sens il est censé être lu.
Pour les besoins de ce défi, nous utiliserons la séquence de démarrage / d'arrêt spécifiée par Australia Post: chaque code à barres commence et se termine par une 1 0
séquence.
Le défi
Votre tâche consiste à écrire un programme ou une fonction qui, à partir d’un entier positif N
, le convertit en code à barres ASCII à 4 états, chaque barre (à l’exception des séquences de démarrage / arrêt) représentant un chiffre dans la représentation en base 4 de N
.
Exemple:
Compte tenu de l'entier 19623
, il faudrait d' abord le convertir à sa représentation de base 4, 10302213
.
Nous pourrions ensuite mapper chaque chiffre sur la barre correspondante:
1 0 3 0 2 2 1 3 | | | | | | | | | | | | | | | |
Enfin, nous ajouterions les séquences start / stop:
Début Fin: 1 0 1 0 | | | | | | | | | | | | | | | | | | | | | |
Le code à barres résultant doit être la sortie du programme.
Règles:
- L'entrée sera un entier positif, compris dans la plage de la taille de l'entier standard de votre langue.
- Le résultat:
- Peut être soit une liste de lignes, soit une chaîne contenant des nouvelles lignes.
- Peut contenir des sauts de ligne ou des espaces, tant que la forme reste intacte.
- Doit montrer le code à barres avec le format ci-dessus - il doit utiliser le caractère de pipe (
|
) et le caractère d'espacement () pour dessiner des barres, et il devrait y avoir un espace entre chaque barre verticale.
- C'est du code-golf , donc le programme le plus court (en octets) gagne!
Cas de test
4095:
| | | | | | | | | | | | | | | | | | | | | | | |
4096:
| | | | | | | | | | | | | |
7313145:
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
la source
Réponses:
Python 3 ,
1039996 octetsEssayez-le en ligne!
la source
MATL ,
34302928 octetsEssayez-le en ligne!
Explication
la source
Gelée ,
1615 octetsEssayez-le en ligne!
Comment ça marche
la source
.......
mais chaque point représente un octet différent.Gelée , 19 octets
Essayez-le en ligne!
-1 merci à M. Xcoder .
la source
Octave ,
78 77 75 74 7069 octetsEssayez-le en ligne!
Contrairement à l'approche originale, celle-ci utilise une simple table de correspondance pour mapper les valeurs en base 4 sur leur équivalent binaire. La table de recherche ajoute également l'espacement entre chaque barre en ajoutant un zéro entre chaque nombre (ce qui correspond à une barre de tous les espaces).
La table de recherche mappe directement aux barres en tant que:
La conversion de binaire en
|
etest maintenant effectuée par indexation dans une chaîne de ces deux caractères - essentiellement le même principe que la table de conversion pour la conversion binaire.
* Enregistré 1 octet, merci @LuisMendo
Original:
Essayez-le en ligne!
Fonction anonyme qui renvoie le code à barres sous forme de chaîne.
Ceci est basé sur le fait que si nous ajoutons 4 aux chiffres base4, alors nous pouvons représenter bar / espace par le nombre converti en binaire avec les bits 1 et 2 échangés:
Le plus délicat dans une perspective de golf est d' ajouter les espaces entre les barres et la conversion de
0/1
à'|'/' '
.la source
JavaScript (ES6),
898783 octetsCas de test
Afficher l'extrait de code
Comment?
NB : Dans la version ci-dessous, les littéraux de modèle ont été remplacés par des chaînes standard afin que le code puisse être mis en retrait correctement.
la source
R ,
154109 octetsEssayez-le en ligne!
Sauvegardé de nombreux octets en indexant et en utilisant
cat
plutôt que de construire une matrice et en utilisantwrite
, ainsi que 6 à partir d'une conversion légèrement différente en base 4. Imprime avec un espace de début dans chaque ligne et aucune nouvelle ligne.L'indexation s'effectue à l'aide d'une arithmétique modulaire, pas très différente d'autres réponses, mais puisque R utilise une indexation basée sur 1, l'arithmétique est quelque peu différente.
Explication:
la source
Charbon de bois , 50 octets
Essayez-le en ligne! Le lien est vers la version verbeuse du code. Explication:
Entrez un nombre.
Poussez la séquence d'arrêt sur la liste vide prédéfinie.
Si le nombre est positif,
appliquer plusieurs fois divmod pour le convertir en base inversée 4,
sinon, il suffit de le pousser.
Poussez la séquence de démarrage à la liste.
Carte sur trois chaînes. Chaque chaîne représente la traduction du code à barres pour les chiffres
0123
de chaque ligne.Carte sur les chiffres (inversé dans l'ordre habituel), convertissez-les en barres ou en espaces en utilisant la traduction, puis joignez les résultats en trois chaînes qui sont ensuite implicitement imprimées sur des lignes séparées.
la source
Japt ,
32 à31 octetsTestez-le en ligne!
Pas vraiment satisfait de ça pour l'instant, mais c'est un début ...
Explication
la source
Haskell ,
9190 octetsEssayez-le en ligne! Retourne une liste de lignes.
Alternative de même nombre d'octets pour la première ligne:
la source
J ,
57 4947 octets10 octets grâce à FrownyFrog!
Comment ça marche:
1 0,4&#.inv,1,0:
- convertit le numéro en une liste de chiffres en base 4, ajoute 1 0 au début et à la fin de la liste((#:2 6 3 7){' |')
- table de consultation pour le chiffrement, binaire 0 correspondant à l'espace, 1 à '|'{~
- chiffre le chiffre de base 4 en sélectionnant une chaîne dans la table de recherche ci-dessus (argument inversé)|:
- transpose le tableau résultant de 3 colonnes en 3 lignes[:
- ferme la fourche,.2{."0
- met des espaces entre les barresEssayez-le en ligne!
la source
APL + WIN, 63 octets
Explication:
la source
Python 2 ,
116114 octets-2 octets grâce à notjagan
Essayez-le en ligne!
la source
05AB1E , 19 octets
Essayez-le en ligne!
C'est un demi-port de l'approche de Dennis, qui est juste un octet plus court que la méthode que j'ai utilisée auparavant (et dont je suis assez content):
05AB1E , 20 octets
Essayez-le en ligne!
Comment ça marche?
J'ai demandé Adnan (le créateur de 05AB1E) à propos de la grille thingy dans le chat , qui m'a aidé à sauver 2 octets, en signalant une caractéristique de 05AB1E: lors de l' adhésion des listes multi-dimenisional par de nouvelles lignes, les listes internes sont jointes à l' aide des espaces trop ,
ðý
est donc inutile.la source
APL (Dyalog Classic) , 33 octets
Essayez-le en ligne!
la source
2⊥⍣¯1
comment obtenir une liste binaire?2⊥⍣¯1
l'inverse ("avers"?) De "deux décodages". Il code en binaire avec autant de bits que nécessaire.J ,
42 4039 octetsRasé 2 octets grâce à Dennis. 1 octet grâce à ngn.
Essayez-le en ligne!
Comment ça marche
la source
JavaScript (ES6) 79 octets
Utilise .toString pour convertir le nombre en base 4, puis pour traiter une ligne avec chaque ligne et au niveau du bit OU pour générer la sortie ligne par ligne. Affiche une liste de lignes.
la source
`10${n.toString(4)}10`
:)Bash + coreutils,
7167 octetsEssayez-le en ligne!
Explication
Le
dc
bit est converti en base 4, en ajoutant et en ajoutant un4
(se transforme10
en sortie) et en utilisantn
pour tout conserver sur une seule ligne.Le reste se passe dans
sed
:la source
x
les espaces de maintien / motif autour pour les modifier et ensuite faires
tout en même temps, et rien n'a été plus court.Retina , 83 octets
Essayez-le en ligne! Link inclut les cas de test les plus rapides. Explication:
Convertir en unaire.
Convertir en base 4 sous forme de nombres unaires séparés par
;
s.Prévoyez la séquence de démarrage.
Ajoutez a
;
, en le transformant en un terminateur de chiffres plutôt qu'en un séparateur et la séquence d'arrêt.Convertir en décimal, mais en ajoutant 1 à chaque chiffre.
Tripliquez-le.
Sur la première ligne,
1
s et3
s (représentant0
s et2
s) deviennent des espaces.Sur la dernière ligne,
1
s et2
s (représentant0
s et1
s) deviennent des espaces.Tous les autres chiffres deviennent des barres.
la source
Pip ,
3331292726 octets25 octets de code, +1 pour le
-S
drapeau.Essayez-le en ligne!
Explication
Nous observons un motif dans les quatre types de barres:
Alors:
la source
SOGL V0.12 , 28 octets
Essayez-le ici!
la source
C (gcc) , 176 octets
Essayez-le en ligne!
Un peu moins terriblement formaté (moins joué au golf):
Explication
Considérons d’abord le code suivant pour lire un entier et sortir la version de base 4:
Ceci utilise la récursion de la queue pour inverser l'ordre de la sortie. Chaque étape récursive décale de 2 bits (coupe les 2 derniers bits et divise par 4). Il émet le résultat masqué avec 3 (0b11), qui n’affiche que les deux derniers bits, soit le dernier chiffre de la base 4.
L'appel de fonction est inclus dans l'
printf
argument final (il n'est pas imprimé, mais il est évalué) pour éviter d'avoir à utiliser {} (+2 octets) pour grouper l'printf
appel de fonction.La solution ici étend ce code base-4. Tout d’abord, m est défini comme n, mais tel qu’en base 4, il sera préfixé et ajouté. Nous imprimons ensuite m.
En imprimant régulièrement en base 4, nous avons utilisé un masque de bits de 3 pour obtenir le chiffre. Dans le code postal, la ligne supérieure représente le bit de poids faible de ce chiffre (un masque de bits de 1) et la ligne inférieure représente le bit de poids fort (un masque de bits de 2). En conséquence,
r
inf(n,r)
est le bitmask - notre fonction principale appellef(m,1)
la première ligne etf(m,2)
la dernière ligne.Pour que la ligne médiane fonctionne (toujours imprimer "|"), nous ajoutons
||!r
au conditionnel - si r est égal à 0, il sera toujours évalué à vrai et affichera un "|". Ensuite, nous appelonsf(m,0)
à la ligne médiane.Enfin, nous voulons que les nouvelles lignes se comportent. L'inclusion d'un extra
printf
coûte cher en octets de code source. Nous ajoutons donc un autre spécificateur% c à l'existantprintf
.n?32:10
affiche une nouvelle ligne si n vaut 0 (faux) et un espace sinon. 32 et 10 sont utilisés à la place de '\ n' et '' pour sauvegarder des octets.la source
f(n,r){n&&f(n>>2);printf("%c%c",n?32:10,(n&r|!r)&&n?'|':32);}main(n){scanf("%d",&n);f(n=(n+(4<<(32-__builtin_clz(n)/2*2)))*16+4,1);f(n,0);f(n,2);}
Common Lisp, 191 octets
Essayez-le en ligne!
la source
PHP, 99 + 1 octets
requiert PHP> = 5.5 pour l'indexation de chaîne littérale et <7.1 pour l'indexation afin de ne pas générer d'avertissement.
Exécuter en pipe
-nR
ou essayer en ligne .Insérez une nouvelle ligne pour en obtenir une autre.
la source
Python 2,
142126 octetsUn grand merci aux ovs!
J'ai essayé de ne pas copier les méthodes des autres réponses et ... beurk.
la source
C # (.NET Core) , 160 octets
Essayez-le en ligne!
Je suis sûr que j'ai raté certaines améliorations.
DeGolfed
t<51 & y != 1 & t-(y>>1) != 49
vérifie que le caractère n'est pas '3', pas la deuxième ligne, et ensuite une magie binaire pour voir si la première ou la troisième ligne doit contenir de l'espace.la source
Zsh ,
156154151133 octetsEssayez-le en ligne!
Prend une entrée base 10 de la var
$x
la source
Japt , 42 octets
Essayez-le en ligne!
la source
Pyth , 32 octets
Essayez-le ici!
la source
C, 120 octets
Malheureusement, ne fonctionne que sur Windows, car il
itoa
est trop pratique pour être standard.la source