Mon tout premier programme de puzzles de programmation et de golf de code est l' affichage à sept barres obliques . Voici mon premier défi, également basé sur un affichage à 7 segments.
En plus des chiffres, je pense souvent au type de lettres que je peux afficher à l'aide d'un simple affichage à 7 segments. Il s'avère que beaucoup de lettres peuvent être affichées. En fait, toutes les lettres sauf les lettres K, M, V, W, X peuvent être affichées à l'aide d'un seul affichage à 7 segments. En effet, vous pouvez afficher les minuscules ou les majuscules d'une lettre. par exemple
"abcdef" peut être affiché comme
_ _ _ _
!_!!_ ! _!!_ !_
! !!_!!_ !_!!_ !
Notez que chaque caractère est une matrice 3x3 composée de !
et _
.
Bien sûr, l'affichage à 7 segments peut être utilisé pour afficher des chiffres et des symboles:
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
Certaines lettres peuvent avoir des majuscules et des minuscules:
_ _
! _ !_!!_ ! ! ! _ ! !
!_ !_ ! !! ! ! !!_!!_!!_!!_!
Voici l'ensemble complet des personnages:
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! !!_! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_! _!!_
Faites attention à la présence d'un espace blanc ( ), d'un tiret (
-
) et d'un point d'interrogation ( ?
). La lettre I
, O
et Z
sont les mêmes que les numéros 1
, 0
et 2
respectivement.
Dans ce défi, vous allez écrire un programme ou une fonction pour afficher une chaîne en utilisant le format d'affichage à 7 segments ci-dessus.
Règles
Vous pouvez écrire un programme ou une fonction
C'est le code-golf, le code le plus court en octets gagne
Votre programme ou fonction doit recevoir des données de STDIN ou en tant que paramètre. Et génère une chaîne vers STDOUT ou sous forme de chaîne sur 3 lignes sans espace de début mais terminée par un saut de ligne. Manipulez
CHIOU
correctement le boîtier supérieur / inférieur .Vous pouvez éventuellement imprimer des espaces blancs à la fin
Vous devez suivre le format ci-dessus. Utilisation du trait de soulignement
_
et du point d'exclamation!
pour former votre affichage à 7 segments.Vous devez prendre en charge les espaces blancs (
), les tirets (
-
) et les points d'interrogation (?
)Si la chaîne contient des caractères non pris en charge (k, m, v, w, x), un seul caractère d'erreur (3 ligne d'horizon, voir exemple) s'affiche. Outre les 5 caractères non pris en charge, vous pouvez supposer que l'entrée est composée uniquement d'un jeu de caractères pris en charge.
J'ai choisi de ne pas avoir de lettre pour L (
l
) minuscule en raison de confusions mais si vous êtes si enclin, vous pouvez l'afficher comme un1
à droite ou à gauche.
Exemples
$./a.out Start
_ _
!_ !_ !_! _ !_
_!!_ ! !! !_
$./a.out "7-seg dIsplay"
_ _ _ _ _ _ _
! _ !_ !_ ! _! !!_ !_!! !_!!_!
! _!!_ !_! !_! ! _!! !_ ! ! _!
$./a.out "0123456789 chiou-?"
_ _ _ _ _ _ _ _ _
! ! ! _! _!!_!!_ !_ !!_!!_! _ !_ _ _ _!
!_! !!_ _! ! _!!_! !!_! _! !_ ! ! !!_!!_! !
$./a.out "ABCDEFGHIJLNOPQRSTUZ"
_ _ _ _ _ _ _ _ _ _
!_!!_ ! _!!_ !_ ! !_! ! !! _ ! !!_!!_! _ !_ !_ ! ! _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "abcdefghijlnopqrstuz"
_ _ _ _ _ _ _ _
!_!!_ _ _!!_ !_ ! !_ !! _ _ !_!!_! _ !_ !_ _!
! !!_!!_ !_!!_ ! !_!! ! !!_!!_ ! !!_!! !! _!!_ !_!!_
$./a.out "Bad Form"
_
_
_
$./a.out "Hello"
_
!_!!_ ! ! _
! !!_ !_ !_ !_!
$./a.out "World"
_
_
_
k, m, v, w, x
ne s'affichent pas.\r
) avec le saut de ligne (LF,\n
). * nix utilise LF et Windows utilise CRLF. Seuls certains systèmes hérités utilisent CR seul. Plus d'informations ici: en.wikipedia.org/wiki/NewlineRéponses:
CJAM,
123114112110 octetsCe qui précède utilise la notation caret, car le code contient des caractères non imprimables. L'un d'eux est un octet nul (
^@
), ce qui signifie que ce code ne peut être exécuté qu'à partir de la ligne de commande.Au prix de seulement deux octets supplémentaires (pour un total de 112 ), nous pouvons résoudre ce problème.
Cette fois, tous les caractères sont imprimables. Essayez-le en ligne dans l' interpréteur CJam .
Exemple d'exécution
Idée (version imprimable)
Chaque caractère peut être affiché sur l'affichage à 9 segments
en remplaçant certains de ses caractères par des espaces.
Nous pouvons transformer un caractère spécifique en un entier en remplaçant chaque segment affiché, dans l'ordre de lecture naturel, par un 1 , chaque segment non affiché par un 0 et en considérant les chiffres binaires résultants.
Le premier et le troisième segment ne sont jamais affichés, cela produira donc des entiers dans les plages [0,64) et [128,192) .
Nous pouvons coder chacun de ces entiers comme un seul octet, mais la moitié d'entre eux entraînera des caractères non imprimables. Ainsi, nous ajoutons 64 à chaque entier avant de transtyper en caractère, ce qui garantit que les points de code sont dans les plages [64,128) et [192,256) .
Le seul caractère non imprimable dans ces deux plages est DEL (point de code 127), ce qui correspond à la configuration d'affichage suivante, non validée:
Nous pouvons inverser le codage ci-dessus en ajoutant 448 == 512 - 64 à chaque point de code, en convertissant en base 2 et en supprimant le premier chiffre binaire.
Il ne reste plus qu'à trouver un moyen efficace d'associer ces segmenets encodés à leurs caractères ASCII correspondants.
Si nous mappons les caractères de
" -chiou"
aux caractères de";=KMVWX"
et convertissons l'intégralité de l'entrée en majuscules, nous pouvons simplement stocker le codage pour tous les caractères entre0
(point de code 48) etZ
(point de code 90), ce qui donne une plage de 43.L'indexation des tableaux est modulaire dans CJam, donc si
A
est une chaîne de longueur 43A86=
,A43=
etA0=
tous donnent les mêmes résultats. Le caractère avec le point de code 86 estV
, donc nous stockons simplement les segments codés de V - Z et 0 - U , dans l'ordre.Dans le code réel, nous sélectionnons le signe at comme caractère "de mauvaise forme", remplaçons l'entrée entière par la chaîne
"@"
si elle contient une lettre interdite et inversons les étapes ci-dessus.Code (version imprimable)
la source
Perl,
475469424390280272 octetsmultiligne avec commentaires:
Les modèles de bits codant les segments sont stockés dans une chaîne (échappant à 3 caractères non imprimables utilisant
\x
et utilisant\0
pour l'espace) et sont mappés aux caractères d'entrée à l'aide de l'opérateur de translittération Perl.Pour 5 des 7 segments, un bit et est utilisé avec l'opérateur ternaire pour sortir un espace ou le caractère de segment. Pour les deux segments en bas à gauche (codés par 2 et 4 dans le jeu de bits), une recherche de sous-chaîne dans une chaîne de 8 caractères est utilisée pour enregistrer 2 octets.
Merci à Dom Hastings pour ses conseils de golf Perl.
Ancienne version (utilisant des expressions rationnelles pour coder les modèles), 390 octets:
multiligne avec commentaires:
La chaîne est lue et vérifiée pour les caractères non valides à l'aide d'une expression régulière, se fermant si aucun n'est trouvé. Ensuite, les caractères minuscules autorisés sont remplacés par les caractères non valides et la chaîne entière est convertie en minuscules.
Les lignes sont générées une à la fois, avec 1 segment par lettre sur la première ligne et 3 sur les deux autres. Pour chaque ligne, la chaîne est traitée un caractère à la fois et le caractère est comparé à une expression régulière pour chaque segment pour vérifier si un! ou _ doit être affiché. L'utilisation d'une expression régulière signifie que pour les caractères où le segment n'est pas défini, il faut zéro bit par segment par caractère pour coder s'il faut le définir, et pour ceux où il l'est, cela prend un peu moins de 8 bits en moyenne car les plages de caractères d'expression régulière peuvent être utilisé. Cela représente donc environ 3 ou 4 bits par segment par caractère dans l'ensemble, ou environ 21-24 bits par caractère.
Il ne gère pas le retour à la ligne.
la source
' '
peut être remplacé par$"
et' '
peut être celui$"x3
qui en coupe quelques-uns, vos\n
s peuvent être de nouvelles lignes littérales pour se débarrasser de quelques autres. Votre sortie anticipée peut également être court-circuitée en utilisant le dé, ce quiif(/[kmvwx]/i){print" -\n"x3;exit}
devientdie" - "x3if(/[kmvwx]/i)
. Avec un peu plus de fudging également, vous pouvez réorganiser la boucle pour éviter les crochets et vous ne devriez pas avoir besoin$z
d'en enregistrer un peu plus!$_=lc<>
cela ne fonctionne pas, car alors le code ne peut pas faire de distinction entre CHIOU supérieur et minusculeLisp commun,
488416Exemple
Avec
"abcdefg'hijklnopqrstuz"
, imprime:Remarques
Les caractères et leurs représentations sont encodés dans ce numéro en base 36:
La représentation binaire de ce chiffre est divisée en groupes de 17 bits.
Par exemple, le dernier groupe de 17 bits est
110000111101010
, qui est décomposé ici en deux parties:110000
, le char-code de caractère0
111101010
, un codage du dessin, mieux représenté comme suit:Les bits dans la première et la dernière "colonne" sont pour les
!
caractères, ceux dans la colonne du milieu pour le_
caractère. Si nécessaire, les versions majuscules et downcase d'un caractère sont stockées.La fonction parcourt trois fois la chaîne d'entrée, une pour chaque ligne de sortie, recherche un caractère correspondant dans le tableau (ou par défaut 146, alias trois barres) et imprime la représentation à la ligne actuelle.
la source
'
personnage, ce qui est bien; cependant, il sera affiché en dehors de ce qu'un écran à 7 segments est capable de faire. Si vous déplacez la ligne!
vers le bas d'une ligne, ce serait parfait.'
caractère et éditer la questionK
car en fait, j'ai mis leK
mauvais endroit dans la chaîne d'entrée ("... jlKn ...") ;-) Vous pouvez voir les triples barres (erreur) juste après le L. Merci de l'avoir remarqué.JavaScript (ES6),
380352324 octets( Remarque: le code utilise la notation caret, car il contient des caractères non imprimables. Pour obtenir le code original, cliquez ici et sélectionnez les données brutes. Et non, ce
h
n'est pas un programme CJam.;)Appelé comme
d("7-seg display")
ou similaire. Fonctionne dans Firefox 40, mais peut-être pas dans d'autres navigateurs. Pour une raison quelconque, l'extrait HTML / JS n'enregistre pas les éléments non imprimables, mais vous pouvez copier-coller les données brutes d' ici .Non golfé:
( Note:
g
eth
ont été complétées par des espaces pour correspondre8
,-
,ÿ
etspace
avec leurs valeurs Unicode correspondantes.)Explication:
J'ai tout de suite remarqué que les 7 segments, convertis en
0
/1
bits, iraient bien avec les 128 premiers caractères Unicode. Le problème avec cette idée est que 1/4 de ces caractères sont des caractères de contrôle non imprimables. Les utiliser dans mon code donnerait un aspect incroyablement désordonné (ou incroyablement intelligent; je n'ai pas décidé lequel). Pour résoudre ce problème tout en gardant le reste du code simple, j'ai eu cette idée:A l'exception de
-
, l' espace , et l' erreur , aucun des personnages , il manquait les deux segments verticaux inférieurs. Donc, pour m'assurer que tous ces caractères sont restés entre0020
et007f
, j'ai simplement mappé les 64 et 32 bits à ces segments, comme ceci:Les numéros des 5 autres segments ne sont pas trop importants; ils pourraient être arrangés de toute autre manière et avoir toujours les mêmes caractères "entrants".
À titre d'exemple, voici la version codée de A :
J'ai ensuite bourré la version codée de chaque caractère à 7 segments
h
. Cependant, il en est8
résulté007f
(le code de contrôle de suppression ; constant, peu importe la façon dont les segments sont disposés), l' espace a entraîné0000
(le code nul ; également constant), il en est-
résulté0002
et une erreur s'est produite0007
. Je copie-collé les octets bruts dans la position correcte pour8
,-
et l' erreur ; l'espace a été facilement atteint avec\0
.Après tout cet encodage, tout ce que j'avais à faire était de l'utiliser pour décoder la chaîne et la sortir dans un format lisible en 7 segments. J'utilisé un de boucle et trois variables (
x
,y
, etz
, chacun correspondant à une ligne de sortie) de passer par chaque caractère dans la chaîne de caractères et ajouter l'équivalent de 7-seg à la sortie. J'ai choisiÿ
le caractère d' erreur car AFAIK, ce n'est sur aucun clavier et c'est le dernier caractère de lau+0000-u+00ff
gamme. J'aurais peut-être pu êtreΞ
plutôt spirituel et choisi (lettre grecque xi) à la place ....;)Edit 1: sauvé un tas d'espace en créant des mini-fonctions pour déterminer si
!
,_
ouest nécessaire.
Edit 2: économisé beaucoup d'espace en utilisant les astuces que j'ai apprises depuis ma dernière visite sur ce post.
Comme d'habitude, les suggestions sont grandement appréciées!
la source