Afficher un nombre dans PrettyFont

13

J'ai conçu une nouvelle police que j'appelle PrettyFont. J'ai mis beaucoup de temps à le perfectionner, mais comme je travaille, je n'ai pas le temps de le terminer. Par conséquent, il ne contient actuellement que 4 caractères. Un jour, quand je serai devenu riche, ce sera mon objectif de toute ma vie de le finir, mais pour l'instant ...

Voici PrettyFont: (0, 1, 2, 3)

####  ##  #### ####
#  #   #  #  #    #
#  #   #    #   ###
#  #   #   #      #
####  ### #### ####

Chaque caractère mesure 4 pixels de large et 5 pixels de haut. Maintenant! Je veux que vous m'écriviez un programme qui génère un nombre dans PrettyFont afin que je puisse commencer à envoyer des dessins à imprimer.

Règles:

L'entrée est un numéro de chaîne en base 4 (uniquement les caractères 0-3), par exemple "01321". Le programme doit être capable de gérer au moins 10 caractères dans la chaîne. Des points BONUS sont donnés au programme qui prend un entier de base 10 réel au lieu d'une chaîne. Clarification EDIT : le bonus entier signifie que l'on peut entrer n'importe quel nombre de base 10, comme 54321, et le programme le convertira en base 4 et le sortira (dans ce cas 31100301).

La sortie sera le nombre imprimé avec PrettyFont. Exemple d'entrée et de sortie:

> "321"
####
   #
 ###
   #
####

####
#  #
  # 
 #  
####

 ## 
  # 
  # 
  # 
 ###

Un énorme bonus pour le programme qui peut le produire en une seule ligne comme ceci:

> "321"
#### ####  ## 
   # #  #   # 
 ###   #    # 
   #  #     # 
#### ####  ### 

Le caractère «#» n'est pas obligatoire et peut être remplacé par n'importe quel caractère.

En sortie verticale, une ligne vide est requise entre chaque caractère PrettyFont. Si quelqu'un effectue la sortie horizontale, un caractère d'espace blanc '' ou un caractère de tabulation est requis entre chaque caractère PrettyFont.

C'est le golf de code, le code le plus court gagne! (J'en ai besoin parce que mon ordinateur de bureau a un stockage limité.)

Accatyyc
la source
1
Ce n'est pas exactement un doublon, mais la seule différence fondamentale entre cela et codegolf.stackexchange.com/questions/3628/… est la table de recherche.
Peter Taylor
PrettierFont -banner -c '#' 0123
Drake Clarris
1
avec 4 pixels de large, vous allez avoir des problèmes avec 'M'
Cameron MacFarland
Combien de caractères représente le bonus pour prendre 10 nombres de base en entrée?
defhlt
Je ne suis pas vraiment sûr. J'ai besoin de voir d'autres solutions pour avoir une idée de la difficulté de le faire. Je ne suis pas très bon au golf de code donc ... Suggestions appréciées!
Accatyyc

Réponses:

11

k ( 118 117 72 71 69 66 car.)

Je n'ai pas encore fait beaucoup d'efforts pour jouer au golf, mais il atteint la sortie horizontale souhaitée en pas trop de caractères:

-1'" "/:'+(5 4#/:4 20#"# "@,/0b\:'0x066609ddd806db00e8e0)"I"$'0:0;

Prend l'entrée de stdin, imprime la sortie sur stdout.

edit: En implémentant une forme de compression sur la sortie "bitmap", je l'ai réduit à 72. Le bitmap est maintenant construit en convertissant les bits 64 bits en binaire et en mappant les 0 et les 1 sur "#" ou "". Je pourrais le faire à partir d'hexagone comme quelques-unes des autres solutions mais je pense que cela finirait plus longtemps . Il s'avère que l'hexagone est meilleur.

Exemple de sortie pour 012301:

####  ##  #### #### ####  ##
#  #   #  #  #    # #  #   #
#  #   #    #   ### #  #   #
#  #   #   #      # #  #   #
####  ### #### #### ####  ###

// edit: -6 car

skeevey
la source
Impressionnant. Code le plus court à ce jour! Il pourrait tenir sur mon lecteur de stockage limité. Bon travail.
Accatyyc
Jusqu'à 71. Étant donné que l'exe combiné kdb + / q / k pèse 392 Ko, cela pourrait être idéal pour votre lecteur de stockage limité;)
skeevey
10

Python3 (124)

s=input();[print(*["".join(" #"[0xf171ff429f72226f999f>>(20*int(x)+4*y+i)&1]for i in(3,2,1,0))for x in s])for y in range(5)]

Désolé, la verticale n'était pas intéressante pour moi.

???/golf.py
1230012301203012030102301230
 ##  #### #### #### ####  ##  #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### ####
  #  #  #    # #  # #  #   #  #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  #    # #  #
  #    #   ### #  # #  #   #    #   ### #  #   #    #  #  #  ### #  #   #    #  #  #  ### #  #   #  #  #   #   ### #  #   #    #   ### #  #
  #   #      # #  # #  #   #   #      # #  #   #   #   #  #    # #  #   #   #   #  #    # #  #   #  #  #  #      # #  #   #   #      # #  #
 ### #### #### #### ####  ### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### ####
Ev_genus
la source
Génial! Je ne m'attendais pas à si peu de caractères pour l'horizontale. Bon travail.
Accatyyc
1
THX. Je suppose que mon idée (nombre hexadécimal et décalages) devrait être encore plus courte dans l'implémentation de Ruby.
Ev_genus
10

J, 84 82 81 80 75 69 caractères

' #'{~(,4,.(4*".,' ',.1!:1[1)+/i.4){"1#:63231 37521 37415 37441 63487

Prend l'entrée du clavier:

   ' #'{~(,4,.(4*".,' ',.1!:1[1)+/i.4){"1#:63231 37521 37415 37441 63487 63487
0123210
 ####  ##  #### #### ####  ##  ####
 #  #   #  #  #    # #  #   #  #  #
 #  #   #    #   ###   #    #  #  #
 #  #   #   #      #  #     #  #  #
 ####  ### #### #### ####  ### ####

Nombre magique FTW (ou pour la deuxième place dans ce cas) :-)

Gareth
la source
Très bien ... très bien ... je suis impressionné! Beaucoup de bonnes réponses aujourd'hui. Peut-être que mes impressions de concepteur finiront bien.
Accatyyc
Vous pouvez coder tous les chiffres en un seul nombre binaire et refaçonner le résultat pour obtenir les matrices numériques correspondantes.
FUZxxl
@FUZxxl J'ai essayé de trouver le nombre pour les 80 bits complets, mais #:ne semble pas fonctionner pour cette taille de nombre. #:1166416635908028473935870et les #:1166416635908028473931775deux donnent la même réponse pour moi.
Gareth
8

C - 164 151 caractères horizontaux

Sur IDEone: http://ideone.com/gljc3

Le code (164 octets):

i,j;main(){char n[99];gets(n);for(;j<5;++j){for(i=0;n[i];++i)printf("%.4s ","#####  # ##   #  ### #     #"+4*("01110233340135006460"[(n[i]-48)*5+j]-48));puts("");}}

entrez la description de l'image ici

EDIT - 151 octets

J'ai ajouté les suggestions des commentaires et puis certaines. Ce n'est pas exactement sûr (tableau de longueur 0 que je veux gets()...).

char i,j=5,n[];main(){for(gets(n);j--;)for(i=puts("");n[i];printf("%.4s ","#####  # ##   #  ### #     #"+4*(0x1A600BA136E0248>>15*n[i++]-720+3*j&7)));}

Remarque, i=puts("")est un comportement indéfini puisque je traite voidcomme int! Il revient systématiquement 0sur ma version de MinGW, mais il revient 1sur le compilateur utilisé par IDEOne.

Accepte les décimales, produit la base 4 (167 octets)

char i,j=5,n[];main(p){for(itoa(atoi(gets(n)),n,4);j--;)for(i=puts("");n[i];printf("%.4s ","#####  # ##   #  ### #     #"+4*(0x1A600BA136E0248>>15*n[i++]-720+3*j&7)));}
Kaslai
la source
Ooh, un court en C! Cela fonctionnera sûrement en moins d'une minute sur mon ancien processeur. Bon.
Accatyyc
Impossible d'enregistrer 3 caractères en supprimant "! = 0"?
a3nm
Oui, merci. Je ne l'ai pas attrapé.
Kaslai
Mettez getsdedans for(sauvez 1). Accédez putsà l' forincrément externe et enregistrez les accolades. Enregistrer les parenthèses: (n[i]-48)*5+j-> n[i]*5-240+j, même astuce avec +4*(...
ugoren
D'accord à 153 octets. Pas trop mal pour deviner CI.
Kaslai
7

Ruby, 0123 caractères + un bonus ([0123] vs '#')

f=15
0.upto(4){|n|$*[0].chars{|x|$><<"%4s "%eval(:f6ff929192279241f7ff[x.to_i+4*n]).to_i.to_s(2).tr(?0,' ').tr(?1,x)}
puts}

Exemple:

% ruby ./font.rb 01231231
0000  11  2222 3333  11  2222 3333  11  
0  0   1  2  2    3   1  2  2    3   1  
0  0   1    2   333   1    2   333   1  
0  0   1   2      3   1   2      3   1  
0000  111 2222 3333  111 2222 3333  111
% ruby ./font.rb 01231231102020103201301203212302230
0000  11  2222 3333  11  2222 3333  11   11  0000 2222 0000 2222 0000  11  0000 3333 2222 0000  11  3333 0000  11  2222 0000 3333 2222  11  2222 3333 0000 2222 2222 3333 0000 
0  0   1  2  2    3   1  2  2    3   1    1  0  0 2  2 0  0 2  2 0  0   1  0  0    3 2  2 0  0   1     3 0  0   1  2  2 0  0    3 2  2   1  2  2    3 0  0 2  2 2  2    3 0  0 
0  0   1    2   333   1    2   333   1    1  0  0   2  0  0   2  0  0   1  0  0  333   2  0  0   1   333 0  0   1    2  0  0  333   2    1    2   333 0  0   2    2   333 0  0 
0  0   1   2      3   1   2      3   1    1  0  0  2   0  0  2   0  0   1  0  0    3  2   0  0   1     3 0  0   1   2   0  0    3  2     1   2      3 0  0  2    2      3 0  0 
0000  111 2222 3333  111 2222 3333  111  111 0000 2222 0000 2222 0000  111 0000 3333 2222 0000  111 3333 0000  111 2222 0000 3333 2222  111 2222 3333 0000 2222 2222 3333 0000 

EDIT: Ruby, 87 caractères

0.upto(4){|n|$*[0].bytes{|x|$><<"%04b0"%:f6ff929192279241f7ff[x-48+4*n].to_i(16)}
puts}

entrez la description de l'image ici

defhlt
la source
Un créatif! Très agréable. Cela aura l'air fabuleux dans mes créations. Ayez un vote positif.
Accatyyc
Rusé! Cela me prendra un peu de temps pour le comprendre.
manatwork
5

Rubis

Vertical: 116 caractères

f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"}
$<.chars{|c|i=c.to_i*5;$><<f[i,5]*$/+$/*2}

Exemple d'exécution:

bash-4.2$ echo -n 321 | ruby -e 'f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"};$<.chars{|c|i=c.to_i*5;$><<f[i,5]*$/+$/*2}'
####
   #
 ###
   #
####

####
#  #
  # 
 #  
####

 ## 
  # 
  # 
  # 
 ###

Horizontal: 150 148 caractères

f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr"01"," #"}
o=(0..4).map{""}
$<.chars{|c|5.times{|j|o[j]<<f[c.to_i*5+j]+" "}}
$><<o*$/

Exemple d'exécution:

bash-4.2$ echo -n 321 | ruby -e 'f="f999f62227f924ff171f".chars.map{|c|c.hex.to_s(2).rjust(4).tr "01"," #"};o=(0..4).map{""};$<.chars{|c|5.times{|j|o[j]<<f[c.to_i*5+j]+" "}};$><<o*$/'
#### ####  ##  
   # #  #   #  
 ###   #    #  
   #  #     #  
#### ####  ### 
homme au travail
la source
J'allais l'encoder comme ça. Ne pensez pas que je peux battre c'est ma langue!
Griffin
4

Mathematica 174 145 139 118 119 123 caractères

Fonctionne maintenant avec une entrée en base 10 (bonus entier). Les versions antérieures peuvent être trouvées dans les modifications.


Utilisation d'ArrayPlot :

Avec, ArrayPlotnous pouvons convertir directement les 1 et les 0 en carrés noir et blanc, économisant ainsi quelques caractères. Par exemple, avec n = 58021, soit 32022211 en base 4:

i = IntegerDigits; i[n, 4] /. Thread@Rule[0~Range~3, ArrayPlot /@ ((PadLeft[#, 4] & /@ i[#, 2]) & /@ (i@{89998, 62227, 89248, 81718} /. {8 -> 15}))]

bonus entier


Explication

L' entrée est paramètre du programme, n.

Zéro peut être représenté par {{1,1,1,1},{1,0,0,1},{1,0,0,1},{1,0,0,1},{1,1,1,1} ou par l'homologue hexadécimal f999f.

L'expression f999f62227f924ff171f,, contient les informations pour afficher tous les nombres {0,1,2,3}. (Remarque: il commence par f999f, qui, comme nous l'avons noté, est nul déguisé.) Parce que Mathematica ne reconnaît pas cela comme un nombre, j'ai utilisé 89998622278924881718(en quatre chaînes entières) à la place, j'ai divisé le nombre en ses chiffres entiers, puis utilisé 15 dans chaque endroit un 8 est apparu. (Cela m'a permis d'utiliser des chiffres au lieu de chaînes partout.)

DavidC
la source
1
Votre sortie ne correspond pas à l'entrée.
M. Lister
Ne pouvez-vous pas simplement transposer cela pour le bonus vertical?
Griffin
Si je comprends bien les règles, le bonus concerne la configuration horizontale.
DavidC
M. Lister Bonne prise. J'ai copié et collé l'image de zéro à la place de 1.
DavidC
Mon mauvais, mal lu.
Griffin
3

Mathematica , 112 107 103

Mon point de vue sur la méthode de David.

i=IntegerDigits;Grid/@i@n/.Thread[0~Range~3->("#"i[i@#/.8->15,2,4]&/@{89998,62227,89248,81718}/.0->"")]

Graphiques Mathematica

105 avec le BONUS:

(pour n = 54321)

i=IntegerDigits;Grid/@n~i~4/.Thread[0~Range~3->("#"i[i@#/.8->15,2,4]&/@{89998,62227,89248,81718}/.0->"")]

Graphiques Mathematica

Mr.Wizard
la source
Très beau effectivement. Si peu de personnages avec le bonus. Bon travail!
Accatyyc
3

APL ( 58 57)

{' #'[1+5 4⍴1022367 401959 1020495 988959[1+⍎⍵]⊤⍨20⍴2]}¨⍞

Production:

0123
 #### ## #### #### 
 # # # # # # 
 # # # # ### 
 # # # # # 
 #### ### #### #### 
marinus
la source
2

Python 2.7

Vertical 160

for i in input():print['****\n*  *\n*  *\n*  *\n****',' ** \n  * \n  * \n  * \n***','****\n*  *\n  * \n *  \n****','****\n   *\n ***\n   *\n****'][int(i)]+'\n'

Horizontale 234 216

x=[['****\n*  *\n*  *\n*  *\n****',' ** \n  * \n  * \n  * \n ***','****\n*  *\n  * \n *  \n****','****\n   *\n ***\n   *\n****'][int(i)]for i in input()]
for i in range(5):print' '.join([y.split('\n')[i]for y in x])

Les deux prennent l'entrée comme une chaîne entre guillemets sur stdin

exemple:
$. / joli
"0123"

Mat
la source
Comment tu gères ça? Je reçois des erreurs. Python 2: "TypeError: l'objet 'int' n'est pas itérable", Python 3: "TypeError: l'objet 'builtin_function_or_method' n'est pas indexable".
manatwork
@manatwork C'est en python 2.7, j'ai édité la réponse pour que ce soit clair.
Matt
@manatwork De plus, il semble que vous ayez entré les chiffres sans les guillemets autour d'eux, par exemple: 0123. Vous devriez essayer d'entrer "0123" sur stdin.
Matt
Je l'ai fait fonctionner maintenant. Désolé, cette astuce n'était pas évidente pour moi.
manatwork
@manatwork dans les versions python avant 3, la fonction input () évalue l'entrée comme s'il s'agissait d'une expression python. Si les guillemets ne sont pas là, le programme essaie d'itérer sur un entier, vous donnant l'erreur que vous avez obtenue.
Matt