ookie 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -15,8 +15,8 @@ Jeweler::Tasks.new do |gem|
15
15
  # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
16
16
  gem.name = "ookie"
17
17
  gem.version = Ookie::Version::STRING
18
- gem.summary = %Q{Ookie is a simple Ook! interpreter}
19
- gem.description = %Q{Ookie is a simple Ook! interpreter you can use to either directly execute your Ook! source code (via shebang) or embed it in your own Ruby programs}
18
+ gem.summary = %Q{Ookie is a simple Ook! and Brainfuck interpreter}
19
+ gem.description = %Q{Ookie is a simple Ook! and Brainfuck interpreter you can use to either directly execute your Ook! or BF source code (via shebang) or embed it in your own Ruby programs}
20
20
  gem.email = "alex@flawedcode.org"
21
21
  gem.homepage = "http://github.com/unleashed/ookie"
22
22
  gem.authors = ["Alejandro Martinez Ruiz"]
@@ -1,222 +1,223 @@
1
- ===================================================================
2
- ======================== OUTPUT STRING ============================
3
- ===================================================================
4
- >++++++++[<++++++++>-]<++++++++++++++++.[-]
5
- >++++++++++[<++++++++++>-]<++++++++++++++.[-]
6
- >++++++++++[<++++++++++>-]<+++++.[-]
7
- >++++++++++[<++++++++++>-]<+++++++++.[-]
8
- >++++++++++[<++++++++++>-]<+.[-]
9
- >++++++++++[<++++++++++>-]<+++++++++++++++.[-]
10
- >+++++[<+++++>-]<+++++++.[-]
11
- >++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
12
- >++++++++++[<++++++++++>-]<++++++++++++.[-]
13
- >+++++[<+++++>-]<+++++++.[-]
14
- >++++++++++[<++++++++++>-]<++++++++++++++++.[-]
15
- >++++++++++[<++++++++++>-]<+++++++++++.[-]
16
- >+++++++[<+++++++>-]<+++++++++.[-]
17
- >+++++[<+++++>-]<+++++++.[-]
18
-
19
- ===================================================================
20
- ======================== INPUT NUMBER ============================
21
- ===================================================================
22
- + cont=1
23
- [
24
- - cont=0
25
- >,
26
- ======SUB10======
27
- ----------
28
-
29
- [ not 10
30
- <+> cont=1
31
- =====SUB38======
32
- ----------
33
- ----------
34
- ----------
35
- --------
36
-
37
- >
38
- =====MUL10=======
39
- [>+>+<<-]>>[<<+>>-]< dup
40
-
41
- >>>+++++++++
42
- [
43
- <<<
44
- [>+>+<<-]>>[<<+>>-]< dup
45
- [<<+>>-]
46
- >>-
47
- ]
48
- <<<[-]<
49
- ======RMOVE1======
50
- <
51
- [>+<-]
52
- ]
53
- <
54
- ]
55
- >>[<<+>>-]<<
56
-
57
- ===================================================================
58
- ======================= PROCESS NUMBER ===========================
59
- ===================================================================
60
-
61
- ==== ==== ==== ====
62
- numd numu teid teiu
63
- ==== ==== ==== ====
64
-
65
- >+<-
66
- [
67
- >+
68
- ======DUP======
69
- [>+>+<<-]>>[<<+>>-]<
70
-
71
- >+<--
72
-
73
- >>>>>>>>+<<<<<<<< isprime=1
74
-
75
- [
76
- >+
77
-
78
- <-
79
-
80
- =====DUP3=====
81
- <[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
82
-
83
- =====DUP2=====
84
- >[>>+>+<<<-]>>>[<<<+>>>-]<<< <
85
-
86
-
87
- >>>
88
-
89
-
90
- ====DIVIDES=======
91
- [>+>+<<-]>>[<<+>>-]< DUP i=div
92
-
93
- <<
94
- [
95
- >>>>>+ bool=1
96
- <<<
97
- [>+>+<<-]>>[<<+>>-]< DUP
98
- [>>[-]<<-] IF i THEN bool=0
99
- >>
100
- [ IF i=0
101
- <<<<
102
- [>+>+<<-]>>[<<+>>-]< i=div
103
- >>>
104
- - bool=0
105
- ]
106
- <<<
107
- - DEC i
108
- <<
109
- -
110
- ]
111
-
112
- +>>[<<[-]>>-]<<
113
- >[-]< CLR div
114
- =====END DIVIDES====
115
-
116
-
117
- [>>>>>>[-]<<<<<<-] if divides then isprime=0
118
-
119
-
120
- <<
121
-
122
- >>[-]>[-]<<<
123
- ]
124
-
125
- >>>>>>>>
126
- [
127
- -
128
- <<<<<<<[-]<<
129
-
130
- [>>+>+<<<-]>>>[<<<+>>>-]<<<
131
-
132
- >>
133
-
134
-
135
-
136
-
137
- ===================================================================
138
- ======================== OUTPUT NUMBER ===========================
139
- ===================================================================
140
- [>+<-]>
141
-
142
- [
143
- ======DUP======
144
- [>+>+<<-]>>[<<+>>-]<
145
-
146
-
147
- ======MOD10====
148
- >+++++++++<
149
- [
150
- >>>+<< bool= 1
151
- [>+>[-]<<-] bool= ten==0
152
- >[<+>-] ten = tmp
153
- >[<<++++++++++>>-] if ten=0 ten=10
154
- <<- dec ten
155
- <- dec num
156
- ]
157
- +++++++++ num=9
158
- >[<->-]< dec num by ten
159
-
160
- =======RROT======
161
- [>+<-]
162
- < [>+<-]
163
- < [>+<-]
164
- >>>[<<<+>>>-]
165
- <
166
-
167
- =======DIV10========
168
- >+++++++++<
169
- [
170
- >>>+<< bool= 1
171
- [>+>[-]<<-] bool= ten==0
172
- >[<+>-] ten = tmp
173
- >[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
174
- <<- dec ten
175
- <- dec num
176
- ]
177
- >>>>[<<<<+>>>>-]<<<< copy div to num
178
- >[-]< clear ten
179
-
180
- =======INC1=========
181
- <+>
182
- ]
183
-
184
- <
185
- [
186
- =======MOVER=========
187
- [>+<-]
188
-
189
- =======ADD48========
190
- +++++++[<+++++++>-]<->
191
-
192
- =======PUTC=======
193
- <.[-]>
194
-
195
- ======MOVEL2========
196
- >[<<+>>-]<
197
-
198
- <-
199
- ]
200
-
201
- >++++[<++++++++>-]<.[-]
202
-
203
- ===================================================================
204
- =========================== END FOR ===============================
205
- ===================================================================
206
-
207
-
208
- >>>>>>>
209
- ]
210
- <<<<<<<<
211
-
212
-
213
-
214
- >[-]<
215
- [-]
216
- <<-
217
- ]
218
-
219
- ======LF========
220
-
221
- ++++++++++.[-]
222
-
1
+ #!/usr/bin/env ookie
2
+ ===================================================================
3
+ ======================== OUTPUT STRING ============================
4
+ ===================================================================
5
+ >++++++++[<++++++++>-]<++++++++++++++++.[-]
6
+ >++++++++++[<++++++++++>-]<++++++++++++++.[-]
7
+ >++++++++++[<++++++++++>-]<+++++.[-]
8
+ >++++++++++[<++++++++++>-]<+++++++++.[-]
9
+ >++++++++++[<++++++++++>-]<+.[-]
10
+ >++++++++++[<++++++++++>-]<+++++++++++++++.[-]
11
+ >+++++[<+++++>-]<+++++++.[-]
12
+ >++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
13
+ >++++++++++[<++++++++++>-]<++++++++++++.[-]
14
+ >+++++[<+++++>-]<+++++++.[-]
15
+ >++++++++++[<++++++++++>-]<++++++++++++++++.[-]
16
+ >++++++++++[<++++++++++>-]<+++++++++++.[-]
17
+ >+++++++[<+++++++>-]<+++++++++.[-]
18
+ >+++++[<+++++>-]<+++++++.[-]
19
+
20
+ ===================================================================
21
+ ======================== INPUT NUMBER ============================
22
+ ===================================================================
23
+ + cont=1
24
+ [
25
+ - cont=0
26
+ >,
27
+ ======SUB10======
28
+ ----------
29
+
30
+ [ not 10
31
+ <+> cont=1
32
+ =====SUB38======
33
+ ----------
34
+ ----------
35
+ ----------
36
+ --------
37
+
38
+ >
39
+ =====MUL10=======
40
+ [>+>+<<-]>>[<<+>>-]< dup
41
+
42
+ >>>+++++++++
43
+ [
44
+ <<<
45
+ [>+>+<<-]>>[<<+>>-]< dup
46
+ [<<+>>-]
47
+ >>-
48
+ ]
49
+ <<<[-]<
50
+ ======RMOVE1======
51
+ <
52
+ [>+<-]
53
+ ]
54
+ <
55
+ ]
56
+ >>[<<+>>-]<<
57
+
58
+ ===================================================================
59
+ ======================= PROCESS NUMBER ===========================
60
+ ===================================================================
61
+
62
+ ==== ==== ==== ====
63
+ numd numu teid teiu
64
+ ==== ==== ==== ====
65
+
66
+ >+<-
67
+ [
68
+ >+
69
+ ======DUP======
70
+ [>+>+<<-]>>[<<+>>-]<
71
+
72
+ >+<--
73
+
74
+ >>>>>>>>+<<<<<<<< isprime=1
75
+
76
+ [
77
+ >+
78
+
79
+ <-
80
+
81
+ =====DUP3=====
82
+ <[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
83
+
84
+ =====DUP2=====
85
+ >[>>+>+<<<-]>>>[<<<+>>>-]<<< <
86
+
87
+
88
+ >>>
89
+
90
+
91
+ ====DIVIDES=======
92
+ [>+>+<<-]>>[<<+>>-]< DUP i=div
93
+
94
+ <<
95
+ [
96
+ >>>>>+ bool=1
97
+ <<<
98
+ [>+>+<<-]>>[<<+>>-]< DUP
99
+ [>>[-]<<-] IF i THEN bool=0
100
+ >>
101
+ [ IF i=0
102
+ <<<<
103
+ [>+>+<<-]>>[<<+>>-]< i=div
104
+ >>>
105
+ - bool=0
106
+ ]
107
+ <<<
108
+ - DEC i
109
+ <<
110
+ -
111
+ ]
112
+
113
+ +>>[<<[-]>>-]<<
114
+ >[-]< CLR div
115
+ =====END DIVIDES====
116
+
117
+
118
+ [>>>>>>[-]<<<<<<-] if divides then isprime=0
119
+
120
+
121
+ <<
122
+
123
+ >>[-]>[-]<<<
124
+ ]
125
+
126
+ >>>>>>>>
127
+ [
128
+ -
129
+ <<<<<<<[-]<<
130
+
131
+ [>>+>+<<<-]>>>[<<<+>>>-]<<<
132
+
133
+ >>
134
+
135
+
136
+
137
+
138
+ ===================================================================
139
+ ======================== OUTPUT NUMBER ===========================
140
+ ===================================================================
141
+ [>+<-]>
142
+
143
+ [
144
+ ======DUP======
145
+ [>+>+<<-]>>[<<+>>-]<
146
+
147
+
148
+ ======MOD10====
149
+ >+++++++++<
150
+ [
151
+ >>>+<< bool= 1
152
+ [>+>[-]<<-] bool= ten==0
153
+ >[<+>-] ten = tmp
154
+ >[<<++++++++++>>-] if ten=0 ten=10
155
+ <<- dec ten
156
+ <- dec num
157
+ ]
158
+ +++++++++ num=9
159
+ >[<->-]< dec num by ten
160
+
161
+ =======RROT======
162
+ [>+<-]
163
+ < [>+<-]
164
+ < [>+<-]
165
+ >>>[<<<+>>>-]
166
+ <
167
+
168
+ =======DIV10========
169
+ >+++++++++<
170
+ [
171
+ >>>+<< bool= 1
172
+ [>+>[-]<<-] bool= ten==0
173
+ >[<+>-] ten = tmp
174
+ >[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
175
+ <<- dec ten
176
+ <- dec num
177
+ ]
178
+ >>>>[<<<<+>>>>-]<<<< copy div to num
179
+ >[-]< clear ten
180
+
181
+ =======INC1=========
182
+ <+>
183
+ ]
184
+
185
+ <
186
+ [
187
+ =======MOVER=========
188
+ [>+<-]
189
+
190
+ =======ADD48========
191
+ +++++++[<+++++++>-]<->
192
+
193
+ =======PUTC=======
194
+ <.[-]>
195
+
196
+ ======MOVEL2========
197
+ >[<<+>>-]<
198
+
199
+ <-
200
+ ]
201
+
202
+ >++++[<++++++++>-]<.[-]
203
+
204
+ ===================================================================
205
+ =========================== END FOR ===============================
206
+ ===================================================================
207
+
208
+
209
+ >>>>>>>
210
+ ]
211
+ <<<<<<<<
212
+
213
+
214
+
215
+ >[-]<
216
+ [-]
217
+ <<-
218
+ ]
219
+
220
+ ======LF========
221
+
222
+ ++++++++++.[-]
223
+
@@ -26,7 +26,7 @@ module Ookie
26
26
 
27
27
  attr_reader :ooks, :mem, :pc, :loops
28
28
  attr_writer :verbose
29
- attr_accessor :code, :ifd, :ofd, :efd, :lang
29
+ attr_accessor :code, :ifd, :ofd, :efd, :lang, :optimize
30
30
 
31
31
  def verbose(msg = nil)
32
32
  @efd.puts "#{self.class}: #{msg}" if @verbose and msg
@@ -37,6 +37,7 @@ module Ookie
37
37
  @verbose = false
38
38
  @code, @ifd, @ofd, @efd = code, ifd, ofd, efd
39
39
  @lang = :ook
40
+ @optimize = true
40
41
  reset!
41
42
  end
42
43
 
@@ -129,7 +130,7 @@ module Ookie
129
130
  loop do
130
131
  @pc += 1
131
132
  insn = next_insn
132
- raise UnmatchedStartLoop if insn.empty?
133
+ raise UnmatchedStartLoop if not insn or insn.empty?
133
134
  if insn == 'ookq_ookx'
134
135
  nesting -= 1
135
136
  break if nesting == 0
@@ -143,6 +144,7 @@ module Ookie
143
144
  @ooks = @code.scan(re).flatten
144
145
  raise NoCode if @ooks.empty?
145
146
  @ooks = yield
147
+ optimize if @optimize
146
148
  end
147
149
 
148
150
  def parse_ook
@@ -171,5 +173,30 @@ module Ookie
171
173
  end
172
174
  end
173
175
 
176
+ def optimize
177
+ verbose "original code size = #{@ooks.size}"
178
+ optimize_helper([:optimize_nils])
179
+ verbose "optimized code size = #{@ooks.size}"
180
+ end
181
+
182
+ def optimize_helper(rules)
183
+ i = 0
184
+ while @ooks[i] do
185
+ if rules.find { |r| send(r, @ooks[i], @ooks[i+1]) }
186
+ @ooks[i, 2] = []
187
+ i -= 1 unless i == 0
188
+ else
189
+ i += 1
190
+ end
191
+ end
192
+ end
193
+
194
+ def optimize_nils(i, j)
195
+ # this takes away innocuous operations, such as move right and then left
196
+ ops = [[i, j], [j, i]]
197
+ ops.include?(['ookd_ookq', 'ookq_ookd']) or
198
+ ops.include?(['ookd_ookd', 'ookx_ookx'])
199
+ end
200
+
174
201
  end
175
202
  end
@@ -12,7 +12,7 @@ module Ookie
12
12
  module Version
13
13
  MAJOR = 0
14
14
  MINOR = 3
15
- PATCH = 0
15
+ PATCH = 1
16
16
  BUILD = nil
17
17
 
18
18
  STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
@@ -5,13 +5,13 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{ookie}
8
- s.version = "0.3.0"
8
+ s.version = "0.3.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alejandro Martinez Ruiz"]
12
- s.date = %q{2010-10-23}
12
+ s.date = %q{2010-11-12}
13
13
  s.default_executable = %q{ookie}
14
- s.description = %q{Ookie is a simple Ook! interpreter you can use to either directly execute your Ook! source code (via shebang) or embed it in your own Ruby programs}
14
+ s.description = %q{Ookie is a simple Ook! and Brainfuck interpreter you can use to either directly execute your Ook! or BF source code (via shebang) or embed it in your own Ruby programs}
15
15
  s.email = %q{alex@flawedcode.org}
16
16
  s.executables = ["ookie"]
17
17
  s.extra_rdoc_files = [
@@ -48,7 +48,7 @@ Gem::Specification.new do |s|
48
48
  s.homepage = %q{http://github.com/unleashed/ookie}
49
49
  s.require_paths = ["lib"]
50
50
  s.rubygems_version = %q{1.3.7}
51
- s.summary = %q{Ookie is a simple Ook! interpreter}
51
+ s.summary = %q{Ookie is a simple Ook! and Brainfuck interpreter}
52
52
  s.test_files = [
53
53
  "spec/ookie_spec.rb",
54
54
  "spec/spec_helper.rb"
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 3
8
- - 0
9
- version: 0.3.0
8
+ - 1
9
+ version: 0.3.1
10
10
  platform: ruby
11
11
  authors:
12
12
  - Alejandro Martinez Ruiz
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-10-23 00:00:00 +02:00
17
+ date: 2010-11-12 00:00:00 +01:00
18
18
  default_executable: ookie
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -165,7 +165,7 @@ dependencies:
165
165
  type: :development
166
166
  prerelease: false
167
167
  version_requirements: *id010
168
- description: Ookie is a simple Ook! interpreter you can use to either directly execute your Ook! source code (via shebang) or embed it in your own Ruby programs
168
+ description: Ookie is a simple Ook! and Brainfuck interpreter you can use to either directly execute your Ook! or BF source code (via shebang) or embed it in your own Ruby programs
169
169
  email: alex@flawedcode.org
170
170
  executables:
171
171
  - ookie
@@ -214,7 +214,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
214
214
  requirements:
215
215
  - - ">="
216
216
  - !ruby/object:Gem::Version
217
- hash: -1506199298662524959
217
+ hash: -764089329
218
218
  segments:
219
219
  - 0
220
220
  version: "0"
@@ -232,7 +232,7 @@ rubyforge_project:
232
232
  rubygems_version: 1.3.7
233
233
  signing_key:
234
234
  specification_version: 3
235
- summary: Ookie is a simple Ook! interpreter
235
+ summary: Ookie is a simple Ook! and Brainfuck interpreter
236
236
  test_files:
237
237
  - spec/ookie_spec.rb
238
238
  - spec/spec_helper.rb