spitewaste 0.1.012 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 67ded3120c199b08555950070ea3339978a7a23537b902477c69a87d2fe83469
4
- data.tar.gz: 6c49ae6ecb268e39894127bdcf5a0c0ba252b5d218b7c3d582b54461f06e48ca
3
+ metadata.gz: 8cd3201a4c8647de4fb29c8529c45fb379c2633cd660a4155e28720931202f94
4
+ data.tar.gz: 3ba703110341a406d476aa8afa8d89c8a57b9d6e136f319956f28f7d311b16e7
5
5
  SHA512:
6
- metadata.gz: a2900fb2ebb4f6cfbb6503615ceb0b8b65ab729cb10354b626397a348867430256bf6d6f60afe9805fec7893a3e327e62144e1f3edba83af12ea7eaabbeb52ce
7
- data.tar.gz: f0b3c878bc133874a16255b94076eb9e7ff8f7fb1d438b368fadf53df9f2fff94c466ed90c94011da1008c5a7249370e3bb995903f2b9135bdb968f7505b8cc7
6
+ metadata.gz: d103c80be7025cca6d784127444702460394e4d0f137f124581212b6d92523b80c7e95e15642f9c0036b26545e821dcee206686818d0728dbe57c7b57a388ef0
7
+ data.tar.gz: 39f473d86a4df1a125a6edae3ff1e29c5a069da2aa72862834097b7151bd11c4fdfe93f8119b60c7009468e4f5c2a05ef60a92d99a9b9198485f79c42411f33d
@@ -72,6 +72,23 @@ aryshift: dup :dig $-- ret
72
72
  ; [7 2 8 2 0] => [7 0 2 8 3]
73
73
  aryunshift: swap dup times (dup $++ :roll swap) $++ ret
74
74
 
75
+ ; inserts the element E into array A at index I, increasing its length by 1
76
+ ; [A I E] => [A']
77
+ ;
78
+ ; [9 5 2 3 1 4] => [9 4 5 2 4]
79
+ ; [1 1 0 7] => [7 1 2]
80
+ ; [3 1 1 7] => [3 7 2]
81
+ ; [7 5 2 1 6] => [7 6 5 3]
82
+ aryinsert: swap copy 2 swap sub $++ :bury $++ ret
83
+
84
+ ; removes the element at index I in array A, decreasing its length by 1
85
+ ; [A I] => [A']
86
+ ;
87
+ ; [6 0 9 3 1] => [6 9 2]
88
+ ; [7 5 3 1 4 0] => [5 3 1 3]
89
+ ; [1 3 5 7 4 3] => [1 3 5 3]
90
+ aryremove: copy 1 swap sub :roll pop $-- ret
91
+
75
92
  ; returns the concatenation of arrays A and B
76
93
  ; [A B] => [A+B]
77
94
  ;
@@ -121,6 +138,22 @@ aryat:
121
138
  _aryat_neg: copy 1 add dup jn _aryat_oob jump aryat
122
139
  _aryat_oob: push "(aryat) index out of bounds!" :die!
123
140
 
141
+ ; swaps the elements at indices I and J in array A
142
+ ; [A I J] => [A']
143
+ ;
144
+ ; [6 0 8 7 4 1 3] => [6 7 8 0 4]
145
+ ; [4 3 2 1 4 0 2] => [2 3 4 1 4]
146
+ ; [3 2 1 3 1 1] => [3 2 1 3]
147
+ aryswap: copy 1 copy 1 sub jz _aryswap_noop
148
+ ^-7 ^-6
149
+ :arydup @-6 :aryat ^-8
150
+ :arydup @-7 :aryat ^-9
151
+ @-6 :aryremove
152
+ @-7 $-- :aryremove
153
+ @-6 @-9 :aryinsert
154
+ @-7 @-8 :aryinsert ret
155
+ _aryswap_noop: pop pop ret
156
+
124
157
  ; returns the minimum and maximum elements of array A
125
158
  ; [A] => [min max]
126
159
  ;
@@ -71,4 +71,8 @@ _blength_zero: ret
71
71
  ;
72
72
  ; [0] => [0] [1] => [1]
73
73
  ; [7] => [3] [8] => [1]
74
- popcount: push 2 :digits reduce (add) ret
74
+ popcount: push 0
75
+ _popcount_loop:
76
+ copy 1 push 2 mod add swap push 2 div
77
+ dup jz _popcount_done swap jump _popcount_loop
78
+ _popcount_done: pop ret
@@ -227,6 +227,71 @@
227
227
  ]
228
228
  ]
229
229
  },
230
+ "aryinsert": {
231
+ "full": "inserts the element E into array A at index I, increasing its length by 1\n[A I E] => [A']\n\n[9 5 2 3 1 4] => [9 4 5 2 4]\n[1 1 0 7] => [7 1 2]\n[3 1 1 7] => [3 7 2]\n[7 5 2 1 6] => [7 6 5 3]\n",
232
+ "desc": "inserts the element E into array A at index I, increasing its length by 1",
233
+ "effect": "[A I E] => [A']",
234
+ "cases": [
235
+ [
236
+ [
237
+ 9,
238
+ 5,
239
+ 2,
240
+ 3,
241
+ 1,
242
+ 4
243
+ ],
244
+ [
245
+ 9,
246
+ 4,
247
+ 5,
248
+ 2,
249
+ 4
250
+ ]
251
+ ],
252
+ [
253
+ [
254
+ 1,
255
+ 1,
256
+ 0,
257
+ 7
258
+ ],
259
+ [
260
+ 7,
261
+ 1,
262
+ 2
263
+ ]
264
+ ],
265
+ [
266
+ [
267
+ 3,
268
+ 1,
269
+ 1,
270
+ 7
271
+ ],
272
+ [
273
+ 3,
274
+ 7,
275
+ 2
276
+ ]
277
+ ],
278
+ [
279
+ [
280
+ 7,
281
+ 5,
282
+ 2,
283
+ 1,
284
+ 6
285
+ ],
286
+ [
287
+ 7,
288
+ 6,
289
+ 5,
290
+ 3
291
+ ]
292
+ ]
293
+ ]
294
+ },
230
295
  "arypop": {
231
296
  "full": "removes the element at the end of the array A, decreasing its length by 1\n[A] => [A']\n\n[10 1] => [0]\n[1 2 3 4 4] => [1 2 3 3]\n[7 10 20 30 3] => [7 10 20 2]\n",
232
297
  "desc": "removes the element at the end of the array A, decreasing its length by 1",
@@ -338,6 +403,59 @@
338
403
  ]
339
404
  ]
340
405
  },
406
+ "aryremove": {
407
+ "full": "removes the element at index I in array A, decreasing its length by 1\n[A I] => [A']\n\n[6 0 9 3 1] => [6 9 2]\n[7 5 3 1 4 0] => [5 3 1 3]\n[1 3 5 7 4 3] => [1 3 5 3]\n",
408
+ "desc": "removes the element at index I in array A, decreasing its length by 1",
409
+ "effect": "[A I] => [A']",
410
+ "cases": [
411
+ [
412
+ [
413
+ 6,
414
+ 0,
415
+ 9,
416
+ 3,
417
+ 1
418
+ ],
419
+ [
420
+ 6,
421
+ 9,
422
+ 2
423
+ ]
424
+ ],
425
+ [
426
+ [
427
+ 7,
428
+ 5,
429
+ 3,
430
+ 1,
431
+ 4,
432
+ 0
433
+ ],
434
+ [
435
+ 5,
436
+ 3,
437
+ 1,
438
+ 3
439
+ ]
440
+ ],
441
+ [
442
+ [
443
+ 1,
444
+ 3,
445
+ 5,
446
+ 7,
447
+ 4,
448
+ 3
449
+ ],
450
+ [
451
+ 1,
452
+ 3,
453
+ 5,
454
+ 3
455
+ ]
456
+ ]
457
+ ]
458
+ },
341
459
  "aryrep": {
342
460
  "full": "returns the array A replicated N times\n[A N] => [A']\n\n[3 2 1 3 4] => [3 2 1 3 2 1 3 2 1 3 2 1 12]\n",
343
461
  "desc": "returns the array A replicated N times",
@@ -505,6 +623,65 @@
505
623
  ]
506
624
  ]
507
625
  },
626
+ "aryswap": {
627
+ "full": "swaps the elements at indices I and J in array A\n[A I J] => [A']\n\n[6 0 8 7 4 1 3] => [6 7 8 0 4]\n[4 3 2 1 4 0 2] => [2 3 4 1 4]\n[3 2 1 3 1 1] => [3 2 1 3]\n",
628
+ "desc": "swaps the elements at indices I and J in array A",
629
+ "effect": "[A I J] => [A']",
630
+ "cases": [
631
+ [
632
+ [
633
+ 6,
634
+ 0,
635
+ 8,
636
+ 7,
637
+ 4,
638
+ 1,
639
+ 3
640
+ ],
641
+ [
642
+ 6,
643
+ 7,
644
+ 8,
645
+ 0,
646
+ 4
647
+ ]
648
+ ],
649
+ [
650
+ [
651
+ 4,
652
+ 3,
653
+ 2,
654
+ 1,
655
+ 4,
656
+ 0,
657
+ 2
658
+ ],
659
+ [
660
+ 2,
661
+ 3,
662
+ 4,
663
+ 1,
664
+ 4
665
+ ]
666
+ ],
667
+ [
668
+ [
669
+ 3,
670
+ 2,
671
+ 1,
672
+ 3,
673
+ 1,
674
+ 1
675
+ ],
676
+ [
677
+ 3,
678
+ 2,
679
+ 1,
680
+ 3
681
+ ]
682
+ ]
683
+ ]
684
+ },
508
685
  "aryunshift": {
509
686
  "full": "places the element E at the beginning of the array A, increasing its length by 1\n[A E] => [A']\n\n[3 2 1 3 7] => [7 3 2 1 4]\n[4 2 0 3 9] => [9 4 2 0 4]\n[11 2 2 10] => [10 11 2 3]\n[7 2 8 2 0] => [7 0 2 8 3]\n",
510
687
  "desc": "places the element E at the beginning of the array A, increasing its length by 1",
@@ -1907,8 +2084,8 @@
1907
2084
  ]
1908
2085
  },
1909
2086
  "pow": {
1910
- "full": "returns B raised to the power E\n[B E] => [B**E]\n\n[0 0] => [1], [0 9] => [0], [9 0] => [1]\n[3 2] => [9], [2 3] => [8], [7 4] => [2401]\n[-2 3] => [-8] [-5 0] => [1] [-4 4] => [256]\n",
1911
- "desc": "returns B raised to the power E",
2087
+ "full": "returns B raised to the power E; if E must be negative, use ratpow instead\n[B E] => [B**E]\n\n[0 0] => [1], [0 9] => [0], [9 0] => [1]\n[3 2] => [9], [2 3] => [8], [7 4] => [2401]\n[-2 3] => [-8] [-5 0] => [1] [-4 4] => [256]\n",
2088
+ "desc": "returns B raised to the power E; if E must be negative, use ratpow instead",
1912
2089
  "effect": "[B E] => [B**E]",
1913
2090
  "cases": [
1914
2091
  [
@@ -2650,7 +2827,7 @@
2650
2827
  ]
2651
2828
  },
2652
2829
  "ratpow": {
2653
- "full": "returns the rational R raised to the power E\n[R E] => [R']\n\n[R(4,2) 5] => [R(32,1)]\n[R(-3,7) 0] => [R(1,1)]\n[R(-3,14) 2] => [R(9,196)]\n",
2830
+ "full": "returns the rational R raised to the power E\n[R E] => [R']\n\n[R(4,2) 5] => [R(32,1)]\n[R(-3,7) 0] => [R(1,1)]\n[R(-3,14) 2] => [R(9,196)]\n[R(5,1) -1] => [R(1,5)]\n[R(2,5) -2] => [R(25,4)]\n[R(-3,14) -3] => [R(-2744,27)]\n",
2654
2831
  "desc": "returns the rational R raised to the power E",
2655
2832
  "effect": "[R E] => [R']",
2656
2833
  "cases": [
@@ -2680,6 +2857,33 @@
2680
2857
  [
2681
2858
  38654706057
2682
2859
  ]
2860
+ ],
2861
+ [
2862
+ [
2863
+ 21474836483,
2864
+ -1
2865
+ ],
2866
+ [
2867
+ 4294967307
2868
+ ]
2869
+ ],
2870
+ [
2871
+ [
2872
+ 8589934603,
2873
+ -2
2874
+ ],
2875
+ [
2876
+ 107374182409
2877
+ ]
2878
+ ],
2879
+ [
2880
+ [
2881
+ 12884901916,
2882
+ -3
2883
+ ],
2884
+ [
2885
+ 11785390260278
2886
+ ]
2683
2887
  ]
2684
2888
  ]
2685
2889
  },
@@ -1,8 +1,7 @@
1
1
  import array ; arycat, arydup
2
2
  import util ; eq, inc, range
3
3
 
4
- ; returns B raised to the power E
5
- ; ! TODO: support negative exponents (return Rational)
4
+ ; returns B raised to the power E; if E must be negative, use ratpow instead
6
5
  ; [B E] => [B**E]
7
6
  ;
8
7
  ; [0 0] => [1], [0 9] => [0], [9 0] => [1]
@@ -169,11 +169,15 @@ ratinv:
169
169
  ; [R(4,2) 5] => [R(32,1)]
170
170
  ; [R(-3,7) 0] => [R(1,1)]
171
171
  ; [R(-3,14) 2] => [R(9,196)]
172
- ratpow:
172
+ ; [R(5,1) -1] => [R(1,5)]
173
+ ; [R(2,5) -2] => [R(25,4)]
174
+ ; [R(-3,14) -3] => [R(-2744,27)]
175
+ ratpow: dup jn _ratpow_neg
173
176
  swap push 2 :divmod push 2 mul $--
174
177
  swap $RAT :divmod copy 2 mul
175
178
  copy 3 :pow swap copy 3 :pow
176
179
  swap :to_r :ratsimp slide 2 ret
180
+ _ratpow_neg: push -1 mul swap :ratinv swap :ratpow ret
177
181
 
178
182
  ; converts the rational number R to a "pseudo-float" with a whole (W) part
179
183
  ; and a fractional (F) part composed of P digits after the decimal point
@@ -117,6 +117,10 @@ module Spitewaste
117
117
  @src.gsub!(/'(.)'/) { $1.ord }
118
118
  # quick push (`push 1,2,3` desugars to individual pushes)
119
119
  @src.gsub!(/push \S+/) { |m| m.split(?,) * ' push ' }
120
+ # quick store (`^2` = `push 2 swap store`)
121
+ @src.gsub!(/\^(-?\d+)/, 'push \1 swap store')
122
+ # quick load (`@2` = `push 2 load`)
123
+ @src.gsub!(/@(-?\d+)/, 'push \1 load')
120
124
  end
121
125
 
122
126
  def gensym
@@ -1,3 +1,3 @@
1
1
  module Spitewaste
2
- VERSION = '0.1.012'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spitewaste
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.012
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Collided Scope (collidedscope)
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-01-01 00:00:00.000000000 Z
11
+ date: 2021-01-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake