יום 5 - Alchemical Reduction

חידה מקורית:
https://adventofcode.com/2018/day/5

פיתרון שלי בשפת רובי:

REACTOR_RE = Regexp.compile(('a'..'z').map { |c| "#{c}#{c.upcase}|#{c.upcase}#{c}" }.join('|'))

def length_after_reacting(input)  
  1 while input.gsub!(REACTOR_RE, '')
  input.length
end

def regexp_for_specific_char(c)
  Regexp.compile(c, Regexp::IGNORECASE)
end

res = {}

input = File.open(ARGV[0]).read.strip

('a'..'z').each do |c|
  polymer = input.dup
  remover = regexp_for_specific_char(c)
  polymer.gsub!(remover, '')
  res[c] = length_after_reacting(polymer)
end

puts res.values.min

ביטויים רגולאריים הם כלי שאני תמיד אוהב להשתמש בו, גם במקרים (כמו הפעם) שהביצועים לא היו הצד החזק בפיתרון. אם יש לכם (@Udi) רעיונות איך לגרום לקוד לרוץ יותר מהר ועדיין להשתמש בביטויים רגולאריים אשמח לשמוע.

מודה שביטויים רגולאריים הם לא כלי שאני אוהב, משתמש רק כשאני חייב… אבל שימוש ב Linked List עשה לי הרבה שכל (עוד ביטוי שאני לא מחבב במיוחד) ומאפשר לשנות את הקלט של התוכנית בפשטות ומהירות מבלי ליצור אותו מחדש

כן האמת שאני חשבתי כאן על מחסנית בתור פיתרון מהיר
(קוראים את המחרוזת תו אחרי תו, כל פעם מסתכלים על התו האחרון ואם זה אותו תו ב case שונה מוציאים מהמחסנים וממשיכים לתו הבא. החלק השני רץ בגלל שאפשר פשוט להתעלם מתווים מסוימים כשרואים אותם במקום להוסיף אותם למחסנית)

בוקר טוב!

הפתרון שלי בפייתון3:

def explosive(a: str, b: str):
    return a.lower() == b.lower() and a.islower() ^ b.islower()


assert explosive("a", "A")
assert explosive("A", "a")
assert not explosive("a", "a")
assert not explosive("A", "A")
assert not explosive("A", "b")


def f(s):
    l = list(s)
    i = 0
    while i < len(l) - 1:
        if explosive(l[i], l[i + 1]):
            del l[i:i + 2]
            i = max(i - 1, 0)
        else:
            i += 1
    return "".join(l)


def f2(s):
    return min(len(f(s.replace(c, '').replace(c.upper(), '')))
               for c in set(s.lower()))


assert f("dabAcCaCBAcCcaDA") == "dabCBAcaDA"
assert f("x") == "x"
assert f("xa") == "xa"
assert f("xA") == "xA"
assert f("Aa") == ""
assert f("bAaB") == ""
assert f("bBAa") == ""
assert f("xbAaBy") == "xy"
assert f("xyAa") == "xy"
assert f("xaA") == "x"
assert f("aAx") == "x"
assert f("aaaAAA") == ""
assert f("xaaAaAaAAx") == "xx"

print(len(f(open("day5.txt").read().strip())))

assert f2("dabAcCaCBAcCcaDA") == 4

print(f2(open("day5.txt").read().strip()))