rasel 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/rasel.rb +8 -8
- data/rasel.gemspec +1 -1
- data/test.rb +22 -16
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 587ff1f458d557603238203069109e7515486684
|
4
|
+
data.tar.gz: 847fabdaaf7016f1b8992004ab1fc7b965e4addb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6594fb5176f5cf7e21d06bbc5cc1f376ad97917d1ff6a844ba850a5930350c893886176a1c5df904cbf6f212864ce77a138249a62ad934e66937affc48ef0633
|
7
|
+
data.tar.gz: 566dbc8e76fe9afa54a181051981a5f67f8009c75e67eb255f42caaf8086b10d43968ea54123173604b785717873e2473514970bc91fe780c3c4281404ceae5e
|
data/lib/rasel.rb
CHANGED
@@ -5,7 +5,7 @@ def RASEL source, stdout = StringIO.new, stdin = STDIN
|
|
5
5
|
lines = source.tap{ |_| fail "empty source" if _.empty? }.gsub(/ +$/,"").split(?\n)
|
6
6
|
code = lines.map{ |_| _.ljust(lines.map(&:size).max).bytes }
|
7
7
|
stack = []
|
8
|
-
pop = ->{ stack.pop ||
|
8
|
+
pop = ->{ stack.pop || 0 }
|
9
9
|
dx, dy = 1, 0
|
10
10
|
x, y = -1, 0
|
11
11
|
|
@@ -49,24 +49,24 @@ def RASEL source, stdout = StringIO.new, stdin = STDIN
|
|
49
49
|
case char
|
50
50
|
when ?\s
|
51
51
|
|
52
|
-
when ?0..?9, ?A..?Z ; stack.push char.to_i
|
52
|
+
when ?0..?9, ?A..?Z ; stack.push char.to_i 36
|
53
53
|
when ?" ; stringmode ^= true
|
54
54
|
when ?# ; move[]
|
55
55
|
when ?$ ; pop[]
|
56
56
|
when ?: ; stack.concat [pop[]] * 2
|
57
57
|
when ?- ; stack.push -(pop[] - pop[])
|
58
|
-
when
|
59
|
-
when
|
60
|
-
when ?% ; b, a = pop[], pop[]; stack.push (b.zero? ? 0 : a % b)
|
58
|
+
when ?/ ; b, a = pop[], pop[]; stack.push (b.zero? ? 0 : Rational(a) / b)
|
59
|
+
when ?% ; b, a = pop[], pop[]; stack.push (b.zero? ? 0 : Rational(a) % b)
|
61
60
|
when ?v ; dx, dy = 0, 1
|
62
61
|
when ?> ; dx, dy = 1, 0
|
63
62
|
when ?^ ; dx, dy = 0, -1
|
64
63
|
when ?< ; dx, dy = -1, 0
|
65
64
|
when ?? ; move[] if pop[] > 0
|
66
|
-
when
|
65
|
+
when ?\\
|
67
66
|
t = pop[]
|
68
|
-
error[] if
|
69
|
-
stack.
|
67
|
+
error[] if 1 != t.denominator
|
68
|
+
stack.unshift 0 until stack.size > t
|
69
|
+
stack[-t-1], stack[-1] = stack[-1], stack[-t-1] unless 0 > t
|
70
70
|
when ?. ; stdout.print "#{_ = pop[]; 1 != _.denominator ? _.to_f : _.to_i} "
|
71
71
|
when ?, ; stdout.print "#{_ = pop[]; 1 != _.denominator ? error[] : _ < 0 || _ > 255 ? error[] : _.to_i.chr}"
|
72
72
|
when ?~ ; if _ = stdin.getbyte then stack.push _; move[] end
|
data/rasel.gemspec
CHANGED
data/test.rb
CHANGED
@@ -6,27 +6,33 @@ require_relative "lib/rasel"
|
|
6
6
|
|
7
7
|
# TODO: assert that all RASEL() return with 0 exit code unless the opposite is expected
|
8
8
|
|
9
|
-
describe "
|
10
|
-
around{ |test| Timeout.timeout(1){ test.call } }
|
11
|
-
def assert_stack expectation, *args
|
12
|
-
result = RASEL *args
|
13
|
-
assert_equal expectation.map(&:to_r), [*result.stack, result.exitcode]
|
14
|
-
end
|
15
|
-
|
9
|
+
describe "bin" do
|
10
|
+
around{ |test| Timeout.timeout(RUBY_PLATFORM == "java" ? 4 : 1){ test.call } }
|
16
11
|
describe "executable" do
|
17
12
|
require "open3"
|
18
13
|
[
|
14
|
+
["cat.rasel < examples/cat.rasel", 0, File.read("examples/cat.rasel")],
|
19
15
|
["helloworld.rasel", 0, "Hello, World!\n"],
|
20
16
|
["naive_if_zero.rasel", 0, "false\nfalse\ntrue\nfalse\nfalse\n"],
|
21
17
|
["short_if_zero.rasel", 0, "false\nfalse\ntrue\nfalse\nfalse\n"],
|
22
|
-
["
|
23
|
-
|
18
|
+
["factorial.rasel", 0, "120 ", "echo 5 | "],
|
19
|
+
["fibonacci.rasel", 5, "3 ", "echo 5 | "],
|
20
|
+
["project_euler/1.rasel", 0, "233168 ", "echo 1000 | "],
|
21
|
+
].each do |cmd, expected_status, expected_stdout, prefix|
|
24
22
|
it cmd do
|
25
|
-
string, status = Open3.capture2e "./bin/rasel examples/#{cmd}"
|
23
|
+
string, status = Open3.capture2e "#{prefix}./bin/rasel examples/#{cmd}"
|
26
24
|
assert_equal [expected_status, expected_stdout], [status.exitstatus, string]
|
27
25
|
end
|
28
26
|
end
|
29
27
|
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "lib" do
|
31
|
+
around{ |test| Timeout.timeout(1){ test.call } }
|
32
|
+
def assert_stack expectation, *args
|
33
|
+
result = RASEL *args
|
34
|
+
assert_equal expectation, [*result.stack, result.exitcode]
|
35
|
+
end
|
30
36
|
|
31
37
|
describe "non-instructional" do
|
32
38
|
it "trim spaces and empty lines" do
|
@@ -84,7 +90,6 @@ describe "tests" do
|
|
84
90
|
it "0..9, A..Z" do assert_stack [*0..35], "#{[*0..9].join}#{[*?A..?Z].join}@" end
|
85
91
|
it "$" do assert_stack [1], "$12$@" end
|
86
92
|
it ":" do assert_stack [0, 0, 1, 1], ":1:@" end
|
87
|
-
it ?\\ do assert_stack [0, 1, 0], "\\1\\@" end
|
88
93
|
it "><^v" do
|
89
94
|
assert_stack [1, 2, 3, 4],
|
90
95
|
<<~HEREDOC
|
@@ -141,6 +146,12 @@ describe "tests" do
|
|
141
146
|
assert_stack expectation, "^@1?#{code.reverse}".chars.zip.transpose.join(?\n)
|
142
147
|
end
|
143
148
|
end
|
149
|
+
it "\\" do assert_stack [2, 0, 4, 0], "4321001-02-\\\\\\\\\\@" end
|
150
|
+
it "exit status code 255 on non-integer \\ index" do
|
151
|
+
assert_equal 0, RASEL("01/\\@").exitcode
|
152
|
+
assert_equal 255, RASEL("12/\\@").exitcode
|
153
|
+
assert_equal 255, RASEL("12/-\\@").exitcode
|
154
|
+
end
|
144
155
|
end
|
145
156
|
|
146
157
|
describe "new" do
|
@@ -151,11 +162,6 @@ describe "tests" do
|
|
151
162
|
it "exit status code 255 on non-integer jump" do
|
152
163
|
assert_equal 255, RASEL("12/j@").exitcode
|
153
164
|
end
|
154
|
-
it "a:." do assert_equal "2 0 0 ", RASEL("21a:.a:.a:.@").stdout.string end
|
155
|
-
it "exit status code 255 on negative 'take at' argument" do
|
156
|
-
assert_equal 255, RASEL("1-a@").exitcode
|
157
|
-
assert_equal 255, RASEL("12/a@").exitcode
|
158
|
-
end
|
159
165
|
end
|
160
166
|
|
161
167
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rasel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Victor Maslov aka Nakilon
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest-around
|