1.はじめに
どうも、趣味でデータ分析している猫背なエンジニアです。
今回は最近はまっているASCIIアートに関してツールを作ったので、記録します。
2.スクリプト概要
■ 概要
このスクリプトでは、入力した文字列を大文字に変換し、ASCIIアートで出力します。
出力できる文字としては、今回はアルファベットと!に限定します。
私個人として需要が出たら増やしたり機能拡張をしたいと思っています。
■ フォント定義の仕組み
アルファベットやスペース、!などの記号を辞書で定義します。各文字は6行のASCIIアートで表現されています。
※ここでは一部のみ掲載しています。付録として最終行にすべての行をしめしたものを添付しています。
■ render関数の解説
文字列を受け取り、ASCIIアートに変換する関数です。
文字列を大文字に統一して、辞書にある文字と一致させることを基本として、各文字の6行のデザインをループで結合するようにしています。
6行以上のデザインにもできますが、くどくない設計はこの6行前後がベストかなと思っています。
また、不明な文字(未定義の文字)は????で表示するようにしています。
def render(text):
text = text.upper() # 大文字に統一
lines = [""] * 6 # 6行分の空リストを用意
for ch in text:
if ch in FONT:
for i in range(6):
lines[i] += FONT[ch][i] + ""
else:
for i in range(6):
lines[i] += "???? " # 未定義文字は????で表示
return "\n".join(lines)
■ 実行例
print(render("HELLO WORLD!"))を実際に実行した結果を以下に示します。
3.おわりに
Pythonで簡単にASCIIアートフォントを作れるようにしました。
特に最近はAdventCalendarでASCIIアートを使う機会が増えたので、効率化ツールとしても最高と思っています。
皆さんもぜひ自分オリジナルのフォントを作って遊んでみてください。
4.付録
以下にアルファベット+!を付けたツールを添付いたします。
FONT = {
"A": [
" █████╗ ",
"██╔══██╗",
"███████║",
"██╔══██║",
"██║ ██║",
"╚═╝ ╚═╝",
],
"B": [
"██████╗ ",
"██╔══██╗",
"██████╔╝",
"██╔══██╗",
"██████╔╝",
"╚═════╝ ",
],
"C": [
" ██████╗",
"██╔════╝",
"██║ ",
"██║ ",
"╚██████╗",
" ╚═════╝",
],
"D": [
"██████╗ ",
"██╔══██╗",
"██║ ██║",
"██║ ██║",
"██████╔╝",
"╚═════╝ ",
],
"E": [
"███████╗",
"██╔════╝",
"██████╗ ",
"██╔════╝",
"███████╗",
"╚══════╝",
],
"F": [
"███████╗",
"██╔════╝",
"██████╗ ",
"██╔════╝",
"██║ ",
"╚═╝ ",
],
"G": [
" ██████╗ ",
"██╔════╝ ",
"██║ ███╗",
"██║ ██║",
"╚██████╔╝",
" ╚═════╝ ",
],
"H": [
"██╗ ██╗",
"██║ ██║",
"███████║",
"██╔══██║",
"██║ ██║",
"╚═╝ ╚═╝",
],
"I": [
"███████╗",
" ██╔═╝",
" ██║ ",
" ██║ ",
"███████╗",
"╚══════╝",
],
"J": [
" ██╗",
" ██║",
" ██║",
"██╗ ██║",
"╚█████╔╝",
" ╚════╝ ",
],
"K": [
"██╗ ██╗",
"██║ ██╔╝",
"█████╔╝ ",
"██╔═██╗ ",
"██║ ██╗",
"╚═╝ ╚═╝",
],
"L": [
"██╗ ",
"██║ ",
"██║ ",
"██║ ",
"███████╗",
"╚══════╝",
],
"M": [
"███╗ ███╗",
"████╗ ████║",
"██╔████╔██║",
"██║╚██╔╝██║",
"██║ ╚═╝ ██║",
"╚═╝ ╚═╝",
],
"N": [
"███╗ ██╗",
"████╗ ██║",
"██╔██╗ ██║",
"██║╚██╗██║",
"██║ ╚████║",
"╚═╝ ╚═══╝",
],
"O": [
" ██████╗ ",
"██╔═══██╗",
"██║ ██║",
"██║ ██║",
"╚██████╔╝",
" ╚═════╝ ",
],
"P": [
"██████╗ ",
"██╔══██╗",
"██████╔╝",
"██╔═══╝ ",
"██║ ",
"╚═╝ ",
],
"Q": [
" ██████╗ ",
"██╔═══██╗ ",
"██║ ██║ ",
"██║ ██║ ",
"╚████████╗",
" ╚═══════╝",
],
"R": [
"██████╗ ",
"██╔══██╗",
"██████╔╝",
"██╔══██╗",
"██║ ██║",
"╚═╝ ╚═╝",
],
"S": [
"███████╗",
"██╔════╝",
"███████╗",
"╚════██║",
"███████║",
"╚══════╝",
],
"T": [
"████████╗",
"╚══██╔══╝",
" ██║ ",
" ██║ ",
" ██║ ",
" ╚═╝ ",
],
"U": [
"██╗ ██╗",
"██║ ██║",
"██║ ██║",
"██║ ██║",
"╚█████╔╝",
" ╚════╝ ",
],
"V": [
"██╗ ██╗",
"██║ ██║",
"██║ ██║",
"╚██╗ ██╔╝",
" ╚████╔╝ ",
" ╚═══╝ ",
],
"W": [
"██╗ ██╗",
"██║ ██║",
"██║ █╗ ██║",
"██║███╗██║",
"╚███╔███╔╝",
" ╚══╝╚══╝ ",
],
"X": [
"██╗ ██╗",
"╚██╗██╔╝",
" ╚███╔╝ ",
" ██╔██╗ ",
"██╔╝ ██╗",
"╚═╝ ╚═╝",
],
"Y": [
"██╗ ██╗",
"╚██╗ ██╔╝",
" ╚████╔╝ ",
" ╚██╔╝ ",
" ██║ ",
" ╚═╝ ",
],
"Z": [
"████████╗",
"╚═══███╔╝",
" ███╔╝ ",
" ███╔╝ ",
" ███╔╝ ",
"████████╗",
"╚═══════╝",
],
" ": [
" ",
" ",
" ",
" ",
" ",
" ",
],
"!": [
" ██╗ ",
" ██║ ",
" ██║ ",
" ╚═╝ ",
" ██╗ ",
" ╚═╝ ",
]
}
def render(text):
text = text.upper()
lines = [""] * 6
for ch in text:
if ch in FONT:
for i in range(6):
lines[i] += FONT[ch][i] + ""
else:
for i in range(6):
lines[i] += "???? "
return "\n".join(lines)
print(render("HELLO WORLD!"))

