Skill: mydearzsy/silly-big-type (version 1.0.0)

--- name: sbti description: > SBTI（沙雕大型性格指标）人格测评工具。由B站UP主@蛆肉儿串儿创作，31道题，15维度，27种人格类型。 当用户提到：(1) SBTI测试、(2) 沙雕人格测试、(3) 帮我做SBTI测评、(4) 测测我是什么人格、(5) SBTI答题、(6) 指定人格类型答题。 不在用户仅提到"MBTI"、"人格测试"等模糊词时激活。 --- # SBTI 人格测评 ## 算法 15维度，每维度2题（选项值1/2/3），维度得分=两题之和（2-6）。 得分→等级：≤3=L, 4=M, ≥5=H。L=1, M=2, H=3。 欧氏距离匹配27种人格，取最近者。 隐藏彩蛋：Q31选[1]喝酒 + Q32选[1]爱喝 → 强制匹配 DRUNK（酒鬼）。 ## 维度定义 | 维度 | 名称 | 模型 | |------|------|------| | S1 | 自尊自信 | 自我模型 | | S2 | 自我清晰度 | 自我模型 | | S3 | 核心价值 | 自我模型 | | E1 | 依恋安全感 | 情感模型 | | E2 | 情感投入度 | 情感模型 | | E3 | 边界与依赖 | 情感模型 | | A1 | 世界观倾向 | 态度模型 | | A2 | 冒险精神 | 态度模型 | | A3 | 目标感 | 态度模型 | | Ac1 | 行动力 | 行动模型 | | Ac2 | 果断性 | 行动模型 | | Ac3 | 执行力 | 行动模型 | | So1 | 社交主动性 | 社交模型 | | So2 | 亲密需求 | 社交模型 | | So3 | 自我呈现 | 社交模型 | 维度向量顺序：`[S1, S2, S3, E1, E2, E3, A1, A2, A3, Ac1, Ac2, Ac3, So1, So2, So3]` ## 测评流程 ### 模式一：对话式测评（推荐） 逐题或分组（5题一组）发送给用户，收集答案后计算结果。 1. 读取 `references/questions.md` 获取完整题库 2. 按组发送题目（每题包含题目+3个选项） 3. 记录用户每题选择的选项值（1/2/3） 4. 收集完30题后，运行 `scripts/calculate.py` 计算结果 5. 读取 `references/types.md` 获取结果描述，输出给用户 输出格式： ``` 🎉 你的SBTI人格是：[代码] [中文名]！ [intro语] 📊 十五维度评分： [5个模型的雷达图或列表] [result描述前300字] ``` ### 模式二：快速查询 用户问"怎么测出XXX人格"时： 1. 读取 `references/types.md` 找到该类型的向量模式 2. 读取 `references/questions.md` 3. 反推每维度需要的目标得分，给出答题建议 答题策略： - 目标H（≥5）：该维度两题都选3 - 目标M（=4）：该维度两题选3+1或1+3 - 目标L（≤3）：该维度两题都选1 ### 模式三：反向查询 用户提供自己的30题答案，运行 `scripts/calculate.py` 直接出结果。 ## 脚本使用 ```bash # 计算结果：传入30个答案值（逗号分隔，按Q1-Q30顺序） python3 scripts/calculate.py "3,2,1,3,2,1,3,2,1,3,2,1,3,2,1,3,2,1,3,2,1,3,2,1,3,2,1,3,2,1" # 输出：匹配的类型代码、名称、相似度、各维度等级 ``` ## 注意事项 - Q22（Ac2果断性）是隐藏题："此题没有题目，请盲选"——直接发送选项让用户选 - Q31/Q32 是酒鬼触发题，仅当用户提到或想触发隐藏类型时才询问 - 评价结果仅供娱乐，提醒用户不要当真

path: references/questions.md
content: # SBTI 完整题库（30题）

## Q1 [S1] 自尊自信
我不仅是屌丝，我还是joker,我还是咸鱼，这辈子没谈过一场恋爱，胆怯又自卑，我的青春就是一场又一场的意淫，每一天幻想着我也能有一个女孩子和我一起压马路，一起逛街，一起玩，现实却是爆了父母金币，读了个烂学校，混日子之后找班上，没有理想，没有目标，没有能力的三无人员，每次看到你能在网上开屌丝的玩笑，我都想哭，我就是地底下的老鼠，透过下水井的缝隙，窥探地上的各种美好，每一次看到这种都是对我心灵的一次伤害，对我生存空间的一次压缩，求求哥们给我们这种小丑一点活路吧，我真的不想在白天把枕巾哭湿一大片
- [1] 我哭了。。
- [2] 这是什么。。
- [3] 这不是我！

## Q2 [S1] 自尊自信
我不够好，周围的人都比我优秀
- [1] 确实
- [2] 有时
- [3] 不是

## Q3 [S2] 自我清晰度
我很清楚真正的自己是什么样的
- [1] 不认同
- [2] 中立
- [3] 认同

## Q4 [S2] 自我清晰度
我内心有真正追求的东西
- [1] 不认同
- [2] 中立
- [3] 认同

## Q5 [S3] 核心价值
我一定要不断往上爬、变得更厉害
- [1] 不认同
- [2] 中立
- [3] 认同

## Q6 [S3] 核心价值
外人的评价对我来说无所吊谓。
- [1] 不认同
- [2] 中立
- [3] 认同

## Q7 [E1] 依恋安全感
对象超过5小时没回消息，说自己窜稀了，你会怎么想？
- [1] 拉稀不可能5小时，也许ta隐瞒了我。
- [2] 在信任和怀疑之间摇摆。
- [3] 也许今天ta真的不太舒服。

## Q8 [E1] 依恋安全感
我在感情里经常担心被对方抛弃
- [1] 是的
- [2] 偶尔
- [3] 不是

## Q9 [E2] 情感投入度
我对天发誓，我对待每一份感情都是认真的！
- [1] 并没有
- [2] 也许？
- [3] 是的！（问心无愧骄傲脸）

## Q10 [E2] 情感投入度
你的恋爱对象是一个尊老爱幼，温柔敦厚，洁身自好，光明磊落，大义凛然，能言善辩，口才流利，观察入微，见多识广，博学多才，诲人不倦，和蔼可亲，平易近人，心地善良，慈眉善目，积极进取，意气风发，玉树临风，国色天香，倾国倾城，花容月貌的人，此时你会？
- [1] 就算ta再优秀我也不会陷入太深。
- [2] 会介于A和C之间。
- [3] 会非常珍惜ta，也许会变成恋爱脑。

## Q11 [E3] 边界与依赖
恋爱后，对象非常黏人，你作何感想？
- [1] 那很爽了
- [2] 都行无所谓
- [3] 我更喜欢保留独立空间

## Q12 [E3] 边界与依赖
我在任何关系里都很重视个人空间
- [1] 我更喜欢依赖与被依赖
- [2] 看情况
- [3] 是的！（斩钉截铁地说道）

## Q13 [A1] 世界观倾向
大多数人是善良的
- [1] 其实邪恶的人心比世界上的痔疮更多。
- [2] 也许吧。
- [3] 是的，我愿相信好人更多。

## Q14 [A1] 世界观倾向
你走在街上，一位萌萌的小女孩蹦蹦跳跳地朝你走来（正脸、侧脸看都萌，用vivo、苹果、华为、OPPO手机看都萌，实在是非常萌的那种），她递给你一根棒棒糖，此时你作何感想？
- [1] 这也许是一种新型诈骗？还是走开为好。
- [2] 一脸懵逼，作挠头状
- [3] 呜呜她真好真可爱！居然给我棒棒糖！

## Q15 [A2] 冒险精神
快考试了，学校规定必须上晚自习，请假会扣分，但今晚你约了女/男神一起玩《绝地求生：刺激战场》（一款刺激的游戏），你怎么办？
- [1] 翘了！反正就一次！
- [2] 干脆请个假吧。
- [3] 都快考试了还去啥。

## Q16 [A2] 冒险精神
我喜欢打破常规，不喜欢被束缚
- [1] 认同
- [2] 保持中立
- [3] 不认同

## Q17 [A3] 目标感
我做事通常有目标。
- [1] 不认同
- [2] 中立
- [3] 认同

## Q18 [A3] 目标感
突然某一天，我意识到人生哪有什么他妈的狗屁意义，人不过是和动物一样被各种欲望支配着，纯纯是被激素控制的东西，饿了就吃，困了就睡，一发情就想交配，我们简直和猪狗一样没什么区别。
- [1] 是这样的。
- [2] 也许是，也许不是。
- [3] 这简直是胡扯

## Q19 [Ac1] 行动力
我做事主要为了取得成果和进步，而不是避免麻烦和风险。
- [1] 不认同
- [2] 中立
- [3] 认同

## Q20 [Ac1] 行动力
你因便秘坐在马桶上（已长达30分钟），拉不出很难受。此时你更像
- [1] 再坐三十分钟看看，说不定就有了。
- [2] 用力拍打自己的屁股并说："死屁股，快拉啊！"
- [3] 使用开塞露，快点拉出来才好。

## Q21 [Ac2] 果断性
我做决定比较果断，不喜欢犹豫
- [1] 不认同
- [2] 中立
- [3] 认同

## Q22 [Ac2] 果断性（隐藏题）
此题没有题目，请盲选
- [1] 反复思考后感觉应该选A？
- [2] 啊，要不选B？
- [3] 不会就选C？

## Q23 [Ac3] 执行力
别人说你"执行力强"，你内心更接近哪句？
- [1] 我被逼到最后确实执行力超强。。。
- [2] 啊，有时候吧。
- [3] 是的，事情本来就该被推进

## Q24 [Ac3] 执行力
我做事常常有计划，____
- [1] 然而计划不如变化快。
- [2] 有时能完成，有时不能。
- [3] 我讨厌被打破计划。

## Q25 [So1] 社交主动性
你因玩《第五人格》（一款刺激的游戏）而结识许多网友，并被邀请线下见面，你的想法是？
- [1] 网上口嗨下就算了，真见面还是有点忐忑。
- [2] 见网友也挺好，反正谁来聊我就聊两句。
- [3] 我会打扮一番并热情聊天，万一呢，我是说万一呢？

## Q26 [So1] 社交主动性
朋友带了ta的朋友一起来玩，你最可能的状态是
- [1] 对"朋友的朋友"天然有点距离感，怕影响二人关系
- [2] 看对方，能玩就玩。
- [3] 朋友的朋友应该也算我的朋友！要热情聊天

## Q27 [So2] 亲密需求
我和人相处主打一个电子围栏，靠太近会自动报警。
- [1] 不认同
- [2] 中立
- [3] 认同

## Q28 [So2] 亲密需求
我渴望和我信任的人关系密切，熟得像失散多年的亲戚。
- [1] 认同
- [2] 中立
- [3] 不认同

## Q29 [So3] 自我呈现
有时候你明明对一件事有不同的、负面的看法，但最后没说出来。多数情况下原因是：
- [1] 这种情况较少。
- [2] 可能碍于情面或者关系。
- [3] 不想让别人知道自己是个阴暗的人。

## Q30 [So3] 自我呈现
我在不同人面前会表现出不一样的自己
- [1] 不认同
- [2] 中立
- [3] 认同

## 隐藏题（酒鬼触发）

### Q31 [drink_gate_q1]
您平时有什么爱好？
- [1] 🍺 喝酒！
- [2] 其他爱好
- [3] 🚫 我不喝酒

### Q32 [drink_gate_q2]
您对饮酒的态度是？
- [1] 🍺 爱喝！
- [2] 😐 一般般
- [3] 🚫 不太喜欢


path: references/types.md
content: # SBTI 27种人格类型

## 完整类型表

| 代码 | 名称 | Pattern | 简介 |
|------|------|---------|------|
| CTRL | 拿捏者 | HHH-HMH-MHH-HHH-MHM | 怎么样，被我拿捏了吧？ |
| ATM | 送钱者 | HHH-HHM-HHH-HMH-MHL | 你以为我很有钱吗？ |
| DIOS | 屌丝 | MHM-MMH-MHM-HMH-LHL | 等着我屌丝逆袭。 |
| BOSS | 领导者 | HHH-HMH-MMH-HHH-LHL | 方向盘给我，我来开。 |
| THAN | 感恩者 | MHM-HMM-HHM-MMH-MHL | 我感谢苍天！我感谢大地！ |
| OHNO | 哦不人 | HHL-LMH-LHH-HHM-LHL | 哦不！我怎么会是这个人格？！ |
| GOGO | 行者 | HHM-HMH-MMH-HHH-MHM | gogogo~出发咯 |
| SEXY | 尤物 | HMH-HHL-HMM-HMM-HLH | 您就是天生的尤物！ |
| LOVR | 多情者 | MLH-LHL-HLH-MLM-MLH | 爱意太满，现实显得有点贫瘠。 |
| MUM | 妈妈 | MMH-MHL-HMM-LMM-HLL | 或许...我可以叫你妈妈吗....? |
| FAKE | 伪人 | HLM-MML-MLM-MLM-HLH | 已经，没有人类了。 |
| OJBK | 无所谓人 | MMH-MMM-HHH-MMM-MMM | 我说随便，是真的随便。 |
| MALO | 吗喽 | MLM-LML-HLM-LMM-HML | 人生是个副本，而我只是一只吗喽。 |
| JOKR | 小丑 | MLM-MML-MLH-MML-LHL | 原来我们都是小丑。 |
| WOC | 握草人 | LML-HLM-LML-HML-MLM | 卧槽，我怎么是这个人格？ |
| THNK | 思考者 | LHL-MLM-LHH-HLM-MLH | 已深度思考100s。 |
| SHIT | 愤世者 | MLH-HMM-LML-MLM-HLL | 这个世界，构石一坨。 |
| ZZZZ | 装死者 | MMM-LLM-LML-LMM-LLL | 我没死，我只是在睡觉。 |
| POOR | 贫困者 | LMM-LHL-MML-MMM-HML | 我穷，但我很专。 |
| MONK | 僧人 | LML-MLL-LHL-MLL-HLL | 没有那种世俗的欲望。 |
| IMSB | 傻者 | LHL-LML-MHL-MLL-HML | 认真的么？我真的是傻逼么？ |
| SOLO | 孤儿 | LML-HLL-LML-HML-LHL | 我哭了，我怎么会是孤儿？ |
| FUCK | 草者 | MLH-LLM-HML-LLM-MHL | 操！这是什么人格？ |
| DEAD | 死者 | LLL-LLL-LLL-LLL-LLL | 我，还活着吗？ |
| IMFW | 废物 | LLL-LML-LLL-LLM-LML | 我真的...是废物吗？ |
| HHHH | 傻乐者 | HHH-HHH-HHH-HHH-HHH | 哈哈哈哈哈哈。 |
| DRUNK | 酒鬼🥂 | 隐藏 | 烈酒烧喉，不得不醉。 |

## 维度向量对照

Pattern格式：[REDACTED_SECRET]
L=1, M=2, H=3

## 各类型详细描述

### CTRL 拿捏者
恭喜您，您测出了全中国最为罕见的人格，您是宇宙熵增定律的天然反抗者！全世界所谓成功人士里，99.99%都是您的拙劣模仿者。CTRL人格，是行走的人形自走任务管理器，普通人眼中的"规则"，在您这里只是出厂的基础参数设置；凡人所谓的"计划"，对您而言不过是心血来潮的随手涂鸦。拥有一个CTRL朋友意味着什么？意味着你的人生导航系统会变得更加精准、高效。因为CTRL最会拿捏了。

### ATM 送钱者
谁说金钱买不到快乐？您的存在就是活生生的反驳！ATM人格就像行走的印钞机，所到之处皆是挥金如土的豪迈身影。朋友聚会您买单，同事困难您赞助，路边乞丐您可能还会额外给个红包。您对金钱的态度可以用八个字概括：千金散尽还复来。

### DIOS 屌丝
别急着伤心，屌丝其实是潜力股的代名词！DIOS人格的朋友们，你们身上有一种独特的韧劲——虽然暂时处于人生的低谷期，但内心深处那团不甘平凡的火焰从未熄灭。您可能在某些方面确实有所欠缺，但这恰恰给了您最大的成长空间。

### BOSS 领导者
天生的指挥官！BOSS人格的人站在人群中，不需要开口，就能感受到那种"这里我说了算"的气场。您不是在管理团队，您是在率领一支军队。目标明确，方向清晰，执行力爆表——这就是BOSS。

### THAN 感恩者
您是这个世界上为数不多的、真正懂得"珍惜"二字含义的人。THAN-K人格就像行走的正能量发电机，所到之处皆是温暖和感动。一朵路边的野花能让您驻足，一个陌生人的善意能让您感动许久。

### OHNO 哦不人
哦不！看到结果的瞬间，您的表情大概就是您最好的名片。OHNO人格的朋友们，你们是行走的表情包制造机，生活中处处充满惊喜和意外——当然，对您来说，意外可能更多一些。不过没关系，正是这种"什么鬼"的反应，让身边的人觉得您特别真实、特别可爱。

### GOGO 行者
世界那么大，GOGO想看看！行者人格的人天生自带冒险基因，您的人生就像一场没有终点的公路旅行。说走就走的旅行？对您来说不是口号，是生活方式。

### SEXY 尤物
您的存在本身就是一件艺术品。SEXY人格的人天生自带一种让人移不开眼的魅力——不是因为刻意装扮，而是一种由内而外散发的自信和从容。您不需要讨好任何人，因为您清楚地知道自己的价值。

### LOVR 多情者
您的心就像一片深不见底的海洋，装得下世间所有的温柔。LOVE-R人格的人对感情有着超乎常人的敏感和投入，您不是花心，您只是对每个人都怀抱着最真挚的好感。

### MUM 妈妈
别误会，这个"妈妈"不是性别标签，而是一种人格特质。MUM人格的人天生自带"照顾者"光环，无论走到哪里，都会不自觉地关注身边人的需求。朋友难过您第一个安慰，同事加班您帮忙点外卖，连路上看到流浪猫都会停下来喂一喂。

### FAKE 伪人
已经，没有人类了。FAKE人格的朋友们，你们对"真实"这个概念有着近乎偏执的追求。您能敏锐地察觉到别人的一举一动中的"表演成分"，也能精准地判断出一段关系的真诚程度。社交场上，您就像装了测谎仪。

### OJBK 无所谓人
随便吧，都可以，你说了算。OJBK人格的人是社交场上的"润滑剂"，有您在的地方，争论和冲突都会大幅减少。不是因为没有主见，而是您觉得大多数事情真的不值得较真。

### MALO 吗喽
人生是个副本，而我只是一只吗喽。MALO人格的人看透了生活的本质——我们都是NPC，在各自的剧本里扮演着或重要或无足轻重的角色。但正是这种"吗喽心态"，让你们活得比谁都通透。

### JOKR 小丑
原来我们都是小丑。JOKE-R人格的人有着最敏感的幽默雷达和最脆弱的内心。您总能在别人的苦涩中找到笑点，在自己的痛苦中制造笑料。不是在逃避现实，而是您选择用幽默来对抗这个荒谬的世界。

### WOC 握草人
卧槽！这是WOC人格最常说的口头禅，不是因为词汇量少，而是因为这个世界在您眼中充满了太多的"卧槽时刻"。您的反应总是最真实、最直接的，没有伪装，没有修饰。

### THNK 思考者
已深度思考100s。THINK-R人格的人，您的大脑就像一台永不停歇的超级计算机。别人看到一个现象，您看到背后的逻辑链；别人在讨论八卦，您在分析因果。您的思考深度让身边的人又敬佩又头疼。

### SHIT 愤世者
这个世界，构石一坨。SHIT人格的朋友们，您对世界的看法用一个字概括就是：呸。您看透了太多虚伪和荒诞，以至于对大多数事物都持怀疑态度。但讽刺的是，正是这种"愤世嫉俗"，让您成为了最清醒的那群人。

### ZZZZ 装死者
我没死，我只是在睡觉。ZZZZ人格的人把"躺平"提升到了艺术的高度。您不是不努力，而是觉得大多数事情不值得努力。在别人忙着内卷的时候，您可能在思考今天的午觉应该睡多久。

### POOR 贫困者
我穷，但我很专。POOR人格的人在物质上可能确实不算富裕，但在精神上，你们是真正的贵族。对感情的专一、对朋友的忠诚、对热爱的执着，是POOR人格最闪亮的标签。

### MONK 僧人
没有那种世俗的欲望。MONK人格的人仿佛是误入尘世的修行者，对物质享受、社交应酬、权力地位等"世俗之物"有着天然的免疫力。您不是不想要，而是真的不感兴趣。

### IMSB 傻者
认真的么？我真的是傻逼么？IMSB人格的人总是低估自己。明明做了很多了不起的事情，却总是觉得自己不够好。您可能觉得自己"傻"，但在别人眼里，这种"傻"恰恰是最真诚、最可爱的品质。

### SOLO 孤儿
我哭了，我怎么会是孤儿？SOLO人格的人有着强烈的独立倾向，但同时内心深处又渴望被理解、被接纳。您像一座孤岛，周围是茫茫大海，偶尔有船经过，但很少停留。

### FUCK 草者
操！这是什么人格？FUCK人格的人对生活中的一切都有着最原始、最真实的反应。愤怒就愤怒，开心就开心，不装、不演、不做作。您的直率可能会让一些人感到不适，但更多的人会觉得跟您在一起特别轻松。

### DEAD 死者
我，还活着吗？DEAD人格的人仿佛游离于生死之间——不是真的想死，而是对生活失去了感知力。日子在过，但在您看来，每一天都像是在重复昨天的剧本。

### IMFW 废物
我真的...是废物吗？IMFW人格的人总觉得自己什么都做不好，什么都比不上别人。但请记住：能问出这个问题的人，本身就说明您不是废物。真正的废物不会反思自己。

### HHHH 傻乐者
哈哈哈哈哈哈。HHHH人格的人是行走的快乐制造机。您的快乐不需要理由，不需要条件，不需要任何外在刺激。您就是天生的乐观主义者，在别人看到乌云的时候，您已经看到了彩虹。

### DRUNK 酒鬼🥂
烈酒烧喉，不得不醉。DRUNK人格是隐藏彩蛋类型，只有承认自己爱喝酒的人才能触发。原作者初衷就是劝诫朋友戒酒，所以这个人格承载着特殊的关怀和提醒。


path: scripts/calculate.py
content: #!/usr/bin/env python3
"""SBTI人格计算器：输入30题答案，输出匹配的人格类型。"""

import sys
import json
import math

# 15维度顺序
DIM_ORDER = ['S1','S2','S3','E1','E2','E3','A1','A2','A3','Ac1','Ac2','Ac3','So1','So2','So3']

# 题目到维度的映射（Q1-Q30）
Q_DIM = ['S1','S1','S2','S2','S3','S3','E1','E1','E2','E2','E3','E3','A1','A1','A2','A2','A3','A3','Ac1','Ac1','Ac2','Ac2','Ac3','Ac3','So1','So1','So2','So2','So3','So3']

# 27种人格类型：code -> pattern
TYPES = {
    'CTRL': 'HHH-HMH-MHH-HHH-MHM',
    'ATM':  'HHH-HHM-HHH-HMH-MHL',
    'DIOS': 'MHM-MMH-MHM-HMH-LHL',
    'BOSS': 'HHH-HMH-MMH-HHH-LHL',
    'THAN': 'MHM-HMM-HHM-MMH-MHL',
    'OHNO': 'HHL-LMH-LHH-HHM-LHL',
    'GOGO': 'HHM-HMH-MMH-HHH-MHM',
    'SEXY': 'HMH-HHL-HMM-HMM-HLH',
    'LOVR': 'MLH-LHL-HLH-MLM-MLH',
    'MUM':  'MMH-MHL-HMM-LMM-HLL',
    'FAKE': 'HLM-MML-MLM-MLM-HLH',
    'OJBK': 'MMH-MMM-HHH-MMM-MMM',
    'MALO': 'MLM-LML-HLM-LMM-HML',
    'JOKR': 'MLM-MML-MLH-MML-LHL',
    'WOC':  'LML-HLM-LML-HML-MLM',
    'THNK': 'LHL-MLM-LHH-HLM-MLH',
    'SHIT': 'MLH-HMM-LML-MLM-HLL',
    'ZZZZ': 'MMM-LLM-LML-LMM-LLL',
    'POOR': 'LMM-LHL-MML-MMM-HML',
    'MONK': 'LML-MLL-LHL-MLL-HLL',
    'IMSB': 'LHL-LML-MHL-MLL-HML',
    'SOLO': 'LML-HLL-LML-HML-LHL',
    'FUCK': 'MLH-LLM-HML-LLM-MHL',
    'DEAD': 'LLL-LLL-LLL-LLL-LLL',
    'IMFW': 'LLL-LML-LLL-LLM-LML',
    'HHHH': 'HHH-HHH-HHH-HHH-HHH',
}

TYPE_NAMES = {
    'CTRL':'拿捏者','ATM':'送钱者','DIOS':'屌丝','BOSS':'领导者',
    'THAN':'感恩者','OHNO':'哦不人','GOGO':'行者','SEXY':'尤物',
    'LOVR':'多情者','MUM':'妈妈','FAKE':'伪人','OJBK':'无所谓人',
    'MALO':'吗喽','JOKR':'小丑','WOC':'握草人','THNK':'思考者',
    'SHIT':'愤世者','ZZZZ':'装死者','POOR':'贫困者','MONK':'僧人',
    'IMSB':'傻者','SOLO':'孤儿','FUCK':'草者','DEAD':'死者',
    'IMFW':'废物','HHHH':'傻乐者','DRUNK':'酒鬼🥂',
}

TYPE_INTROS = {
    'CTRL':'怎么样，被我拿捏了吧？','ATM':'你以为我很有钱吗？',
    'DIOS':'等着我屌丝逆袭。','BOSS':'方向盘给我，我来开。',
    'THAN':'我感谢苍天！我感谢大地！','OHNO':'哦不！我怎么会是这个人格？！',
    'GOGO':'gogogo~出发咯','SEXY':'您就是天生的尤物！',
    'LOVR':'爱意太满，现实显得有点贫瘠。','MUM':'或许...我可以叫你妈妈吗....?',
    'FAKE':'已经，没有人类了。','OJBK':'我说随便，是真的随便。',
    'MALO':'人生是个副本，而我只是一只吗喽。','JOKR':'原来我们都是小丑。',
    'WOC':'卧槽，我怎么是这个人格？','THNK':'已深度思考100s。',
    'SHIT':'这个世界，构石一坨。','ZZZZ':'我没死，我只是在睡觉。',
    'POOR':'我穷，但我很专。','MONK':'没有那种世俗的欲望。',
    'IMSB':'认真的么？我真的是傻逼么？','SOLO':'我哭了，我怎么会是孤儿？',
    'FUCK':'操！这是什么人格？','DEAD':'我，还活着吗？',
    'IMFW':'我真的...是废物吗？','HHHH':'哈哈哈哈哈哈。',
    'DRUNK':'烈酒烧喉，不得不醉。',
}

DIM_NAMES = {
    'S1':'自尊自信','S2':'自我清晰度','S3':'核心价值',
    'E1':'依恋安全感','E2':'情感投入度','E3':'边界与依赖',
    'A1':'世界观倾向','A2':'冒险精神','A3':'目标感',
    'Ac1':'行动力','Ac2':'果断性','Ac3':'执行力',
    'So1':'社交主动性','So2':'亲密需求','So3':'自我呈现',
}

DIM_MODELS = {
    'S1':'自我模型','S2':'自我模型','S3':'自我模型',
    'E1':'情感模型','E2':'情感模型','E3':'情感模型',
    'A1':'态度模型','A2':'态度模型','A3':'态度模型',
    'Ac1':'行动模型','Ac2':'行动模型','Ac3':'行动模型',
    'So1':'社交模型','So2':'社交模型','So3':'社交模型',
}

def score_to_level(score):
    if score <= 3:
        return 'L'
    elif score == 4:
        return 'M'
    else:
        return 'H'

def level_to_num(level):
    return {'L':1,'M':2,'H':3}[level]

def parse_pattern(pattern):
    return pattern.replace('-','')

def calculate(answers_str):
    # Parse answers
    answers = [int(x.strip()) for x in answers_str.split(',')]
    if len(answers) != 30:
        return {'error': f'需要30个答案，收到{len(answers)}个'}

    # Calculate dimension scores
    dim_scores = {}
    for i, a in enumerate(answers):
        dim = Q_DIM[i]
        dim_scores[dim] = dim_scores.get(dim, 0) + a

    # Convert to levels
    levels = {dim: score_to_level(score) for dim, score in dim_scores.items()}

    # Build user vector
    user_vector = [level_to_num(levels[dim]) for dim in DIM_ORDER]

    # Find closest type
    best_match = None
    min_distance = float('inf')

    for code, pattern in TYPES.items():
        type_vector = [level_to_num(c) for c in parse_pattern(pattern)]
        distance = sum(abs(user_vector[i] - type_vector[i]) for i in range(15))
        exact = sum(1 for i in range(15) if user_vector[i] == type_vector[i])
        similarity = max(0, round((1 - distance / 30) * 100))

        if distance < min_distance:
            min_distance = distance
            best_match = {
                'code': code,
                'name': TYPE_NAMES.get(code, code),
                'intro': TYPE_INTROS.get(code, ''),
                'distance': distance,
                'exact': exact,
                'similarity': similarity,
            }

    # Build result
    result = {
        'type': best_match,
        'dimensions': {},
        'user_pattern': '-'.join([''.join(levels[d] for d in DIM_ORDER[i*3:(i+1)*3]) for i in range(5)]),
        'ranked': [],
    }

    # Add dimension details
    for dim in DIM_ORDER:
        result['dimensions'][dim] = {
            'name': DIM_NAMES[dim],
            'model': DIM_MODELS[dim],
            'score': dim_scores[dim],
            'level': levels[dim],
        }

    # Rank top 5
    ranked = []
    for code, pattern in TYPES.items():
        type_vector = [level_to_num(c) for c in parse_pattern(pattern)]
        distance = sum(abs(user_vector[i] - type_vector[i]) for i in range(15))
        exact = sum(1 for i in range(15) if user_vector[i] == type_vector[i])
        similarity = max(0, round((1 - distance / 30) * 100))
        ranked.append({
            'code': code,
            'name': TYPE_NAMES.get(code, code),
            'distance': distance,
            'similarity': similarity,
        })
    ranked.sort(key=lambda x: x['distance'])
    result['ranked'] = ranked[:5]

    return result

def format_output(result):
    if 'error' in result:
        return f"❌ {result['error']}"

    t = result['type']
    lines = [
        f"🎉 SBTI人格：{t['code']} {t['name']}",
        f"💬 {t['intro']}",
        f"📊 匹配度：{t['similarity']}% | 完全匹配维度：{t['exact']}/15",
        f"🎯 你的Pattern：{result['user_pattern']}",
        "",
        "📐 十五维度评分：",
    ]

    # Group by model
    current_model = ''
    for dim in DIM_ORDER:
        d = result['dimensions'][dim]
        model = d['model']
        if model != current_model:
            lines.append(f"\n【{model}】")
            current_model = model
        bar = {'L':'░░','M':'▓░','H':'▓▓'}[d['level']]
        lines.append(f"  {dim} {d['name']}: {bar} {d['score']}/6 ({d['level']})")

    lines.append(f"\n🏅 Top 5匹配：")
    for i, r in enumerate(result['ranked']):
        marker = "👉 " if i == 0 else f"  {i+1}. "
        lines.append(f"{marker}{r['code']} {r['name']} ({r['similarity']}%)")

    return '\n'.join(lines)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        print("用法: python3 calculate.py \"3,2,1,3,2,1,...\" (30个答案，逗号分隔)")
        sys.exit(1)

    result = calculate(sys.argv[1])
    print(format_output(result))


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: clean (LOW)