Day 9
This commit is contained in:
parent
e19f3e4865
commit
8cd75cfd86
91
my_parsing_nightmare.rb
Normal file
91
my_parsing_nightmare.rb
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
require 'lex'
|
||||||
|
|
||||||
|
input = File.read("input_9.txt").strip
|
||||||
|
|
||||||
|
class MyLexer < Lex::Lexer
|
||||||
|
tokens(
|
||||||
|
:LBRACE,
|
||||||
|
:RBRACE,
|
||||||
|
:BANG,
|
||||||
|
:LGARB,
|
||||||
|
:RGARB,
|
||||||
|
:OTHER
|
||||||
|
)
|
||||||
|
|
||||||
|
# Regular expression rules for simple tokens
|
||||||
|
rule(:LBRACE, /\{/)
|
||||||
|
rule(:RBRACE, /}/)
|
||||||
|
rule(:BANG, /!/)
|
||||||
|
rule(:LGARB, /\</)
|
||||||
|
rule(:RGARB, /\>/)
|
||||||
|
rule(:OTHER, /./)
|
||||||
|
|
||||||
|
# A string containing ignored characters (spaces and tabs)
|
||||||
|
ignore " \t"
|
||||||
|
|
||||||
|
error do |lexer, token|
|
||||||
|
puts "Illegal character: #{value}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
LEXER = MyLexer.new
|
||||||
|
|
||||||
|
TESTS = { "{}" => 1,
|
||||||
|
"{{{}}}" => 1 + 2 + 3,
|
||||||
|
"{{},{}}" => 1 + 2 + 2,
|
||||||
|
"{{{},{},{{}}}}" => 1 + 2 + 3 + 3 + 3 + 4,
|
||||||
|
"{<a>,<a>,<a>,<a>}" => 1,
|
||||||
|
"{{<ab>},{<ab>},{<ab>},{<ab>}}" => 1 + 2 + 2 + 2 + 2,
|
||||||
|
"{{<!!>},{<!!>},{<!!>},{<!!>}}" => 1 + 2 + 2 + 2 + 2,
|
||||||
|
"{{<a!>},{<a!>},{<a!>},{<ab>}}}" => 1 + 2 }
|
||||||
|
|
||||||
|
def testings
|
||||||
|
TESTS.each do |test, expec|
|
||||||
|
res = parsing_lol test
|
||||||
|
if res == expec then
|
||||||
|
puts "[gj] #{test}"
|
||||||
|
else
|
||||||
|
puts "[fuck] #{test}\texpected #{expec}, got #{res}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
def parsing_lol str_in
|
||||||
|
|
||||||
|
lex = LEXER.lex str_in
|
||||||
|
garb = false
|
||||||
|
level = 0
|
||||||
|
sum = 0
|
||||||
|
garb_count = 0
|
||||||
|
|
||||||
|
begin
|
||||||
|
while elem = lex.next do
|
||||||
|
if not garb then
|
||||||
|
case elem.name
|
||||||
|
when :LBRACE
|
||||||
|
level += 1
|
||||||
|
sum += level
|
||||||
|
when :RBRACE
|
||||||
|
level -= 1
|
||||||
|
when :LGARB
|
||||||
|
garb = true
|
||||||
|
end
|
||||||
|
else
|
||||||
|
case elem.name
|
||||||
|
when :RGARB
|
||||||
|
garb = false
|
||||||
|
when :BANG
|
||||||
|
lex.next
|
||||||
|
else
|
||||||
|
garb_count += 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue StopIteration
|
||||||
|
end
|
||||||
|
p sum
|
||||||
|
p garb_count
|
||||||
|
end
|
||||||
|
|
||||||
|
parsing_lol input
|
Loading…
Reference in New Issue
Block a user