1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def abba?(s)
  s.chars.each_cons(4).any? {|a,b,c,d| (a != b) && (a == d) && (b == c) }
end

def tls?(s)
  hypernets, supernets = s.split(/\[|\]/).inject([[],[]]) {|n,x| n[0] << x; [n[1], n[0]]}
  supernets.any? {|x| abba?(x) } && hypernets.none? {|x| abba?(x) }
end

def abas(s)
  s.chars.each_cons(3).select {|a,b,c| (a != b) && (a == c) }
end

def ssl?(s)
  hypernets, supernets = s.split(/\[|\]/).inject([[],[]]) {|n,x| n[0] << x; [n[1], n[0]]}
  abas = supernets.flat_map {|supernet| abas(supernet)}
  hypernets.any? {|hypernet| abas.any? {|a,b,_| hypernet.include?("#{b}#{a}#{b}") }}
end

if __FILE__ == $0
  p DATA.each_line.count {|line| ssl?(line) }
end

require 'minitest'
# require 'minitest/autorun'

class TestDay7 < Minitest::Test
  def test_tls
    assert tls?('abba[mnop]qrst')
    refute tls?('abcd[bddb]xyyx')
    refute tls?('aaaa[qwer]tyui')
    assert tls?('ioxxoj[asdfgh]zxcvbn')
  end
end

__END__