(ns aocclj.day02 (:require [clojure.set :as set] [clojure.string :as str])) (def loses-to {:rock :scissors :scissors :paper :paper :rock}) (def wins-to (set/map-invert loses-to)) (defn translate [play] (case play (A X) :rock (B Y) :paper (C Z) :scissors)) (defn weight [play] (case play :rock 1 :paper 2 :scissors 3)) (defn match [my other] (cond (= my (wins-to other)) 6 (= my other) 3 :else 0)) (defn static-play [my-instruction other] (translate my-instruction)) (defn reactive-play [my-instruction other] (case my-instruction X (loses-to other) Y other Z (wins-to other))) (defn score [strategy game-play] (let [[oponent my] game-play oponent (translate oponent) my-play (strategy my oponent)] (+ (weight my-play) (match my-play oponent)))) (defn solver [strategy input] (transduce (comp (map #(map symbol (str/split % #" "))) (map (partial score strategy))) + input))