diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dba78e..7c961e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ * Fixed a bug in printing truncated results. * Now characters are internally represented as `Word8`s instead of `Char`s. * Added a REPL command `\Arity` to print the arity of a function. -* New built-in functions: `\minMax`, `\pad`. +* New built-in functions: `\minMax`, `\pad`, `\slices`. ### Breaking changes diff --git a/analysis/Ideas.md b/analysis/Ideas.md index 1605ffa..7fca219 100644 --- a/analysis/Ideas.md +++ b/analysis/Ideas.md @@ -171,12 +171,6 @@ LiberationMono 字体所支持的字符列举于[此文件](analysis/LiberationM - [ ] `\onAny`:助词,将一个函数应用到列表的任意一个元素上。比如说 `[1,2,3] \onAny \increment` 有三种可能的结果:`[2,2,3]`、`[1,3,3]`、`[1,2,4]`。 -### [Matrix with 1 to L(n), in all n columns](https://codegolf.stackexchange.com/q/142037/9288) - -``` -\range1 \pad \transpose -``` - ## 关于字符串 从 v0.5.0.0 开始,Nekomata 将不再区分字符串和列表,增加了一个字符类型,当一个列表的全部元素都是字符时,就视为一个字符串。字符串和列表只在输入输出时有区别,其它时候都是一样的。 @@ -221,3 +215,6 @@ LiberationMono 字体所支持的字符列举于[此文件](analysis/LiberationM ## 文档 目前的文档还很不完善。需要增加更多的例子,以及更详细的说明。 + +- [ ] 为每个函数增加例子。 +- [ ] 重写现有的 Tutorial。考虑分成多个文件,每个文件只讲一个主题。 diff --git a/analysis/corpus.txt b/analysis/corpus.txt index 78ed2e4..793e9d2 100644 --- a/analysis/corpus.txt +++ b/analysis/corpus.txt @@ -215,7 +215,7 @@ x:→&xï@ᵐ∑ ᵐ{į→ŋ+}≡H Cᶦ{ᵈsf¡C ʷ{ᶜŤĕ≡¿}Ø= -↕ᵃ{Jᵐɗ"∩<"<60b}-_Paṁ +↕ᵃ{2Šᵐɗ"∩<"<60b}-_Paṁ :←/∏* ƂxŘƃṁ qᵗz:∙= @@ -235,7 +235,7 @@ R↔$∆çJᵐ{CᵈAc}-ň ∑½$ṁ±*$:#←c≥ ʷ{P↕1:Ð-:Cž¿?}žz O↕ᶠz$L -į3ƂÐ3~ᵑᵐç3~ᵑçaḞS∑ƶ +į3ƂÐ3~ᵑᵐç3~ᵑçaᵐᶜ{0*}∑ƶ ᵒ{ᵃƂv≈Ä+ç4ŗd 0UU$ᵑ{4*4ᵐ+↔3Ř;ᶻᶻ,j ḞŤxqNᵖ{@Ťů}aşᵉhl→Ð @@ -300,6 +300,6 @@ Jᵐ{x:ᵒ≈>~}aş# 1D∑ rjŢ ŋ∑Aaṁ -ĕ<ĭÐŤʳXH"c"I +ĕ<2ŠʳXH"c"I ∆±ɱ+ Ä&Þ£E diff --git a/analysis/freq_1gram.txt b/analysis/freq_1gram.txt index 8a7d6e9..f2e2d99 100644 --- a/analysis/freq_1gram.txt +++ b/analysis/freq_1gram.txt @@ -1,16 +1,16 @@ -{ : 66 +{ : 67 $ : 50 : : 45 ∑ : 40 = : 39 + : 37 -ᵐ : 31 +ᵐ : 32 ← : 29 R : 29 +* : 28 → : 28 a : 28 -* : 27 -} : 25 +} : 26 1 : 23 - : 23 j : 22 @@ -18,24 +18,24 @@ x : 21 ᵉ : 20 , : 20 ç : 20 +2 : 19 ᵒ : 18 o : 18 ↔ : 18 # : 17 -ĭ : 17 -Ť : 17 u : 17 -2 : 17 3 : 16 +ĭ : 16 +Ť : 16 p : 16 Ṁ : 16 ~ : 16 ↕ : 15 l : 15 ᵖ : 15 -Ð : 15 -S : 14 Ƃ : 14 +Ð : 14 +S : 13 đ : 13 Ɔ : 13 ∫ : 13 @@ -49,7 +49,6 @@ N : 12 ½ : 12 ᵑ : 12 Ɗ : 12 -J : 11 < : 11 q : 11 Q : 11 @@ -59,6 +58,7 @@ Z : 11 c : 11 ĉ : 11 _ : 11 +J : 10 Ţ : 10 ᵃ : 10 r : 10 @@ -76,6 +76,7 @@ E : 9 C : 9 ∆ : 9 P : 8 +ᶜ : 8 ᵗ : 8 ũ : 8 × : 8 @@ -90,7 +91,6 @@ P : 8 ≈ : 8 ∙ : 8 Ĩ : 8 -ᶜ : 7 f : 7 ů : 7 Ä : 7 @@ -135,6 +135,7 @@ h : 5 √ : 5 5 : 5 Þ : 5 +0 : 5 B : 5 b : 5 A : 5 @@ -154,7 +155,6 @@ M : 4 & : 4 ˣ : 4 ň : 4 -0 : 4 ᵋ : 4 ĝ : 3 Ṃ : 3 @@ -162,7 +162,6 @@ M : 4 Y : 3 T : 3 7 : 3 -Ḟ : 3 X : 3 ƶ : 3 ≠ : 3 @@ -173,10 +172,12 @@ v : 3 g : 2 ɱ : 2 ^ : 2 +Ḟ : 2 K : 2 þ : 2 6 : 2 m : 2 +Š : 2 ' : 2 ¥ : 2 Ĝ : 1 diff --git a/analysis/freq_2gram.txt b/analysis/freq_2gram.txt index da7d3e2..6f37461 100644 --- a/analysis/freq_2gram.txt +++ b/analysis/freq_2gram.txt @@ -5,10 +5,10 @@ ᵑ{ : 7 ᶠ{ : 7 {$ : 6 -Jᵐ : 5 {: : 5 aṀ : 5 :ᵒ : 5 +Jᵐ : 4 *→ : 4 -¬ : 4 £E : 4 @@ -111,7 +111,6 @@ qᵗ : 2 ;ᶜ : 2 ᶜt : 2 :Ĭ : 2 -ÐŤ : 2 ∑≡ : 2 R~ : 2 ĉ~ : 2 @@ -120,6 +119,7 @@ aj : 2 ᵐ∙ : 2 Ṁ← : 2 ᵐ∏ : 2 +}∑ : 2 :E : 2 E∑ : 2 o; : 2 @@ -153,7 +153,6 @@ qŤ : 2 ;$ : 2 N, : 2 ½$ : 2 -ĭÐ : 2 oĉ : 2 oĭ : 2 ĉ# : 2 @@ -166,6 +165,7 @@ $đ : 2 _= : 2 Ṁ→ : 2 -ň : 2 +0* : 2 x= : 2 $ᶻ : 2 ᶻL : 2 @@ -180,7 +180,6 @@ $y : 2 {Ť : 2 4* : 2 2÷ : 2 -S∑ : 2 :u : 2 £d : 2 į→ : 2 @@ -195,7 +194,6 @@ ut : 2 ,Ť : 2 Ťx : 2 Ṗ↕ : 2 -{J : 2 :# : 2 ĭ? : 2 {* : 2 @@ -203,6 +201,7 @@ ut : 2 {x : 2 ŋ+ : 2 {ᵈ : 2 +2Š : 2 }- : 2 $B : 2 →ᵉ : 2 @@ -345,6 +344,7 @@ tᶻ : 1 Ɗ: : 1 Ĭ; : 1 ;Ð : 1 +ÐŤ : 1 Ť∑ : 1 Fƒ : 1 ƒ# : 1 @@ -377,7 +377,6 @@ x∙ : 1 $~ : 1 ~¦ : 1 ¦} : 1 -}∑ : 1 F: : 1 rG : 1 3D : 1 @@ -530,6 +529,7 @@ _∑ : 1 *Ɗ : 1 Ɗa : 1 jĭ : 1 +ĭÐ : 1 Ðɗ : 1 ɗ$ : 1 Ţ≡ : 1 @@ -601,7 +601,6 @@ $Ð : 1 ň‼ : 1 ‼į : 1 į= : 1 -0* : 1 *2 : 1 R+ : 1 +ŋ : 1 @@ -665,6 +664,7 @@ $2 : 1 ÷3 : 1 3Ĉ : 1 Ĉ- : 1 +S∑ : 1 ∑a : 1 a: : 1 Ë→ : 1 @@ -732,6 +732,7 @@ $R : 1 ~ᵃ : 1 ƃ= : 1 ĉJ : 1 +{J : 1 JS : 1 =} : 1 }ş : 1 @@ -787,6 +788,8 @@ f¡ : 1 ≡¿ : 1 ¿} : 1 ↕ᵃ : 1 +{2 : 1 +Šᵐ : 1 ᵐɗ : 1 ɗ" : 1 "∩ : 1 @@ -909,8 +912,11 @@ z$ : 1 ç3 : 1 ᵑç : 1 ça : 1 -aḞ : 1 -ḞS : 1 +aᵐ : 1 +ᵐᶜ : 1 +ᶜ{ : 1 +{0 : 1 +*} : 1 ∑ƶ : 1 {ᵃ : 1 Ƃv : 1 @@ -1228,8 +1234,8 @@ D∑ : 1 ∑A : 1 Aa : 1 ĕ< : 1 -<ĭ : 1 -Ťʳ : 1 +<2 : 1 +Šʳ : 1 ʳX : 1 XH : 1 H" : 1 diff --git a/analysis/freq_3gram.txt b/analysis/freq_3gram.txt index b7bc230..6760007 100644 --- a/analysis/freq_3gram.txt +++ b/analysis/freq_3gram.txt @@ -685,9 +685,10 @@ f¡C : 1 ≡¿} : 1 ¿}Ø : 1 ↕ᵃ{ : 1 -ᵃ{J : 1 -{Jᵐ : 1 -Jᵐɗ : 1 +ᵃ{2 : 1 +{2Š : 1 +2Šᵐ : 1 +Šᵐɗ : 1 ᵐɗ" : 1 ɗ"∩ : 1 "∩< : 1 @@ -838,10 +839,14 @@ z$L : 1 ç3~ : 1 ~ᵑç : 1 ᵑça : 1 -çaḞ : 1 -aḞS : 1 -ḞS∑ : 1 -S∑ƶ : 1 +çaᵐ : 1 +aᵐᶜ : 1 +ᵐᶜ{ : 1 +ᶜ{0 : 1 +{0* : 1 +0*} : 1 +*}∑ : 1 +}∑ƶ : 1 ᵒ{ᵃ : 1 {ᵃƂ : 1 ᵃƂv : 1 @@ -1219,11 +1224,10 @@ rjŢ : 1 ŋ∑A : 1 ∑Aa : 1 Aaṁ : 1 -ĕ<ĭ : 1 -<ĭÐ : 1 -ĭÐŤ : 1 -ÐŤʳ : 1 -ŤʳX : 1 +ĕ<2 : 1 +<2Š : 1 +2Šʳ : 1 +ŠʳX : 1 ʳXH : 1 XH" : 1 H"c : 1 diff --git a/analysis/freq_4gram.txt b/analysis/freq_4gram.txt index 87a7d95..0395d6f 100644 --- a/analysis/freq_4gram.txt +++ b/analysis/freq_4gram.txt @@ -506,10 +506,11 @@ sf¡C : 1 ĕ≡¿} : 1 ≡¿}Ø : 1 ¿}Ø= : 1 -↕ᵃ{J : 1 -ᵃ{Jᵐ : 1 -{Jᵐɗ : 1 -Jᵐɗ" : 1 +↕ᵃ{2 : 1 +ᵃ{2Š : 1 +{2Šᵐ : 1 +2Šᵐɗ : 1 +Šᵐɗ" : 1 ᵐɗ"∩ : 1 ɗ"∩< : 1 "∩<" : 1 @@ -647,10 +648,14 @@ O↕ᶠz : 1 ç3~ᵑ : 1 3~ᵑç : 1 ~ᵑça : 1 -ᵑçaḞ : 1 -çaḞS : 1 -aḞS∑ : 1 -ḞS∑ƶ : 1 +ᵑçaᵐ : 1 +çaᵐᶜ : 1 +aᵐᶜ{ : 1 +ᵐᶜ{0 : 1 +ᶜ{0* : 1 +{0*} : 1 +0*}∑ : 1 +*}∑ƶ : 1 ᵒ{ᵃƂ : 1 {ᵃƂv : 1 ᵃƂv≈ : 1 @@ -985,11 +990,10 @@ $ÇƆ/ : 1 ɔ$ᵑ∆ : 1 ŋ∑Aa : 1 ∑Aaṁ : 1 -ĕ<ĭÐ : 1 -<ĭÐŤ : 1 -ĭÐŤʳ : 1 -ÐŤʳX : 1 -ŤʳXH : 1 +ĕ<2Š : 1 +<2Šʳ : 1 +2ŠʳX : 1 +ŠʳXH : 1 ʳXH" : 1 XH"c : 1 H"c" : 1 diff --git a/analysis/freq_5gram.txt b/analysis/freq_5gram.txt index 4774cda..f095537 100644 --- a/analysis/freq_5gram.txt +++ b/analysis/freq_5gram.txt @@ -367,10 +367,11 @@ Cᶦ{ᵈs : 1 Ťĕ≡¿} : 1 ĕ≡¿}Ø : 1 ≡¿}Ø= : 1 -↕ᵃ{Jᵐ : 1 -ᵃ{Jᵐɗ : 1 -{Jᵐɗ" : 1 -Jᵐɗ"∩ : 1 +↕ᵃ{2Š : 1 +ᵃ{2Šᵐ : 1 +{2Šᵐɗ : 1 +2Šᵐɗ" : 1 +Šᵐɗ"∩ : 1 ᵐɗ"∩< : 1 ɗ"∩<" : 1 "∩<"< : 1 @@ -488,10 +489,14 @@ O↕ᶠz$ : 1 ᵐç3~ᵑ : 1 ç3~ᵑç : 1 3~ᵑça : 1 -~ᵑçaḞ : 1 -ᵑçaḞS : 1 -çaḞS∑ : 1 -aḞS∑ƶ : 1 +~ᵑçaᵐ : 1 +ᵑçaᵐᶜ : 1 +çaᵐᶜ{ : 1 +aᵐᶜ{0 : 1 +ᵐᶜ{0* : 1 +ᶜ{0*} : 1 +{0*}∑ : 1 +0*}∑ƶ : 1 ᵒ{ᵃƂv : 1 {ᵃƂv≈ : 1 ᵃƂv≈Ä : 1 @@ -772,11 +777,10 @@ $ÇƆ/← : 1 ŗ0ɔ$ᵑ : 1 0ɔ$ᵑ∆ : 1 ŋ∑Aaṁ : 1 -ĕ<ĭÐŤ : 1 -<ĭÐŤʳ : 1 -ĭÐŤʳX : 1 -ÐŤʳXH : 1 -ŤʳXH" : 1 +ĕ<2Šʳ : 1 +<2ŠʳX : 1 +2ŠʳXH : 1 +ŠʳXH" : 1 ʳXH"c : 1 XH"c" : 1 H"c"I : 1 diff --git a/analysis/particles.txt b/analysis/particles.txt index f01149f..75e4e70 100644 --- a/analysis/particles.txt +++ b/analysis/particles.txt @@ -1,13 +1,13 @@ particle : with "{" / total -ᶜ : 0 / 7 ᵈ : 0 / 7 ʳ : 0 / 5 ˣ : 0 / 4 ᶻ : 0 / 11 ᶾ : 0 / 1 ᵉ : 1 / 20 +ᶜ : 1 / 8 +ᵐ : 4 / 32 ᵗ : 1 / 8 -ᵐ : 4 / 31 ᵚ : 1 / 7 ᵃ : 2 / 10 ᵒ : 4 / 18 diff --git a/doc/Builtins.md b/doc/Builtins.md index fc73f15..0cecb1c 100644 --- a/doc/Builtins.md +++ b/doc/Builtins.md @@ -1116,6 +1116,16 @@ The first argument is a list of elements, the second argument is a list of lengt Fails when the two lists are of different lengths. +### `slices` (`Š`, `2 -> 1`) + +Split a list into a list of slices of a given length. + +If the length of the list is not a multiple of the slice length, the last slice is shorter. + +If the first argument is a number, it is converted to a range from 0 to that number minus 1. + +Fails when the given length is not positive. + ### `uninterleave` (`ĭ`, `1 -> 2`) uninterleave a list into a list of elements at even positions and a list of elements at odd positions. diff --git a/doc/CodePage.md b/doc/CodePage.md index b812eb4..3fd9c8e 100644 --- a/doc/CodePage.md +++ b/doc/CodePage.md @@ -17,7 +17,7 @@ The language is still in an early stage, so the code page is incomplete. Unassig |**8_**|`ᵃ`|`ᶜ`|`ᵈ`|`ᵉ`|`ᵋ`|`ᶠ`|`ᶦ`|`ᵏ`|`ˡ`|`ᵐ`|`ᵚ`|`ᵑ`|`ᵒ`|`ᵖ`|`ʳ`|`ᵗ`| |**9_**|`ʷ`|`ˣ`|`ᶻ`|`ᶾ`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`| |**A_**|`Ä`|`Ƃ`|`Ç`|`Ĉ`|`Ď`|`Ð`|`Ɗ`|`Ë`|`Ḟ`|`Ĝ`|`Ģ`|`Ħ`|`Ĩ`|`Ĭ`|`Ļ`|`Ṁ`| -|**B_**|`Ṃ`|`Ň`|`Ö`|`Ø`|`Ɔ`|`Ƥ`|`Ṗ`|`Ř`|`Ş`|`Ţ`|`Ť`|`Ŭ`|`Ž`|`Ƶ`|`Þ`|`�`| +|**B_**|`Ṃ`|`Ň`|`Ö`|`Ø`|`Ɔ`|`Ƥ`|`Ṗ`|`Ř`|`Š`|`Ş`|`Ţ`|`Ť`|`Ŭ`|`Ž`|`Ƶ`|`Þ`| |**C_**|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`|`�`| |**D_**|`ä`|`ƃ`|`ƀ`|`ç`|`ĉ`|`đ`|`ḍ`|`ɗ`|`ĕ`|`ƒ`|`ĝ`|`ï`|`ĭ`|`į`|`ṁ`|`ṃ`| |**E_**|`ɱ`|`ň`|`ŋ`|`ṇ`|`ɔ`|`ƥ`|`ŗ`|`ř`|`ş`|`ŧ`|`ũ`|`ů`|`ž`|`ƶ`|`þ`|`�`| diff --git a/src/Nekomata/Builtin.hs b/src/Nekomata/Builtin.hs index 7520850..5e38321 100644 --- a/src/Nekomata/Builtin.hs +++ b/src/Nekomata/Builtin.hs @@ -1226,6 +1226,16 @@ builtins = \The first argument is a list of elements, \ \the second argument is a list of lengths.\n\ \Fails when the two lists are of different lengths." + , Builtin + "slices" + 'Š' + slices + "Split a list into a list of slices of a given length.\n\ + \If the length of the list is not a multiple of the slice length, \ + \the last slice is shorter.\n\ + \If the first argument is a number, \ + \it is converted to a range from 0 to that number minus 1.\n\ + \Fails when the given length is not positive." , Builtin "uninterleave" 'ĭ' diff --git a/src/Nekomata/Builtin/List.hs b/src/Nekomata/Builtin/List.hs index 9e3eece..e13da13 100644 --- a/src/Nekomata/Builtin/List.hs +++ b/src/Nekomata/Builtin/List.hs @@ -656,6 +656,26 @@ unrle = binary unrle' unrle_ i xs ys = zipWithFail replicate'' (leftId i) xs ys >>= concat_ +slices :: Function +slices = binaryVecArg2 slices' + where + slices' _ (DNumT x) (DNumT y) = + liftNum (\x' -> liftInt (flip slices_ . fromList $ range0_ x') y) x + slices' _ (DListT xs) (DNumT y) = + liftList (\x -> liftInt (`slices_` x) y) xs + slices' _ _ _ = Fail + slices_ :: Integer -> ListTry a -> TryList (TryList a) + slices_ n _ | n <= 0 = Fail + slices_ n xs = + splitAt' n xs <&> \case + (Nil, _) -> Nil + (ys, Nil) -> singleton $ Val ys + (ys, zs) -> Cons (Val ys) (slices_ n zs) + splitAt' :: Integer -> ListTry a -> Try (ListTry a, ListTry a) + splitAt' 0 xs = Val (Nil, xs) + splitAt' n (Cons x xs) = xs >>= splitAt' (n - 1) <&> first (Cons x . Val) + splitAt' _ Nil = Val (Nil, Nil) + uninterleave :: Function uninterleave = unary2 uninterleave' where diff --git a/src/Nekomata/CodePage.hs b/src/Nekomata/CodePage.hs index 4f93722..4fd673b 100644 --- a/src/Nekomata/CodePage.hs +++ b/src/Nekomata/CodePage.hs @@ -20,7 +20,7 @@ codePage = ++ "ᵃᶜᵈᵉᵋᶠᶦᵏˡᵐᵚᵑᵒᵖʳᵗ" ++ "ʷˣᶻᶾ������������" ++ "ÄƂÇĈĎÐƊËḞĜĢĦĨĬĻṀ" - ++ "ṂŇÖØƆƤṖŘŞŢŤŬŽƵÞ�" + ++ "ṂŇÖØƆƤṖŘŠŞŢŤŬŽƵÞ" ++ "����������������" ++ "äƃƀçĉđḍɗĕƒĝïĭįṁṃ" ++ "ɱňŋṇɔƥŗřşŧũůžƶþ�" diff --git a/test/Eval.hs b/test/Eval.hs index 898675a..15c2794 100644 --- a/test/Eval.hs +++ b/test/Eval.hs @@ -2331,7 +2331,7 @@ testEval = describe "Evaluation" $ do ] describe "q257631: Time to shortest permutation" $ do specEval - "↕ᵃ{Jᵐɗ\"∩<\"<60b}-_Paṁ" + "↕ᵃ{2Šᵐɗ\"∩<\"<60b}-_Paṁ" [ ("[1,1,4,3]", all_ ["91"]) , ("[0,1,0,1]", all_ ["9"]) , ("[1,7,3,8]", all_ ["59"]) @@ -2559,7 +2559,7 @@ testEval = describe "Evaluation" $ do ] describe "q259576: all_ of the Boards" $ do specEval - "į3ƂÐ3~ᵑᵐç3~ᵑçaḞS∑ƶ" + "į3ƂÐ3~ᵑᵐç3~ᵑçaᵐᶜ{0*}∑ƶ" [("", Count 215)] describe "q259633: Make a Custom Bayer Matrix" $ do specEval @@ -3235,7 +3235,7 @@ testEval = describe "Evaluation" $ do ] describe "q266561: aaabbabbc" $ do specEval - "ĕ<ĭÐŤʳXH\"c\"I" + "ĕ<2ŠʳXH\"c\"I" [ ("\"cbbbaab\"", all_ ["aa"]) , ("\"bbbaabc\"", all_ ["aa"]) , ("\"baaacbb\"", all_ ["ab"])