在PrettyFont中输出数字


13

我设计了一种新字体,称为PrettyFont。我花了很多时间来完善它,但是由于我是一个工人,所以没有时间完成它。因此,它现在仅包含4个字符。有一天,当我变得富有时,完成它将成为我终生的目标,但是现在...

这是PrettyFont:(0、1、2、3)

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

每个字符宽4像素,高5像素。现在!我想让您编写一个在PrettyFont中输出数字的程序,这样我就可以开始发送要打印的设计了。

规则:

输入为以4为底的字符串编号(仅字符0-3),例如“ 01321”。该程序应至少能够处理字符串中的10个字符。奖励积分是给程序的,该程序采用实际的基数为10的整数而不是字符串。编辑说明:整数红利表示您可以输入任何以10为底的数字,例如54321,并且程序会将其转换为以4为底的数字并将其输出(在本例中为31100301)。

输出将是用PrettyFont打印的数字。输入和输出示例:

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

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

 ## 
  # 
  # 
  # 
 ###

可以按单行格式输出的程序有很多好处,如下所示:

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

“#”字符不是必需的,可以用任何字符代替。

在垂直输出中,每个PrettyFont字符之间都需要有一个空行。如果有人进行水平输出,则在每个PrettyFont字符之间需要一个空格字符''或一个制表符。

这是代码高尔夫球,最短的代码获胜!(由于办公室计算机的存储空间有限,我需要简短说明。)


1
它不完全是一个副本,但是它与codegolf.stackexchange.com/questions/3628/…之间的唯一基本区别是查找表。
彼得·泰勒

PrettierFont -banner -c '#' 0123
德雷克Clarris

1
与4个像素宽,你就要有问题与“M”
卡梅伦麦克法兰

以10个基数为输入的奖励多少个字符?
2012年

我不太确定 我需要查看更多解决方案,以了解这样做的难度。我自己不太擅长打高尔夫球,所以...建议表示赞赏!
Accatyyc 2012年

Answers:


11

k(118117 72 71 69 66个字符)

我还没有花太多力气去打高尔夫球,但是它可以在不增加很多字符的情况下实现所需的水平输出:

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

从stdin接受输入,将输出打印到stdout。

编辑:通过对输出“位图”实施一种压缩形式,我将其缩减为72。现在通过将64位int转换为二进制并将0和1映射为“#”或“”来构建位图。我可以像其他一些解决方案一样从十六进制完成此操作,但我认为这样做的时间会更长。原来十六进制更好。

012301的样本输出:

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

//编辑:-6个字符


令人印象深刻。最短的代码!它可能适合我有限的存储驱动器。做得好。
Accatyyc 2012年

下降到71。考虑到组合的kdb + / q / k exe的重量仅为392kB,这可能是您有限的存储驱动器的理想选择;)
skeevey 2012年

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)]

抱歉,垂直对我来说并不有趣。

???/golf.py
1230012301203012030102301230
 ##  #### #### #### ####  ##  #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### #### ####  ##  #### #### ####
  #  #  #    # #  # #  #   #  #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  # #  #    # #  #   #  #  #    # #  #
  #    #   ### #  # #  #   #    #   ### #  #   #    #  #  #  ### #  #   #    #  #  #  ### #  #   #  #  #   #   ### #  #   #    #   ### #  #
  #   #      # #  # #  #   #   #      # #  #   #   #   #  #    # #  #   #   #   #  #    # #  #   #  #  #  #      # #  #   #   #      # #  #
 ### #### #### #### ####  ### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### #### ####  ### #### #### ####

太棒了!没想到水平字符这么少。不错的工作。
Accatyyc 2012年

1
谢谢。我想我的想法(十六进制数和移位)在Ruby实现中应该更短。
Ev_genus 2012年

10

J,84 82 81 80 75 69个字符

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

从键盘获取输入:

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

幻数FTW(或在这种情况下为第二名):-)


很好...很好...给我留下深刻的印象!今天有很多好的答案。也许我的设计师版画会好起来的。
Accatyyc 2012年

您可以将所有数字编码为一个二进制数,并对结果进行整形以获得相应的数字矩阵。
FUZxxl 2012年

@FUZxxl我确实尝试找到完整的80位数字,但#:似乎不适用于该大小的数字。#:1166416635908028473935870#:1166416635908028473931775两个给我相同的答案。
Gareth 2012年

8

Ç - 164个 151字符的水平

在IDEone上:http ://ideone.com/gljc3

代码(164字节):

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("");}}

在此处输入图片说明

编辑-151字节

我从评论中添加了一些建议,然后添加了一些。但是,这并不是完全安全的(我gets()要插入0长度的数组...)。

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)));}

注意,这i=puts("")是未定义的行为,因为我将其void视为int!它始终0在我的MinGW版本上返回,但1在IDEOne使用的编译器上返回。

接受十进制,输出基数为4(167字节)

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)));}

哦,C语言中的一小部分!那肯定会在一分钟内在我的旧CPU上运行。好一个
Accatyyc 2012年

您不能通过删除“!= 0”来保存3个字符吗?
2012年

是的,谢谢。我没有抓住那个。
卡斯莱2012年

getsfor(节省1)。移至puts外部for的增量并保存大括号。保存括号:(n[i]-48)*5+j-> n[i]*5-240+j与相同的技巧+4*(..
ugoren

可以减少到153个字节。对于CI的猜测来说还算不错。
卡斯莱2012年

7

Ruby,0123个字符+奖金([0123]与“#”)

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}

例:

% 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 

编辑:Ruby,87个字符

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

在此处输入图片说明


有创造力的一个!非常好。这在我的设计中看起来很棒。进行投票。
Accatyyc 2012年

整rick 请花一些时间来理解它。
manatwork,2012年

5

红宝石

垂直:116个字符

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}

样品运行:

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}'
####
   #
 ###
   #
####

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

 ## 
  # 
  # 
  # 
 ###

水平:150个 148字符

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*$/

样品运行:

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*$/'
#### ####  ##  
   # #  #   #  
 ###   #    #  
   #  #     #  
#### ####  ### 

我打算像这样编码。不要以为我能打败这就是我的语言!
格里芬2012年

4

数学174 145 139 118 119 123个字符

现在可以使用以10为底的输入(整数奖励)。早期版本可以在编辑中找到。


使用ArrayPlot

使用ArrayPlot我们可以将1和0直接转换为黑白方块,从而节省了一些字符。例如,n = 58021,即以4 为底的32022211

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

整数奖金


说明

输入为程序参数n

零可以{{1,1,1,1},{1,0,0,1},{1,0,0,1},{1,0,0,1},{1,1,1,1} 由十六进制对应项表示,也可以由十六进制对应项表示f999f

表达式f999f62227f924ff171f包含信息以显示所有数字{0,1,2,3}。(注意:它以开头f999f,正如我们指出的,它变相为零。)因为Mathematica不能将其识别为数字,所以我改用 89998622278924881718(在四个整数字符串中)将数字分解成整数,然后使用每个地方15个,出现8个。(这使我可以始终使用数字而不是字符串。)


1
您的输出与输入不匹配。
李斯特先生,2012年

您不可以将其换成垂直红利吗?
格里芬2012年

据我了解的规则,奖金是用于水平配置。
DavidC 2012年

Lister先生好抓住。我复制并在1处粘贴的零图片
DavidC

我的烂,读错了。
格里芬

3

数学112 107 103

我接受戴维的方法。

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

Mathematica图形

带奖励的105:

(用于n = 54321

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

Mathematica图形


确实很好。如此少的字符加奖金。干得好!
Accatyyc 2012年

3

APL(58 57)

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

输出:

0123
 #### ## #### #### 
 ###### 
 ####### 
 ##### 
 #### ### #### #### 

2

Python 2.7

垂直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'

水平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])

两者都将输入作为标准输入上的带引号的字符串

例如:
$。/ pretty
“ 0123”


您如何运行此程序?我得到错误。Python 2:“ TypeError:'int'对象不可迭代”,Python 3:“ TypeError:'builtin_function_or_method'对象不可下标”。
manatwork'8

@manatwork这是在python 2.7中,我已经编辑了答案以使其更加清楚。
马特

@manatwork此外,您似乎输入的数字可能没有引号,即:0123。您应该尝试在stdin上输入“ 0123”。
马特

现在工作了。对不起,这种报价技巧对我来说并不明显。
manatwork,2012年

@manatwork在3之前的python版本中,input()函数将输入评估为好像是python表达式。如果引号不存在,该程序将尝试对整数进行迭代,从而给您带来的错误。
马特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.