PrettyFontで数値を出力します


13

PrettyFontという新しいフォントを設計しました。私はそれを完成させることに多くの時間を費やしましたが、私は働く人なので、それを終わらせる時間がありません。したがって、現在は4文字しか含まれていません。私が金持ちになったある日、それはそれを終えることが私の生涯の目標になりますが、今のところ...

これはPrettyFontです:(0、1、2、3)

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

各文字は幅4ピクセル、高さ5ピクセルです。今!PrettyFontで数値を出力するプログラムを作成して、印刷用のデザインを送信できるようにします。

ルール:

入力は、基数4の文字列番号(文字0〜3のみ)、たとえば「01321」です。プログラムは、文字列内の少なくとも10文字を処理できる必要があります。ボーナスポイントは、文字列の代わりに実際の基数10の整数を取るプログラムに与えられます。編集の明確化:整数ボーナスは、54321のような任意の10進数を入力できることを意味し、プログラムはそれを4進数に変換して出力します(この場合は31100301)。

出力は、PrettyFontで印刷された番号になります。入力と出力の例:

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

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

 ## 
  # 
  # 
  # 
 ###

次のような単一行形式で出力できるプログラムへの大きなボーナス:

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

「#」文字は必須ではなく、任意の文字に置き換えることができます。

垂直出力では、各PrettyFont文字の間に空の行が必要です。誰かが水平出力を行う場合、各PrettyFont文字の間に1つの空白文字「」またはタブ文字が必要です。

これはコードゴルフで、最短のコードが勝ちます!(オフィスのコンピューターのストレージが限られているため、短くする必要があります。)


1
まったく重複しているわけではありませんが、これとcodegolf.stackexchange.com/questions/3628/…の唯一の基本的な違いは、ルックアップテーブルです。
ピーターテイラー

PrettierFont -banner -c '#' 0123
ドレイクClarris

1
4ピクセル幅では「M」に問題が発生します
キャメロンマクファーランド

入力として10の基本数を取ると、いくつの文字がボーナスになりますか?
defhlt

よくわからない。それがどれほど難しいかを知るために、私はさらにいくつかの解決策を見る必要があります。私は自分でコードゴルフが得意ではないので...提案に感謝します!
Accatyyc

回答:


11

k(118117 72 71 69 66文字)

私はまだこれをゴルフするために多くの努力をしていませんが、あまり多くの文字で望ましい水平出力を達成しません:

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

stdinから入力を受け取り、出力をstdoutに出力します。

編集:出力「ビットマップ」に圧縮形式を実装することで、72に縮小しました。64ビットintをバイナリに変換し、0と1を「#」または「」にマッピングすることでビットマップが作成されます。他の解決策のいくつかのように16進数からそれをすることができましたが、これはより長くなると思います。ヘックスが優れていることが判明。

012301のサンプル出力:

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

//編集:-6文字


印象的。最短のコード!私の限られたストレージドライブに収まるかもしれません。よくやった。
-Accatyyc

71個まで。結合されたkdb + / q / k exeがスリムな392kBで重さがあることを考えると、これは限られたストレージドライブに最適かもしれません;)
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)]

申し訳ありませんが、垂直は私にとって面白くありませんでした。

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

すばらしいもの!水平方向の文字はそれほど期待していませんでした。良くやった。
Accatyyc

1
THX。Rubyの実装では、私の考え(16進数とシフト)はさらに短くなるはずです。
Ev_genus

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(または、この場合は2位):-)


とてもいい...とてもいい...感動しました!今日多くの良い答え。たぶん、私のデザイナープリントはうまくいくでしょう。
Accatyyc

すべての数字を1つの2進数にエンコードし、結果を変形して対応する数値行列を取得できます。
-FUZxxl

@FUZxxl私は完全な80ビットの数値を見つけようとしましたが、#:そのサイズの数値では機能しないようでした。#:1166416635908028473935870そして、#:1166416635908028473931775の両方が私のために同じ答えを与えます。
ガレス

8

C- 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ようにint0私のバージョンのMinGWでは一貫して戻りますが、1IDEOneが使用するコンパイラでは戻ります。

10進数を受け入れ、基数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で1分以内に確実に実行されます。良いもの。
Accatyyc

「!= 0」を削除して3文字を保存できませんでしたか?
a3nm

うん、ありがとう。私はそれをキャッチしませんでした。
カスライ

gets内に置くfor(保存1)。puts外部forの増分に移動して中括弧を保存します。括弧を保存:(n[i]-48)*5+j-> n[i]*5-240+j、と同じトリック+4*(..
ugoren

153バイトまで。CIの推測にはそれほど悪くありません。
カスライ

7

ルビー、0123文字+ボーナス([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}

例:

% 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

トリッキー!それを理解するのに時間がかかります。
マナトワーク

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

そのようにエンコードするつもりでした。私がこれを打ち負かすことができるとは思わないでください!
グリフィン

4

Mathematicaの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} 、対応する16進数で表すことができますf999f

式にはf999f62227f924ff171f、すべての数値{0,1,2,3}を表示するための情報が保持されます。(注:冒頭でf999f述べたように、これはゼロであるため偽装されています。)Mathematicaはこれを数値として認識しないため、 89998622278924881718代わりに(4つの整数文字列で)使用し、その数値を整数に分割してから使用しましたあらゆる場所に15が8が現れました。(これにより、全体を通して文字列の代わりに数字を使用することができました。)


1
出力が入力と一致しません。
ミスターリスター

垂直ボーナスのためにそれを転置することはできませんか?
グリフィン

ルールを理解しているように、ボーナスは水平構成にあります。
DavidC

ミスター・リスター良いキャッチ。1の場所にゼロの写真をコピーして貼り付けました。
DavidC12年

私の悪い、誤読。
グリフィン

3

Mathematica112 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

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これはPython 2.7にありますが、答えを編集して明確にしました。
マット

@manatworkまた、引用符なしで数字を入力しているように見えます(例:0123)。stdinに「0123」と入力してみてください。
マット

動作するようになりました。申し訳ありませんが、その引用のトリックは私には明らかではありませんでした。
マナトワーク

3より前のPythonバージョンの@manatworkは、input()関数が入力をpython式であるかのように評価します。引用符が存在しない場合、プログラムは整数を反復しようとし、取得したエラーを表示します。
マット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.