diff --git a/day 15/day_15_max_n.cpp b/day 15/day_15_max_n.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7aa7c22e8844723342694920a8bf8998bebcb6b9
--- /dev/null
+++ b/day 15/day_15_max_n.cpp	
@@ -0,0 +1,143 @@
+#include <bits/stdc++.h>
+
+#ifdef LOCAL
+#include "./cpp-dump/cpp-dump.hpp"
+#define pr(x) cpp_dump(x)
+#endif
+
+using namespace std;
+
+#define Mod(x,y) (((x)%(y)+(y))%(y))
+#define rep(i, a, b) for(ll (i) = (a); (i) < (b); ++(i))
+#define all(x) begin(x), end(x)
+#define pb push_back
+#define gcd __gcd 
+#define sz(x) (ll)(x.size())
+
+typedef long long ll;
+typedef unsigned long long ull;
+typedef pair<ll, ll> pii;
+typedef vector<ll> vi;
+typedef vector<pii> vii;
+
+const bool debug = false;
+
+vector<string> mat;
+
+int n, m;
+
+pii push_hor(pii s, pii ds) {
+    int i = s.first, j = s.second, di = ds.first, dj = ds.second;
+    int ni = i+di, nj = j+dj;
+    if (mat[ni][nj] == '#') return s;
+    if (mat[ni][nj] == '[' || mat[ni][nj] == ']') {
+        push_hor(pii(ni,nj), ds);
+    }
+
+    if (mat[ni][nj] == '.') {
+        swap(mat[i][j], mat[ni][nj]);
+        return pii(ni, nj);
+    }
+    return s;
+}
+pii push_ver(pii s, pii ds) {
+    int i = s.first, j = s.second, di = ds.first, dj = ds.second;
+    int ni = i+di, nj = j+dj;
+
+    if (mat[ni][nj] == '#') return s;
+    if (mat[ni][nj] == '[') {
+        push_ver(pii(ni,nj), ds);
+        push_ver(pii(ni,nj+1), ds);
+        if (!(mat[ni][nj] == '.' && mat[ni][nj+1] == '.')) {
+            return s;
+        }
+
+    } else if (mat[ni][nj] == ']') {
+        push_ver(pii(ni,nj), ds);
+        push_ver(pii(ni,nj-1), ds);
+        if (!(mat[ni][nj] == '.' && mat[ni][nj-1] == '.')) {
+            return s;
+        }
+    }
+
+    if (mat[ni][nj] == '.') {
+        swap(mat[i][j], mat[ni][nj]);
+        return pii(ni, nj);
+    }
+    return s;
+}
+
+pii move(pii s, char c) {
+    int di = 0;
+    int dj = 0;
+    if (c == '^') di = -1;
+    if (c == '>') dj =  1;
+    if (c == 'v') di =  1;
+    if (c == '<') dj = -1;
+
+    int i = s.first, j = s.second;
+    assert(mat[i][j] == '@');
+
+    if (c == '>' || c == '<') return push_hor(s, pii(di, dj));
+    else return push_ver(s, pii(di, dj));
+}
+
+void solve() {
+    string s;
+    while(cin >> s) {
+        if (s.size() == 0) break;
+        string t;
+
+        for (char c : s) {
+            if (c == '#') t += "##";
+            if (c == 'O') t += "[]";
+            if (c == '.') t += "..";
+            if (c == '@') t += "@.";
+        }
+
+
+        mat.pb(t);
+        cin.ignore();
+        if (cin.peek() == '\n') break;
+    }
+    n = sz(mat);
+    m = sz(mat[0]);
+    
+
+    s.clear();
+    string t;
+    while(cin >> t) s += t;
+
+    pii st;
+    rep(i, 0, n) rep(j, 0, m) if (mat[i][j] == '@') {
+        st = pii(i, j);
+    }
+
+    for (char c : s){
+        vector<string> mat2 = mat;
+        pii st2 = st;
+
+        st = move(st, c);
+        if (st2 == st) {
+            mat = mat2;
+        }
+    }
+
+    ll ans = 0;
+    rep(i, 1, n) rep(j, 1, m) if (mat[i][j] == '[') {
+        ans += 100*i + j;
+    }
+    pr(ans);
+} 
+
+
+int main() {
+    ios::sync_with_stdio(0);cin.tie(0);
+    cout << setprecision(15) << fixed;
+
+#ifdef LOCAL
+    freopen("input.txt", "r", stdin);
+#endif
+
+    solve();
+}