diff --git a/CHANGELOG.md b/CHANGELOG.md index da150ca..e1d5e28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ * Fixed some errors in the documentation. * Fixed a bug in `\binomial`. Now it returns `0` when the second argument is negative. * Fixed a bug in `\factor`. In earlier versions, it may return incorrect results. -* New particle: `\fixedPoint`. +* New particles: `\concatMap`, `\fixedPoint`, `\unconcatMap`. ### Breaking changes diff --git a/analysis/Ideas.md b/analysis/Ideas.md index 4515082..4ac1034 100644 --- a/analysis/Ideas.md +++ b/analysis/Ideas.md @@ -28,7 +28,7 @@ LiberationMono 字体所支持的字符列举于[此文件](analysis/LiberationM * 与 non-deterministic 机制有关的操作,除了 `=`(`\eq`)没有一个排到前二十。排最高的是第二十四的 `a`(`\allValues`)。 * 在两个字符的组合中,排前六的分别是 `ᶦ{`、`ᵖ{`、`ʷ{`、`ˡ{`、`ᵑ{`、`ᶠ{`。也许可以像 Vyxal 等语言一样,让这些助词自动开启 block,省去一个 `{`。不过另外一些助词通常只修饰单个 built-in,自动开启 block 反而会额外需要一个 `}`。尤其是 `ᵖ`、`ᵑ`、`ᵐ`,两种用法都很常见,不好取舍。详见 [`analysis/particles.txt`](particles.txt),以及下文的[关于助词](#关于助词)。 * `{$` 在两个字符的组合中排第七,`{:` 排第八。这两个组合没有特别的意义,只是因为 `\dup` 和 `\swap` 是最常用的两个操作,因此它们的组合也很常用。 -* `Jᵐ` 在两个字符的组合中排第八,和 `{:`、`ᵐ{`、`Ťđ` 并列。这完全出乎我的意料。`J` 是将输入 non-deterministic 地拆成若干部分,`ᵐ` 是对后一个函数进行 map,这两个操作的组合并没有特别的意义。也许值得为它增加一个助词。 +* `Jᵐ` 在两个字符的组合中排第八,和 `{:`、`ᵐ{`、`Ťđ` 并列。这完全出乎我的意料。`J` 是将输入 non-deterministic 地拆成若干部分,`ᵐ` 是对后一个函数进行 map,这两个操作的组合可以看作 Haskell 中 `concatMap` 的反操作。可能 `concatMap` 也是一个常用的操作,但由于 `ᵐ` 和 `j`(`\concat`)之间会插入别的操作,所以没有出现在这个统计结果中。可以考虑加上 `\concatMap` 和 `\unconcatMap` 两个助词。目前已加上。 * `Ťđ` 在两个字符的组合中也排第八,和 `{:`、`Jᵐ`、`ᵐ{` 并列。这个组合是将二维列表转置,然后进行 unpair 操作。看起来确实比较常用。先等更多的解答出现再决定是否增加这个 built-in。 * `Ňᵖ{` 在三个字符的组合中排第一,也许值得为它增加一个助词。 * 统计结果与其它语言的差异,除了考虑到语言本身的特点之外,还要考虑到语言的使用者的偏好。目前 Nekomata 的使用者基本上只有我自己,解答的也主要是我感兴趣的题目类型,string 相关的题目较少,ascii-art 更是完全没有。 diff --git a/analysis/corpus.txt b/analysis/corpus.txt index 18fd6c2..21d3b3a 100644 --- a/analysis/corpus.txt +++ b/analysis/corpus.txt @@ -1,7 +1,7 @@ "ᵉĝ,"ᵉĝ, 1:ᶦ{$ᵉ+ ʷ{←Pᶜ← -Jᵐ#3< +ᶣ#3< qŁƀ=ũ ↕= S= @@ -100,7 +100,7 @@ pƆᵗf ;ᶜç↔ᶻ+ poil ᵏ{ᵉ+→%Z -ᵏ{ᵐĝj= +ᵏ{ʲĝ= ˡ{C4+>‼ RḞŤ Ď∑ @@ -122,7 +122,7 @@ xq§LaĦ* ˡ{Łĉᵐ# Ë:ᵒ&Þ£E ŋ∑ũ -ĉᵐ∫j +ĉʲ∫ Þ½ Sđ*aŢṂ S:đ∩z¿ᵐj @@ -208,7 +208,7 @@ D:×Ṁ Øc;$ᶻ,ŤxᶻŘ Ṗ↕ũṀ←½ Rᶠ{$R~ᵃƂ×Öƃ= -ĉJᵐj +ĉᶣj ᶠ{JS=}ş ᵐµṀ o:h-l @@ -217,7 +217,7 @@ x:→&xï@Ŝ Ňᵖ{:ÄXÞ½= ˡ{ᵗ≡ĭ?}Å Ɗĭ∑ -ĉᵐ{ᵉĜ#Mĝ}j +ĉʲ{ᵉĜ#Mĝ ᵏ{*+$/1%≡ @ᵃ{x-¬∑}ä- ƒo↔ @@ -241,7 +241,7 @@ RS2L::∙√ɔ$≤ q£E→∫x>çƆᵖLÅ ᶦ{:Ɔ≥$tI}ṁ SjŢ½ađ -R↔$∆çJᵐ{CᵈAc}-ň +R↔$∆çᶣ{CᵈAc}-ň ∑½$ṁ±*$:#←c≥ ʷ{P↕1:Ð-:Cž¿?}žz õx-çṀ @@ -306,7 +306,7 @@ Jĭ?∑hÅ ʷ∑→ᵉbD ᶦ{Ƃ2ŗɔƃ3M ĎSᵉti¦ -Jᵐ{x:ᵒ≈>~}aş# +ᶣ{x:ᵒ≈>~}aş# →r$ÇƆ/←ŗ0ɔ$ᵑ∆ 1D∑ rjŢ @@ -316,7 +316,7 @@ rjŢ Ä&Þ£E õõ2+$ŗ→Eõl Ooᵐᵗžũ -oOᵐůj +oOʲů ∆±ĉđ 'B∕uo ᶜ$ᵗ{iq=}s= @@ -337,7 +337,7 @@ Z:Ť‼Ť$ḟ Ħ¬ ᵐ#:x+Ṁ$ᵒ%ᵐᶻ@ji ŤđᵃSᵒÐj↕= -↕JᵐŤŤđ≡¿ᵐ≡ +↕ᶣŤŤđ≡¿ᵐ≡ Ňr26%→Ɔ64+$∑→řH 7R¢ɔ∙11¦ ᵃ#*R↕v#Š:ᵐ∑ᵈv=¿:∑ᵈ§=¿ @@ -347,3 +347,4 @@ Sđ∙Z pƆᵗ≤ᵗ≥ o$2ᵑ{Jĭᵃjᵈ↔,}= +ʸ{CU$x3+þç++;ž¿Ø? +*∙Ɗᶣɗ= diff --git a/analysis/freq_1gram.txt b/analysis/freq_1gram.txt index 6391f00..d82fc08 100644 --- a/analysis/freq_1gram.txt +++ b/analysis/freq_1gram.txt @@ -1,17 +1,17 @@ { : 79 $ : 56 -= : 54 += : 55 : : 50 + : 46 -ᵐ : 44 ∑ : 40 +ᵐ : 35 → : 33 +* : 32 R : 32 -* : 31 ← : 30 -j : 30 -} : 29 x : 29 +} : 28 +j : 26 1 : 25 - : 25 o : 24 @@ -33,7 +33,6 @@ S : 17 ĭ : 17 p : 17 ᵖ : 17 -J : 16 l : 16 ĉ : 16 Ɔ : 15 @@ -43,6 +42,7 @@ t : 15 Ð : 15 " : 14 Ƃ : 14 +Ɗ : 14 Ň : 14 ; : 14 L : 14 @@ -52,10 +52,10 @@ L : 14 ᶻ : 13 ≡ : 13 ∫ : 13 -Ɗ : 13 q : 12 ½ : 12 Ë : 12 +∙ : 12 ∆ : 12 ʷ : 11 Q : 11 @@ -63,9 +63,9 @@ r : 11 ᵑ : 11 ? : 11 c : 11 -∙ : 11 ± : 11 _ : 11 +J : 11 ũ : 10 ˡ : 10 Ţ : 10 @@ -96,6 +96,7 @@ f : 8 ∕ : 8 £ : 8 Ø : 8 +ɗ : 8 ƒ : 8 ᵗ : 8 4 : 8 @@ -104,7 +105,6 @@ f : 8 H : 7 Ä : 7 / : 7 -ɗ : 7 Ħ : 7 ¦ : 7 Ĉ : 7 @@ -114,6 +114,7 @@ h : 7 ä : 7 Ř : 7 ¢ : 7 +ᶣ : 6 ᵏ : 6 ƃ : 6 Ď : 6 @@ -159,6 +160,7 @@ F : 4 ƥ : 4 D : 4 7 : 4 +ʲ : 4 ÷ : 4 þ : 4 § : 4 diff --git a/analysis/freq_2gram.txt b/analysis/freq_2gram.txt index 12b5465..54ea369 100644 --- a/analysis/freq_2gram.txt +++ b/analysis/freq_2gram.txt @@ -4,11 +4,8 @@ ˡ{ : 8 ᶠ{ : 7 ᵑ{ : 6 -ᵐ{ : 6 {$ : 5 -Jᵐ : 5 {: : 5 -ĉᵐ : 5 Ťđ : 5 ↕= : 4 *→ : 4 @@ -23,7 +20,6 @@ xŘ : 4 ↕ũ : 4 Ňᵖ : 4 aş : 4 -ᵐ# : 3 S= : 3 {Ƶ : 3 ŢṂ : 3 @@ -52,12 +48,14 @@ Rᶠ : 3 đ+ : 3 $L : 3 {C : 3 +ᵐ{ : 3 {x : 3 x= : 3 R: : 3 :∙ : 3 ∑= : 3 2R : 3 +ĉᵐ : 3 &Þ : 3 Sđ : 3 -_ : 3 @@ -93,7 +91,6 @@ qŁ : 2 ×Ö : 2 Öƃ : 2 Ťᵐ : 2 -ᵐů : 2 ᵒ- : 2 lo : 2 Ɔᵖ : 2 @@ -146,7 +143,6 @@ Qƥ : 2 Ɔᵗ : 2 4+ : 2 ḞŤ : 2 -Oᵐ : 2 $∑ : 2 ᵐ↔ : 2 +1 : 2 @@ -160,14 +156,15 @@ Sᵖ : 2 xq : 2 §L : 2 Ħ* : 2 +ᵐ# : 2 Ë: : 2 ᵒ& : 2 Þ£ : 2 ŋ∑ : 2 +ĉʲ : 2 Þ½ : 2 ∩z : 2 ¿ᵐ : 2 -ᵐj : 2 qŤ : 2 ;$ : 2 N, : 2 @@ -237,6 +234,7 @@ RS : 2 ɔ$ : 2 jŢ : 2 ↔$ : 2 +ᶣ{ : 2 ž¿ : 2 çṀ : 2 3~ : 2 @@ -275,6 +273,7 @@ $ᵉ : 1 {← : 1 Pᶜ : 1 ᶜ← : 1 +ᶣ# : 1 #3 : 1 3< : 1 Łƀ : 1 @@ -290,6 +289,7 @@ Pᶜ : 1 ½Q : 1 Ťu : 1 uŤ : 1 +ᵐů : 1 ᶻᵒ : 1 ¬≡ : 1 "H : 1 @@ -487,10 +487,9 @@ oi : 1 il : 1 →% : 1 %Z : 1 -{ᵐ : 1 -ᵐĝ : 1 -ĝj : 1 -j= : 1 +{ʲ : 1 +ʲĝ : 1 +ĝ= : 1 C4 : 1 +> : 1 >‼ : 1 @@ -501,6 +500,7 @@ RḞ : 1 ←X : 1 X< : 1 ∆ƶ : 1 +Oᵐ : 1 *ä : 1 äK : 1 *ĕ : 1 @@ -538,8 +538,7 @@ aĦ : 1 {Ł : 1 Łĉ : 1 ∑ũ : 1 -ᵐ∫ : 1 -∫j : 1 +ʲ∫ : 1 đ* : 1 *a : 1 aŢ : 1 @@ -547,6 +546,7 @@ S: : 1 :đ : 1 đ∩ : 1 z¿ : 1 +ᵐj : 1 Ťq : 1 Ť= : 1 $N : 1 @@ -781,7 +781,8 @@ xᶻ : 1 $R : 1 ~ᵃ : 1 ƃ= : 1 -ĉJ : 1 +ĉᶣ : 1 +ᶣj : 1 JS : 1 }ş : 1 ᵐµ : 1 @@ -810,12 +811,11 @@ XÞ : 1 ≡ĭ : 1 }Å : 1 Ɗĭ : 1 +ʲ{ : 1 ᵉĜ : 1 Ĝ# : 1 #M : 1 Mĝ : 1 -ĝ} : 1 -}j : 1 $/ : 1 /1 : 1 %≡ : 1 @@ -924,7 +924,7 @@ ađ : 1 R↔ : 1 $∆ : 1 ∆ç : 1 -çJ : 1 +çᶣ : 1 Cᵈ : 1 ᵈA : 1 Ac : 1 @@ -1294,7 +1294,8 @@ oᵐ : 1 ᵗž : 1 žũ : 1 oO : 1 -ůj : 1 +Oʲ : 1 +ʲů : 1 ĉđ : 1 'B : 1 B∕ : 1 @@ -1369,8 +1370,8 @@ ji : 1 Sᵒ : 1 ᵒÐ : 1 Ðj : 1 -↕J : 1 -ᵐŤ : 1 +↕ᶣ : 1 +ᶣŤ : 1 ŤŤ : 1 đ≡ : 1 ᵐ≡ : 1 @@ -1432,3 +1433,8 @@ x3 : 1 +; : 1 ;ž : 1 ¿Ø : 1 +*∙ : 1 +∙Ɗ : 1 +Ɗᶣ : 1 +ᶣɗ : 1 +ɗ= : 1 diff --git a/analysis/freq_3gram.txt b/analysis/freq_3gram.txt index 75f8065..8aa406d 100644 --- a/analysis/freq_3gram.txt +++ b/analysis/freq_3gram.txt @@ -22,7 +22,6 @@ $ᵑ{ : 2 ᵒ%ᵐ : 2 ᶠ{$ : 2 pƆᵗ : 2 -ᵐ{x : 2 Rᶠ{ : 2 Sᵖ{ : 2 ᵖ{@ : 2 @@ -38,7 +37,6 @@ tut : 2 ᵒ{ᵋ : 2 ᵖ{: : 2 ŋ+} : 2 -Jᵐ{ : 2 3~ᵑ : 2 ʸ{ˣ : 2 ∆±ĉ : 2 @@ -58,8 +56,7 @@ $ᵉ+ : 1 {←P : 1 ←Pᶜ : 1 Pᶜ← : 1 -Jᵐ# : 1 -ᵐ#3 : 1 +ᶣ#3 : 1 #3< : 1 qŁƀ : 1 Łƀ= : 1 @@ -283,10 +280,9 @@ oil : 1 ᵉ+→ : 1 +→% : 1 →%Z : 1 -ᵏ{ᵐ : 1 -{ᵐĝ : 1 -ᵐĝj : 1 -ĝj= : 1 +ᵏ{ʲ : 1 +{ʲĝ : 1 +ʲĝ= : 1 ˡ{C : 1 {C4 : 1 C4+ : 1 @@ -296,6 +292,7 @@ RḞŤ : 1 ←Ƃ≡ : 1 ←X< : 1 Oᵐ{ : 1 +ᵐ{x : 1 {x= : 1 *äK : 1 R:∙ : 1 @@ -348,8 +345,7 @@ aĦ* : 1 Łĉᵐ : 1 ĉᵐ# : 1 ŋ∑ũ : 1 -ĉᵐ∫ : 1 -ᵐ∫j : 1 +ĉʲ∫ : 1 Sđ* : 1 đ*a : 1 *aŢ : 1 @@ -632,8 +628,7 @@ $R~ : 1 R~ᵃ : 1 ~ᵃƂ : 1 Öƃ= : 1 -ĉJᵐ : 1 -Jᵐj : 1 +ĉᶣj : 1 ᶠ{J : 1 {JS : 1 JS= : 1 @@ -668,14 +663,12 @@ XÞ½ : 1 ĭ?} : 1 ?}Å : 1 Ɗĭ∑ : 1 -ĉᵐ{ : 1 -ᵐ{ᵉ : 1 +ĉʲ{ : 1 +ʲ{ᵉ : 1 {ᵉĜ : 1 ᵉĜ# : 1 Ĝ#M : 1 #Mĝ : 1 -Mĝ} : 1 -ĝ}j : 1 ᵏ{* : 1 {*+ : 1 *+$ : 1 @@ -816,9 +809,9 @@ jŢ½ : 1 R↔$ : 1 ↔$∆ : 1 $∆ç : 1 -∆çJ : 1 -çJᵐ : 1 -ᵐ{C : 1 +∆çᶣ : 1 +çᶣ{ : 1 +ᶣ{C : 1 {Cᵈ : 1 CᵈA : 1 ᵈAc : 1 @@ -1218,6 +1211,7 @@ Jĭ? : 1 ĎSᵉ : 1 Sᵉt : 1 ti¦ : 1 +ᶣ{x : 1 {x: : 1 x:ᵒ : 1 :ᵒ≈ : 1 @@ -1265,9 +1259,8 @@ Ooᵐ : 1 oᵐᵗ : 1 ᵐᵗž : 1 ᵗžũ : 1 -oOᵐ : 1 -Oᵐů : 1 -ᵐůj : 1 +oOʲ : 1 +Oʲů : 1 ±ĉđ : 1 'B∕ : 1 B∕u : 1 @@ -1358,9 +1351,8 @@ SᵒÐ : 1 ᵒÐj : 1 Ðj↕ : 1 j↕= : 1 -↕Jᵐ : 1 -JᵐŤ : 1 -ᵐŤŤ : 1 +↕ᶣŤ : 1 +ᶣŤŤ : 1 ŤŤđ : 1 Ťđ≡ : 1 đ≡¿ : 1 @@ -1444,3 +1436,7 @@ x3+ : 1 ;ž¿ : 1 ž¿Ø : 1 ¿Ø? : 1 +*∙Ɗ : 1 +∙Ɗᶣ : 1 +Ɗᶣɗ : 1 +ᶣɗ= : 1 diff --git a/analysis/freq_4gram.txt b/analysis/freq_4gram.txt index a942726..633c8d3 100644 --- a/analysis/freq_4gram.txt +++ b/analysis/freq_4gram.txt @@ -22,8 +22,7 @@ ʷ{←P : 1 {←Pᶜ : 1 ←Pᶜ← : 1 -Jᵐ#3 : 1 -ᵐ#3< : 1 +ᶣ#3< : 1 qŁƀ= : 1 Łƀ=ũ : 1 ˡ{Ƶᵉ : 1 @@ -184,9 +183,8 @@ poil : 1 {ᵉ+→ : 1 ᵉ+→% : 1 +→%Z : 1 -ᵏ{ᵐĝ : 1 -{ᵐĝj : 1 -ᵐĝj= : 1 +ᵏ{ʲĝ : 1 +{ʲĝ= : 1 ˡ{C4 : 1 {C4+ : 1 C4+> : 1 @@ -235,7 +233,6 @@ LaĦ* : 1 {Łĉᵐ : 1 Łĉᵐ# : 1 ᵒ&Þ£ : 1 -ĉᵐ∫j : 1 Sđ*a : 1 đ*aŢ : 1 *aŢṂ : 1 @@ -454,7 +451,6 @@ $R~ᵃ : 1 R~ᵃƂ : 1 ~ᵃƂ× : 1 ×Öƃ= : 1 -ĉJᵐj : 1 ᶠ{JS : 1 {JS= : 1 JS=} : 1 @@ -483,13 +479,11 @@ XÞ½= : 1 ᵗ≡ĭ? : 1 ≡ĭ?} : 1 ĭ?}Å : 1 -ĉᵐ{ᵉ : 1 -ᵐ{ᵉĜ : 1 +ĉʲ{ᵉ : 1 +ʲ{ᵉĜ : 1 {ᵉĜ# : 1 ᵉĜ#M : 1 Ĝ#Mĝ : 1 -#Mĝ} : 1 -Mĝ}j : 1 ᵏ{*+ : 1 {*+$ : 1 *+$/ : 1 @@ -615,11 +609,10 @@ jŢ½a : 1 Ţ½ađ : 1 R↔$∆ : 1 ↔$∆ç : 1 -$∆çJ : 1 -∆çJᵐ : 1 -çJᵐ{ : 1 -Jᵐ{C : 1 -ᵐ{Cᵈ : 1 +$∆çᶣ : 1 +∆çᶣ{ : 1 +çᶣ{C : 1 +ᶣ{Cᵈ : 1 {CᵈA : 1 CᵈAc : 1 ᵈAc} : 1 @@ -975,8 +968,7 @@ Jĭ?∑ : 1 ĎSᵉt : 1 Sᵉti : 1 ᵉti¦ : 1 -Jᵐ{x : 1 -ᵐ{x: : 1 +ᶣ{x: : 1 {x:ᵒ : 1 x:ᵒ≈ : 1 :ᵒ≈> : 1 @@ -1016,8 +1008,7 @@ $ŗ→E : 1 Ooᵐᵗ : 1 oᵐᵗž : 1 ᵐᵗžũ : 1 -oOᵐů : 1 -Oᵐůj : 1 +oOʲů : 1 ∆±ĉđ : 1 'B∕u : 1 B∕uo : 1 @@ -1096,9 +1087,8 @@ $ᵒ%ᵐ : 1 SᵒÐj : 1 ᵒÐj↕ : 1 Ðj↕= : 1 -↕JᵐŤ : 1 -JᵐŤŤ : 1 -ᵐŤŤđ : 1 +↕ᶣŤŤ : 1 +ᶣŤŤđ : 1 ŤŤđ≡ : 1 Ťđ≡¿ : 1 đ≡¿ᵐ : 1 @@ -1173,3 +1163,6 @@ x3+þ : 1 +;ž¿ : 1 ;ž¿Ø : 1 ž¿Ø? : 1 +*∙Ɗᶣ : 1 +∙Ɗᶣɗ : 1 +Ɗᶣɗ= : 1 diff --git a/analysis/freq_5gram.txt b/analysis/freq_5gram.txt index 4eaac99..02dbb93 100644 --- a/analysis/freq_5gram.txt +++ b/analysis/freq_5gram.txt @@ -12,7 +12,6 @@ ᶦ{$ᵉ+ : 1 ʷ{←Pᶜ : 1 {←Pᶜ← : 1 -Jᵐ#3< : 1 qŁƀ=ũ : 1 ˡ{Ƶᵉ½ : 1 {Ƶᵉ½3 : 1 @@ -120,8 +119,7 @@ o;↔ᶻÐ : 1 ᵏ{ᵉ+→ : 1 {ᵉ+→% : 1 ᵉ+→%Z : 1 -ᵏ{ᵐĝj : 1 -{ᵐĝj= : 1 +ᵏ{ʲĝ= : 1 ˡ{C4+ : 1 {C4+> : 1 C4+>‼ : 1 @@ -346,12 +344,10 @@ x:→&x : 1 {ᵗ≡ĭ? : 1 ᵗ≡ĭ?} : 1 ≡ĭ?}Å : 1 -ĉᵐ{ᵉĜ : 1 -ᵐ{ᵉĜ# : 1 +ĉʲ{ᵉĜ : 1 +ʲ{ᵉĜ# : 1 {ᵉĜ#M : 1 ᵉĜ#Mĝ : 1 -Ĝ#Mĝ} : 1 -#Mĝ}j : 1 ᵏ{*+$ : 1 {*+$/ : 1 *+$/1 : 1 @@ -455,12 +451,11 @@ $tI}ṁ : 1 SjŢ½a : 1 jŢ½ađ : 1 R↔$∆ç : 1 -↔$∆çJ : 1 -$∆çJᵐ : 1 -∆çJᵐ{ : 1 -çJᵐ{C : 1 -Jᵐ{Cᵈ : 1 -ᵐ{CᵈA : 1 +↔$∆çᶣ : 1 +$∆çᶣ{ : 1 +∆çᶣ{C : 1 +çᶣ{Cᵈ : 1 +ᶣ{CᵈA : 1 {CᵈAc : 1 CᵈAc} : 1 ᵈAc}- : 1 @@ -757,8 +752,7 @@ Jĭ?∑h : 1 ŗɔƃ3M : 1 ĎSᵉti : 1 Sᵉti¦ : 1 -Jᵐ{x: : 1 -ᵐ{x:ᵒ : 1 +ᶣ{x:ᵒ : 1 {x:ᵒ≈ : 1 x:ᵒ≈> : 1 :ᵒ≈>~ : 1 @@ -791,7 +785,6 @@ $ŗ→Eõ : 1 ŗ→Eõl : 1 Ooᵐᵗž : 1 oᵐᵗžũ : 1 -oOᵐůj : 1 'B∕uo : 1 ᶜ$ᵗ{i : 1 $ᵗ{iq : 1 @@ -853,9 +846,8 @@ $ᵒ%ᵐᶻ : 1 ᵃSᵒÐj : 1 SᵒÐj↕ : 1 ᵒÐj↕= : 1 -↕JᵐŤŤ : 1 -JᵐŤŤđ : 1 -ᵐŤŤđ≡ : 1 +↕ᶣŤŤđ : 1 +ᶣŤŤđ≡ : 1 ŤŤđ≡¿ : 1 Ťđ≡¿ᵐ : 1 đ≡¿ᵐ≡ : 1 @@ -920,3 +912,5 @@ x3+þç : 1 ++;ž¿ : 1 +;ž¿Ø : 1 ;ž¿Ø? : 1 +*∙Ɗᶣɗ : 1 +∙Ɗᶣɗ= : 1 diff --git a/analysis/particles.txt b/analysis/particles.txt index d4e4c61..8530ce5 100644 --- a/analysis/particles.txt +++ b/analysis/particles.txt @@ -5,8 +5,8 @@ particle : with "{" / total ˣ : 0 / 4 ᶾ : 0 / 1 ᶻ : 1 / 13 +ᵐ : 3 / 35 ᶜ : 1 / 9 -ᵐ : 6 / 44 ᵃ : 2 / 13 ᵋ : 1 / 5 ᵒ : 4 / 20 diff --git a/doc/Builtins.md b/doc/Builtins.md index b441253..e2316e9 100644 --- a/doc/Builtins.md +++ b/doc/Builtins.md @@ -2389,6 +2389,18 @@ Apply a function to every possible pair of values in two lists and return a list If one of the input is an number, apply the function to each integer from 0 to the input minus 1. +### `concatMap` (`ʲ`, `(0 -> 1) -> (1 -> 1) or (m -> 1) -> (m -> 1) where m > 0`) + +Map a function over a list and concatenate the results. + +See the documentation for `concat` and `map`. + +### `unconcatMap` (`ᶣ`, `(0 -> 1) -> (1 -> 1) or (m -> 1) -> (m -> 1) where m > 0`) + +Unconcatenate a list, and then map a function over the results. + +See the documentation for `unconcat` and `map`. + ### `predicate` (`ᵖ`, `(m -> n) -> (1 -> 1)`) Check if a function would succeed without actually applying it. diff --git a/doc/CodePage.md b/doc/CodePage.md index ef4d432..1bd07a6 100644 --- a/doc/CodePage.md +++ b/doc/CodePage.md @@ -14,8 +14,8 @@ The language is still in an early stage, so the code page is incomplete. Unassig |**5_**|`P`|`Q`|`R`|`S`|`T`|`U`|`V`|`W`|`X`|`Y`|`Z`|`[`|`\`|`]`|`^`|`_`| |**6_**|`` ` ``|`a`|`b`|`c`|`d`|`e`|`f`|`g`|`h`|`i`|`j`|`k`|`l`|`m`|`n`|`o`| |**7_**|`p`|`q`|`r`|`s`|`t`|`u`|`v`|`w`|`x`|`y`|`z`|`{`|`\|`|`}`|`~`|`\n`| -|**8_**|`ᵃ`|`ᶜ`|`ᵈ`|`ᵉ`|`ᵋ`|`ᶠ`|`ᶦ`|`ᵏ`|`ˡ`|`ᵐ`|`ᵚ`|`ᵑ`|`ᵒ`|`ᵖ`|`ʳ`|`ᵗ`| -|**9_**|`ʷ`|`ˣ`|`ʸ`|`ᶻ`|`ᶾ`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`| +|**8_**|`ᵃ`|`ᶜ`|`ᵈ`|`ᵉ`|`ᵋ`|`ᶠ`|`ᶦ`|`ʲ`|`ᶣ`|`ᵏ`|`ˡ`|`ᵐ`|`ᵚ`|`ᵑ`|`ᵒ`|`ᵖ`| +|**9_**|`ʳ`|`ᵗ`|`ʷ`|`ˣ`|`ʸ`|`ᶻ`|`ᶾ`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`| |**A_**|`Ä`|`Å`|`Ƃ`|`Ç`|`Ĉ`|`Ď`|`Ð`|`Ɗ`|`Ë`|`Ḟ`|`Ĝ`|`Ģ`|`Ħ`|`Ĩ`|`Ĭ`|`Ļ`| |**B_**|`Ł`|`Ṁ`|`Ṃ`|`Ň`|`Ö`|`Ø`|`Ɔ`|`Ƥ`|`Ṗ`|`Ř`|`Ŝ`|`Š`|`Ş`|`Ţ`|`Ť`|`Ŭ`| |**C_**|`Ž`|`Ƶ`|`Þ`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`| diff --git a/src/Nekomata/CodePage.hs b/src/Nekomata/CodePage.hs index f32c87c..cc3a5c8 100644 --- a/src/Nekomata/CodePage.hs +++ b/src/Nekomata/CodePage.hs @@ -27,8 +27,8 @@ codePage = ++ "PQRSTUVWXYZ[\\]^_" ++ "`abcdefghijklmno" ++ "pqrstuvwxyz{|}~\n" - ++ "ᵃᶜᵈᵉᵋᶠᶦᵏˡᵐᵚᵑᵒᵖʳᵗ" - ++ "ʷˣʸᶻᶾ�����������" + ++ "ᵃᶜᵈᵉᵋᶠᶦʲᶣᵏˡᵐᵚᵑᵒᵖ" + ++ "ʳᵗʷˣʸᶻᶾ���������" ++ "ÄÅƂÇĈĎÐƊËḞĜĢĦĨĬĻ" ++ "ŁṀṂŇÖØƆƤṖŘŜŠŞŢŤŬ" ++ "ŽƵÞ�������������" diff --git a/src/Nekomata/Particle.hs b/src/Nekomata/Particle.hs index 0ab0ea7..6f9f529 100644 --- a/src/Nekomata/Particle.hs +++ b/src/Nekomata/Particle.hs @@ -17,6 +17,7 @@ module Nekomata.Particle ( import Data.Functor (($>), (<&>)) import Data.Map.Strict (Map) import qualified Data.Map.Strict as Map +import Nekomata.Builtin.List (concat', unconcat) import Nekomata.Data import Nekomata.Function hiding (arity) import qualified Nekomata.Function as Function @@ -204,6 +205,24 @@ builtinParticles = \If one of the input is an number, apply the function to each \ \integer from 0 to the input minus 1." [] + , BuiltinParticle + "concatMap" + 'ʲ' + concatMap' + "(0 -> 1) -> (1 -> 1) \ + \or (m -> 1) -> (m -> 1) where m > 0" + "Map a function over a list and concatenate the results.\n\ + \See the documentation for `concat` and `map`." + [] + , BuiltinParticle + "unconcatMap" + 'ᶣ' + unconcatMap' + "(0 -> 1) -> (1 -> 1) \ + \or (m -> 1) -> (m -> 1) where m > 0" + "Unconcatenate a list, and then map a function over the results.\n\ + \See the documentation for `unconcat` and `map`." + [] , BuiltinParticle "predicate" 'ᵖ' @@ -504,6 +523,12 @@ outer = Particle outer' in liftJoinM2 f'' x y :+ dropStack (m - 2) s outer' _ = Nothing +concatMap' :: Particle +concatMap' = Particle $ fmap (.* concat') . runParticle map' + +unconcatMap' :: Particle +unconcatMap' = Particle $ fmap (unconcat .*) . runParticle map' + predicate' :: Particle predicate' = Particle predicate'' where diff --git a/test/Eval.hs b/test/Eval.hs index e092e62..7d45848 100644 --- a/test/Eval.hs +++ b/test/Eval.hs @@ -79,7 +79,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do , ("9", Count 55) ] specEval - "Jᵐ#3<" + "ᶣ#3<" [ ("0", Count 1) , ("1", Count 1) , ("2", Count 2) @@ -1118,7 +1118,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q139804: Undo a Range of Numbers" $ do specEval - "ᵏ{ᵐĝj=" + "ᵏ{ʲĝ=" [ ("\"0123\"", all_ ["4"]) , ("\"0\"", all_ ["1"]) , ("\"012345678910111213141516171819202122232425262728293031323334353637383940\"", all_ ["41"]) @@ -1352,7 +1352,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q167573: Consecutive 1-Bits are Incremented" $ do specEval - "ĉᵐ∫j" + "ĉʲ∫" [ ("[0,1,1,1,0,1,1,0,0,0,1,1,1,1,1,1]", all_ ["[0,1,2,3,0,1,2,0,0,0,1,2,3,4,5,6]"]) , ("[0,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1]", all_ ["[0,1,2,0,1,0,1,2,3,4,5,0,1,0,1,2,0,1,2,3,4,5,6,0,1,0,1,2,3,4,5,6,7,8]"]) , ("[1,1,1,1,1,1,1,1,1,1,1,1,0,1]", all_ ["[1,2,3,4,5,6,7,8,9,10,11,12,0,1]"]) @@ -2285,7 +2285,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q252303: Cut along the lines" $ do specEval - "ĉJᵐj" + "ĉᶣj" [ ("[1,0]", all_ ["[[1],[0]]", "[[1,0]]"]) , ("[1,1,1,1]", all_ ["[[1,1,1,1]]"]) , ("[1,1,0,0,1]", all_ ["[[1,1],[0,0],[1]]", "[[1,1],[0,0,1]]", "[[1,1,0,0],[1]]", "[[1,1,0,0,1]]"]) @@ -2358,7 +2358,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q255822: Replace 0s In a String With Their Consecutive Counts" $ do specEval - "ĉᵐ{ᵉĜ#Mĝ}j" + "ĉʲ{ᵉĜ#Mĝ" [ ("\"1234500362000440\"", all_ ["1234523623441"]) , ("\"123450036200044\"", all_ ["123452362344"]) , ("\"000000000000\"", all_ ["12"]) @@ -2591,7 +2591,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q259083: Is it traversable?" $ do specEval - "R↔$∆çJᵐ{CᵈAc}-ň" + "R↔$∆çᶣ{CᵈAc}-ň" [ ("0 [1,1,1,1,1]", Check True) , ("0 [50,45,20,19,18,10,1,1,1]", Check True) , ("5 [1,6,11,16,21,26,31]", Check True) @@ -3306,7 +3306,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q266049: How many umbrellas to cover the beach?" $ do specEval - "Jᵐ{x:ᵒ≈>~}aş#" + "ᶣ{x:ᵒ≈>~}aş#" [ ("[9,2,1,3,2,4,2,1] 1", first_ "1") , ("[1,1,1,1,1,1,1,1] 1", first_ "8") , ("[2,1,4,1,4,1,1,3,1] 1", first_ "2") @@ -3413,7 +3413,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q267491: Iteratively sort a list" $ do specEval - "oOᵐůj" + "oOʲů" [ ("[1,5,2,2,8,3,5,2,9]", first_ "[1,2,3,5,8,9,2,5,2]") , ("[8,5]", first_ "[5,8]") , ("[2,2,2]", first_ "[2,2,2]") @@ -3651,7 +3651,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do , ("[[6,1],[1,6]]", Check False) ] specEval - "↕JᵐŤŤđ≡¿ᵐ≡" + "↕ᶣŤŤđ≡¿ᵐ≡" [ ("[[1,1]]", Check True) , ("[[1,1],[1,2]]", Check True) , ("[[1,1],[1,1],[2,1]]", Check True) @@ -3753,3 +3753,21 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do , ("[0,2] [0,2]", first_ "[1,1]") , ("[0,1,2] [0,1,2]", first_ "[1]") ] + describe "q274690: Cubic Concatenation" $ do + specEval + "*∙Ɗᶣɗ=" + [ ("[1,5,3]", Check True) + , ("[2,2,13]", Check True) + , ("[4,0,7]", Check True) + , ("[10,0,0]", Check True) + , ("[10,0,1]", Check True) + , ("[22,18,59]", Check True) + , ("[98,28,27]", Check True) + , ("[166,500,333]", Check True) + , ("[828,538,472]", Check True) + , ("[1,2,3]", Check False) + , ("[4,5,6]", Check False) + , ("[6,0,0]", Check False) + , ("[166,500,334]", Check False) + , ("[200,0,200]", Check False) + ]