From 5edc92e243a3afe954b4216c8e77958b2916de65 Mon Sep 17 00:00:00 2001 From: AlephAlpha Date: Mon, 5 Aug 2024 15:19:28 +0800 Subject: [PATCH] :banana: --- CHANGELOG.md | 1 + analysis/corpus.txt | 11 ++++---- analysis/freq_1gram.txt | 35 +++++++++++++------------ analysis/freq_2gram.txt | 40 ++++++++++++++-------------- analysis/freq_3gram.txt | 46 +++++++++++++++------------------ analysis/freq_4gram.txt | 55 ++++++++++++++++++--------------------- analysis/freq_5gram.txt | 56 ++++++++++++++++++---------------------- analysis/particles.txt | 8 +++--- doc/Builtins.md | 4 +++ doc/CodePage.md | 2 +- src/Nekomata/CodePage.hs | 2 +- src/Nekomata/Particle.hs | 30 +++++++++++++++++++++ test/Eval.hs | 21 ++++++++++----- 13 files changed, 169 insertions(+), 142 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4b4682..da150ca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +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`. ### Breaking changes diff --git a/analysis/corpus.txt b/analysis/corpus.txt index 09455e9..18fd6c2 100644 --- a/analysis/corpus.txt +++ b/analysis/corpus.txt @@ -192,6 +192,7 @@ S∑a:u∕u ʷ{£d į→ŋ V +ʸj Øᶦ{Sa ᶠ{+ä∩z O2ᵚL @@ -201,7 +202,7 @@ p:ƀᵃᶜt$,,= J≡ ŇË←Q Ṗ¢$¦ -ʷ{;"tut-tut"=ip,}ᵗN +ʷ{;"tut-tut"=ip,}Ø= D:×Ṁ #2÷:→:ᵒ{ᵋ{-+@}m@ Øc;$ᶻ,ŤxᶻŘ @@ -283,8 +284,8 @@ xᵐĦ*Ḟ Ë:ᵒ&Þ←A± ƒƵ Ťᵐ↕∫Ɔž∑≤ -~ᵉ{$#ᵑ{ˣ@j,u}}∕~ -xᵒĈ:§#ᵑ{ˣᵐ∙+}±≈j∑ +~ᵉʸ{ˣ@j,u}∕~ +xᵒĈ:ʸ{ˣᵐ∙+±}≈j∑ ᵒ{ᵋ∩?Ø?= Ňᵖ{Rƒᵐ∏Ɔ< Ň+ᵖ{ʷ½≥ @@ -327,7 +328,7 @@ Jtđ= RJ:ᵐhmj↕ũh= Z:Ť‼Ť$ḟ ŧĉᵐz -0ʷ{ᵖ>Ë}= +0ʷ{v<Ë}= Ŝoç∆ ↕ᵉtiᶻ{∕z Ŝoç∆ᵐᶠZH @@ -345,4 +346,4 @@ Sđ∙Z ᵒ∙jZ‼* pƆᵗ≤ᵗ≥ o$2ᵑ{Jĭᵃjᵈ↔,}= -+:#ᵑ{CU$x3+þç++;ž¿ ++ʸ{CU$x3+þç++;ž¿Ø? diff --git a/analysis/freq_1gram.txt b/analysis/freq_1gram.txt index f2c222e..6391f00 100644 --- a/analysis/freq_1gram.txt +++ b/analysis/freq_1gram.txt @@ -1,7 +1,7 @@ -{ : 80 -$ : 57 -= : 53 -: : 51 +{ : 79 +$ : 56 += : 54 +: : 50 + : 46 ᵐ : 44 ∑ : 40 @@ -9,30 +9,30 @@ $ : 57 R : 32 * : 31 ← : 30 -} : 30 -j : 29 +j : 30 +} : 29 x : 29 1 : 25 - : 25 o : 24 ç : 24 , : 23 -# : 23 2 : 23 ᵉ : 22 ↕ : 22 Ť : 21 +# : 20 ᵒ : 20 a : 20 ↔ : 20 đ : 19 u : 18 -ᵖ : 18 ~ : 18 3 : 17 S : 17 ĭ : 17 p : 17 +ᵖ : 17 J : 16 l : 16 ĉ : 16 @@ -43,17 +43,16 @@ t : 15 Ð : 15 " : 14 Ƃ : 14 -ᵑ : 14 Ň : 14 ; : 14 L : 14 ᶦ : 13 +< : 13 ᵃ : 13 ᶻ : 13 ≡ : 13 ∫ : 13 Ɗ : 13 -< : 12 q : 12 ½ : 12 Ë : 12 @@ -61,8 +60,9 @@ q : 12 ʷ : 11 Q : 11 r : 11 +ᵑ : 11 +? : 11 c : 11 -N : 11 ∙ : 11 ± : 11 _ : 11 @@ -72,10 +72,10 @@ _ : 11 E : 10 ž : 10 ŋ : 10 -? : 10 @ : 10 % : 10 ᶠ : 10 +N : 10 ∏ : 10 O : 10 C : 10 @@ -86,7 +86,6 @@ z : 10 ≥ : 9 ‼ : 9 ŗ : 9 -ᵗ : 9 ≈ : 9 i : 9 P : 8 @@ -96,7 +95,9 @@ f : 8 ů : 8 ∕ : 8 £ : 8 +Ø : 8 ƒ : 8 +ᵗ : 8 4 : 8 ¿ : 8 Ƶ : 7 @@ -111,25 +112,25 @@ H : 7 Ĩ : 7 h : 7 ä : 7 -> : 7 Ř : 7 ¢ : 7 ᵏ : 6 ƃ : 6 Ď : 6 ≤ : 6 -Ø : 6 ŧ : 6 Ĭ : 6 ş : 6 Ŝ : 6 ɔ : 6 ĕ : 6 +> : 6 Þ : 6 ∩ : 6 į : 6 0 : 6 B : 6 +v : 6 ƀ : 5 I : 5 y : 5 @@ -147,11 +148,9 @@ M : 5 8 : 5 √ : 5 5 : 5 -§ : 5 ᵋ : 5 b : 5 A : 5 -v : 5 ĝ : 4 Ł : 4 Ḟ : 4 @@ -162,12 +161,14 @@ D : 4 7 : 4 ÷ : 4 þ : 4 +§ : 4 & : 4 6 : 4 ˣ : 4 ň : 4 Ṗ : 4 U : 4 +ʸ : 4 Ṃ : 3 Y : 3 T : 3 diff --git a/analysis/freq_2gram.txt b/analysis/freq_2gram.txt index 1b6fc87..12b5465 100644 --- a/analysis/freq_2gram.txt +++ b/analysis/freq_2gram.txt @@ -1,11 +1,11 @@ ᶦ{ : 12 ᵖ{ : 11 ʷ{ : 9 -ᵑ{ : 9 ˡ{ : 8 ᶠ{ : 7 -{$ : 6 +ᵑ{ : 6 ᵐ{ : 6 +{$ : 5 Jᵐ : 5 {: : 5 ĉᵐ : 5 @@ -39,6 +39,8 @@ Z‼ : 3 $ᵑ : 3 {ᵉ : 3 ?} : 3 +}Ø : 3 +Ø= : 3 1c : 3 →r : 3 Ňŧ : 3 @@ -66,14 +68,12 @@ pN : 3 {į : 3 ᶻL : 3 x→ : 3 -:# : 3 +$ : 3 -+} : 3 *$ : 3 #← : 3 }a : 3 R∑ : 3 -#ᵑ : 3 +ʸ{ : 3 =¿ : 3 ∆± : 3 Jĭ : 3 @@ -102,8 +102,6 @@ al : 2 $Ç : 2 →/ : 2 çƆ : 2 -}Ø : 2 -Ø= : 2 $ŧ : 2 ŧ← : 2 Ɗj : 2 @@ -218,6 +216,7 @@ ut : 2 Ṗ↕ : 2 {J : 2 =} : 2 +:# : 2 #: : 2 x: : 2 ĭ? : 2 @@ -226,6 +225,7 @@ x: : 2 ᵃ{ : 2 x- : 2 ŋ+ : 2 ++} : 2 {ᵈ : 2 ≡¿ : 2 2Š : 2 @@ -252,6 +252,7 @@ rj : 2 :, : 2 {R : 2 @j : 2 +Ø? : 2 ±ĉ : 2 ĭ, : 2 #* : 2 @@ -727,6 +728,7 @@ a: : 1 m2 : 1 2Ĩ : 1 {£ : 1 +ʸj : 1 Øᶦ : 1 Sa : 1 {+ : 1 @@ -759,8 +761,6 @@ t" : 1 =i : 1 ip : 1 p, : 1 -}ᵗ : 1 -ᵗN : 1 D: : 1 :× : 1 ×Ṁ : 1 @@ -1144,28 +1144,25 @@ A± : 1 ž∑ : 1 ∑≤ : 1 ~ᵉ : 1 -ᵉ{ : 1 -$# : 1 +ᵉʸ : 1 ˣ@ : 1 j, : 1 ,u : 1 u} : 1 -}} : 1 }∕ : 1 ∕~ : 1 xᵒ : 1 ᵒĈ : 1 Ĉ: : 1 -:§ : 1 -§# : 1 +:ʸ : 1 ˣᵐ : 1 -}± : 1 -±≈ : 1 ++± : 1 +±} : 1 +}≈ : 1 ≈j : 1 j∑ : 1 ∩? : 1 ?Ø : 1 -Ø? : 1 ?= : 1 Rƒ : 1 ƒᵐ : 1 @@ -1335,9 +1332,9 @@ h= : 1 Ť$ : 1 $ḟ : 1 0ʷ : 1 -{ᵖ : 1 -ᵖ> : 1 ->Ë : 1 +{v : 1 +v< : 1 +<Ë : 1 Ë} : 1 ↕ᵉ : 1 iᶻ : 1 @@ -1424,7 +1421,7 @@ o$ : 1 jᵈ : 1 ᵈ↔ : 1 ↔, : 1 -+: : 1 ++ʸ : 1 CU : 1 $x : 1 x3 : 1 @@ -1434,3 +1431,4 @@ x3 : 1 ++ : 1 +; : 1 ;ž : 1 +¿Ø : 1 diff --git a/analysis/freq_3gram.txt b/analysis/freq_3gram.txt index 8907bc4..75f8065 100644 --- a/analysis/freq_3gram.txt +++ b/analysis/freq_3gram.txt @@ -2,9 +2,8 @@ u∕u : 3 ∫Ɔž : 3 Ɔž≥ : 3 -ᵑ{ˣ : 3 +}Ø= : 3 }aş : 3 -#ᵑ{ : 3 "ᵉĝ : 2 ᵉĝ, : 2 3*→ : 2 @@ -14,7 +13,6 @@ u∕u : 3 ×Öƃ : 2 ᵒ-¬ : 2 $ᵑ{ : 2 -}Ø= : 2 ᶦ{1 : 2 {1% : 2 1%ŗ : 2 @@ -42,6 +40,7 @@ tut : 2 ŋ+} : 2 Jᵐ{ : 2 3~ᵑ : 2 +ʸ{ˣ : 2 ∆±ĉ : 2 ←ᶠ{ : 2 ᵉti : 2 @@ -438,6 +437,7 @@ oĉ~ : 1 Ɗj1 : 1 j1Ĉ : 1 ᵉᵑ{ : 1 +ᵑ{ˣ : 1 {ˣ∙ : 1 ˣ∙ɔ : 1 ∙ɔᵈ : 1 @@ -599,8 +599,7 @@ t"= : 1 =ip : 1 ip, : 1 p,} : 1 -,}ᵗ : 1 -}ᵗN : 1 +,}Ø : 1 D:× : 1 :×Ṁ : 1 #2÷ : 1 @@ -1085,30 +1084,26 @@ yĦŋ : 1 ↕∫Ɔ : 1 Ɔž∑ : 1 ž∑≤ : 1 -~ᵉ{ : 1 -ᵉ{$ : 1 -{$# : 1 -$#ᵑ : 1 +~ᵉʸ : 1 +ᵉʸ{ : 1 {ˣ@ : 1 ˣ@j : 1 @j, : 1 j,u : 1 ,u} : 1 -u}} : 1 -}}∕ : 1 +u}∕ : 1 }∕~ : 1 xᵒĈ : 1 ᵒĈ: : 1 -Ĉ:§ : 1 -:§# : 1 -§#ᵑ : 1 +Ĉ:ʸ : 1 +:ʸ{ : 1 {ˣᵐ : 1 ˣᵐ∙ : 1 ᵐ∙+ : 1 -∙+} : 1 -+}± : 1 -}±≈ : 1 -±≈j : 1 +∙+± : 1 ++±} : 1 +±}≈ : 1 +}≈j : 1 ≈j∑ : 1 {ᵋ∩ : 1 ᵋ∩? : 1 @@ -1315,10 +1310,10 @@ Z:Ť : 1 Ť$ḟ : 1 ŧĉᵐ : 1 0ʷ{ : 1 -ʷ{ᵖ : 1 -{ᵖ> : 1 -ᵖ>Ë : 1 ->Ë} : 1 +ʷ{v : 1 +{v< : 1 +v<Ë : 1 +<Ë} : 1 Ë}= : 1 ↕ᵉt : 1 tiᶻ : 1 @@ -1433,9 +1428,8 @@ jᵈ↔ : 1 ᵈ↔, : 1 ↔,} : 1 ,}= : 1 -+:# : 1 -:#ᵑ : 1 -ᵑ{C : 1 ++ʸ{ : 1 +ʸ{C : 1 {CU : 1 CU$ : 1 U$x : 1 @@ -1448,3 +1442,5 @@ x3+ : 1 ++; : 1 +;ž : 1 ;ž¿ : 1 +ž¿Ø : 1 +¿Ø? : 1 diff --git a/analysis/freq_4gram.txt b/analysis/freq_4gram.txt index e7d42d4..a942726 100644 --- a/analysis/freq_4gram.txt +++ b/analysis/freq_4gram.txt @@ -11,7 +11,6 @@ :ᵒ&Þ : 2 &Þ£E : 2 Ɔ$đ+ : 2 -#ᵑ{ˣ : 2 Ŝoç∆ : 2 ᵉĝ," : 1 ĝ,"ᵉ : 1 @@ -422,8 +421,8 @@ t"=i : 1 "=ip : 1 =ip, : 1 ip,} : 1 -p,}ᵗ : 1 -,}ᵗN : 1 +p,}Ø : 1 +,}Ø= : 1 D:×Ṁ : 1 #2÷: : 1 2÷:→ : 1 @@ -855,31 +854,27 @@ $yĦŋ : 1 ↕∫Ɔž : 1 ∫Ɔž∑ : 1 Ɔž∑≤ : 1 -~ᵉ{$ : 1 -ᵉ{$# : 1 -{$#ᵑ : 1 -$#ᵑ{ : 1 -ᵑ{ˣ@ : 1 +~ᵉʸ{ : 1 +ᵉʸ{ˣ : 1 +ʸ{ˣ@ : 1 {ˣ@j : 1 ˣ@j, : 1 @j,u : 1 j,u} : 1 -,u}} : 1 -u}}∕ : 1 -}}∕~ : 1 +,u}∕ : 1 +u}∕~ : 1 xᵒĈ: : 1 -ᵒĈ:§ : 1 -Ĉ:§# : 1 -:§#ᵑ : 1 -§#ᵑ{ : 1 -ᵑ{ˣᵐ : 1 +ᵒĈ:ʸ : 1 +Ĉ:ʸ{ : 1 +:ʸ{ˣ : 1 +ʸ{ˣᵐ : 1 {ˣᵐ∙ : 1 ˣᵐ∙+ : 1 -ᵐ∙+} : 1 -∙+}± : 1 -+}±≈ : 1 -}±≈j : 1 -±≈j∑ : 1 +ᵐ∙+± : 1 +∙+±} : 1 ++±}≈ : 1 +±}≈j : 1 +}≈j∑ : 1 ᵒ{ᵋ∩ : 1 {ᵋ∩? : 1 ᵋ∩?Ø : 1 @@ -1056,11 +1051,11 @@ Z:Ť‼ : 1 Ť‼Ť$ : 1 ‼Ť$ḟ : 1 ŧĉᵐz : 1 -0ʷ{ᵖ : 1 -ʷ{ᵖ> : 1 -{ᵖ>Ë : 1 -ᵖ>Ë} : 1 ->Ë}= : 1 +0ʷ{v : 1 +ʷ{v< : 1 +{v<Ë : 1 +v<Ë} : 1 +<Ë}= : 1 ↕ᵉti : 1 ᵉtiᶻ : 1 tiᶻ{ : 1 @@ -1163,10 +1158,8 @@ Jĭᵃj : 1 jᵈ↔, : 1 ᵈ↔,} : 1 ↔,}= : 1 -+:#ᵑ : 1 -:#ᵑ{ : 1 -#ᵑ{C : 1 -ᵑ{CU : 1 ++ʸ{C : 1 +ʸ{CU : 1 {CU$ : 1 CU$x : 1 U$x3 : 1 @@ -1178,3 +1171,5 @@ x3+þ : 1 ç++; : 1 ++;ž : 1 +;ž¿ : 1 +;ž¿Ø : 1 +ž¿Ø? : 1 diff --git a/analysis/freq_5gram.txt b/analysis/freq_5gram.txt index 089770c..4eaac99 100644 --- a/analysis/freq_5gram.txt +++ b/analysis/freq_5gram.txt @@ -295,8 +295,8 @@ ut"=i : 1 t"=ip : 1 "=ip, : 1 =ip,} : 1 -ip,}ᵗ : 1 -p,}ᵗN : 1 +ip,}Ø : 1 +p,}Ø= : 1 #2÷:→ : 1 2÷:→: : 1 ÷:→:ᵒ : 1 @@ -657,31 +657,25 @@ $ƥ←$y : 1 ᵐ↕∫Ɔž : 1 ↕∫Ɔž∑ : 1 ∫Ɔž∑≤ : 1 -~ᵉ{$# : 1 -ᵉ{$#ᵑ : 1 -{$#ᵑ{ : 1 -$#ᵑ{ˣ : 1 -#ᵑ{ˣ@ : 1 -ᵑ{ˣ@j : 1 +~ᵉʸ{ˣ : 1 +ᵉʸ{ˣ@ : 1 +ʸ{ˣ@j : 1 {ˣ@j, : 1 ˣ@j,u : 1 @j,u} : 1 -j,u}} : 1 -,u}}∕ : 1 -u}}∕~ : 1 -xᵒĈ:§ : 1 -ᵒĈ:§# : 1 -Ĉ:§#ᵑ : 1 -:§#ᵑ{ : 1 -§#ᵑ{ˣ : 1 -#ᵑ{ˣᵐ : 1 -ᵑ{ˣᵐ∙ : 1 +j,u}∕ : 1 +,u}∕~ : 1 +xᵒĈ:ʸ : 1 +ᵒĈ:ʸ{ : 1 +Ĉ:ʸ{ˣ : 1 +:ʸ{ˣᵐ : 1 +ʸ{ˣᵐ∙ : 1 {ˣᵐ∙+ : 1 -ˣᵐ∙+} : 1 -ᵐ∙+}± : 1 -∙+}±≈ : 1 -+}±≈j : 1 -}±≈j∑ : 1 +ˣᵐ∙+± : 1 +ᵐ∙+±} : 1 +∙+±}≈ : 1 ++±}≈j : 1 +±}≈j∑ : 1 ᵒ{ᵋ∩? : 1 {ᵋ∩?Ø : 1 ᵋ∩?Ø? : 1 @@ -820,10 +814,10 @@ j↕ũh= : 1 Z:Ť‼Ť : 1 :Ť‼Ť$ : 1 Ť‼Ť$ḟ : 1 -0ʷ{ᵖ> : 1 -ʷ{ᵖ>Ë : 1 -{ᵖ>Ë} : 1 -ᵖ>Ë}= : 1 +0ʷ{v< : 1 +ʷ{v<Ë : 1 +{v<Ë} : 1 +v<Ë}= : 1 ↕ᵉtiᶻ : 1 ᵉtiᶻ{ : 1 tiᶻ{∕ : 1 @@ -912,10 +906,8 @@ Jĭᵃjᵈ : 1 ᵃjᵈ↔, : 1 jᵈ↔,} : 1 ᵈ↔,}= : 1 -+:#ᵑ{ : 1 -:#ᵑ{C : 1 -#ᵑ{CU : 1 -ᵑ{CU$ : 1 ++ʸ{CU : 1 +ʸ{CU$ : 1 {CU$x : 1 CU$x3 : 1 U$x3+ : 1 @@ -926,3 +918,5 @@ x3+þç : 1 þç++; : 1 ç++;ž : 1 ++;ž¿ : 1 ++;ž¿Ø : 1 +;ž¿Ø? : 1 diff --git a/analysis/particles.txt b/analysis/particles.txt index 1ac659f..d4e4c61 100644 --- a/analysis/particles.txt +++ b/analysis/particles.txt @@ -1,19 +1,19 @@ particle : with "{" / total ᵈ : 0 / 10 +ᵉ : 0 / 22 ʳ : 0 / 5 ˣ : 0 / 4 ᶾ : 0 / 1 -ᵉ : 1 / 22 ᶻ : 1 / 13 ᶜ : 1 / 9 ᵐ : 6 / 44 ᵃ : 2 / 13 ᵋ : 1 / 5 ᵒ : 4 / 20 -ᵗ : 2 / 9 ᵚ : 2 / 8 -ᵖ : 11 / 18 -ᵑ : 9 / 14 +ᵗ : 2 / 8 +ᵑ : 6 / 11 +ᵖ : 11 / 17 ᵏ : 4 / 6 ᶠ : 7 / 10 ˡ : 8 / 10 diff --git a/doc/Builtins.md b/doc/Builtins.md index 7a67ba7..b441253 100644 --- a/doc/Builtins.md +++ b/doc/Builtins.md @@ -2435,6 +2435,10 @@ This is different from `iterate` in that it does not return the intermediate res Apply a function zero or more times, until the top value of the stack is Fail, and return the number of times the function was applied. +### `fixedPoint` (`ʸ`, `(n -> n) -> (n -> n)`) + +Apply a function zero or more times, until the top value of the stack no longer changes. + ### `firstInt` (`ᵏ`, `(m -> n) -> (0 -> 1)`) Find the smallest non-negative integer for which a function does not fail, and return it. diff --git a/doc/CodePage.md b/doc/CodePage.md index 9e1b51f..ef4d432 100644 --- a/doc/CodePage.md +++ b/doc/CodePage.md @@ -15,7 +15,7 @@ The language is still in an early stage, so the code page is incomplete. Unassig |**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_**|`ʷ`|`ˣ`|`ᶻ`|`ᶾ`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`| +|**9_**|`ʷ`|`ˣ`|`ʸ`|`ᶻ`|`ᶾ`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`| |**A_**|`Ä`|`Å`|`Ƃ`|`Ç`|`Ĉ`|`Ď`|`Ð`|`Ɗ`|`Ë`|`Ḟ`|`Ĝ`|`Ģ`|`Ħ`|`Ĩ`|`Ĭ`|`Ļ`| |**B_**|`Ł`|`Ṁ`|`Ṃ`|`Ň`|`Ö`|`Ø`|`Ɔ`|`Ƥ`|`Ṗ`|`Ř`|`Ŝ`|`Š`|`Ş`|`Ţ`|`Ť`|`Ŭ`| |**C_**|`Ž`|`Ƶ`|`Þ`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`| diff --git a/src/Nekomata/CodePage.hs b/src/Nekomata/CodePage.hs index 5bebcac..f32c87c 100644 --- a/src/Nekomata/CodePage.hs +++ b/src/Nekomata/CodePage.hs @@ -28,7 +28,7 @@ codePage = ++ "`abcdefghijklmno" ++ "pqrstuvwxyz{|}~\n" ++ "ᵃᶜᵈᵉᵋᶠᶦᵏˡᵐᵚᵑᵒᵖʳᵗ" - ++ "ʷˣᶻᶾ������������" + ++ "ʷˣʸᶻᶾ�����������" ++ "ÄÅƂÇĈĎÐƊËḞĜĢĦĨĬĻ" ++ "ŁṀṂŇÖØƆƤṖŘŜŠŞŢŤŬ" ++ "ŽƵÞ�������������" diff --git a/src/Nekomata/Particle.hs b/src/Nekomata/Particle.hs index 395e135..0ab0ea7 100644 --- a/src/Nekomata/Particle.hs +++ b/src/Nekomata/Particle.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE LambdaCase #-} + module Nekomata.Particle ( Particle (..), BuiltinParticle (..), @@ -274,6 +276,14 @@ builtinParticles = \until the top value of the stack is Fail, \ \and return the number of times the function was applied." [] + , BuiltinParticle + "fixedPoint" + 'ʸ' + fixedPoint + "(n -> n) -> (n -> n)" + "Apply a function zero or more times, \ + \until the top value of the stack no longer changes." + [] , BuiltinParticle "firstInt" 'ᵏ' @@ -618,6 +628,26 @@ lengthWhile = Particle lengthWhile' else Val 0 ) +fixedPoint :: Particle +fixedPoint = Particle fixedPoint' + where + fixedPoint' (Function (Arity m n) f) | m == n = + Just + . Function (Arity m n) + $ \i s -> + prepend + (takeStack n . tryStack $ fixedPoint'' i f s) + (dropStack m s) + fixedPoint' _ = Nothing + fixedPoint'' :: Id -> (Id -> Stack -> Stack) -> Stack -> Try Stack + fixedPoint'' i f s = + let t = top s + s' = f (leftId i) s + t' = normalForm (top s') + in tryEq t t' >>= \case + True -> Val s + False -> t' $> s' >>= fixedPoint'' (rightId i) f + firstInt :: Particle firstInt = Particle firstInt' where diff --git a/test/Eval.hs b/test/Eval.hs index ef894fb..e092e62 100644 --- a/test/Eval.hs +++ b/test/Eval.hs @@ -2122,6 +2122,13 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do , ("[[],[]]", all_ ["[]"]) , ("[[1,4,6],[1,[2,67,[5,7]]]]", all_ ["[1,4,6,1,2,67,5,7]"]) ] + specEval + "ʸj" + [ ("[[3],[3,[[6]]]]", all_ ["[3,3,6]"]) + , ("[]", all_ ["[]"]) + , ("[[],[]]", all_ ["[]"]) + , ("[[1,4,6],[1,[2,67,[5,7]]]]", all_ ["[1,4,6,1,2,67,5,7]"]) + ] describe "q248445: Print the power set of the power set ... of an empty set" $ do specEval "Øᶦ{Sa" @@ -2217,7 +2224,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q251772: Tut-tut-tut-tut-tut" $ do specEval - "ʷ{;\"tut-tut\"=ip,}ᵗN" + "ʷ{;\"tut-tut\"=ip,}Ø=" [ ("\"tut-tut\"", Check True) , ("\"tut-tutut-tut\"", Check True) , ("\"tut-tut-tut-tut-tut\"", Check True) @@ -2672,7 +2679,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do , ("5 4", Count 0) , ("5 5", Count 120) ] - describe "q259576: all_ of the Boards" $ do + describe "q259576: All of the Boards" $ do specEval "į3ƂÐ3~ᵑᵐç3~ᵑçaᵐᶜ{0*}∑ƶ" [("", Count 215)] @@ -3061,7 +3068,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q263566: Calculating Transitive Closure" $ do specEval - "~ᵉ{$#ᵑ{ˣ@j,u}}∕~" + "~ᵉʸ{ˣ@j,u}∕~" [ ("[[],[],[]]", Count 0) , ("[[1],[0]]", Count 2) , ("[[1],[0],[]]", Count 2) @@ -3071,7 +3078,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do , ("[[1],[2],[3],[4],[5],[0]]", Count 30) ] specEval - "xᵒĈ:§#ᵑ{ˣᵐ∙+}±≈j∑" + "xᵒĈ:ʸ{ˣᵐ∙+±}≈j∑" [ ("[[],[],[]]", all_ ["0"]) , ("[[1],[0]]", all_ ["2"]) , ("[[1],[0],[]]", all_ ["2"]) @@ -3543,7 +3550,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q271363: Is it a tetrate of two?" $ do specEval - "0ʷ{ᵖ>Ë}=" + "0ʷ{v<Ë}=" [ ("1", Check True) , ("2", Check True) , ("4", Check True) @@ -3720,7 +3727,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do , ("[1,2,3,2,3,4]", Check True) , ("[4,5,4,3,4,5]", Check True) ] - describe "q274358: Sorting with a deque" $ do + describe "q274358: Double dequer sort" $ do specEval "o$2ᵑ{Jĭᵃjᵈ↔,}=" [ ("[1]", Check True) @@ -3739,7 +3746,7 @@ testEval = describe "Solutions to Code Golf Stack Exchange challenges" $ do ] describe "q274448: Factoriadic Fraction Addition" $ do specEval - "+:#ᵑ{CU$x3+þç++;ž¿" + "+ʸ{CU$x3+þç++;ž¿Ø?" [ ("[] []", first_ "[]") , ("[] [1]", first_ "[1]") , ("[0,2] [-1]", first_ "[-1,2]")