【しょぼい】コンソールで回転する地球


## これ

![a.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/0aa1031a-dc88-4436-ae9f-a34fc958be27.gif)

## ソース

```javascript
const 世界地図の文字列 =
`                                                                                                                                                            ########          ##########      
                ####                                        ##                                                                                        ########    ########################    
                                            ############################################                                                ########    ##  ##########        ##############      
              ####  ##############################################################################                ####################################            ##        ####              
      ##      ##  ############################################################          ##                            ####################################    ##########                      
        ##########################################################################                                                ########################################                    
        ########################################################################                                                    ####################  ##########                          
      ####    ##########      ####  ########################################      ####                                                ############################                            
    ####              ############  ##################################  ##        ####                                                  ########################                              
    ####              ############  ##################################  ##      ####                                                    ########################                              
      ########            ############################################      ######                                                      ######################                                
    ##################    ############################################    ####                                                            ##################                                  
  ################################  ##################################                                                                        ########                                        
  ########################  ##########      ########################                                                                            ######                                        
##################################            ####        ######                                                                                      ########                                
  ##############################                ##            ##                                                                                            ######                            
  ################################                                                                                                                            ############                    
              ##################                            ##  ####                                                                                          ##############                  
              ################                              ##                                                                                              ################                  
                ##########      ##                                    ################                                                                            ##############              
                  ######                                            ##################                                                                            ##########                  
                                                                              ########                                                                          ########                      
                                                                                                                                                                ##                            `;

const 世界地図行List = 世界地図の文字列.split("\n");

const 円の文字列 =
`                     ABCCDDDCCBA
                AABBCCCCDDDDDCCCCBBAA
            AAABBBCCCCCDDDDDDDCCCCCBBBAAA
         AAAABBBCCCCCCDDDDDDDDDCCCCCCBBBAAAA
      AAAAABBBBCCCCCCDDDDDDDDDDDCCCCCCBBBBAAAAA
    AAAAABBBBCCCCCCCDDDDDDDDDDDDDCCCCCCCBBBBAAAAA
   AAAABBBBCCCCCCCCDDDDDDDDDDDDDDDCCCCCCCCBBBBAAAA
  AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
 AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
 AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
 AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
 AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
  AAAABBBBBCCCCCCCCDDDDDDDDDDDDDDDCCCCCCCCBBBBBAAAA
   AAAABBBBCCCCCCCCDDDDDDDDDDDDDDDCCCCCCCCBBBBAAAA
    AAAAABBBBCCCCCCCDDDDDDDDDDDDDCCCCCCCBBBBAAAAA
      AAAAABBBBCCCCCCDDDDDDDDDDDCCCCCCBBBBAAAAA
         AAAABBBCCCCCCDDDDDDDDDCCCCCCBBBAAAA
            AAABBBCCCCCDDDDDDDCCCCCBBBAAA
                AABBCCCCDDDDDCCCCBBAA
                     ABCCDDDCCBA`;

const 円行List = 円の文字列.split("\n").map(円行 => 円行.trim());;
const 円行文字数List = 円行List.map(円行 => 円行.length);

if (世界地図行List.length !== 円行文字数List.length) {
    throw new Error("んにゃぴ");
}
if (円行文字数List.some(円行文字数 => 円行文字数 % 2 === 0)) {
    throw new Error("んにゃぴ");
}

let 円行文字数_最大 = 0;
let 円行比率_基準 = [];
const 円行比率List = [];

for (const 円行 of 円行List) {
    const 円行比率 = [];
    let 数えている文字 = 円行[0];
    let count = 0;
    for (const 文字 of 円行) {
        if (文字 === 数えている文字) {
            count++;
        }
        else {
            円行比率.push(count);
            数えている文字 = 文字;
            count = 1;
        }
    }
    円行比率.push(count);
    円行比率List.push(円行比率);

    if (円行.length > 円行文字数_最大) {
        円行文字数_最大 = 円行.length;
        円行比率_基準 = 円行比率;
    }
}

if (円行比率List.some(円行比率 => 円行比率.length !== 円行比率_基準.length)) {
    throw new Error("んにゃぴ");
}

const 円行比率_基準内の最大値 = Math.max(...円行比率_基準);
const 世界地図のコピー時の文字数 = 円行比率_基準内の最大値 * 円行比率_基準.length;

let 世界地図基準列 = 0;
const 世界地図基準列_最大 = 世界地図行List[0].length;

setInterval(() => {
    描画();
    世界地図基準列 = (世界地図基準列 + 世界地図基準列_最大 - 1) % 世界地図基準列_最大;
}, 80);

function 描画() {
    console.clear();
    for (let i = 0; i < 世界地図行List.length; i++) {
        const 世界地図行 = 世界地図行List[i];
        const 円行比率 = 円行比率List[i];
        const 世界地図行の一部 = (世界地図行 + 世界地図行).slice(世界地図基準列, 世界地図基準列 + 世界地図のコピー時の文字数);
        const 世界地図行の一部の分割文字列List = [];
        for (let i = 0; i < 世界地図行の一部.length; i += 円行比率_基準内の最大値) {
            世界地図行の一部の分割文字列List.push(世界地図行の一部.slice(i, i + 円行比率_基準内の最大値));
        }
        
        let 地球行の一部 = "";

        for (let i = 0; i < 円行比率.length; i++) {
            const 円行の一部の文字数 = 円行比率[i];
            const 世界地図行の一部の分割文字列 = 世界地図行の一部の分割文字列List[i];
            const 削除する文字数 = 円行比率_基準内の最大値 - 円行の一部の文字数;
            if (世界地図行の一部の分割文字列.length < 削除する文字数) {
                throw new Error("んにゃぴ");
            }
            let 円行の一部の文字列 = "";
            if (削除する文字数 === 0) {
                円行の一部の文字列 = 世界地図行の一部の分割文字列;
            }
            else {
                const 文字を削除する間隔 = Math.ceil(世界地図行の一部の分割文字列.length / 削除する文字数);
                for (let i = 0; i < 世界地図行の一部の分割文字列.length; i += 文字を削除する間隔) {
                    const 削除処理を入れる文字列 = 世界地図行の一部の分割文字列.slice(i, i + 文字を削除する間隔);
                    const center = Math.floor(削除処理を入れる文字列.length / 2);
                    円行の一部の文字列 += 削除処理を入れる文字列.slice(0, center) + 削除処理を入れる文字列.slice(center + 1);
                }
            }
            if (円行の一部の文字列.length > 円行の一部の文字数) {
                const さらに削除する文字数 = 円行の一部の文字列.length - 円行の一部の文字数;
                if (i < 円行比率.length / 2) {
                    円行の一部の文字列 = 円行の一部の文字列.slice(さらに削除する文字数);
                }
                else {
                    円行の一部の文字列 = 円行の一部の文字列.slice(0, -さらに削除する文字数);
                }
            }
            if (円行の一部の文字列.length !== 円行の一部の文字数) {
                throw new Error("んにゃぴ");
            }
            地球行の一部 += 円行の一部の文字列;
        }

        const 宇宙 = "#".repeat((円行文字数_最大 - 円行文字数List[i]) / 2);
        console.log(宇宙 + " " + 地球行の一部 + " " + 宇宙);
    }
}
```

## 解説

世界地図を球体に貼り付けている感じ（雑）

## 最後に

端っこがバグってる気もしないでもないが面倒なので気にしない