« first day (1738 days earlier)      last day (917 days later) » 
00:00 - 21:0021:00 - 00:00

12:00 AM
:-)
 
12:19 AM
ModifyRegion ← {
    (board region)←⍵
    corner←2↑region
    size←1+(2↓region)-(2↑region)
    affected←size↑corner↓board
    (size↑corner↓board)←⍺⍺ affected
    board
}
fancy dancy
How do you split a string on spaces (or other chars) again
 
Did you try APLcart?
 
yes
 
What did you search for?
 
Oh
not hard enough obviously
 
I want to know so I can add your search terms for next time.
 
12:26 AM
split spaces I think?
> Fast: A nested vector comprising simple character vectors constructed from the rows of Dm (which must be of depth 1) with trailing blank spaces removed
i'm sure this makes lots of sense if you are any better at apl than i
 
Well, that isn't the one you want. Also, why so specific? You wanted other chars too, no?
Anyway, I'll add "spaces".
 
12:45 AM
⎕ ← {
    board ← 1000 1000 ⍴ 0
    ⍝ Dummy assignment thing to make it iterate over each command
    _ ← {
        opc ← ⊃⍵
        args ← 1↓⍵
        opc ≡ 'turnon' : board ⊢← {1} ModifyRegion board args
        opc ≡ 'turnoff' : board ⊢← {0} ModifyRegion board args
        opc ≡ 'toggle' : board ⊢← {⍵=0} ModifyRegion board args
        ⍬
    }¨ commands
    +/+/ board
}⍬
Howcome this won't update the board?
 
No sure. Did you try tracing through it?
Btw, for this kind of thing, I'd use a tradfn.
 
i dont know how to do that because i wrote this in my dyalog script
not the workspace
 
Oh, right, you're really missing out on APL's interactive programming.
 
Ihave a workspace open
 
∇sum←Process commands;board;command;opc;args
 board←1000 1000⍴0
 :For command :In commands
     opc←⊃command
     args←1↓command
     :Select opc
     :Case 'turnon'
         board←{1}ModifyRegion board args
     :Case 'turnoff'
         board←{0}ModifyRegion board args
     :Case 'toggle'
         board←{⍵=0}ModifyRegion board args
     :EndSelect
 :EndFor
 sum←+/+/board
∇
(No need for the ⊢← to update board here.)
 
12:51 AM
Ok
and i can just type the carrots in the file?
 
Yes.
Also, if ModifyRegion took board as left argument and args as right argument, you could write board{1}ModifyRegion←args etc.
 
Huh
oh well
 
Btw, {1} is 1⍨ and {⍵=0} is =∘0
 
How do you pass in commands ?
 
ModifyRegion is a monadic operator, right?
 
12:53 AM
it uh, it takes a fn on the left and a vec on the right
 
@gamma_delta After the definition, you'd simply say Process commands
 
vec of (board region)
 
@Adám
VALUE ERROR: Undefined name: commands
      ⎕←Process commands
              ∧
 
How come it knows what to pass in and what are local variables?
 
@gamma_delta Hold on, can I see ModifyRegion?
 
12:53 AM
(Also that still doesn't work)
34 mins ago, by gamma_delta
ModifyRegion ← {
    (board region)←⍵
    corner←2↑region
    size←1+(2↓region)-(2↑region)
    affected←size↑corner↓board
    (size↑corner↓board)←⍺⍺ affected
    board
}
 
@gamma_delta The first line, with is a header line specifying that the argument is called commands.
@gamma_delta Ah yes, that's a monadic operator.
 
i have tested ModifyRegion and it works
 
I think I know what the problem is.
 
do tell
 
what exactly is the structure of each command?
 
12:56 AM
(opc x y x2 y2)
 
Hm.
 
this generates them from a vec of strings like "turn on 0,0 through 999,999" and "toggle 0,0 through 999,0"
commands ← {
    splitted← ' ' split ⍵
    end ← ¯3↑splitted
    ∊ (∊¯3↓splitted) , (⍎¨ ',' split 1⊃end) , (⍎¨ ',' split 3⊃end)
}¨ input
 
Right.
Well, try Ctrl+Enter to trace into Process and then inspect values as you go along. Hovering your mouse over a name should give you a pop-up of its value, but you can also enter the name in the session.
 
what is "the session"
 
Sorry, the REPL. The interactive, immediate execution, area
 
1:01 AM
aha
for some reason ⊃command is getting only the first char
i probably want ⊃command[1] or something?
 
@gamma_delta Sounds like the commands don't have the exact structure you thought.
Maybe they are in fact (opc,x y x2 y2) and not (opc x y x2 y2)?
 
ParseCommand 'turn on 10,10 to 20,20' is giving me what sure looks like an array of "turnon" 10 10 20 20
if i understand the box view at all?
... it's possible it's giving me like, a flat vector that is like ['t' 'u' 'r' 'n' 'o' 'n' 10 10 20 20]
 
Try ]display command
 
I ... have no idea how to interpret that
     ]display ParseCommand 'turn on 10,10 to 20,20'
┌→───────────────────┐
↓┌→─────────────────┐│
││turnon 10 10 20 20││
│└+─────────────────┘│
└────────────────────┘
 
Yeah, that's a matrix containing a flat vector of mixed types (chars and nums).
Look at ]display -? for help.
But I've gotta go.
 
1:05 AM
It's pretty much expected because you have at the end
∊ (∊¯3↓splitted) , ... → (⊂∊¯3↓splitted), ∊...
 
ok (?)
(⊂∊¯3↓splitted) , (⍎¨ ',' split 1⊃end) , (⍎¨ ',' split 3⊃end)
is what i've changed it to
playing around in the repl i think that's correct
aha it displays not 0
 
That would also do I guess
 
YAY
thats the answer
man i love aoc
 
though you can the things like 1,1 or 999,999 directly just fine
 
Oh
huh
God day 7 looks disgusting
 
1:19 AM
Oh right that one...
 
 
2 hours later…
2:54 AM
help
i entered dyalog from wsl on accident and i can't fiugre out how to leave
 
Did you check APLcart?
 
I just closed the terminal...
 
Or rather, what did you search for on APLcart?
 
no i did not search aplcart
this is because it is late and i am stupid
 
Nah, you might not have thought it'd say how to leave.
 
2:57 AM
That is also true
actually that is very true
i figured it would only have code snippets
 
But now, if you search for it, do you find what you're looking for?
@gamma_delta Yes, and APL can close itself under program control.
 
that would be like a car's manual telling you how to not get a ticket when pulled over
@Adám I tried a lot of things, ]exit ]quit and with )
oh of course ⎕OFF
how ergonomic ⍨⍨⍨⍨
 
?
It happened to me as kid, the first time my father left me alone with an APL system, and I didn't know how to shut it down. I also tried all kinds of words. Eventually I started crying.
It is called "off" for historical reasons, because you used to log off a remote system. APL wasn't an application; it was the "operating environment", so there was nothing you could "exit".
 
huh
if i cried around my father he would yell at me to stop until i stopped
 
My father had left me there.
 
3:08 AM
Anyways is there a good string map structure
other than namespaces, which i hear are kind of a hack
 
@gamma_delta The normal thing to do is to have two vectors, one with the keys and one with the values.
 
Hm ok
 
Then you can write values[keys⍳key]
If you really want a keyed array, then there is the keyed class property.
 
how do you left shift / right shift an array without rotating?
just creating extra zeroes and dropping things that fall off
 
That's exactly how you do it
 
3:13 AM
... no how does one do that
 
⎕←1↓1 2 3 4,0
 
@Adám 2 3 4 0
 
@gamma_delta What did you search for on APLcart?
 
... nothing
sorry i'm on a terrible connection rn
 
If you open APLcart in a tab, then you can keep it open. It doesn't need internet.
 
3:26 AM
Shl←{(≢⍺)↑⍵↓⍺}
that works
 
@gamma_delta Only in one direction.
 
Really?
it seems to work with negative rhs
(169 ⊤⍨ 16⍴2) Shl ¯1
for example
 
⋄ Shl←{(≢⍺)↑⍵↓⍺} ⋄ (⍳8) Shl 2 ⋄ (⍳8) Shl ¯2
 
@Adám
3 4 5 6 7 8 0 0
1 2 3 4 5 6 0 0
 
Surely, this isn't right.
@gamma_delta Btw, normal practice is that the main data goes on the right and the "parameter" goes on the left. (There are exceptions, though.)
 
3:29 AM
... huh yeah
 
Maybe the most prominent exception is ÷
 
 
5 hours later…
8:04 AM
@Adám For me, the reason I found trains hard to parse is that they require a bigger 'lookahead' window to keep track of how function arguments "jump around". I'm still curious if others can take in the meaning of a 8-10 carriage train at a glance. I sure can't, and need to use the interpreter's help, or painstakingly draw it out on paper.
 
@xpqz not at a glance but as fast as an equivalent dfn (or faster)
unless it's using a lot of operators, that can make it a bit harder
 
I must be tacitlexic.
 
f∘g∘h∘i - no stop just use a dfn instead
 
@Miguel Great to hear. Did you find the indexing chapter was overwhelming due to the fact that the topic is complex (it is), or that it could have been explained in a better way?
@Adám Awesome. Happy to do a Phase2 one, too, if there's interest.
 
8:25 AM
@xpqz Because the topic is complex 100%
 
 
1 hour later…
9:54 AM
@Adám not sure if it's my bad school internet, but it seems tryapl has slowed back down again (can someone else check?)
 
10:30 AM
@rak1507 How about now?
 
yep, that fixed it
 
 
lol
 
@Adám Is there a clockwork mechanism you have to wind up at regular intervals?
 
No, it just appears to slow down over a day or so, until it reaches an equilibrium with about a half-second of delay. Rebuilding the server temporarily fixes the issue. Mysterious.
 
 
1 hour later…
11:47 AM
@Adám weird
 
11:57 AM
Wow
 
 
3 hours later…
3:16 PM
@CharlesHoffmann Hi there. Interested in APL?
Hi @MrV
 
MrV
Hi @Adam, copy pasted the line in Dyalog and it returned 0.
 
I presumed you inserted your user name, right?
 
MrV
Sorry, I take it back haha it was 1
Did not notice the <User> haha
It was 1 after inserting the userna,me
 
OK, good.
How about ⎕NINFO'C:\Users\<user>\Documents\Dyalog APL-64 18.0 Unicode Files\UserCommand20.cache'
You might be able to use ⎕AN⎕R'<user>'⎕NINFO'C:\Users\',⎕AN,'\Documents\Dyalog APL-64 18.0 Unicode Files\UserCommand20.cache' to automatically insert and redact your name.
 
MrV
It returned the filename and created the UserCommand20.cache
 
3:24 PM
Hi, I was asking about string maps here earlier
someone recommended a vec of keys and a vec of values
 
@MrV That shouldn't create it, just check if it exists.
@gamma_delta That was me!
 
Problem is vals[keys⍳key] doesn't seem to work when key is a string
 
@gamma_delta Sorry, you need ⊂key if key is a simple string.
 
OK, enclose key?
... what if i have some single-char strings and some many-char strings
 
Yes, because you want to look for a scalar in a vector.
@gamma_delta That should just work.
 
3:25 PM
ok
 
MrV
...oh, Maybe after I reinstalled(the 10th time) my dyalog, maybe that created the file. It was not there previously
 
@gamma_delta If you write it as vals[keys⍳⊆key] then it works both for key being simple and nested (e.g. for multiple keys you want the value for)
Note the rather than
is "enclose if simple".
@MrV So now, do user commands like ]box work?
 
MrV
No
@Adam
 
:-(
Still the same errors?
 
MrV
yeah the same
FILE ACCESS ERROR: C:/Users/<user>/Documents/: Unable to read directory status
 
3:30 PM
It really looks like Dyalog doesn't have permissions to your documents folder. Can you try ⎕A⎕NPUT'C:/Users/',⎕AN,'/Documents/testfile.txt'
And then ⊃⎕NGET'C:/Users/',⎕AN,'/Documents/testfile.txt' to see if you get the alphabet.
 
MrV
It works, I am getting the alphabets. no problem there.
 
Hm.
Can you try ⎕CY'salt' ⋄ enableSALT
 
MrV
@Adám DOMAIN ERROR: Name not copied
getting this error
 
OK, you might want a clear workspace first. Try:
)load salt
enableSALT
 
MrV
Ok done. After the second command getting: SALT already reacts to Editor events
 
3:36 PM
Can you do ]ureset now?
 
MrV
No. Same error as before.
 
Hm, after that error, what does ⎕JSON⎕DMX give? (It'll be very long.)
 
MrV
{"Category":"Native files","DM":["FILE ACCESS ERROR","Dir[11] files←1 3 2 0 6 ⎕NINFO ⎕OPT 1∊path","
∧"],"EM":"FILE ACCESS ERROR","EN":19,"ENX":93,"HelpURL":"https://help.dyalog.com/dmx/18.0/Nativefiles/93","Internal
Location":["pff.c",4117],"Message":"C:/Users/<User>/Documents/: Unable to read directory status","OSError":[1,0,""],"
Vendor":"Dyalog"}
@Adám
 
Thanks. Give me a min to look into that.
 
MrV
Ok. Thank you for your time.
 
3:50 PM
@MrV Try running ⎕SE.SALTUtils.(⎕FX'[pe] 2\b'⎕R'& 19'⊢⎕NR'Dir') and then try ]box again.
 
MrV
@Adam I get this:VALUE ERROR: No result was provided when the context expected one
locateIn[8] files←'a'Dir path←dir ClassFolder name⊣files←,⊂''
@Adam I get this error after trying ]box
 
Hm, ok, now close APL and open it again (because I messed with the system), and then try: ≢1⊃1 3 2 0 6 ⎕NINFO ⎕OPT 1⊢'C:/Users/',⎕AN,'/Documents/*'
@MrV I trashed your message because it revealed your name.
 
MrV
Thank you.
no worries
 
FYI, I'm discussing with a colleague.
@MrV What is ⎕AN⎕R'<user>'⍠1⎕SE.SALT.Set'cmddir'
 
MrV
4:05 PM
I get this: C:\Users\<user>\Documents\\MyUCMDs;C:\Program Files\Dyalog\Dyalog APL-64 18.0 Unicode\SALT\spice
 
OK, let's try ⎕SE.SALT.Set'cmddir C:\Program Files\Dyalog\Dyalog APL-64 18.0 Unicode\SALT\spice'
 
MrV
C:\Users\<user>\Documents\\MyUCMDs;C:\Program Files\Dyalog\Dyalog APL-64 18.0 Unicode\SALT\spice
@Adám
 
Right, now try ]ureset
 
MrV
@Adám It WORKS!
I tried ]box @Adám
Should I try ]ureset, @Adám
?
 
No, it should all work now, but you might want to make it permanent: ⎕SE.SALT.Set'cmddir C:\Program Files\Dyalog\Dyalog APL-64 18.0 Unicode\SALT\spice -p'
 
MrV
4:11 PM
Okay. done
Any thoughts on what happened?
@Adám
 
Yes, there's something in your documents folder that has restricted access. So when Dyalog tries to find any custom user commands you might have there, Windows refuses.
 
MrV
hmmm okay.
Thank you for your extraordinary support. And I feel like I am indebted to you now. I will definitely try to give back to this community in return.
 
So now we told APL to not even go look for any custom commands.
@MrV No worries. It is my job :-)
 
MrV
@Adám interesting stuff.
haha
Okay then, bye. See you again later.
 
See you around, and don't hesitate to ask for anything again.
@MrV (You're still allowed to give back to the community, of course.)
 
4:25 PM
It still won;t work (the scuffed hashmap thing)
ExecCommand ← {
    (kwires vwires) ← ⍺
    opc ← ⊃⍵
    args ← 1↓⍵

    'LIT'≡opc : ⊃args
    'COPY'≡opc : vwires[kwires⍳args;]
    'AND'≡opc : ∧/{vwires[kwires⍳⊂⍵;]}¨args
    'OR'≡opc : ∨/{vwires[kwires⍳⊂⍵;]}¨args
    'LSHIFT'≡opc : vwires[kwires⍳⊂⊃args;] Shl 2⊃args
    'RSHIFT'≡opc : vwires[kwires⍳⊂⊃args;] Shr 2⊃args
    'NOT'≡opc : ~ vwires[kwires⍳args;]
    ⎕←'Unknown opcode "',opc,'"'
}
this is what I have
 
@gamma_delta (It isn't a hashmap, just a map.)
 
mhm
⍵ is a vector like ['AND' 'ab' 'cd'] or ['RSHIFT' 'ab' 3]
 
You should be able to write {vwires[kwires⍳⊂⍵;]}¨args as vwires[kwires⍳args;]
 
it fails on the NOT case, it doesn't seem to believe that the single boxed string is in kwires
 
Maybe it isn't? Insert a line before the NOT case that says ⎕←args∊kwires
 
4:29 PM
@Adám
VALUE ERROR: Undefined name: kwires
      ⎕←args∊kwires
           ∧
 
@TryAPL I wasn't talking to you.
 
well uh now there's a problem elsewhere
after i did your change removing the ¨
 
Wait, is vwires a matrix?
 
yeah
it's a 16xN matrix
or like uh, 16 across N down
where N is 26^2 + 26
cause it has one entry for every letter pair plus each letter
 
Aha, then no, you can't remove ¨ the way I said.
 
4:31 PM
Dang
 
Sorry, I missed the ;
(There are other ways to do it, but that's not the issue right now.)
 
yeah i'm fully aware this is such a bad way to do this
 
@gamma_delta So what happens now?
 
index error again
'NOT'≡opc : ~ vwires[kwires⍳args;]
Oh also your debug print prints 0
⎕←args∊kwires
that one
 
@gamma_delta
VALUE ERROR: Undefined name: kwires
      ⎕←args∊kwires
           ∧
 
4:33 PM
shut up tryapl
 
Aha, so args really isn't in kwires.
 
guess not
 
You might want to trace through and inspect your values.
 
huh
it thinks it has a space surrounding it
like it's seeing " lk " and not "lk"
i think
 
Maybe it is enclosed one time too many? Do you have ]boxing on?
 
4:38 PM
... im running this as a script
I should probably stop doing that
 
Yeah, interactive coding is much better.
 
aha
 
?
 
for some reason, only in the not case, it's being boxed
 
Well, I can't see your s so it is kind of hard to tell what's going on.
Can you give an example of a NOT case ?
 
4:45 PM
hang on i got this i think
ok this should be it
Ok now i have some new problems love that
 
:-)
 
i know what it is though, i need to box all the single chars too
 
Box or ravel (and box)?
 
... um
So the problem is it can't find 'a' in a vector for some reason
or actually 'x'
args = ('x' 5), and i'm doing kwires⍳⊂⊃args
and that's returning out of bounds
 
Try with args←(,'x')5
 
4:53 PM
yeah i need to like, map , over the letters when making the array i guess?
 
If they are single characters, then yes will do.
 
new and exciting errors
 
Enjoy the ride!
 
Oh that's just great
i misunderstood the problem statement
i need to handle variables /and/ numbers on both sides
wauugh
Ugh
APL is a terrible language for this problem
i might skip it
 
5:10 PM
solving stuff in APL is sometimes five stages of grief for me
APL is absolutely trash for some problems, and really good for others
don't bother with APL if it doesn't work, at least that's my stance
 
can't get better by giving up
here's my solution if you wanna see @gamma_delta github.com/rak1507/Advent-Of-Code-APL/blob/main/2015/…
 
I don't think I've ran into a problem that didn't have a decent solution in APL, some problems definitely take some clever and roundabout approaches, though.
There's always your local Dzaima if you need a better perspective on something :)
 
haha true
 
for me, things that are better not made in arraylangs are things that take lots of control flow. but, since that has a prerequisite of having lots of code in general, it takes quite a bit of complexity to reach that
 
5:26 PM
How can I check how many of a set of substrings are in a string?
i dont think i understand ¨
my thought was '\\' '\"'∊¨'"\"msoytqimx\\tbklqz" but i get length errors?
 
5:47 PM
¨ is like 'zipwith' in other languages, it iterates through both arguments
you may want ∊¨⊂ ?
oh, also ∊ won't do what you want there
⍷ may be more useful
⋄ '\\' '\"' ⍷¨⊂ '"\"msoytqimx\\tbklqz"'
 
@rak1507
┌─────────────────────────────────────────┬─────────────────────────────────────────┐
│0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0│0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0│
└─────────────────────────────────────────┴─────────────────────────────────────────┘
 
hm ok
 
there's a secret weapon for this question
 
6:06 PM
Is it "use regex"
i swear day 5 was also "just use regex"
@rak1507 i dont understand what any of that means
OH
THAT'S CHEATING OH MY GOD i love it
HAHAHAahaha oh my god hahahaha
 
6:28 PM
:)
 
 
2 hours later…
8:06 PM
re: that, it doesn't like the \xXX escapes
 
@gamma_delta ⎕←'\x42'⎕R'\l&'⊢⎕A
 
@Adám AbCDEFGHIJKLMNOPQRSTUVWXYZ
 
what does that do?
 
Lowercases "B"s.
Or were you talking about ⎕JSON?
 
yeah ⎕JSON
⎕←⎕JSON'"\x22"'
 
8:10 PM
@gamma_delta
DOMAIN ERROR: JSON import: invalid string at offset 3 (⎕IO=1)
      ⎕←⎕JSON'"\x22"'
      ∧
 
⎕←⎕JSON⍠'Dialect' 'JSON5'⊢'"A\x42C"'
 
@Adám ABC
 
\x escapes are not in the JSON spec.
 
... really
huh
 
 
8:11 PM
nice
 
However, JSON5 does:
> Any character may be escaped. If the character is in the Basic Latin or Latin-1 Supplement Unicode character ranges (U+0000 through U+00FF), then it may be represented as a four-character sequence: a reverse solidus, followed by the lower case letter x, followed by two hexadecimal digits that encode the character’s code point. A reverse solidus followed by the lower case letter x must be followed by two hexadecimal digits.
 
8:31 PM
@gamma_delta yes, I had the same issue
 
interesting thing: 1⎕JSON⍠'Dialect' 'JSON5'⊢'""'
@Adám thanks, maybe that should be pinned?
 
There's a link from the memorial page to the video.
@rak1507 What's interesting about it? Happens that APL and JS agree on that.
 
@Adám just interesting that it mixes single and double quotes, didn't know it could do that
it means JSON5 isn't backwards compatible with regular JSON, I thought it just added things (like \x escapes)
 
JS(ON5) allows it, so we choose the most appropriate.
 
8:36 PM
yeah, not complaining, just surprised me
 
JSON5 is just a larger subset of ES5 than JSON is.
@rak1507 When we generate JSON5, we include a lot of nice touches:
      ⎕JSON⍠'Compact'0⊢⎕SE.SALT.SALT_Data
{
  "LastWriteTime": "(unavailable)",
  "SourceFile": "C:\\d\\SVN\\salt\\trunk\\core\\SALT.dyalog",
  "Version": 0
}
      ⎕JSON⍠'Compact'0⍠'Dialect' 'JSON5'⊢⎕SE.SALT.SALT_Data
{
  LastWriteTime: "(unavailable)",
  SourceFile: "C:\\d\\SVN\\salt\\trunk\\core\\SALT.dyalog",
  Version: 0,
}
 
unfortunately it makes my problem 8 aoc solution slightly less nice
 
Notice the trailing , after the last member, and the lack of quotes around member names.
 
because I have to use ⎕JSON⍠'Dialect' 'JSON5' for part 1, and ⎕JSON for part 2
 
@rak1507 well, adding \x escapes is also not backwards-compatible the same way as quotes - code generating it won't generate valid JSON
 
8:39 PM
@rak1507 You have to generate JSON?
 
@dzaima generating \x escapes no, but I assumed JSON5 would always output backwards compatible things and just allow reading more
@Adám yes
well, you have to 'escape' characters in a string
 
@rak1507 No, if you ask for JSON5, we'll use all the tools to make the output as nice as possible.
 
@rak1507 JSON5 defines what is valid syntax, not what to always output or read
 
@Adám makes sense
@dzaima fair enough
 
a valid JSON5 outputter would be a regular JSON outoutter
what's the point of an extended JSON if nothing can output it
 
8:42 PM
well the main benefit to me is being able to read in more things not to output it
 
Heh, though it is called ⎕JSON, it can actually generate JS: ⎕←⎕JSON (⊂'10%3')(⊂'!``')
 
@Adám [10%3,!``]
 
I made a little library:
      js.Eval ⎕JSON (⊂'10%3')(⊂'!``')
┌─┬──────┐
│1│┌────┐│
│ ││true││
│ │└────┘│
└─┴──────┘
 
Hey everone! how are you doing?
 
8:57 PM
Hi Miguel. I'm good. Getting ready to go offline.
 
ugh this is gonna be a p a i n
i need a weighted graph
 
ah, that question
there are some handy things in dfns.dyalog.com/n_contents.htm
or you could probably do dumb bruteforce as it's pretty small
 
i'm thinking about the data structure actually ... oh here's an idea
a matrix for vals, and then a key showing which row/column each is at
like a multiplication table
 
00:00 - 21:0021:00 - 00:00

« first day (1738 days earlier)      last day (917 days later) »