如何为文本编写 ASCII 艺术(使用任何语言)?
How can I write ASCII art for text(using any language)?
我想编写一个程序来为文本打印以下模式 "NUOSPIN":
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * *
我正在研究 Javascript(NodeJS)。我必须在控制台上输出它。任何语言的实现都适合我,包括 java、C、javascript。我知道我可以通过使用预构建的 npm 包(如 asciify)来做到这一点,但我想这样做。我应该采取什么方法呢?我是否必须分别为每个字符的模式编写代码?然后按照运行每个字符的模式逻辑一个一个打印出来?
通常你在某个地方有一张大地图,可以将一个字符映射到它的外观,尤其是对于这种定制字体。然后,您将遍历输入字符串,查找字符的图片,将其放入缓冲区,并在完成后打印该缓冲区。
您也可以逐行直接打印到屏幕,查找每个字符的第一行,打印它,查找每个字符的第二行,等等。
如果您想真正发挥创意,您还可以使用特定字体绘制图像以纪念文本,然后将该图像与星号和空格一起绘制到控制台。
每行文字都要写好几遍。
首先是 ASCII 艺术字形的上排。
#!/usr/bin/python
import sys
# Each item in `font` is a list of `font_height` strings.
# The glyphs are not limited to asterisks and spaces.
font_height = 7
margin_left = 1
margin_right = 1
font = {
'N': [
"* *",
"* *",
"** *",
"* * *",
"* **",
"* *",
"* *",
],
'U': [
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
" *** ",
],
'O': [
" *** ",
"* *",
"* *",
"* *",
"* *",
"* *",
" *** ",
],
'S': [
" *** ",
"* *",
"* ",
" *** ",
" *",
"* *",
" *** ",
],
'P': [
"**** ",
"* *",
"* *",
"**** ",
"* ",
"* ",
"* ",
],
'I': [
" * ",
" * ",
" * ",
" * ",
" * ",
" * ",
" * ",
],
}
def printline(text):
for row in range(font_height):
for ch in text:
sys.stdout.write(' ' * margin_left)
sys.stdout.write(font[ch][row])
sys.stdout.write(' ' * margin_right)
sys.stdout.write('\n')
printline('NUOSPIN')
给我
sshoskar@oskog97:~$ ./test.py
* * * * *** *** **** * * *
* * * * * * * * * * * * *
** * * * * * * * * * ** *
* * * * * * * *** **** * * * *
* ** * * * * * * * * **
* * * * * * * * * * * *
* * *** *** *** * * * *
您可以使用位图和 assemble 您想要的 ASCII 样式的点。
function getWord(s) {
var ascii = [],
font = {
N: [7, 5, 5, 5],
U: [5, 5, 5, 7],
O: [7, 5, 5, 7],
S: [7, 4, 7, 7],
P: [7, 7, 4, 4],
I: [1, 1, 1, 1]
};
s.split('').forEach(function (c) {
var size =( font[c].reduce(function (r, a) {
return r | a;
}, 0)).toString(2).length;
font[c].forEach(function (a, i) {
var temp = a.toString(2).split('').map(function (c) {
return +c ? '*' : ' ';
});
while (temp.length < size) {
temp.unshift(' ');
}
ascii[i] = ascii[i] || [];
ascii[i].push(temp.join(''));
});
});
return ascii.map(function (a) {
return a.join(' ');
}).join('\n')
}
document.getElementById('tt').innerHTML = getWord('NUOSPIN');
<pre id="tt"></pre>
我想编写一个程序来为文本打印以下模式 "NUOSPIN":
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * *
* * * * * * * * * * * * * * *
我正在研究 Javascript(NodeJS)。我必须在控制台上输出它。任何语言的实现都适合我,包括 java、C、javascript。我知道我可以通过使用预构建的 npm 包(如 asciify)来做到这一点,但我想这样做。我应该采取什么方法呢?我是否必须分别为每个字符的模式编写代码?然后按照运行每个字符的模式逻辑一个一个打印出来?
通常你在某个地方有一张大地图,可以将一个字符映射到它的外观,尤其是对于这种定制字体。然后,您将遍历输入字符串,查找字符的图片,将其放入缓冲区,并在完成后打印该缓冲区。
您也可以逐行直接打印到屏幕,查找每个字符的第一行,打印它,查找每个字符的第二行,等等。
如果您想真正发挥创意,您还可以使用特定字体绘制图像以纪念文本,然后将该图像与星号和空格一起绘制到控制台。
每行文字都要写好几遍。 首先是 ASCII 艺术字形的上排。
#!/usr/bin/python
import sys
# Each item in `font` is a list of `font_height` strings.
# The glyphs are not limited to asterisks and spaces.
font_height = 7
margin_left = 1
margin_right = 1
font = {
'N': [
"* *",
"* *",
"** *",
"* * *",
"* **",
"* *",
"* *",
],
'U': [
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
" *** ",
],
'O': [
" *** ",
"* *",
"* *",
"* *",
"* *",
"* *",
" *** ",
],
'S': [
" *** ",
"* *",
"* ",
" *** ",
" *",
"* *",
" *** ",
],
'P': [
"**** ",
"* *",
"* *",
"**** ",
"* ",
"* ",
"* ",
],
'I': [
" * ",
" * ",
" * ",
" * ",
" * ",
" * ",
" * ",
],
}
def printline(text):
for row in range(font_height):
for ch in text:
sys.stdout.write(' ' * margin_left)
sys.stdout.write(font[ch][row])
sys.stdout.write(' ' * margin_right)
sys.stdout.write('\n')
printline('NUOSPIN')
给我
sshoskar@oskog97:~$ ./test.py
* * * * *** *** **** * * *
* * * * * * * * * * * * *
** * * * * * * * * * ** *
* * * * * * * *** **** * * * *
* ** * * * * * * * * **
* * * * * * * * * * * *
* * *** *** *** * * * *
您可以使用位图和 assemble 您想要的 ASCII 样式的点。
function getWord(s) {
var ascii = [],
font = {
N: [7, 5, 5, 5],
U: [5, 5, 5, 7],
O: [7, 5, 5, 7],
S: [7, 4, 7, 7],
P: [7, 7, 4, 4],
I: [1, 1, 1, 1]
};
s.split('').forEach(function (c) {
var size =( font[c].reduce(function (r, a) {
return r | a;
}, 0)).toString(2).length;
font[c].forEach(function (a, i) {
var temp = a.toString(2).split('').map(function (c) {
return +c ? '*' : ' ';
});
while (temp.length < size) {
temp.unshift(' ');
}
ascii[i] = ascii[i] || [];
ascii[i].push(temp.join(''));
});
});
return ascii.map(function (a) {
return a.join(' ');
}).join('\n')
}
document.getElementById('tt').innerHTML = getWord('NUOSPIN');
<pre id="tt"></pre>