Skip to content

Instantly share code, notes, and snippets.

@wrongbyte
Last active November 1, 2021 14:08
Show Gist options
  • Save wrongbyte/b47453e011fc478986372f07db76bbe7 to your computer and use it in GitHub Desktop.
Save wrongbyte/b47453e011fc478986372f07db76bbe7 to your computer and use it in GitHub Desktop.
Printe letrinhas bonitinhas com nodeJS
const L = parseInt(process.argv[2]);
const H = parseInt(process.argv[3]);
const T = process.argv[4];
/* exemplo: node asciiArt.js 5 5 ESSE_CODIGO_TA_RUIM
##### #### #### ##### #### # #### ##### #### # ##### # #### # # ##### # #
# # # # # # # # # # # # # # # # # # # # # ## ##
#### # # #### # # # # # # # # # # # ##### #### # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # #
##### #### #### ##### #### # #### ##### #### # # # # # # ##### ##### # #
OBSERVAÇÕES
O código tá uma bagunça pq eu fiz aleatoriamente isso aqui (OUTRA HORA EU ARRUMO), mas funciona, então se vc quiser testar..
COMO USAR:
1 - Os dois primeiros argumentos são os tamanhos da largura e altura das letras.
Eu só testei com altura e largura iguais, com 5x5 e 7x7, respectivamente. Outros valores podem n funcionar
2 - Use letras maiúsculas, e divida as palavras com underscore (esse simbolo aqui _ )
*/
/* A LÓGICA Q EU USEI
Vamos definir a estrutura base de uma letra, que é a seguinte:
_ _ _ _ _
| | | Para evitar 26 funções diferentes, nós vemos os pontos comuns entre essas linhas
| | | da estrutura em cada letra. Por ex, tanto E quanto F têm a primeira linha inteiramente
|- - - - -| preenchida. Tanto H quanto A tem a linha H/2 inteiramente preenchida, e por aí vai.
| | | Então, tomando por referência essas linhas principais que formam todas as 26 letras,
|_ _ | _ _| podemos escrever uma função que vai printar todas as letras de uma dada palavra.
Para montar uma palavra, printamos todos os char de uma linha.
A cada L char, adicionamos um espaço e começamos a printar a linha countH da próxima letra.
*/
let countH = 0;
let char = '#';
console.log('');
writeLetters();
// TODO: passar pra uppercase todas as letras
// TODO: ARRUMAR COISAS Q ENVOLVEM AS METADES (definir halfH e halfL separadamente)
// TODO: substituir por (se no conjunto) por (se fora do conjunto)
function writeLetters(){
// cada linha
for (let j = 0; j < H; j++) {
let row = '';
// vamos concatenando os caracteres de cada linha countH de cada letra i e no fim de cada iteração printamos a linha inteira
for (let i = 0; i < T.length; i++){
// ================== LETRAS COM A PRIMEIRA LINHA TOTALMENTE PREENCHIDA ==============================
if (T[i] === 'E' || T[i] === 'F' || T[i] === 'I' || T[i] === 'N' || T[i] === 'T' || T[i] === 'Z'){
// Primeira linha em comum e linha final inteira
if (countH === 0 || countH === H - 1 && (T[i] === 'E' || T[i] === 'Z' || T[i] === 'I')){
row += char.repeat(L);
}
// Linha do meio
else if (countH === Math.round(H / 2) - 1 && (T[i] === 'E' || T[i] === 'F')){
row = row + char.repeat(L - 1) + ' ';
}
// "Corpo" à esquerda
else {
if (T[i] === 'Z'){
row += (' ').repeat(H - countH - 1) + char + (' ').repeat(countH);
} else if (T[i] === 'T' || T[i] === 'I'){
// Linha central <=========
row += (' ').repeat(Math.round(H / 2) - 1) + char + (' ').repeat(Math.round(H / 2) - 1);
} else if(T[i] === 'N'){
row += char + (' ').repeat(L - 2) + char;
} else {
row += char + (' ').repeat(L - 1);
}
}
}
// Letras com char nas extremidades da primeira: H, K, M, U, V, W, X, Y
else if (T[i] === 'H' || T[i] === 'K' || T[i] === 'M' || T[i] === 'U' || T[i] === 'V' || T[i] === 'W' || T[i] === 'X' || T[i] === 'Y'){
// Pimeira e ultima linhas caso dois char nas extremidades
if (countH === 0 || countH === H - 1 && (T[i] === 'H' || T[i] === 'K' || T[i] === 'M' || T[i] === 'W' || T[i] === 'X')){
row += char + (' ').repeat(L - 2) + char;
}
// ========== LINHA DO MEIO ==============
else if (countH === Math.round(H / 2) - 1 && T[i] === 'H') {
row += char.repeat(L);
}
// ========= CORPO DA LETRA ===========
else {
// ======= H E U
if (T[i] === 'H' || T[i] === 'U' || T[i] === 'V') {
if (countH === H - 1){
T[i] === 'U' ? row += char.repeat(L): row += (' ').repeat(Math.round(H / 2) - 1) + char + (' ').repeat(Math.round(H / 2) - 1);
} else row += char + (' ').repeat(L - 2) + char;
}
else if (T[i] === 'Y' || T[i] === 'X'){
if (T[i] === 'Y'){
countH < Math.round(H / 2) - 1 ? row += char + (' ').repeat(L - 2) + char : row += (' ').repeat(Math.round(H / 2) - 1) + char + (' ').repeat(Math.round(H / 2) - 1);
} else {
countH === Math.round(H / 2) - 1 ? row += (' ').repeat(Math.round(H / 2) - 1) + char + (' ').repeat(Math.round(H / 2) - 1) : row += char + (' ').repeat(L - 2) + char;
}
}
if (T[i] === 'K'){
if (countH === Math.round(H / 2) - 1){
row += char.repeat(2) + (' ').repeat(L - 2)
} else {
countH < Math.round(H / 2) - 1 ? row += char + (' ').repeat(H - countH - 2) + char + (' ').repeat(countH) : row += char + (' ').repeat(countH - 1) + char + (' ').repeat(countH - 2);
}
}
else if (T[i] === 'M' || T[i] === 'W') {
if (T[i] === 'M') {
if (countH === Math.round(H / 2) - 1) {
row += char + (' ').repeat(Math.round((L - 3)/2)) + char + (' ').repeat(Math.round((L - 3)/2)) + char
} else {
countH < Math.round(H / 2) - 1 ? row += char.repeat(2) + (' ').repeat(L - 4) + char.repeat(2) : row += char + (' ').repeat(L - 2) + char;
}
}
// O oposto do acima p W
else {
if (countH === Math.round(H / 2) - 1) {
row += char + (' ').repeat(Math.round((L - 3)/2)) + char + (' ').repeat(Math.round((L - 3)/2)) + char
} else {
countH > Math.round(H / 2) - 1 ? row += char.repeat(2) + (' ').repeat(L - 4) + char.repeat(2) : row += char + (' ').repeat(L - 2) + char;
}
}
}
}
}
// Letras com um char central na primeira linha: A, O, Q
else if (T[i] === 'A' || T[i] === 'O' || T[i] === 'Q'){
if (countH === 0 || (T[i] === 'O' && countH === H - 1)){
row += (' ').repeat(Math.round(H / 2) - 1) + char + (' ').repeat(Math.round(H / 2) - 1);
}
else if (T[i] === 'O'){ row += char + (' ').repeat(L - 2) + char; }
else if (T[i] === 'A'){ countH === Math.round(H / 2) - 1 ? row += char.repeat(L) : row += char + (' ').repeat(L - 2) + char;}
else if (T[i] === 'Q') { countH < Math.round(H / 2) ? row += char + (' ').repeat(L - 2) + char : row += (' ').repeat(countH) + char.repeat(L - countH)}
}
// Letras com dois char à esquerda
else if (T[i] === 'B' || T[i] === 'D' || T[i] === 'P' || T[i] === 'R'){
if (countH === 0 || (T[i] === 'B' || T[i] === 'D') && countH === H - 1) {
row += char.repeat(L - 1) + ' ';
}
else if (T[i] === 'D') { row += char + (' ').repeat(L - 2) + char }
else if (T[i] === 'B') { countH === Math.round(H / 2) - 1? row += char.repeat(L - 1) + (' ').repeat(1): row += char + (' ').repeat(L - 2) + char }
else if (T[i] === 'P') {
if (countH === Math.round(H / 2) - 1){ row += char.repeat(L - 1) + ' ' }
else {countH < Math.round(H / 2) - 1 ? row += char + (' ').repeat(L - 2) + char : row += char + (' ').repeat(L - 1)}
}
else if (T[i] == 'R') { countH === Math.round(H / 2) - 1 ? row += char.repeat(L - 1) + ' ' : row += char + (' ').repeat(L - 2) + char }
}
// Letras com dois char à direita
else if (T[i] === 'C' || T[i] === 'G' || T[i] === 'S') {
if (countH === 0 || (countH === H - 1 && T[i] !== 'S')){
row += (' ').repeat(1) + char.repeat(L -1)
}
else if (T[i] === 'S') {
if (countH === H - 1) { row += char.repeat(L -1) + (' ').repeat(1) }
else {row += (' ').repeat(countH) + char + (' ').repeat(H - countH - 1)}
}
else if (T[i] === 'C') { row += char + (' ').repeat(L - 1) }
else if (T[i] === 'G') { countH < Math.round(H / 2) - 1 ? row += char + (' ').repeat(L - 1) : row += char + (' ').repeat(L - 2) + char}
}
else if (T[i] === 'L') {
countH === H - 1 ? row += char.repeat(L) : row += char + (' ').repeat(L - 1)
}
row += ' '; // espaço entre as letras
}
console.log(row);
countH += 1;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment