JS体操第三回開催中!

こんにちは!カヤック地域資本主義事業部の橋本です。
今回は現在カヤックで開催しているエンジニア採用企画JS体操第三問の告知になります!

今回の問題はちょっぴり怖い「Zalgo Textの生成」がテーマになっています。

以下のベースとなるZalgo Textを生成するコードを編集して、できるだけ短い文字数で任意の文字列をZalgo Textに変換するコードを書いてみてください!

このコードを115文字以下まで削ることができるので挑戦してみてください♪♪

/**
 *  Combining Character のコードポイント一覧
 *
 *  @type {number[]}
 */
const codePointList = [
  0x0300, 0x0310, 0x0320, 0x0330, 0x0340, 0x0350, 0x0360,
  0x0301, 0x0311, 0x0321, 0x0331, 0x0341, 0x0351, 0x0361,
  0x0302, 0x0312, 0x0322, 0x0332, 0x0342, 0x0352, 0x0362,
  0x0303, 0x0313, 0x0323, 0x0333, 0x0343, 0x0353, 0x0363,
  0x0304, 0x0314, 0x0324, 0x0334, 0x0344, 0x0354, 0x0364,
  0x0305, 0x0315, 0x0325, 0x0335, 0x0345, 0x0355, 0x0365,
  0x0306, 0x0316, 0x0326, 0x0336, 0x0346, 0x0356, 0x0366,
  0x0307, 0x0317, 0x0327, 0x0337, 0x0347, 0x0357, 0x0367,
  0x0308, 0x0318, 0x0328, 0x0338, 0x0348, 0x0358, 0x0368,
  0x0309, 0x0319, 0x0329, 0x0339, 0x0349, 0x0359, 0x0369,
  0x030a, 0x031a, 0x032a, 0x033a, 0x034a, 0x035a, 0x036a,
  0x030b, 0x031b, 0x032b, 0x033b, 0x034b, 0x035b, 0x036b,
  0x030c, 0x031c, 0x032c, 0x033c, 0x034c, 0x035c, 0x036c,
  0x030d, 0x031d, 0x032d, 0x033d, 0x034d, 0x035d, 0x036d,
  0x030e, 0x031e, 0x032e, 0x033e, 0x034e, 0x035e, 0x036e,
  0x030f, 0x031f, 0x032f, 0x033f, 0x034f, 0x035f, 0x036f,
];

/**
 *  1文字以上、8文字以下のランダムな Combining Character の文字列を生成する
 *
 *  @return {string}
 */
function genRandCombiningChars() {
  const COUNT_MAX = 8;
  const count = Math.ceil(COUNT_MAX * Math.random());

  let result = '';

  for (let i = 0; i < count; ++i) {
    const len = codePointList.length;
    const randIndex = Math.trunc(len * Math.random());
    const randCodePoint = codePointList[randIndex];
    const randCombiningChar = String.fromCodePoint(randCodePoint);

    result += randCombiningChar;
  }

  return result;
}

/**
 *  任意の文字列を Zalgo Text に変換する
 *
 *  @param  {string} str
 *  @return {string}
 */
export default function zalgo(str) {
  const len = str.length;

  let result = '';

  for (let i = 0; i < len; ++i) {
    const origChar = str[i];
    const randCombiningChars = genRandCombiningChars();

    result += origChar + randCombiningChars;
  }

  return result;
}

興味がわいた方は以下のサイトからファイルをダウンロードして挑戦してみてください

hubspot.kayac.com

Zalgo Textとは?

Zalgo(ザルゴ)とは、FlashアニメータDave Kallyによって生み出されたインターネット上の人々を狂気に陥れ破滅へと導く架空の生物。 Zalgo Textはダイアクリティカルマークとも呼ばれる「結合文字(Combining Character)」をまとい、まるでZalgoのような、狂気に満ちた呪われた文字列。世にも恐ろしいウェブサイトを作る際には必須なテクニックです!

というわけで、今回は任意の文字列をZalgo Textに変換する問題です。

JS体操とは?

『JS体操』とはカヤックが主催する JavaScript のコードゴルフ大会です。 JavaScriptの仕様を問うだけでなく、問題になっている実装が実務にどのように活かされているのかをテーマに各回出題しています。

リファレンス実装形式で出題していることもありますので、普段からJavaScriptをバリバリ書いている方も、普段は別の言語のメインに扱っている方も奮ってご参加ください!

hubspot.kayac.com

第一問 第二問についてはこちら!

hubspot.kayac.com

hubspot.kayac.com