0番染色体

科学は全世界を照らす光である

思わずTeXでフカセ暗号してみた

最近,巷では「フカセ暗号」なるものが流行っていて,そのジェネレーターは大人気のようです.

これまでのコレとかアレで「TeXで暗号化」してきた私としては,これをTeXで実装しない手はありません.ということで,作りました.

フカセ暗号とは

SEKAI NO OWARI の Fukase とかいう人が発明した最新の暗号らしいです.詳細は他のサイトにいくらでも説明があるので割愛します.

とりあえず実装する

実装と言っても,アルゴリズムもなにもあったものではないので,ほぼ数字のデザインゲーで終わります.今回はTikZを用いて雰囲気だけ元ネタを真似てみました.フォントやデザインについては,完全に私の専門外なのであまり細かいことは突っ込まないでください.気に食わなければご自分で調整してください.

以下,実装です.TikZ等のパッケージを使用するのでプリアンブル全体を載せています.

\documentclass[uplatex]{jsarticle}

\usepackage[dvipdfmx]{xcolor}
\usepackage[dvipdfmx]{graphicx}
\usepackage{tikz}

\definecolor{purple}{rgb}{0.5, 0, 0.5}
\definecolor{silver}{rgb}{0.75, 0.75, 0.75}

\makeatletter
\newcommand{\fks@one}[1]{%
  \@fks@alphtrue
  \begin{tikzpicture}[baseline=0pt,line width=1pt]
  \filldraw[fill=#1] (.1,0) -- (.2,0) -- (.2,.5) -- (.1,.4) -- (.1,0);
  \draw (0,0) -- (.3,0);
  \draw (.1,0) -- (.1,.4);
  \draw (.2,0) -- (.2,.5);
  \draw (.2,.5) -- (0,.3);
  \useasboundingbox (0,.6);
  \end{tikzpicture}}
\newcommand{\fks@two}[1]{%
  \@fks@alphtrue
  \begin{tikzpicture}[baseline=0pt,line width=1pt]
  \filldraw[fill=#1] (0,0) -- (.15,0) -- (.15,.2) -- cycle;
  \filldraw[fill=#1] (.15,.2) .. controls (.3,.4) and (.3,.5) .. (.15,.5) -- (.15,.2);
  \filldraw[fill=#1] (.035,.35) circle [radius=1pt];
  \draw (0,0) -- (.3,0);
  \draw (0,0) -- (.15,.2);
  \draw (.15,.2) .. controls (.3,.4) and (.3,.5) .. (.15,.5);
  \draw (.15,.5) .. controls (.1,.5) and (0,.45) .. (0,.35);
  \draw (.15,0) -- (.15,.5);
  \useasboundingbox (0,.6);
  \end{tikzpicture}}
\newcommand{\fks@three}[1]{%
  \@fks@alphtrue
  \begin{tikzpicture}[baseline=0pt,line width=1pt]
  \filldraw[fill=#1] (.15,.01) .. controls (.28,.03) and (.28,.22) .. (.15,.24) -- (.15,.01);
  \filldraw[fill=#1] (.15,.26) .. controls (.28,.28) and (.28,.47) .. (.15,.49) -- (.15,.24);
  \filldraw[fill=#1] (.035,.4) circle [radius=1pt];
  \draw (0,.1) .. controls (0,.02) and (.08,0) .. (.1,0);
  \draw (.1,0) .. controls (.3,.0) and (.3,.25) .. (.1,.25);
  \draw (.1,.25) .. controls (.3,.25) and (.3,.5) .. (.1,.5);
  \draw (.1,.5) .. controls (.08,.5) and (0,.48) .. (0,.4);
  \draw (.15,0) -- (.15,.5);
  \useasboundingbox (0,.6);
  \end{tikzpicture}}
\newcommand{\fks@four}[1]{%
  \@fks@alphtrue
  \begin{tikzpicture}[baseline=0pt,line width=1pt]
  \filldraw[fill=#1] (.15,0) -- (.25,0) -- (.25,.45) -- (.15,.3) -- (.15,0);
  \draw (.1,0) -- (.3,0);
  \draw (.15,0) -- (.15,.3);
  \draw (.25,0) -- (.25,.45) -- (0,.1) -- (.35,.1);
  \useasboundingbox (0,.6);
  \end{tikzpicture}}
\newcommand{\fks@five}[1]{%
  \@fks@alphtrue
  \begin{tikzpicture}[baseline=0pt,line width=1pt]
  \filldraw[fill=#1] (.12,0) .. controls (.26,.04) and (.3,.28) .. (.12,.3) -- (.12,0);
  \filldraw[fill=#1] (.035,.1) circle [radius=1pt];
  \filldraw[fill=#1] (.12,.3) .. controls (.11,.3) and (0,.25) .. (0,.2)
    -- (0,.45) -- (.12,.45) -- (.12,.3);
  \draw (0,.1) .. controls (0,.02) and (.11,0) .. (.12,0) 
    .. controls (.26,.04) and (.3,.28) .. (.12,.3);
  \draw (.12,.3) .. controls (.11,.3) and (0,.25) .. (0,.2) -- (0,.5);
  \draw (0,.45) -- (.25,.45);
  \draw (.12,0) -- (.12,.45);
  \useasboundingbox (0,.6);
  \end{tikzpicture}}
\newcommand{\fks@F}{\@fks@alphtrue{\huge F}}
\newcommand{\fks@J}{\@fks@alphtrue{\huge J}}
\newcommand{\fks@M}{\@fks@alphtrue{\huge M}}
\newcommand{\fks@Q}{\@fks@alphtrue{\huge Q}}
\newcommand{\fks@X}{\@fks@alphtrue{\huge X}}
\newcommand{\fks@Z}{\@fks@alphtrue{\huge Z}}

\newcount\@character
\newif\if@fks@alph

\def\Fukase#1{%
  \expandafter\@tfor\expandafter\member\expandafter:\expandafter=#1\do{%
    \@fks@alphfalse
    \expandafter\@character\expandafter=\expandafter`\member\relax
    % 小文字
    \ifnum\@character>96
      \advance\@character-97
      \ifcase\@character\fks@three{black}\or\fks@one{black}\or\fks@four{black}\or
      \fks@three{red}\or\fks@two{red}\or\fks@F\or\fks@one{green}\or
      \fks@two{white}\or\fks@two{silver}\or\fks@J\or\fks@five{black}\or
      \fks@three{yellow}\or\fks@M\or\fks@five{green}\or\fks@five{yellow}\or
      \fks@one{purple}\or\fks@Q\or\fks@one{red}\or\fks@one{silver}\or\fks@four{white}\or
      \fks@two{purple}\or\fks@four{silver}\or\fks@one{white}\or\fks@X\or
      \fks@one{yellow}\or\fks@Z\fi
    \fi
    % 大文字
    \ifnum\@character>64
      \advance\@character-65
      \ifcase\@character\fks@three{black}\or\fks@one{black}\or\fks@four{black}\or
      \fks@three{red}\or\fks@two{red}\or\fks@F\or\fks@one{green}\or
      \fks@two{white}\or\fks@two{silver}\or\fks@J\or\fks@five{black}\or
      \fks@three{yellow}\or\fks@M\or\fks@five{green}\or\fks@five{yellow}\or
      \fks@one{purple}\or\fks@Q\or\fks@one{red}\or\fks@one{silver}\or\fks@four{white}\or
      \fks@two{purple}\or\fks@four{silver}\or\fks@one{white}\or\fks@X\or
      \fks@one{yellow}\or\fks@Z\fi
    \fi
    \if@fks@alph\else{\huge\member}\fi
    }}

\makeatother

大きさは\hugeのサイズ(固定)です.その他には特に補足することもないのですが,一応2点だけ.

\ifcaseは直後に与えた変数について「0のとき〜」「1のとき〜」…… と処理するので,小文字と大文字についてそれぞれ a, A が0になるように調整する必要があります.

また,アルファベットでないときはそのまま出力するようにスイッチ\if@fks@alphで制御しています.

使ってみる

実際に使ってみます.さきほどのプリアンブルに以下を続け,タイプセットすれば完了です.

【入力】

\begin{document}

\noindent
question\\
\Fukase{we\ broke\ up}

\end{document}

【出力】

we broke up


2015/08/15 更新

いくつかコードの問題点を修正しました.

  • a の変換先を\fks@three{black}に修正
  • 最後の【入力】部分が不完全だったので改善
  • purpleが紫に見えない,という指摘をいただいたのでRGB値を手動で変更