) get "input.ivy" sample = 5 5 rho 3 0 3 7 3 2 5 5 1 2 6 5 3 3 2 3 3 5 4 9 3 5 3 9 0 op visible r = r = -1, r r = transp max\ transp r r = r > -1 flip r 1 drop r op vis2 m = (visible m) or (flip visible flip m) op vis4 m = (vis2 m) or (transp vis2 transp m) sample +/, vis4 sample +/, vis4 input op pady a = -1, a, -1 op padx a = transp pady transp a op pad a = pady padx a A = pad sample i = 3 3 d = 1 0 op i slice d = t = A[i[1];i[2]] t < 0: 0 rho 0 t, (i+d) slice d A A[3;3] i slice d i slice -d op empty v = 0 == rho v # takes from v while v[i] is less than x op x shorter v = empty v: v (and\ x > v) sel v # returns 1 if any v[i] blocks x op x blocked v = empty v: 0 or/ x <= v v = 1 2 3 4 3 2 5 6 1 2 3 5 shorter v 0 shorter 1 2 3 # takes from v while v[i] is less than v[0] op shorter2 v = x = v[1] v = 1 flip v v, +/ (and\ transp x > v) #shorter2 transp (1, rho v) rho v #shorter2 3 3 rho flip iota 9 "" sample "-" op x viewDistance v = (x blocked v) + rho x shorter v op viewDistance v = v[1] viewDistance 1 drop v viewDistance 1 2 3 viewDistance 5 1 2 3 viewDistance 5 5 op p score A = x = p[1] y = p[2] e = A[y;x] row = A[y] col = A[;x] n = 1 n = n * e viewDistance flip (x-1) take row n = n * e viewDistance x drop row n = n * e viewDistance flip (y-1) take col n = n * e viewDistance y drop col n op i loopY A = i[2] > (rho A)[2]: 0 (i score A) max (i + 0 1) loopY A op i loopX A = i[1] > (rho A)[1]: 0 (i loopY A) max (i + 1 0) loopX A op solve A = 1 1 loopX A 1 1 score sample 2 2 score sample 3 4 score sample solve sample 1 1 score sample; 1 2 score sample; 1 3 score sample; 1 4 score sample; 1 5 score sample 2 1 score sample; 2 2 score sample; 2 3 score sample; 2 4 score sample; 2 5 score sample solve input