Ecrivez un programme qui prend une chaîne non vide des chiffres de 0 à 9 et affiche leur affichage sur un affichage à sept segments à l' aide de barres obliques ( /
, \
).
Ce sont les formes de chiffres précis:
/\
\ \
\/
\
\
/\
/
\/
/\
/\
/
\
\/\
/
\/\
/
/
\/\
\/
/\
\
/\
\/\
\/
/\
\/\
/
Lorsqu'un chiffre apparaît l'un après l'autre, ils sont chaînés en diagonale vers le haut et à droite, avec un espace diagonal entre eux. Ainsi, par exemple, 203
deviendrait ceci:
/\
/\
/\ /
\ \
/\ \/
/
\/
Notez que le 1
personnage occupe la même quantité d’espace que les autres. Les deux lignes du 1
sont à droite de l'écran et non à gauche.
Ainsi 159114
deviendrait ceci:
\
\/\
\
\
\
\
/\
\/\
/ /
\/\
\ /
\
Il peut y avoir toute quantité et combinaison de nouvelles lignes ou d’espaces dans la sortie tant que les chiffres sont dans la position correcte les uns par rapport aux autres.
Donc 159114
, cela serait aussi valable pour:
\
\/\
\
\
\
\
/\
\/\
/ /
\/\
\ /
\
Prenez une entrée de stdin ou de la ligne de commande, ou écrivez une fonction qui prend une chaîne. Imprimez le résultat sur stdout ou vous pouvez le renvoyer sous forme de chaîne si vous écrivez une fonction.
Toute chaîne non vide des chiffres 0 à 9 devrait fonctionner, y compris les chaînes (par exemple , un seul chiffre 8
) et les chaînes par des zéros (par exemple 007
, les zéros ne doivent être imprimés).
Le code le plus court en octets gagne.
Réponses:
CJam,
777170696362 octetsTous les caractères sont imprimables, le copier-coller devrait donc fonctionner correctement.
Essayez-le en ligne dans l' interprète CJam .
Idée
Nous commençons par examiner le nombre de chiffres n dans l'entrée et en poussant un carré d'espaces assez grand pour couvrir la sortie. Dans l'implémentation, ce carré sera codé sous la forme d'un tableau à deux dimensions de chaînes à un caractère.
Un carré de longueur 2n + 1 conviendrait parfaitement (c’est-à-dire qu’il n’ya pas d’espace blanc) pour une implémentation simple, mais nous en utiliserons un de longueur 5n pour économiser quelques octets. Heureusement, les espaces blancs environnants sont autorisés.
Si nous inversons les lignes de la représentation sept barres obliques de 8 , nous obtenons ce qui suit:
La représentation de tous les chiffres peut être codé comme un entier 8 bits, où le i ème bit est 0 ssi le i ème personnage doit me remplacer par un espace. Pour les chiffres de 0 à 9 , les entiers résultants sont
qui correspondent aux caractères ISO-8559-1 suivants:
Pour chaque chiffre dans l'entrée, après avoir sélectionné le nombre entier de 8 bits, on répète le i correspondant ième caractère de la représentation de 8 exactement un i fois, où un i est le i ème bit du nombre entier. Cela pousse un tableau de chaînes de un ou zéro caractères. En divisant ce tableau en morceaux de longueur 3, nous obtenons un tableau où chaque élément correspond à une ligne de la représentation.
Maintenant, nous calculons le maximum vectorisé des chaînes qui représentent le carré et les chaînes qui représentent le chiffre. Les chaînes
, elles vont donc remplacer les espaces dans le carré. Toutefois, la chaîne
vide est plus petite que la chaîne . Par conséquent, les chaînes vides dans la représentation numérique préservent les espaces du carré.
/
et\
sont plus grandes que la chaîneNous tournons maintenant les lignes et les colonnes de deux unités pour placer la représentation numérique suivante dans la partie appropriée du carré et répétons le processus pour les chiffres restants de l'entrée.
Enfin, nous inversons chaque ligne et insérons un saut de ligne entre les lignes individuelles.
Code
Les dernières rotations gâcheraient la sortie si la longueur du côté du carré était inférieure à 2n + 3 . Puisque 5n ≥ 2n + 3 pour tous les entiers positifs n , le carré est suffisamment grand pour empêcher cela.
la source
Python 3,
189183174 octetsLa compression me convient, mais j'ai du mal à trouver un bon moyen d'abandonner les sept variables ...
Heureusement, la spécification est assez détendue sur les règles d'espaces, car il y a beaucoup d'espaces en tête / en fin.
Étendu:
Explication
Les positions de segment représentées par les variables sont:
Chaque segment est codé par un seul caractère Unicode de 2 octets. Par exemple,
ϻ
encodeg
le segment comme suit:En effet,
2
c’est le seul chiffre à ne pas utiliser le segment inférieur droit d’un affichage à sept segments.la source
C,
1098345323319 octetsPremièreDeuxièmeTroisième tentative. Finalement décidé d'abandonner le tampon d'écran pour économiser quelques octets. Ce programme prend un paramètre de chiffres et imprime les chiffres au format 7 segments.Premier participant. Juste pour le fun. Sois gentil.
Élargi, sans avertissement:
la source
JavaScript,
192178167162 octetsUtilisation:
f("1337");
reviendraIl utilise des fonctionnalités de ES6 et peut avoir un comportement dépendant de l'implémentation en raison de l'omission des points-virgules et des parenthèses, etc., mais cela fonctionne dans Firefox.
Étendu:
Explication:
l
est un tableau contenant 10 caractères sur un octet correspondant à la forme de chaque chiffre. Par exemple, le chiffre 0 est représenté par le caractèreî
:Les caractères en entrée sont utilisés comme clés pour que le tableau conserve leur forme, représentant des contreparties, qui sont lues bit par bit.
la source
==0
et==1
bien nécessaires avant?
. Int n'est-il pas considéré comme un booléen dans js? @Regret"w\x05k/\x1D>~\x07\x7F?"
avec chaque caractère inversé au niveau du bit"\xee\xa0\xd6\xf4\xb8|~\xe0\xfe\xfc"
, chacun de ceux-ci est imprimable. Cela donne 8 octets supplémentaires. Bien que pas assez ...f=(x)=>{}
- elles ne sont pas nécessaires avec un seul argument.Perl - 103 octets
Ce qui précède contient 6 caractères non imprimables (la source peut être téléchargée sur Ideone ) et correspond à ce qui suit:
Chacun
^F
peut être remplacé par un caractère littéral 6 (ACK) et\177
par le caractère 127 (DEL).Le shebang est compté comme 1, la deuxième nouvelle ligne est inutile. L'entrée est prise de stdin.
Exemple d'utilisation
Explication
La sortie est générée un octet à la fois. Chaque caractère est translittéré, et ceci est ensuite interprété comme un tableau de bits utilisant
vec
. Les bits sont stockés de la manière suivante:La sortie alterne entre 3 et 5 barres obliques, de sorte que les bits
56
débordent01
du chiffre suivant. Le bit7
n'est pas utilisé.la source
C #,
360 355331 octetsBonjour, première tentative de code-golf. J'espère que cela ne marque pas trop mal pour une entrée en C #.
Utilisation:
p("159114");
reviendraÉtendu:
la source
string s(string n)
à l'n=>
aide d'un lambda. Ah bon, vous pouvez simplement le laisser comme ça si vous préférez. :) J'ai cependant créé un port pour Java qui vous crédite. ;)python 2,
317298278273,15J'ai considéré 4 espaces comme des onglets en comptant.
Non compressé et lisible:
la source
l[y+dy][x+dx]=c if r[map(int,s)[x/2]][i]=='1' else ' '
en model[y+dy][x+dx]=[' ',c][r[map(int,s)[x/2]][i]=='1']
sauvegarde de 5 octets, passerreturn '\n'.join(''.join(x) for x in l)
en modeprint'\n'.join(''.join(x)for x in l)
sauvegarde de 3 octets, plus quelques modifications supplémentaires. Voici un lien vers un Gist où j'ai eu le décompte d'octets à 440 à partir de 508.KDB (Q),
172136 octetsExplication
1) Créer une
d
carte avec toutes les formes des chiffres.2) Remplissez la matrice avec des zéros supplémentaires et ajoutez-les ensemble. c'est-à-dire "01"
3) Utilisez l’index pour cartographier
" /\"
et imprimer avec-1
.Tester
Je suis sûr que ça peut être plus court !!
Merci @hjk
la source
1 2 0 2 1 2 0 2 1
par(9#1 2 0 2)
(-6).enlist
par des1#
œuvres, donc c'est un autre -5.enlist
bien parce quecount[a 0]#0
n'est pas atome :(Pip, 122 + 1 = 123 octets
Utilise le
-n
drapeau. Prend une entrée via un argument de ligne de commande.Les caractères de la chaîne UTF-8 ont les points de code suivant:
11152, 19190, 12535, 12547, 17651, 11575, 11557, 12629, 11071, 11089
.Légèrement non-golfé:
La stratégie de base consiste à rechercher les caractères constitutifs de chaque numéro, puis à les biaiser de manière appropriée. Par exemple, pour
8
, nous voulons ceci (espaces représentés par des points):qui se transformera en ceci:
La fonctionnalité intéressante de cette stratégie est que plusieurs nombres pré-asymétriques peuvent simplement être concaténés côte à côte.
Maintenant, nous pouvons encoder
/.\\/.\\/.
en base 3 comme1200120012
. Ensuite, nous pouvons convertir cela en décimal et le traiter comme un point de code UTF-8.L'expression
J"\/ "@^(A_TB3M"⮐䫶ヷ䓳ⴷⴥㅕ⬿⭑")@_.2<>2Ma
obtient les données pré-asymétriques par le processus suivant:Une fois que nous avons concaténé ces chaînes côte à côte
$.
, nous créons une grille d’espaces (2 * n +2 carrés), parcourons la grille pré-asymétrique et remplaçons les espaces correspondants dans la grille post-asymétrique par les caractères appropriés. Pour le voir se produire, on peut modifier le code pour imprimer chaque étape et mettre en pause pour la saisie de l'utilisateur:La grille est en réalité construite à l'envers, car cela semblait faciliter les calculs.
Je suis sûr qu'il existe de meilleurs algorithmes à utiliser. Mais je voulais proposer ma propre idée plutôt que de copier celle de quelqu'un d'autre.
Plus sur Pip
la source
Brainfuck - 719 octets
Pour contexte historique seulement, crédits à Daniel B Cristofani. Je ne sais pas exactement quand cela a été créé, mais il est disponible sur Internet Archive dès le 9 mai 2003.
La sortie
9
est différente de celle décrite dans la description du problème.la source
Perl, 270 octets
Je n'aurais vraiment pas dû perdre mon temps avec ça.
la source
[$1]while/(.)/g
par[$_]for/./g
pour sauvegarder 4 octets. remplacezfor($i=0;$i<=$l;$i++)
parfor$i(0..$l)
pour sauvegarder 9 octets.JavaScript ( ES6 ), 191
206Exécutez le fragment de code dans Firefox pour tester.
la source
Java 8, 341 octets
La réponse du port de @Shion en C # .NET , assurez-vous donc également de lui donner son vote!
Essayez-le en ligne.
Explication:
la source