<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>隙间月影 | Sukima Moonlight Blog</title>
        <link>https://sukima-ml.club/en/blog</link>
        <description>隙间月影 | Sukima Moonlight Blog</description>
        <lastBuildDate>Tue, 16 Dec 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Revealing the Algorithm Behind the 'Touhou Project Personality Test']]></title>
            <link>https://sukima-ml.club/en/blog/touhou-personality-test-analysis</link>
            <guid>https://sukima-ml.club/en/blog/touhou-personality-test-analysis</guid>
            <pubDate>Tue, 16 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, the mini-test "Which Touhou Character Are You?" went viral in various QQ groups. As a proud CS student and the organizer of a Touhou doujin circle, I couldn't help but wonder: How does this test actually work? Does it truly use machine learning to match characters, or is it just simple conditional logic? Is my intuition about a "six-dimensional vector" matching actually correct?]]></description>
            <content:encoded><![CDATA[<p>Today, the mini-test "Which Touhou Character Are You?" went viral in various QQ groups. As a proud CS student and the organizer of a Touhou doujin circle, I couldn't help but wonder: How does this test actually work? Does it truly use machine learning to match characters, or is it just simple conditional logic? Is my intuition about a "six-dimensional vector" matching actually correct?</p>
<p>To solve this mystery, I analyzed the source code of the webpage. In this article, I will take you deep into the code to see how your "soul character" is actually calculated.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-discovery-six-dimensions-are-not-just-vectors">Core Discovery: Six Dimensions Are Not Just Vectors<a href="https://sukima-ml.club/en/blog/touhou-personality-test-analysis#core-discovery-six-dimensions-are-not-just-vectors" class="hash-link" aria-label="Direct link to Core Discovery: Six Dimensions Are Not Just Vectors" title="Direct link to Core Discovery: Six Dimensions Are Not Just Vectors" translate="no">​</a></h2>
<p>After reverse-engineering the source code (mainly the <code>index-*.js</code> files), I found that the test is indeed based on a <strong>six-dimensional personality model</strong>. Similar to the well-known MBTI (four-dimensional), this test introduces two additional dimensions, constructing a more complex classification system.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-twelve-sub-dimensions-and-six-axes">1. Twelve Sub-dimensions and Six Axes<a href="https://sukima-ml.club/en/blog/touhou-personality-test-analysis#1-twelve-sub-dimensions-and-six-axes" class="hash-link" aria-label="Direct link to 1. Twelve Sub-dimensions and Six Axes" title="Direct link to 1. Twelve Sub-dimensions and Six Axes" translate="no">​</a></h3>
<p>The code defines 12 basic dimensions, which are paired in opposites to form 6 core personality axes. Here is a snippet of the definitions found in the code:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Dimension mapping in the code</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> dimensions </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">code</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"e"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Extroverted"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">opposite</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"i"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">oppositeName</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Introverted"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">code</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"n"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Intuitive"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">opposite</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">oppositeName</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Sensing"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">code</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"t"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Thinking"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">opposite</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"f"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">oppositeName</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Feeling"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">code</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"p"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Perceiving"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">opposite</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"j"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">oppositeName</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Judging"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">code</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"a"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Skeptical"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">opposite</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"o"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">oppositeName</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Accommodating"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// A vs O</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token literal-property property" style="color:#36acaa">code</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"h"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">name</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Pragmatic"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">opposite</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"c"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">oppositeName</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Conformist"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">// H vs C</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>These six pairs of traits are:</p>
<ol>
<li class=""><strong>E (Extroverted) vs I (Introverted)</strong>: The classic extraversion/intraversion dimension.</li>
<li class=""><strong>N (Intuitive) vs S (Sensing)</strong>: Similar to MBTI's intuition/sensing.</li>
<li class=""><strong>T (Thinking) vs F (Feeling)</strong>: Thinking/Feeling.</li>
<li class=""><strong>P (Perceiving) vs J (Judging)</strong>: Perceiving/Judging.</li>
<li class=""><strong>A (Skeptical) vs O (Accommodating)</strong>: A unique dimension, possibly corresponding to Agreeableness in the Big Five model.</li>
<li class=""><strong>H (Pragmatic) vs C (Conformists)</strong>: Measuring attitude towards new things, possibly corresponding to Openness.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-scoring-algorithm">2. Scoring Algorithm<a href="https://sukima-ml.club/en/blog/touhou-personality-test-analysis#2-scoring-algorithm" class="hash-link" aria-label="Direct link to 2. Scoring Algorithm" title="Direct link to 2. Scoring Algorithm" translate="no">​</a></h3>
<p>The test consists of several questions, each corresponding to one of the 12 sub-dimensions. When you select options A/B/C/D, it adds 1 to 4 points to that specific dimension.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Pseudocode for the scoring logic</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> scores </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">e</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">i</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">n</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token literal-property property" style="color:#36acaa">s</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// Initialized to 0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">userAnswers</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">answer</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Each question has a fixed dimension attribute, e.g., 'e'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> dimension </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> answer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">dimension</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// answer.score is 1-4 points</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    scores</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">dimension</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> answer</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">score</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>It's not that every question is a tug-of-war between E and I; rather, some questions specifically measure E, and some specifically measure I. Finally, the system calculates the total scores for E and I separately.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-duel-and-personality-code-generation">3. "Duel" and Personality Code Generation<a href="https://sukima-ml.club/en/blog/touhou-personality-test-analysis#3-duel-and-personality-code-generation" class="hash-link" aria-label="Direct link to 3. &quot;Duel&quot; and Personality Code Generation" title="Direct link to 3. &quot;Duel&quot; and Personality Code Generation" translate="no">​</a></h3>
<p>Here comes the critical step. The system doesn't directly use these 12 detailed scores for similarity calculations (like cosine similarity). Instead, it uses a <strong>binarization</strong> strategy, similar to MBTI type classification.</p>
<p>For each pair of axes, it compares the total scores of the two sub-dimensions, and the higher one wins:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> resultCode </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">e</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">i</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"e"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"i"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">n</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">s</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"n"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"s"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">t</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">f</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"t"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"f"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">p</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">j</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"p"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"j"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">a</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">o</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"a"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"o"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">h</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> scores</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">c</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"h"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"c"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">join</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">""</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>This generates a 6-letter string (personality code), such as <code>"entpah"</code> or <code>"isfjoc"</code>.</p>
<p>With 6 dimensions and 2 possibilities each, there are a total of $2^6 = 64$ possible personality combinations.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-character-matching-mechanism">4. Character Matching Mechanism<a href="https://sukima-ml.club/en/blog/touhou-personality-test-analysis#4-character-matching-mechanism" class="hash-link" aria-label="Direct link to 4. Character Matching Mechanism" title="Direct link to 4. Character Matching Mechanism" translate="no">​</a></h3>
<p>You might think the system calculates the Euclidean distance between your score vector and each character's vector to find the "closest" character. But in reality, the logic is very blunt: <strong>Exact Lookup</strong>.</p>
<p>The system directly takes the generated 6-letter code and queries the database:</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Pseudocode</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">let</span><span class="token plain"> characters </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> database</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">query</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"characters"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">where</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"dimension_code"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"=="</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> resultCode</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<ul>
<li class=""><strong>Hit</strong>: If a character's setting in the database happens to match this code (e.g., Reimu is set as <code>entpah</code>), you are matched with Reimu.</li>
<li class=""><strong>Collision</strong>: If the same code corresponds to multiple characters, the system picks one at <strong>random</strong>.</li>
<li class=""><strong>Miss (Fallback)</strong>: This is the most interesting part. What happens if <strong>no</strong> character in the database matches your code exactly? The code shows it <strong>returns a character at random</strong>!</li>
</ul>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">matchedCharacters</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> allCharacters </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getAllCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// Pick a lucky character randomly</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    finalCharacter </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> allCharacters</span><span class="token punctuation" style="color:#393A34">[</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">random</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> allCharacters</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>This means that if your personality combination is very unique (or very weird) and can't be found in the preset Touhou character pool, you actually get a completely random result. This explains why sometimes the results feel "a bit off."</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="technical-summary">Technical Summary<a href="https://sukima-ml.club/en/blog/touhou-personality-test-analysis#technical-summary" class="hash-link" aria-label="Direct link to Technical Summary" title="Direct link to Technical Summary" translate="no">​</a></h2>
<p>From a technical perspective, this H5 app uses the following stack:</p>
<ul>
<li class=""><strong>Frontend</strong>: React + Vite bundling.</li>
<li class=""><strong>Backend</strong>: Uses Supabase (BaaS) for database services; the frontend reads questions and character data directly via API.</li>
<li class=""><strong>Platform</strong>: It looks like it was generated using a low-code/no-code platform called "Miaoda."</li>
</ul>
<p>The "six-dimensional vector" is actually <strong>6 pairs of binary traits</strong>. The matching algorithm is essentially <strong>Classification</strong>, not <strong>Regression</strong> or <strong>Clustering</strong>. It simplifies the rich personality spectrum into 64 discrete boxes.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://sukima-ml.club/en/blog/touhou-personality-test-analysis#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>Although the algorithm logic is simpler and more straightforward than expected, it doesn't diminish its fun. Reducing complex personalities to a few labels is exactly the secret behind the popularity of various online personality tests—it's simple, easy to share, and provides a seemingly certain "identity."</p>
<p>Next time you find out you are Reimu Hakurei or Marisa Kirisame, think about it: Did you meet her in that 1/64 box, or were you "destined" by a random function to be by her side?</p>
<hr>
<p><em>This article is based on the analysis of public page source code and is for educational purposes only.</em></p>
<p>Sincerely,</p>
<p><strong>Su Xinxian (he/him)</strong><br>
<!-- -->Undergraduate Student / Incoming Ph.D. Student (2026)<br>
<!-- -->Beijing Jiaotong University</p>]]></content:encoded>
            <category>Touhou Project</category>
            <category>Tech</category>
            <category>Algorithm</category>
            <category>Reverse Engineering</category>
        </item>
        <item>
            <title><![CDATA[PKU Meeting: When Exhibit Pieces Accidentally Became Prizes (]]></title>
            <link>https://sukima-ml.club/en/blog/pku_Hxzn</link>
            <guid>https://sukima-ml.club/en/blog/pku_Hxzn</guid>
            <pubDate>Sun, 23 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[The Peking University (PKU) Touhou meeting on November 23, 2025, was the first offline debut of our circle's products.]]></description>
            <content:encoded><![CDATA[<p>The Peking University (PKU) Touhou meeting on November 23, 2025, was the first offline debut of our circle's products.</p>
<p>For this occasion, we specially prepared two prints of Yukari-sama. According to the original script, the 16-inch print was for the lucky draw, while the 20-inch one was only for display. However, due to a failure to confirm details with the staff, something unexpected happened—the 20-inch masterpiece, which should have come home with me, was held high by Remilia on stage and given away as the grand prize to a lucky "villager."</p>
<p>What's done is done. To avoid disappointing everyone, I decided to "go with the flow" and gave the remaining 16-inch print to the hardworking staff members on site.</p>
<p>The promotion cost for this event completely exceeded the budget, but participating in a university meeting with such a great atmosphere was definitely worth it. Moreover, I had a burst of my own luck and won a second prize—Enjou Bookstore's "Human Village, Strolling in the Courtyard."</p>
<hr>
<p>Sincerely,</p>
<p><strong>Su Xinxian (he/him)</strong><br>
<!-- -->Undergraduate Student / Incoming Ph.D. Student (2026)<br>
<!-- -->Beijing Jiaotong University</p>]]></content:encoded>
            <category>Circle</category>
            <category>Development</category>
            <category>Touhou Project</category>
            <category>Art Derivations</category>
        </item>
        <item>
            <title><![CDATA[The Beginning of Everything]]></title>
            <link>https://sukima-ml.club/en/blog/beginning</link>
            <guid>https://sukima-ml.club/en/blog/beginning</guid>
            <pubDate>Tue, 11 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[At the Beijing THO on November 8, 2025, I saw three stunning Touhou-themed famous painting parodies. After buying two of them, I was still amazed by the creativity and wanted more.]]></description>
            <content:encoded><![CDATA[<p>At the Beijing THO on November 8, 2025, I saw three stunning Touhou-themed famous painting parodies. After buying two of them, I was still amazed by the creativity and wanted more.</p>
<p>Taking action right away, I contacted the artist that night. With their permission, I obtained the original images and produced two Giclée prints. I believe such excellent artistic resources deserve to be presented on better media, such as high-quality photography cotton paper output by Epson 10-color printers.</p>
<p>Still not satisfied, I established the circle's name the next day, and on the third day, I bought the domain name and started building the circle's website.</p>
<p>Then came the process of finding suitable artists and commissioning new works.</p>
<p>It is now 0:22 on November 11th. From the moment I had the idea to create the circle to putting it into action, it took about 48 hours.</p>
<p>Plans for many more artistic resources have already formed in my mind. It seems this Double 11, my wallet is going to take a big hit.</p>
<p>Finally, congratulations on the founding of Sukima Moonlight. I hope that I, and my future partners, can maintain our drive, plan scientifically, develop for the long term, and achieve infinite progress.</p>
<hr>
<p>Sincerely,</p>
<p><strong>Su Xinxian (he/him)</strong><br>
<!-- -->Undergraduate Student / Incoming Ph.D. Student (2026)<br>
<!-- -->Beijing Jiaotong University</p>]]></content:encoded>
            <category>Circle</category>
            <category>Founding</category>
            <category>Touhou Project</category>
            <category>Art Derivations</category>
        </item>
    </channel>
</rss>