←2016-03-06 2016-03-07 2016-03-08→ ↑2016 ↑all
00:00:18 <b_jonas> !bfjoust pause2 ()*99999999999
00:00:23 <ais523> Lymia: the reason the current version does better than the []*8 version is that it at least has a chance of locking a naive clear loop
00:00:26 <b_jonas> !bfjoust pause3 ({})*99999999999
00:00:50 <ais523> !bfjoust attack1 [>[-]+]
00:01:02 <Lymia> !ztest two_people_running_from_a_shark >+([]) -=≡(>[-])> *-1=≡(>[-])>
00:01:02 <zemhill> Lymia.two_people_running_from_a_shark: points -21.76, score 7.19, rank 47/47
00:01:06 <ais523> b_jonas: should be ({})%99999999999 (with however many 9s you want) to comply with the spec
00:01:12 <b_jonas> ah
00:01:19 <b_jonas> !bfjoust pause4 ({})%99999999999
00:01:31 <ais523> in retrospect, we should probably cap loop iterations to 100000, there's no reason not to
00:01:36 <ais523> (but even then, nested loops could be a DoS)
00:02:12 <prooftechnique> !bfjoust fishbones >+]]]][-]>
00:02:23 <b_jonas> what are the interpreters written in? something that uses bigints by default?
00:02:26 <prooftechnique> !ztest fishbones >+]]]][-]>
00:02:26 <zemhill> prooftechnique: error: parse error: terminating ] without a matching [
00:02:33 <ais523> juiced is written in C
00:02:37 <prooftechnique> Aww.
00:02:58 <b_jonas> !bfjoust pause5 ()%99999999999
00:03:15 <Lymia> I'd probably try to fix () with some sort of AST manipulation
00:03:25 <ais523> !ztest google http://google.com
00:03:25 <fizzie> The thing that's powering zemhill is also written in C, and the command to parse numbers actually does cap at 100000.
00:03:25 <b_jonas> maybe it's still stuck on the first one and doesn't start to run the rest
00:03:25 <zemhill> ais523: error: parse error: encountered { without suitable enclosing (
00:03:35 <fizzie> Or at whatever MAXCYCLES is defined as, but anyway.
00:03:45 <b_jonas> !bfjoust dead <
00:03:51 <ais523> fizzie: margins3 and preparation both care about the exact value of the cycle cap
00:03:58 <b_jonas> see
00:04:04 <ais523> both of them could be modified to handle a different cycle cap, but would need the modification
00:04:11 <ais523> b_jonas: you killed hackego?
00:04:23 <b_jonas> ais523: or at least its bfjoust or something
00:04:27 <b_jonas> um, what other command does it have?
00:04:38 <b_jonas> `ping
00:04:40 <fizzie> EgoBot, not HackEgo.
00:04:40 <oerjan> <b_jonas> maybe it's still stuck on the first one and doesn't start to run the rest <-- i think so. i haven't seen any response since then.
00:04:42 <HackEgo> pong
00:04:52 <oerjan> !sh echo hi
00:04:53 <ais523> !bf8 ++++++++[->++++++++<]>.
00:04:53 <EgoBot> hi
00:04:53 <EgoBot> ​@
00:05:11 <ais523> HackEgo often did have problems with concurrent submissions
00:05:23 <ais523> so maybe there's some sort of locking involved
00:05:28 <ais523> that breaks on a time out
00:05:47 <ais523> s/HackEgo/EgoBot/g/recently
00:06:19 <b_jonas> ais523: oh, you mean if I submit two programs at the same time, I can get it to break and allow two of my knights on the same tapes?
00:06:37 <ais523> it had a tendency to rerun apparently unrelated results
00:06:40 <ais523> thus confusing the output
00:06:53 <ais523> was normally visible in http://codu.org/eso/bfjoust/in_egobot/breakdown.txt
00:06:58 <ais523> also, wow, look at that atm
00:07:00 <ais523> a bunch of invalid unicode
00:07:19 <ais523> and output interspersed in other output
00:07:24 <ais523> `fetch http://codu.org/eso/bfjoust/in_egobot/breakdown.txt
00:07:27 <HackEgo> 2016-03-07 00:07:05 URL:http://codu.org/eso/bfjoust/in_egobot/breakdown.txt [8451/8451] -> "breakdown.txt" [1]
00:07:29 <ais523> (for the benefit of logreaders)
00:07:38 <ais523> `paste breakdown.txt
00:07:40 <HackEgo> http://codu.org/projects/hackbot/fshg/index.cgi/file/tip/breakdown.txt
00:07:44 <ais523> `rm breakdown.txt
00:07:46 <HackEgo> No output.
00:07:48 <Lymia> !ztest (.)*-2 3
00:07:48 <zemhill> Lymia: Program name ((.)*-2) is restricted to characters in [a-zA-Z0-9_-], sorry.
00:07:53 <Lymia> !ztest f (.)*-2<
00:07:53 <zemhill> Lymia.f: points -32.14, score 2.99, rank 47/47
00:07:58 <Lymia> !ztest test (.)*-2<
00:07:58 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:08:00 <Lymia> !ztest test (.)*-0<
00:08:00 <zemhill> Lymia.test: points -46.00, score 0.00, rank 47/47
00:08:11 <fizzie> ais523: Your paste link no longer works, now that you removed the file.
00:08:13 <Lymia> !ztest test (<)*0
00:08:14 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:08:16 <Lymia> !ztest test (<)*-0
00:08:17 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:08:18 <Lymia> !ztest test (<)*--0
00:08:18 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:08:23 <fizzie> "breakdown.txt@d57f8e8d353c: not found in manifest"
00:08:23 <Lymia> !ztest test (<)*-----0
00:08:23 <zemhill> Lymia.test: points -32.12, score 2.99, rank 47/47
00:08:34 <ais523> fizzie: seriously? I thought it'd permalink :-(
00:08:35 <Lymia> !ztest test (.)*-----1<
00:08:35 <zemhill> Lymia.test: points -46.00, score 0.00, rank 47/47
00:08:39 <ais523> `revert
00:08:41 <Lymia> Messing with parsing. \o/
00:08:45 <HackEgo> rm: cannot remove `/home/hackbot/hackbot.hg/multibot_cmds/env/.hg/store/data/canary.orig': Is a directory \ Done.
00:08:48 <Lymia> I have no idea how this parses.
00:08:49 <ais523> `paste < breakdown.txt
00:08:50 <HackEgo> http://codu.org/projects/hackbot/fshg/index.cgi/file/tip/%3C%20breakdown.txt
00:08:55 <Lymia> !ztest test (<)*
00:08:56 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:08:56 <ais523> `` paste < breakdown.txt
00:08:59 <Lymia> !ztest test (<)*-----
00:08:59 <zemhill> Lymia.test: points -32.12, score 2.99, rank 47/47
00:09:00 <HackEgo> http://codu.org/projects/hackbot/fshg/index.cgi/file/tip/paste/paste.32218
00:09:01 <Lymia> !ztest test (<)*-----1
00:09:01 <zemhill> Lymia.test: points -32.12, score 2.99, rank 47/47
00:09:02 <Lymia> !ztest test (<)*-----0
00:09:02 <zemhill> Lymia.test: points -32.12, score 2.99, rank 47/47
00:09:04 <ais523> there we go
00:09:08 <ais523> `rm breakdown.txt
00:09:10 <HackEgo> No output.
00:09:23 <fizzie> Yeah, it's an "optimization" to not generate a new file when given a file name.
00:09:44 <fizzie> Also the invalid characters in breakdown.txt seemed to be just 0 bytes.
00:09:44 <ais523> but seriously, poor HackEgo
00:09:48 <Lymia> !ztest test (<)%
00:09:48 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:09:55 <Lymia> !ztest test (<)% 1
00:09:55 <zemhill> Lymia.test: points -46.00, score 0.00, rank 47/47
00:10:02 <ais523> fizzie: I was guessing NUL bytes, they're a common symptom of two concurrent accesses to the same file without locking
00:10:02 <Lymia> !ztest test (<)%CC1
00:10:02 <zemhill> Lymia.test: points -46.00, score 0.00, rank 47/47
00:10:04 <Lymia> !ztest test (<)%C-C1
00:10:05 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:10:11 <Lymia> !ztest test (<)%C-1
00:10:11 <zemhill> Lymia.test: points -46.00, score 0.00, rank 47/47
00:10:27 <Lymia> Canonization is going to be a pain.
00:11:19 <hppavilion[2]> Lymia: Does zemhill work in privmsg?
00:11:22 <Lymia> yep
00:11:49 <hppavilion[2]> Lymia: Is there a reason you aren't using it then?
00:11:50 <ais523> also over the Web, although it can't auth you there
00:11:54 <Lymia> !ztest test (<)
00:11:54 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:11:55 <Lymia> nope.
00:12:00 <Lymia> !ztest test {<}
00:12:00 <zemhill> Lymia: error: parse error: encountered { without suitable enclosing (
00:12:25 <ais523> <juiced> {} with no matching ()
00:14:08 <fizzie> I think (<)%C-1 gets interpreted (by zemhill) identically to (<)*-1, while (<)%C-C1 is just the empty program.
00:14:17 <Lymia> Yeah.
00:14:23 <Lymia> Looks like it tokenizes somehow.
00:14:29 <Lymia> >-1[<<]
00:14:33 <Lymia> !ztest test >-1[<<]
00:14:34 <zemhill> Lymia.test: points -46.00, score 0.00, rank 47/47
00:14:38 <Lymia> !ztest test >*-1[<<]
00:14:39 <zemhill> Lymia.test: points -46.00, score 0.00, rank 47/47
00:14:42 <Lymia> !ztest test >()*-1[<<]
00:14:42 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:14:53 <Lymia> Context sensitive too.
00:15:03 <b_jonas> I'm sorry for breaking the bot
00:15:11 <hppavilion[2]> ais523: Is a LISP that compiles to JS a reasonable goal for a first transpiler?
00:15:17 <ais523> juiced responds to "(>)C*-1" with ") not followed by % or *"
00:15:23 <fizzie> Well, if you can call it that. It's more that it ignores "non-meaningful" characters in most contexts, except after it's found the start of the number. So the C before the - is skipped, but the C between - and 1 isn't, so the count's just 0 for the latter.
00:15:24 <hppavilion[2]> ais523: IYHONHO?
00:15:29 <ais523> hppavilion[2]: it's not terrible, especially as javascript has first-class functions
00:15:37 <hppavilion[2]> ais523: That's what I was thinking
00:15:46 <ais523> also surely you mean IYHONSHO?
00:15:47 <hppavilion[2]> ais523: The part I was scared of is quote and unquote
00:15:50 <Lymia> I'm trying to gather all the programs that ever existed on the hill
00:15:56 <Lymia> And I'm working on a component to canonicalize stuff.
00:16:02 <hppavilion[2]> ais523: What does THAT mean?
00:16:25 <hppavilion[2]> (Mine was "In Your Humble (Or Not Humble) Opinion")
00:16:35 <ais523> "not so humble"
00:16:38 <fizzie> You could actually say it treats anything that's not +-<>.,[](){}*%0123456789 as whitespace, and ignores whitespace except in the middle of a number.
00:16:43 <hppavilion[2]> ais523: Ah
00:16:44 <ais523> by analogy with IMNSHO
00:16:54 <hppavilion[2]> ais523: Is that the one I use, or is that common?
00:17:00 <hppavilion[2]> IMNSHO that is
00:17:25 <ais523> hmm, (>)*C-1 seems to be interpreted as (>)*0 by juiced
00:17:36 <ais523> err, as (>)*0-C by juicd
00:17:42 <ais523> (the - is parsed as an instruction)
00:17:44 <hppavilion[2]> I think I independently discovered IMNSHO, but it may already have been known
00:18:00 <ais523> it used to be fairly common, especially on usenet
00:18:03 <ais523> it's not used much nowadays
00:18:04 <hppavilion[2]> Ah
00:18:23 <b_jonas> I still see “IMNSHO” in irc I think.
00:18:28 <hppavilion[2]> IMNSHO, it should be used more
00:18:58 <fizzie> ais523: I used to have a ") not followed by % or *" error, but then some program in the sample sets contained something akin to (this is a comment where there's (something) in parentheses)*0.
00:19:11 <oerjan> !ztest b_jonas_pause ((({})*999999)*9999999)*999999
00:19:11 <zemhill> oerjan.b_jonas_pause: points -32.14, score 2.99, rank 47/47
00:19:24 <oerjan> zemhill is rather more resilient
00:19:29 <ais523> fizzie: I dislike it when hill interps are permissive, as that means I have to correct other people's programs for local testing
00:20:21 <ais523> IIRC there was a controversy about "()* 1" and "() *1" (as opposed to the uncontroversial "()*1 ") which I had to patch in juiced at one point
00:20:32 <ais523> to have any hope of compatibility with what other people were doing
00:20:34 <JX7P> urgh, manually written parsers. damnit Geany
00:20:56 <prooftechnique> sizeof(hppavilion) / sizeof(hppavilion[0])
00:21:38 <oerjan> istr some programs had to be patched when the grammar changed (disallowing unmatched [] in ()*, iirc)
00:21:55 <oerjan> *accepted grammar
00:22:01 <Lymia> !ztest b_jonas_pause ((({.})*999999)*9999999)*999999
00:22:01 <zemhill> Lymia.b_jonas_pause: points -32.14, score 2.99, rank 47/47
00:22:02 <fizzie> "help ()*0 comments" says the commit message which introduced that change.
00:22:16 <Lymia> !ztest b_jonas_pause ((({.})*999999)*9999999)%999999
00:22:16 <zemhill> Lymia.b_jonas_pause: points -32.14, score 2.99, rank 47/47
00:22:20 <Lymia> +1
00:22:24 <Lymia> !ztest b_jonas_pause ((({.}.)*999999)*9999999)%999999
00:22:24 <zemhill> Lymia.b_jonas_pause: points -32.14, score 2.99, rank 47/47
00:22:31 <b_jonas> Lymia: try adding some %
00:22:46 <Lymia> !ztest b_jonas_pause (((({[.}.}.)*999999)*9999999)%999999)%999999
00:22:46 <zemhill> Lymia: error: parse error: terminating } without a matching {
00:22:51 <Lymia> !ztest b_jonas_pause (((({{.}.}.)*999999)*9999999)%999999)%999999
00:22:51 <zemhill> Lymia.b_jonas_pause: points -32.14, score 2.99, rank 47/47
00:23:02 <b_jonas> um
00:23:12 <b_jonas> near the {} or something
00:23:22 <b_jonas> !ztest syntaxerror }
00:23:22 <zemhill> b_jonas: error: parse error: terminating } without a matching {
00:23:25 <b_jonas> !ztest syntaxerror )
00:23:25 <zemhill> b_jonas: error: parse error: terminating ) without a matching (
00:23:34 <b_jonas> !ztest syntaxerror ([)*1
00:23:34 <zemhill> b_jonas: error: parse error: [..] crossing out of a ({..}) level
00:23:41 <Lymia> Does it not match ()* in ()% correctly?
00:23:48 <fizzie> Also zemhill considers * and % as synonyms.
00:23:51 <b_jonas> !ztest syntaxerror ({)*1(})*1
00:23:51 <zemhill> b_jonas: error: parse error: starting { without a matching }
00:23:54 <Lymia> :S
00:23:55 <Lymia> I see.
00:24:09 <b_jonas> !ztest syntaxerror {}
00:24:09 <zemhill> b_jonas: error: parse error: encountered { without suitable enclosing (
00:24:16 <b_jonas> !ztest syntaxerror ({{}})
00:24:16 <zemhill> b_jonas: error: parse error: encountered { without suitable enclosing (
00:24:19 <ais523> b_jonas: (a{b}c)%n is equivalent to (a)*n b (c)*n
00:24:24 <ais523> but allows you to match brackets between a and c
00:24:31 <ais523> this is to make it possible to implement efficiently
00:24:31 <b_jonas> ais523: yep
00:24:55 <ais523> even then, implementing % takes a little thought and most BF Joust interpreters I've seen from non-#esoteric people omit it
00:25:08 <b_jonas> although I think it would be possible to implement the general parenthesis (which allows unbalanced brackets) too, only more difficult to implement
00:25:19 <ais523> how many interps implement outside-%-matches-inside-{} ?
00:25:27 <oerjan> <JX7P> urgh, manually written parsers. damnit Geany <-- the BFJoust ({})% construction is a bit tricky to parse, i don't think it's context-free.
00:26:07 <oerjan> erm, with nested {}s.
00:26:13 <ais523> oerjan: isn't it just program ::= program '(' program '{' program '}' program ')' '%' integer ?
00:26:14 <Lymia> !ztest ({})
00:26:14 <zemhill> Lymia: "!ztest progname code". See http://zem.fi/bfjoust/ for documentation.
00:26:17 <Lymia> !ztest test ({})
00:26:18 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:26:23 <ais523> nested {} is the thing that cause problems
00:26:23 <Lymia> !ztest test ({}{})
00:26:23 <zemhill> Lymia: error: parse error: encountered second { on a same level
00:26:27 <ais523> and I'm not sure if it's widely implemented anyway
00:26:28 <Lymia> !ztest test (({}{}))
00:26:28 <zemhill> Lymia: error: parse error: encountered second { on a same level
00:26:31 <Lymia> !ztest test (({}){})
00:26:31 <zemhill> Lymia.test: points -32.14, score 2.99, rank 47/47
00:26:37 <Lymia> Even though it's an noop context
00:26:38 <ais523> !ztest test (({{}})%2)%2
00:26:38 <zemhill> ais523.test: points -32.14, score 2.99, rank 47/47
00:26:40 <oerjan> ais523: not when you allow {}s to match other than immediately enclosing ()
00:26:40 <Lymia> Interesting. . .
00:27:03 <b_jonas> I mean, you'd have to count the brackets in the expansion of every parenthesis, and track a path in the tree for where the program counter is or something like that
00:27:04 <oerjan> which zemhill and EgoBot both support iirc
00:27:33 <b_jonas> !ztest (({}{})%1)%1
00:27:33 <zemhill> b_jonas: "!ztest progname code". See http://zem.fi/bfjoust/ for documentation.
00:27:39 <b_jonas> !ztest syntx (({}{})%1)%1
00:27:39 <zemhill> b_jonas: error: parse error: encountered second { on a same level
00:27:46 <b_jonas> !ztest syntax (({})%2)%1
00:27:46 <zemhill> b_jonas.syntax: points -32.14, score 2.99, rank 47/47
00:27:54 <ais523> OK, so with a test program of (1(2{3{4}5}6)%2 7)%2
00:27:56 <fizzie> (a(b{c{d}e}f)%n g)%m => (a(b)*n c)*m d(e(f)*n g)*m, yes.
00:28:18 <ais523> juiced outputs 12231223456675667
00:29:35 <fizzie> I don't have a debug output like that, but that's what zemhill should execute as well.
00:29:57 <ais523> so the way juiced's debug output works is
00:30:04 <ais523> you write ()*n in your program (nothing in the brackets)
00:30:53 <ais523> and it outputs n in a way that can be parsed
00:31:13 <ais523> and when I run a program against the entire hill, I get the various values of n that were used in any of its runs, broken down via program
00:31:19 <ais523> this means that, say, I can write a defence program detector
00:31:21 <ais523> put a ()*1 in it
00:31:31 <ais523> then run it and see which enemy programs my own program considers to be defensie
00:31:33 <ais523> *defensive
00:32:18 <Lymia> Can't you just make an escape
00:32:19 <Lymia> like
00:32:25 <Lymia> ($debug command)
00:32:34 <Lymia> Without making it something that normally parses to noop
00:33:56 <hppavilion[2]> $help
00:34:14 <hppavilion[2]> Huh.
00:34:16 <ais523> Lymia: but that'd prevent me putting these into programs submitted to the hill
00:34:17 <hppavilion[2]> No $ bot
00:34:37 <ais523> ^prefixes
00:34:38 <fungot> Bot prefixes: fungot ^, HackEgo `, EgoBot !, lambdabot @ or ?, thutubot +, metasepia ~, idris-bot ( , jconn ) , j-bot [ .
00:34:54 <oerjan> <b_jonas> although I think it would be possible to implement the general parenthesis (which allows unbalanced brackets) too, only more difficult to implement <-- i've thought about that, the problem is you can get _very_ tricky about where exactly in the hierarchy the matching [ to a ] is.
00:34:59 <HackEgo> [wiki] [[Bf joust]] N https://esolangs.org/w/index.php?oldid=46502 * Ais523 * (+22) caps redirect
00:35:24 <fizzie> You could've made it ($echo foo)*0 etc. though, so that it's not limited to numbers and could do other sort of commands.
00:35:42 <ais523> it always seems weird seeing a miscapitalization, even though that's the whole point of a caps redirect
00:36:09 <ais523> fizzie: then other people could trigger it using malicious comments
00:36:18 <ais523> whereas a ()*5 in someone else's program is clearly harmless
00:36:44 <ais523> !ztest does_this_have_a_distinct_score (+)*-1
00:36:45 <zemhill> ais523.does_this_have_a_distinct_score: points -12.88, score 9.15, rank 47/47
00:37:07 <ais523> !ztest (<{(+)*-1}.)*0
00:37:07 <zemhill> ais523: "!ztest progname code". See http://zem.fi/bfjoust/ for documentation.
00:37:15 <ais523> !ztest empty_percent (<{(+)*-1}.)%0
00:37:16 <zemhill> ais523.empty_percent: points -12.88, score 9.15, rank 47/47
00:37:32 <ais523> oh wow, that is a hard case to handle correctly (and that is the correct handling of it)
00:38:12 <ais523> just tested juiced, it seems broken on it :-(
00:38:16 <ais523> (the whole thing is a no-op on juiced)
00:38:35 <hppavilion[2]> ais523: Perhaps I should make Thoof Bot?
00:38:42 <hppavilion[2]> ais523: One where you can add arbitrary axioms?
00:38:48 <ais523> hppavilion[2]: you can just add an interpreter into HackEgo, can't you?
00:38:52 <ais523> that's what it was originally meant to be for
00:38:56 <hppavilion[2]> ais523: Oh, right
00:39:00 <ais523> before people started filling it with quotes and wisdom, anyway
00:39:14 <ais523> very occasionally it is actually used for its intended purpose
00:39:15 <ais523> `quote
00:39:17 <ais523> `quote
00:39:17 <HackEgo> 579) <ais523> it's not a list of /all/ interesting esolangs, btw; otherwise you can take the first command from the first esolang, the second from the second, the third from the third, etc, then add 1 to all of them <ais523> and you get a new interesting esolang <ais523> diagonal principle…
00:39:18 <HackEgo> 323) <Phantom_Hoover> The system I kind of have in mind makes a flying train a natural consequence.
00:39:18 <ais523> `quote
00:39:19 <HackEgo> 605) <Phantom__Hoover> elliott, cars aren't perfectly spherical.
00:39:20 <ais523> `quote
00:39:20 <HackEgo> 703) <Sgeo_> Why does CL get called functional? <oerjan> it's sort of like how you call ancient greece democratic.
00:39:21 <ais523> `quote
00:39:22 <HackEgo> 1235) <elliott> `addquote <olsner> boily: thanks for getting quoted saying django btw, now I'm only in 87.5% of the django quotes [...] <olsner> ah, the inevitable result of mentioning django
00:39:54 <hppavilion[2]> ais523: Of course, if I do that I have to somehow get it /into/ hackego
00:40:09 <ais523> hppavilion[2]: `fetch is your friend
00:40:11 <ais523> `help fetch
00:40:11 <HackEgo> Runs arbitrary code in GNU/Linux. Type "`<command>", or "`run <command>" for full shell commands. "`fetch <URL>" downloads files. Files saved to $PWD are persistent, and $PWD/bin is in $PATH. $PWD is a mercurial repository, "`revert <rev>" can be used to revert to a revision. See http://codu.org/projects/hackbot/fshg/
00:40:17 <hppavilion[2]> ais523: Yes, but I'm an idiot
00:40:26 <ais523> hmm, that command was mis-parsed and yet somehow gave useful outut anyway
00:40:55 <hppavilion[2]> ais523: Is there a HackEgo API I can use?
00:41:08 <hppavilion[2]> ais523: Or perhaps docs on how to write scripts that run on HackEgo?
00:41:16 <ais523> hppavilion[2]: see Linux manpages
00:41:18 <ais523> it's basically just Linux
00:41:20 <hppavilion[2]> ais523: Perhaps
00:42:36 <hppavilion[2]> ais523: I'm going to start looking into how the Thoof command API should work
00:43:16 <hppavilion[2]> ais523: I suppose putting it in HackEgo's better as I don't need to make a full bot this way, AND it'll practically always be online
00:43:56 <Phantom_Hoover> do people actually hate python
00:44:20 <hppavilion[2]> Oh shit
00:44:24 <hppavilion[2]> My computer's not charging
00:44:27 <hppavilion[2]> But the outlet is working
00:44:33 <Phantom_Hoover> like my enduring impression of it is just this perfectly inoffensive language, but you can always find people who hate a given language
00:44:40 <hppavilion[2]> I'm going to try another outlet out of ill-thought-out desperation
00:44:56 <ais523> Phantom_Hoover: I don't hate it /that/ much but I still have a pretty dim view of it
00:45:04 <ais523> enough to get into flame wars with Python fans on occasion
00:45:32 <ais523> hppavilion[2]: check that the other end of the power wire (the one that's not connected to the socket) is connected to the charger
00:45:39 <ais523> this is a reasonably common failure mode and one that's confused me a bunch in the past
00:45:48 <hppavilion[2]> ais523: I did
00:46:17 <hppavilion[2]> Oh god
00:46:18 <ais523> (it's also possible for the charger to become disconnected from the laptop in a way that's non-obvious; this is rarer but it's happened a few times)
00:46:23 <hppavilion[2]> It's on and off charging
00:46:34 <hppavilion[2]> It depends on my angle of sitting
00:46:37 <ais523> oh, that makes it very likely that the end next to the laptop is loose
00:46:43 <ais523> just push it in a bit further
00:46:53 <hppavilion[2]> ais523: It's as far as it'll safely go
00:46:58 <ais523> hmm
00:47:01 <hppavilion[2]> ais523: I think the cord might be shot
00:47:06 <oerjan> ais523: _you_ get into flame wars?
00:47:10 <ais523> in that case it could be – yes
00:47:23 <ais523> oerjan: they are pretty tame by flame war standards
00:47:33 <oerjan> i thought you were this perfectly inoffensive guy.
00:47:49 <ais523> it's more that I'm so inoffensive that I will consider even something pretty minor to be a flame war
00:50:13 -!- PinealGlandOptic has quit (Quit: leaving).
00:50:49 <oerjan> *ACHOO*
00:52:01 <hppavilion[2]> ais523: Should the Thoof have different proofspaces?
00:52:06 <ais523> editor flame wars are fun, I typically take the side of emacs and vim versus everything else
00:52:34 <ais523> normally I can get most of the emacs /and/ vim users round to my side, thus catching out all the other-editor-users who thought they were safe
00:52:43 <ais523> hppavilion[2]: I have no idea
00:52:55 <ais523> to be honest, I'm probably not the right person to ask about a Thue-based proof assistant
00:53:16 <hppavilion[2]> ais523: A proofspace being that you have to do `thoof-addax <space> <axname> "<expression>"
00:54:32 <ais523> well, global state in IRC bots has a tendency to get trampled on
00:54:39 <Phantom_Hoover> so you're going to base it on deductive term rewriting?
00:54:57 <hppavilion[2]> Phantom_Hoover: Yes; it's based on string rewriting, to be exact
00:55:03 <hppavilion[2]> Phantom_Hoover: With s///
00:55:36 <Phantom_Hoover> hmm
00:56:09 <Phantom_Hoover> won't you end up basically implementing a typed lambda calculus in thue, what with curry-howard?
00:56:21 <hppavilion[2]> Phantom_Hoover: I'm trying to decide whether to shove all the axioms in a global namespace or to be precise and specific and allow different proofs
00:56:34 <hppavilion[2]> Phantom_Hoover: Huh?
00:56:34 <oerjan> `addquote <ais523> editor flame wars are fun, I typically take the side of emacs and vim versus everything else <ais523> normally I can get most of the emacs /and/ vim users round to my side, thus catching out all the other-editor-users who thought they were safe
00:56:36 <HackEgo> 1271) <ais523> editor flame wars are fun, I typically take the side of emacs and vim versus everything else <ais523> normally I can get most of the emacs /and/ vim users round to my side, thus catching out all the other-editor-users who thought they were safe
00:56:48 <hppavilion[2]> Phantom_Hoover: How is string rewriting typed lambda calculus
00:56:53 -!- vyv has joined.
00:57:20 <Phantom_Hoover> string rewriting isn't, but to get logic working properly i think you'll end up with a typed LC
00:58:45 <hppavilion[2]> Phantom_Hoover: There are a variety of ways to do what you want in it
00:58:49 <oerjan> <ais523> well, global state in IRC bots has a tendency to get trampled on <-- we don't like _too_ much global state change in HackEgo, it clutters up the history browser.
00:59:05 <ais523> indeed
00:59:20 <ais523> perhaps HackEgo should have some non-versioned temporary state, too
00:59:29 <ais523> that we can expect to get blown away on a regular basis
00:59:59 <oerjan> *ACHOO* more nosedrops ->
01:00:07 <olsner> ooh, interesting approach to editor flame wars
01:00:15 <hppavilion[2]> Phantom_Hoover: Typed λ-calculus is one way to do things, but it is not necessary
01:00:16 <Phantom_Hoover> like presumably you'll want some way to express the statement "forall x, A(x) implies B(x)" where A, B are some formulaic statements about x
01:01:21 <hppavilion[2]> Phantom_Hoover: That's possible, but not how you go about it
01:01:50 <hppavilion[2]> Phantom_Hoover: Thoof is based on proving strings from other strings together with substitutions
01:01:54 <Phantom_Hoover> and some rewriting rule that lets you turn a proof of that, and an x, and a proof of A(x) into a proof of B(x)
01:02:09 <hppavilion[2]> Phantom_Hoover: You can do that, but that's not the goal
01:02:46 <hppavilion[2]> Phantom_Hoover: Substitutions are based on PCRE regexes, Phantom_Hoover.
01:03:26 <Phantom_Hoover> you're just describing a string rewriting system here, not a string rewriting system that implements a proof assistant
01:04:13 <Phantom_Hoover> to make it a proof assistant you'll have to define some kind of encoding of logic into your strings, and rewriting rules that let you make deductions
01:04:43 <HackEgo> [wiki] [[BF Joust strategies]] https://esolangs.org/w/index.php?diff=46503&oldid=46497 * Ais523 * (+1501) /* Synchronization */ renamed to /* Reconnaissance */ mention the strategy Lymia.nyuroki uses, expand/adapt a bit
01:04:58 <Phantom_Hoover> e.g. the deduction and rule i described above, which is essentially function application
01:05:55 <HackEgo> [wiki] [[BF Joust strategies]] M https://esolangs.org/w/index.php?diff=46504&oldid=46503 * Ais523 * (+11) /* Decoy detection */ replace gratuitous Markdown with actual wikimarkup (I posted wikimarkup to a Markdown-using forum a little earlier, so the reverse error a few minutes later is perhaps not that unexpected)
01:08:16 -!- augur has joined.
01:09:48 <hppavilion[2]> Phantom_Hoover: You create axioms and theorems from said axioms and apply the axioms/theorems to other axioms until you get what you want
01:09:54 <hppavilion[2]> Phantom_Hoover: Sounds like a proof assistant to me
01:10:12 <Phantom_Hoover> sure, i never said otherwise
01:10:34 <hppavilion[2]> Phantom_Hoover: The axioms are strings, s/// expressions, and y/// expressions
01:10:47 <hppavilion[2]> Phantom_Hoover: You prove strings, and those strings can represent other things
01:10:59 <hppavilion[2]> Phantom_Hoover: You have to construct things like numbers though
01:11:00 <Phantom_Hoover> what does a y/// expression do
01:11:12 <hppavilion[2]> Phantom_Hoover: Character-by-character substitution, like in Sed
01:11:25 <hppavilion[2]> Phantom_Hoover: Less common than s///, but still potentially VERY useful
01:11:58 <hppavilion[2]> y/S/s/
01:13:44 <Phantom_Hoover> have you made any concrete proofs or anything with this? i'd like to have a clear idea of what you're thinking of
01:13:56 <hppavilion[2]> Phantom_Hoover: Yes, I proved 3+2=5
01:14:00 <hppavilion[2]> Phantom_Hoover: Using Peano arithmetic
01:14:07 <hppavilion[2]> It was more construction than proof, but close enough
01:14:16 <hppavilion[2]> Phantom_Hoover: So do you think it'd be better to have one big proofspace, sort of like lambdabot's functionspace, or multiple proofspaces like in any rational thing ever?
01:14:59 <Phantom_Hoover> do you have a source file or something for it?
01:15:11 <hppavilion[2]> Phantom_Hoover: http://pastebin.com/Ax2v5XSV
01:15:22 <hppavilion[2]> Phantom_Hoover: That's the paste, but I also have the github if you like
01:15:57 <hppavilion[2]> Phantom_Hoover: Oh, crap, wrong file
01:16:30 <hppavilion[2]> Phantom_Hoover: https://github.com/ZodiacWorkingGroup/Thoof/blob/master/construct.thoof
01:16:33 <hppavilion[2]> Just read that
01:17:08 <hppavilion[2]> Phantom_Hoover: Note that the main theorem no longer shows 2+3=5, it instead was made for dealing with lists
01:18:16 <Phantom_Hoover> what's \g?
01:20:05 <Phantom_Hoover> nvm, found a cheatsheet
01:22:10 <hppavilion[2]> Phantom_Hoover: Group reference
01:22:22 <hppavilion[2]> Phantom_Hoover: PCRE groups are invaluable in Thoof proving
01:24:19 <Phantom_Hoover> yes, i'd argue that's because they make it easy to beta reduce
01:24:56 <hppavilion[2]> Phantom_Hoover: Agreed
01:25:09 <hppavilion[2]> Phantom_Hoover: so, single- or multi- proofspace?
01:25:37 <Phantom_Hoover> single, theorem prover naming schemes are a clusterfuck regardless
01:25:43 <hppavilion[2]> Single is easier, but more unwieldy
01:25:49 <hppavilion[2]> OK
01:25:59 <hppavilion[2]> Maybe I'll add multiple in a later version
01:26:20 <hppavilion[2]> Phantom_Hoover: Alternatively, I could speed up the ONLINE thoof, and just publish that sooner and add a sharing feature
01:28:10 <Phantom_Hoover> wait
01:28:12 <Phantom_Hoover> HEAD :: s/(?P<x>[^:]*).*/\g<x>/;
01:28:34 <Phantom_Hoover> won't that clear the entire expression after the first colon... OK i guess that's what you want
01:28:40 <Phantom_Hoover> what if you had a nested array though?
01:30:48 <hppavilion[2]> Phantom_Hoover: That isn't supported in the construction yet
01:31:00 <hppavilion[2]> Phantom_Hoover: Mostly because I have NFC how to do it using regexes alone
01:31:10 <hppavilion[2]> Probably some PCRE bullshit that detects nested parenthesis
01:31:48 <hppavilion[2]> Phantom_Hoover: Think I should just make Thoof's online impl sooner instead of something complicated on IRC
01:32:41 <hppavilion[2]> Phantom_Hoover: If you want to keep the rest, you have to do something complicated with the filesys and stuff (yes, Thoof is going to support a Unix filesys as part of its provingness)
01:33:54 <hppavilion[2]> Phantom_Hoover: Besides, what do you expect it to do with the tail of the list?
01:35:30 <Phantom_Hoover> no that wasn't the issue, it's the fact that it can't recurse and it can't apply
01:37:17 <hppavilion[2]> Phantom_Hoover: It is TC actually
01:37:32 <hppavilion[2]> Phantom_Hoover: The fixpoint operator makes it reduce to Thue
01:37:42 <hppavilion[2]> (Fixpoint is when you prefix an application with @)
01:38:34 <hppavilion[2]> Phantom_Hoover: It also supports pattern matching and multiproving
01:39:26 -!- heroux has quit (Remote host closed the connection).
01:39:35 -!- heroux has joined.
01:43:13 -!- Phantom_Hoover has quit (Read error: Connection reset by peer).
01:51:29 -!- andrew__ has joined.
01:52:28 -!- andrew__ has quit (Remote host closed the connection).
01:56:32 -!- hppavilion[2] has quit (Ping timeout: 244 seconds).
02:00:20 -!- AlexR42 has joined.
02:08:07 -!- hppavilion[2] has joined.
02:08:09 -!- hppavilion[2] has changed nick to hppavilion[1].
02:08:28 <hppavilion[1]> tswett: Hi
02:11:55 <prooftechnique> hppavilion[1]: Is that a DEFCON, or a countdown?
02:12:15 <hppavilion[1]> prooftechnique: What part? The [1]?
02:12:25 <prooftechnique> Yeah
02:12:37 <hppavilion[1]> http://smbc-comics.com/index.php?id=2941
02:12:44 <hppavilion[1]> prooftechnique: My nick is usually hppavilion[1]
02:12:50 <hppavilion[1]> prooftechnique: The [2] is my backup nick
02:12:58 <hppavilion[1]> prooftechnique: Which I sometimes am too lazy to change back to [1]
02:13:07 <hppavilion[1]> prooftechnique: It's an array index, hth
02:13:16 <prooftechnique> Are you rivals with hppavilion[0]? hppavilion prime?
02:14:03 <prooftechnique> I thought so, hence my attempt to sizeof(hppavilion) / sizeof(hppavilion[0]), earlier
02:15:00 -!- AlexR42 has quit (Quit: My Mac has gone to sleep. ZZZzzz…).
02:15:43 <hppavilion[1]> prooftechnique: hppavilion['wc'] is my alter ego, when hexchat stops working. It's very strange and causes a type error in most languages.
02:16:03 <prooftechnique> How rude
02:17:06 <hppavilion[1]> prooftechnique: Also, I'm not an array so much as a haskell-like list
02:17:23 <hppavilion[1]> prooftechnique: But one that can be indexed with [] in postfix, because I'm written in haskll
02:17:26 <hppavilion[1]> *haskell
02:17:31 <hppavilion[1]> I'm written in Jskell
02:17:37 <hppavilion[1]> jayskell
02:29:03 -!- hppavilion[1] has quit (Ping timeout: 244 seconds).
02:35:36 -!- hppavilion[1] has joined.
02:35:36 <\oren\> godammn windows update holding computer hostage
02:38:16 <prooftechnique> Windows is shutting down now!
02:39:47 -!- augur has quit (Remote host closed the connection).
02:44:44 -!- p34k has quit.
02:57:17 -!- andrew__ has joined.
02:57:25 -!- andrew__ has quit (Read error: Connection reset by peer).
03:02:46 -!- blockzombie has left.
03:16:52 <hppavilion[1]> \oren\: As an arbitrary selection, I have a question: Which should I put effort into first- a Haskell-like language that compiles to JS (jayskell), or a LISPy language that also compiles to JS?
03:17:07 <hppavilion[1]> \oren\: Or some other language format?
03:18:28 <mad> what kind of software do you want to write?
03:19:19 <hppavilion[1]> mad: Fun software that runs on the web
03:21:21 <mad> runs on the web? like on people's browsers or on servers?
03:23:05 <hppavilion[1]> mad: In browsers
03:23:40 <hppavilion[1]> mad: It's just another language that compiles to JS so we don't have to use that godawful language and can instead use one we're more familiar with the mindset of
03:24:01 <mad> JS isn't THAT bad
03:24:23 <hppavilion[1]> mad: It's pretty bad
03:24:27 <zzo38> I happen to think JavaScript is pretty good actually
03:24:42 <hppavilion[1]> zzo38: It may be good for its niche, but it isn't very good in general
03:24:43 <zzo38> I am writing a X client library in JavaScript.
03:25:04 <zzo38> I also wrote a Z-machine implementation in JavaScript, too.
03:25:25 <hppavilion[1]> zzo38: I heard
03:25:45 <hppavilion[1]> Ugh
03:25:54 <hppavilion[1]> At 27% battery and can't get my charger to work
03:27:14 -!- hppavilion[2] has joined.
03:28:54 -!- lleu has quit (Quit: That's what she said).
03:30:11 -!- hppavilion[1] has quit (Ping timeout: 248 seconds).
03:30:33 -!- oerjan has quit (Quit: Nite).
03:36:33 -!- hppavilion[2] has quit (Ping timeout: 240 seconds).
03:42:09 -!- hppavilion[2] has joined.
03:42:40 -!- nisstyre has joined.
03:44:47 <hppavilion[2]> mad: What paradigms would be good for web that haven't been done much yet?
03:56:25 -!- hppavilion[2] has quit (Ping timeout: 240 seconds).
04:24:45 -!- AlexR42 has joined.
04:27:44 -!- idris-bot has joined.
04:36:19 <zgrep> If what people have done to the web so far is to be taken into account, then apparently all of them.
04:38:14 <myname> anything stateful would be good for the web
04:40:42 -!- treaki_ has joined.
04:44:47 -!- treaki__ has quit (Ping timeout: 260 seconds).
04:46:38 <ais523> maybe ther are no paradigms that are good for web?
04:47:34 <myname> that too
04:54:56 <mad> hm
05:00:53 -!- hppavilion[2] has joined.
05:01:08 <mad> maybe it could have the model where instead of having a single script control gfx elements like buttons and so forth
05:01:28 -!- AlexR42 has quit (Quit: My Mac has gone to sleep. ZZZzzz…).
05:01:59 <mad> it could instead have buttons etc and you attach an individual script to a button/object
05:02:29 <mad> with easy callbacks like :onclick()
05:03:18 <mad> and individual scripts each have their own thread
05:03:44 <mad> which gets a timeslice until the next wait() statement every displayed frame
05:04:36 <Taneb> I am not sure why I am awake but I am
05:06:47 <myname> because you do not sleep
05:07:47 -!- hppavilion[2] has quit (Ping timeout: 248 seconds).
05:20:42 <ais523> Taneb: because when you're tired, it makes it harder to make decisions, and one such decision is to go to sleep
05:20:55 <ais523> this is something I have problems with myself
05:21:22 <Taneb> ais523, actually, I went to bed at half past ten
05:21:33 <ais523> am or pm?
05:21:36 <Taneb> pm
05:21:50 <ais523> 10:30 to 5:21 is about 7 hours
05:21:58 <ais523> which is a reasonable amount of night's sleep
05:22:03 <Taneb> I got out of bed at 4:40
05:22:14 <Taneb> First woke up at 3:27
05:22:17 <ais523> oh, hmm
05:22:21 <ais523> I get out of bed long after I wake up
05:22:27 <ais523> but that's at least partly because I do most of my work in bed
05:24:27 <ais523> hm, a spambot is trying to sell me web design services:
05:24:35 <ais523> "1.) Website Design & Redesign - (Logo design, Flash, Photoshop to HTML/ HTML5)"
05:25:08 <ais523> I'm not 100% sure how this parses, but it seems to involve "Photoshop to HTML" either as a unit or as part of a larger whole, no matter how it's parsed
05:25:59 <ais523> they also apparently do Windows Phone and Blackberry in addition to Android and iPhone
05:26:34 <ais523> in terms of app development
05:34:05 <myname> lol flash
05:34:33 <coppro> "Furthermore, if one counts demonstrations *not* based on quantum computing, some people have claimed even earlier precedents for [the theorem that 3 \times 5 = 15]."
05:35:16 <pikhq> That sounds like an occasionally useful theorem.
05:35:52 <coppro> furthermore, scott aaronson is hopeful that quantum computing will soon be able to tackle the factorization of large numbers like 91
05:36:05 <pikhq> One does wonder.
05:37:21 <ais523> coppro: what do you think of the theory that quantum computing will prove the many-worlds hypothesis of quantum mechanics via violating bounds on the processing power that can exist in one universe?
05:37:39 <ais523> if something like that /is/ the case, it could be that "large" quantum computers are impossible to construct
05:37:47 <mad> quantum computers sound like something that's great for the NSA to have but not really for anyone else
05:38:05 <coppro> ais523: I think that's a stupid view
05:38:23 <coppro> many-worlds is not really a theory so much as an interpretation
05:38:25 <Taneb> mad, I hope it's useful because next year I'm doing two modules on them
05:38:39 <coppro> it's the science fiction authors who ran with it and then everybody started getting philosophical
05:38:39 <ais523> mad: having faster algorithms often ends up having applications unrelated to crypto
05:38:41 <mad> o
05:39:01 <ais523> hmm, I was going to say "is there a quantum solution to the travelling salesman problem"
05:39:11 <mad> hmm
05:39:15 <coppro> by which you mean BQP, presumably?
05:39:24 <mad> ais523 : I think there might be
05:39:32 <ais523> coppro: by which I meant a quantum computer, but then I remembered NP =? BQP
05:39:36 <ais523> and realised the question wasn't interesting
05:39:45 <ais523> except inasmuch as NP =? BQP is interesting
05:40:45 <pikhq> Yeah, many-worlds as physicists think of it is rather less silly than what philosophers think. :)
05:41:07 <pikhq> Well, "philosophers".
05:41:25 <mad> there's a difference between the physicists' many-worlds?
05:41:35 <ais523> it's basically just a debate about whether the universe uses threads or processes
05:42:13 <pikhq> Physicists notion of "many-worlds" is basically just "for each possible state in a quantum superposition, those states can be said to exist."
05:42:35 <shachaf> pikhq: what about "many-worlds" in linear logic twh
05:42:51 <coppro> importantly
05:43:01 <ais523> hmm, and /now/ I'm reminded of the proof that God exists due to God being defined as having all positive qualities, and existence is a positive
05:43:11 <coppro> many-worlds (usually) makes no actual predictions, so it's not really a hypothesis
05:43:14 <ais523> I am not convinced that that holds up either logically or theologically
05:43:29 <coppro> ais523: more precisely
05:43:30 <mad> ais523 : that's a classic
05:43:34 <ais523> (how do you define a positive quality anyway?)
05:43:50 <coppro> the argument goes "consider the greatest possible being. This being must exist, because if it didn't, surely a being that existed would be greater."
05:43:58 <coppro> which presupposes the existence of a greatest possible being
05:44:08 <pikhq> coppro: Yeah, many-worlds really is just "well, this is what the equations describe".
05:44:09 <ais523> coppro: well if there aren't infinitely many beings…
05:44:10 <mad> yeah it has all sorts of logical flaws
05:44:48 <ais523> however, I think that argument is equivalent to "nothing is better than eternal life, a ham sandwich is better than nothing, therefore a ham sandwich is better than eternal life"
05:45:06 <ais523> one of the "greatest" is a "greatest hypothetical", the other is a "greatest currently existing", and the two are conflated
05:45:08 <coppro> ais523: infinitely many *possible* beings, though?
05:45:22 <shachaf> ais523: I remember reading about this in a Smullyan book.
05:45:23 <coppro> not to mention the assumption of an upper bound, which not all posets possess
05:45:25 <ais523> coppro: it's conflating two different things and hoping you don't notice
05:45:39 <shachaf> Would you say that everything exists, or that existence is a property that some things have and some things don't?
05:45:55 <ais523> shachaf: I'd say that that question is a debate about the meaning of the word "everything"
05:46:12 <mad> the concept of a perfect god has many qualities
05:46:33 <mad> but the real-world existance is not a quality of that concept
05:46:36 <coppro> I enjoy the Stewart/Cohen/Pratchett characterization of the argument as being an "argument from God" rather than an "argument for God"
05:47:03 <mad> since real-world existance is a quality of the real world, not a quality of concepts
05:48:16 <mad> it's like a c++ class having a variable that's not in the computer
05:48:52 <ais523> mad: I read that correctly the first time, looked back to it, looked at it again, and misparsed it as meaning something like "the real world defines itself to exist"
05:49:12 <ais523> also, depending on what you mean by "class having a variable", that's totally possible
05:49:19 <ais523> you could have network-abstracted getters and setters
05:49:22 <mad> yeah I'm like... "this fomulation is clumsy"
05:50:03 <ais523> now I'm wondering if stable time loops could exist in real life
05:50:08 <mad> ais523 : well then it's not really a variable, it's something that pretends being a variable with setters and getters
05:50:14 <coppro> ais523: theoretically, yes
05:50:18 <coppro> ais523: CTCs
05:50:36 <coppro> Fascinatingly, depending on their exact properties, they may or may not allow for increased computing power
05:50:47 <ais523> it was eye-opening doing the maths for my semantics and discovering that it worked perfectly fine without causality
05:50:56 <mad> is it possible, in a many-worlds universe
05:51:09 <coppro> mad: question doesn't make sense
05:51:13 <ais523> had to add causality to get it to reflect the thing it was meant to model
05:51:14 <coppro> many-worlds makes no predictions
05:51:14 <mad> for an universe to essentially be a dead-end so that
05:51:26 <coppro> ais523: the thing that most makes me want to get a physics phd
05:51:44 <coppro> is that quantum field theory, the most advanced understanding of the microscale world that we have, has no causa,ity
05:51:47 <coppro> *causality
05:52:02 <mad> like, the universe gets to that dead end, decides that it's not possible, so that path is eliminated so that the universe goes through some other path
05:52:05 <ais523> causality really isn't something that drops naturally out of maths and physics
05:52:32 <ais523> hmm, maybe there's a really deep philosophical meaning behind "sometimes things just happen", a phrase whose truth value I've seen heavily debated (but not really with arguments, mostly as a shouting match)
05:52:46 <mad> which has the side effect of skewing event probability statistics for situations that can lead to "dead end" paths
05:53:18 <ais523> mad: this is the theory behind quantum bogosort
05:53:37 <ais523> which should probably never be implemented, because imagine what would happen if you were wrong about how physics works?
05:53:38 <coppro> ais523: no, it isn't. It comes from thermodynamics, but calling them the "laws" of thermodynamics overstates them... I cringe every time I hear something "proven" due to thermodynamics
05:54:08 <ais523> coppro: well the laws of thermodynamics are observations which, so far, appear to hold in the universe
05:54:12 <coppro> ais523: right
05:54:26 <ais523> I'm not sure if we have explanations for why they're true, they're just a data point for helping to understand things
05:54:28 <coppro> but they are defined in terms of causality
05:54:48 <coppro> specifically the directionality of time
05:54:56 <ais523> yes, they're time-asymmetric
05:54:59 <ais523> which is pretty rare, really
05:55:02 <coppro> yes
05:55:05 <coppro> and a huge problem
05:55:08 <coppro> qft is not
05:55:16 <coppro> well
05:55:24 <coppro> it's CPT-symmetric
05:55:48 <coppro> there's a very intereting paper out there on the arxiv discussing the thermodynamics of antimatter
05:56:34 <mad> ais523 : well, I was wondering if this "universe suicide" naturally happens due to the laws of physics
05:56:53 <coppro> it describes models of antimatter where the thermodynamics work parallel or antiparallel to our own, the consequences, and concludes that both are compatible
05:57:14 <coppro> (with physics as we know it, not with each other
05:57:14 <coppro> )
05:57:17 <mad> like the probability density of some event is due to the relative probability of each resulting universe of not comitting universe-suicide
05:57:18 <ais523> mad: so you mean that you think it's impossible to set up a situation in which the universe will eventually be destroyted?
05:57:19 <coppro> but either result is fascinating
05:57:33 <ais523> and that things that would make it easier to happen are less probable as a result?
05:57:47 <ais523> coppro: hmm, what if it's undecidable?
05:57:52 <coppro> ais523: it's not
05:57:53 <mad> ais523 : well, for a specific kind of universe destroying
05:57:56 <coppro> it's a physical property of the universe
05:58:08 <coppro> observable, even
05:58:22 <mad> ais523 : like as if the whole universe decides 'no' and that path is removed from the possibilities retroactively
05:58:26 <ais523> in that case there's not much point in wondering until we get to observe it
05:58:39 <ais523> mad: as I said, this is how quantum bogosort "works"
05:58:39 <coppro> but it's worth thinking of an experiment
05:58:49 <mad> ais523 : right
05:58:52 * ais523 wonders how quickly quantum computers can sort things
05:58:54 <coppro> if antimatter is parallel to matter, then QFT is incomplete because thermodynamics breaks CPT symmetry
05:59:12 <coppro> ais523: n log n
05:59:36 <coppro> if antimatter is antiparallel to matter, then there are regions where thermodynamics work locally backward (though, still, globally forward, assuming a strong enough matter surplus)
05:59:52 <mad> my limited understanding of quantum computers is that basically it's got a distinct independent probability for every combination of qubits in it
05:59:58 <mad> until you collapse it
06:00:11 <coppro> mad: not independent
06:00:13 <ais523> mad: probabilities can be entangled
06:00:18 <coppro> that's rather the point
06:00:30 <ais523> right, you couldn't do useful computation with it otherwise
06:00:48 <mad> well, that's why I said probability for "combinations of qubits" instead of probability for "qubits"
06:00:58 <coppro> but they're not independent
06:01:02 <coppro> and they are not probabilities
06:01:31 <coppro> a quantum system of n qubits is viewed as a 2^n vector, one entry corresponding to each possibly binary state, yes
06:01:32 <mad> yeah it's that weird complex domain thing where the probability is the square of the magnitude right?
06:01:37 <coppro> yes
06:01:56 <coppro> each entry is a complex number with the condition that the vector must have norm 1
06:02:16 <coppro> so an n-qubit system is a point on the 2^n-dimensional complex unit sphere
06:02:51 <coppro> when you measure, the probabilities collapse to classical ones by taking the magnitude squared
06:03:15 <coppro> but when you manipulate qubits, the fact that entries are complex can lead to unintuitive results
06:03:53 <ais523> this sort of thing is what causes wave/particle duality
06:04:07 <myname> i like the H gate
06:04:10 <ais523> quantum electrodynamics has some strong predictive power
06:04:15 -!- lambda-11235 has quit (Quit: Bye).
06:05:15 <myname> H(1) is a state with 50% propability for 0 and 1, H(0) is a state with 50% propability for 0 and 1, H(H(1)) is 1 and H(H(0)) is 0
06:05:33 <coppro> yeah, that's a great example
06:05:59 <coppro> X, Y, and Z are boring by comparison
06:06:35 <myname> it took me a while to make sense
06:06:44 <myname> but there are great youtube videos
06:06:59 <ais523> I implemented shor's algorithm as an a level project
06:07:20 <ais523> (not on a quantum computer, obviously; on a simulator on a regular CPU that did arithmetic on the quantum probabilities)
06:07:48 <coppro> I had a pretty fantastic professor
06:07:50 <myname> i liked the point at one video where someone told he could emulate up to 8 qubits but that would take tbs of ram
06:08:05 -!- lambda-11235 has joined.
06:08:22 <ais523> poor 15
06:08:33 <ais523> everyone factorizes it because they don't have any other options
06:08:33 <coppro> all the lectures were recorded and put up as private videos on youtube too
06:09:15 <ais523> coppro: how useful is that as a student? they're trying to make that happen here but many of the staff are very uncomfortable with it
06:09:37 <coppro> ais523: extremely
06:09:39 <ais523> and gathering more data would be useful to help me know what my opinion should be
06:09:58 -!- hppavilion[wc] has joined.
06:10:01 <coppro> ais523: and I even attended those lectures
06:10:33 <coppro> putting them up privately is an interesting decision
06:10:35 <ais523> there are a ton of students who write down everything the lecturer says, which I never really understood
06:10:53 <coppro> some of them find it easier to learn that way
06:11:22 <coppro> some of them just want reference material that actually matches up to the lectures (which rarely correspond to the textbook, if any, used)
06:11:26 <coppro> some of them don't know better
06:11:36 <coppro> ais523: also interesting that you say "staff"
06:11:45 -!- vyv has quit (Ping timeout: 244 seconds).
06:11:50 <coppro> do you mean teaching staff?
06:11:56 <ais523> coppro: what do you expect me to have said? but yes, teaching staff
06:12:16 <ais523> I imagine the sysadmins are a little annoyed too but mostly in a "more work" sort of way
06:12:39 -!- vyv has joined.
06:13:47 <mad> what if "rejected" universes of the multiverse don't "selfdestruct" like in quantum bogosort but go backwards in time and make themselves impossible? (ok I clearly don't know enough about quantum physics to ask this but I'm still curious)
06:13:56 <coppro> ais523: here, the distinction between "staff" and "faculty" is quite sharply draw
06:13:59 <coppro> *drawn
06:14:15 <zzo38> Do some of students know how to write shorthand so that they can write everything they say?
06:14:15 <ais523> ah right, probably just an international language variant thing
06:14:21 <coppro> mad: it's not really a physics question
06:14:26 <ais523> I'm aware of the word "faculty" being a word but am not really sure what it means
06:14:37 <coppro> ais523: not neceessarily, because there's a class aspect to it
06:14:39 <ais523> zzo38: possibly, but it's common for students to ask lecturers to wait so that the student can finish writing
06:14:51 <ais523> so you can't, as a lecturer, really talk faster than the slowest student writes anyway
06:14:56 <coppro> faculty are the professors and, increasingly, lecturers
06:15:01 <shachaf> @wn faculty
06:15:02 <lambdabot> *** "faculty" wn "WordNet (r) 3.0 (2006)"
06:15:02 <lambdabot> faculty
06:15:02 <lambdabot> n 1: one of the inherent cognitive or perceptual powers of the
06:15:02 <lambdabot> mind [syn: {faculty}, {mental faculty}, {module}]
06:15:02 <lambdabot> 2: the body of teachers and administrators at a school; "the
06:15:04 <lambdabot> dean addressed the letter to the entire staff of the
06:15:06 <lambdabot> university" [syn: {staff}, {faculty}]
06:15:22 <coppro> and ranking administrators, of course, since they must be professors themselves
06:15:24 <ais523> wordnet has a "syn:" on the words
06:15:37 <ais523> wait, there's a rule that administrators must be professors?
06:15:39 <coppro> ais523: many professors here simply go as fast as they can explain the math, and it's up to you to catch up
06:15:53 <coppro> ais523: Anyone with authority over a professor must be.
06:16:07 <zzo38> coppro: Then you must learn shorthand writing
06:16:09 <ais523> here the main problem with finding qualified people to administrate is to persuade them to take the job, few people want to
06:16:11 <coppro> so department chairs, deans, some vice-presidents, and presidents
06:16:16 <ais523> and the people who do are rarely suited for it
06:16:23 <coppro> that's a problem here too, moreso at the department level
06:16:28 <zzo38> If it is up to you to catch up.
06:16:37 <coppro> at the higher ranks, some academics are career administrators and move from school to school
06:16:53 <coppro> the senior administrators don't actually teach, mind you
06:17:11 <mad> academia
06:17:46 <ais523> well, there's a "central administration" which doesn't teach and isn't attached to a subject
06:17:49 <coppro> there is a strong culture that academics should not be subject to non-academics' authoirty
06:18:07 <ais523> but everyone associated with a subject, including as a head of school or whatever, teaches too, as far as I know
06:18:21 <coppro> it depends how high up you are
06:18:29 <coppro> and the size of your unit, etc.
06:18:30 <ais523> what do you do about people like human resources, accounting, etc.?
06:18:37 <coppro> those are the staff
06:18:39 <coppro> "staff"
06:18:42 <ais523> those people have a lot of authority, and sort-of need it to do their jobs
06:18:51 <coppro> they do, but not direct authority
06:18:54 <\oren\> my dad deliberately takes more teaching work in order to avoid administrative work as much as possible
06:18:56 <ais523> but they aren't generally academics and it doesn't make much sense for them to be
06:19:18 <coppro> basically, no academic has a non-academic in their chain of command
06:19:27 <coppro> doesn't mean that the non-academics have no power!
06:19:32 <ais523> chain of command can be fairly meaningless at times
06:19:48 -!- hppavilion[wc] has quit (Quit: Page closed).
06:19:52 <coppro> it's more a matter of principle really
06:20:06 <\oren\> usually they avoid a chain of command by having lots of commitees that my dad never attends
06:20:25 <Taneb> \oren\, what does your dad teach?
06:20:30 <coppro> but it's also to reserve academic decisions to the academics
06:20:31 <\oren\> math
06:20:42 <Taneb> Only one math?
06:20:59 <coppro> since the suppport staff don't make academic decisions, and they never have academics as reports, the academics can't be told what to teach/research by the non-academics
06:21:25 <\oren\> specifically, calculus, logic, and operations research (this year)
06:21:53 <Taneb> Nice!
06:22:14 <ais523> coppro: we can basically be limited in what to research by what we can get funding for
06:22:20 <ais523> which often depends on external entities
06:22:52 <coppro> ais523: that's true here too
06:23:00 <coppro> and the academics chafe against that, naturally
06:23:12 <ais523> yes
06:23:17 <coppro> in large part, the real chafing is against the government
06:23:17 <ais523> some of the requirements are often bizarre
06:23:21 <coppro> as I'm sure you have there too
06:23:57 <ais523> hmm, I'm not sure, the government is many steps away indirectly, and the EU government probably matters more than the UK government for the purpose
06:24:16 <ais523> although that's kind-of specific to being in Europe
06:24:30 <coppro> the government controls the purse-strings, though
06:24:43 <coppro> for instance, a lot of people here in Ontario are upset with the degree of enrollment growth at universities
06:24:51 <coppro> feeling that it's diluting the quality of education
06:25:03 <coppro> but the government has decided that funding is allocated based on enrollment growth so up it goes
06:26:00 <ais523> oh, rapid increases in attendance can be a problem here too
06:26:46 <ais523> we're building constantly to try to keep up; the building I'm in had its layout changed, e.g. all the common rooms were combined into one and the old ones were converted into offices, just to try to get more office space
06:26:56 <Taneb> As a student I'm not really privy to the inner workings of my university, but it got fined a couple of years ago for taking on more students than it could accomodate
06:27:14 <\oren\> well the problem is that people enroll in degrees and don't learn anything useful, and then complain that they can't pay their loans
06:27:22 <Taneb> About 300 students who were guaranteed on-campus accomodation were housed off-campus (I was one of them)
06:27:24 <Lymia> !ztest semanticsTest (>(>{})*1)%2 <<<
06:27:25 <zemhill> Lymia.semanticsTest: points -32.14, score 2.99, rank 47/47
06:27:27 <ais523> and a bunch of the land nearby got bought up and now student accommodation is being built on it (in the passive because I'm not entirely sure who's responsible for that happening)
06:27:32 <Lymia> !ztest semanticsTest (>(>{})*1)%2 <<<<<
06:27:32 <zemhill> Lymia.semanticsTest: points -46.00, score 0.00, rank 47/47
06:27:48 <Lymia> !ztest semanticsTest (>(>{})%1)*2 <<<
06:27:49 <zemhill> Lymia.semanticsTest: points -32.14, score 2.99, rank 47/47
06:27:51 <ais523> Lymia: that's equivalent to (>(>{})%1)*2
06:28:03 <coppro> Taneb: I was on both of said senate and board as a student representative. It was a fascinating experience.
06:28:04 <ais523> and some <s, obviously
06:28:46 <ais523> there was a bed shop nearby which had a slogan that's been much-quoted by my family: "if you can't buy a bed today, you are not in Beds Direct"
06:28:50 <Lymia> I'm not actually sure how to test which way it does it.
06:28:51 <Lymia> But, bleh.
06:28:52 <\oren\> but it is hard to blame people who are told they have to have "a degree in something" to get a job
06:28:56 <Lymia> oh.
06:29:00 <ais523> it got demolished to build more student accommodation, we're a little upset about that
06:29:05 <Lymia> I guess it fits what the wiki says. :/
06:29:18 <ais523> (I assume the slogan worked, given that I did actually get my current bed from there)
06:29:23 <Lymia> "Any parentheses which directly contain braces after expansion of all interior parentheses must be terminated by a %."
06:29:32 <Taneb> ais523, where are they going to get the beds for the student accomodation
06:29:42 <ais523> Taneb: I'm not sure
06:29:50 <Lymia> It implies that, by spec, (({})*2)%2 should be expanded like this: ({}{})%2
06:29:53 <Lymia> Which is invalid.
06:29:57 <ais523> perhaps they took the beds out before they demolished it and are planning to put them back afterwards
06:30:04 <ais523> Lymia: (({})*2)%2 is invalid by spec
06:30:09 <Taneb> That would make sense
06:30:14 <ais523> however, zemhill treats * and % as synonyms
06:30:22 <Lymia> ais523, right.
06:30:23 <ais523> because they're always uniquely distinguishable by where the {} are
06:30:35 <Lymia> I would have expected it to expand like this: (()%2)%2
06:31:06 <Lymia> Which would be a slightly different spec: ()% blocks are matched with their corresponding {} blocks, then expanded first. then ()* blocks are expanded.
06:31:41 <ais523> ({({})%2})%2 is equivalent to (({{}})%2)%2
06:31:48 <ais523> although it'd be a bit clearer if you used larger and different numbers
06:32:12 <mad> would a quantum functionnal language be possible?
06:32:25 <ais523> (({{}})%5)%3 expands to ({({({{}})%5})%5})%5
06:32:32 <Lymia> I'd expect (({})*2)%2 to be valid, and expand to (()*2)*2
06:32:39 <ais523> mad: well the thing about quantum computing is that everything has to be reversible
06:32:50 <ais523> so you could start by trying to make a reversible functional language
06:32:56 <Lymia> I don't see why you can't make a declarative functional language.
06:33:00 <ais523> Lymia: what does (a(b{c}d)*2e)%2 expand to?
06:33:01 <Lymia> Er
06:33:02 <Lymia> quantum*
06:33:31 <ais523> oh, I think I see how you're parsing it
06:33:49 <ais523> a(ba(bcd)*2ed)*2e
06:34:07 <ais523> that actually works, I think
06:34:10 <Lymia> ais523, Under the scheme that distinguishes ()* and ()%? (a(b{c}d)*2e)%2 -> a(ba(bcd)*2ed)*2e
06:34:16 <ais523> next question is "is it useful", but it probably is
06:34:59 <Lymia> But to be less confusing, the BF Joust page should probably just make having )* and )% synonyms is standard, and explain that the two symbols exist for historical reasons.
06:35:10 <Lymia> Or, at least.
06:35:43 <Lymia> Be clear that there's no distinction between )% and )* that lets you make nestings that implementation wouldn't
06:35:48 <mad> i see
06:35:52 <Lymia> Since they're explicitly forbidden.
06:36:26 <ais523> we could arguably change the semantics again
06:36:41 <ais523> the inside {} matches outside % rule is pretty new, and came out of a discussion in #esoteric
06:36:59 <ais523> I still don't use it in any of my programs (even though it would have helped a couple of times) because I don't trust interpreters with it
06:37:20 <ais523> (I don't consider the #esoteric hills to define BF Joust, although IIRC nyuroki was originally written for an implementation that didn't even support %)
06:37:49 <Lymia> That one had a completely different algorithm.
06:37:53 <Lymia> Basically a different program.
06:38:28 <ais523> ah right
06:38:30 <ais523> you just like the name?
06:38:37 <Lymia> Or, well. Yeah. Basically. Didn't check before decoys either.
06:38:42 <Lymia> Not quite
06:38:49 <Lymia> It was originally the same program.
06:38:54 <Lymia> Then lots of changes happened.
06:39:01 <Lymia> So maybe it should have a 2 on the end.
06:39:02 <ais523> hmm
06:39:09 <Lymia> But it didn't
06:39:12 <Lymia> So it doesn't
06:39:28 <ais523> margins3 is basically an entirely different program from margins except that it uses the same basic strategy of playing for a draw if conditions in the first few turns don't work out favourably
06:40:01 <ais523> hmm, that is the first time I've used Firefox's "search for an open tab" thing intentionally
06:40:08 <ais523> to get at the zemhill matrix
06:40:15 <Lymia> Both use the same basic strategy still too.
06:42:55 <ais523> Lymia: btw I updated the wiki article to talk about decoy detection
06:43:39 <Lymia> I saw.
06:44:08 <Lymia> Basically, both versions set decoys, then go do a slowish clear.
06:44:35 <ais523> that's a description of 90% of hilltopping programs over the last several years
06:45:02 -!- lambda-11235 has quit (Quit: Bye).
06:45:08 <Lymia> And its strategy for anti-lock was to nest another copy of the clear loop after it falls through (under some conditions) so it does make leaps of faith.
06:46:21 <ais523> leaps of faith are something that IMO you can't do if you're looking for a 100% win rate, but may help if you're only going for topping the hill
06:46:39 <ais523> certainly, it's possible to do very well by exploiting the existence of leaps of faith on the hill
06:47:29 * ais523 checks if anticipation2 is still there
06:47:41 <Lymia> 0% lose rate rather, right?
06:47:51 <Lymia> If margins had no tripwire
06:47:53 <ais523> it is
06:48:03 <Lymia> It would force leaps of faith, or else, you can't win.
06:48:15 <Lymia> But you'd probably take ties too, if margins is willing to.
06:48:15 <ais523> Lymia: oh, by that, I mean it gets a better than 50:50 record against each other program
06:48:27 <Lymia> ah.
06:48:28 <ais523> there are programs I've written before now that have pulled that off and /not/ topped the hill at that time
06:48:53 <ais523> (although they did so later; in some cases I may have edited my own programs to lose to them temporarily to give them their moment at the top of the hill)
06:49:20 <ais523> margins strikes me as not being the sort of program for which a 100% win rate is feasible
06:49:29 <ais523> although I've been wrong before now
06:51:58 <Lymia> I should try to make a nyuroki 2, or something.
06:52:16 <Lymia> Keep the basic approach, but, actually react appropriately to different behaviors.
06:52:28 <Lymia> Instead of just skipping decoy setup and going straight to rush.
06:53:12 <ais523> the thing is, the basic reactions to behaviours have become so standardised now that people have started exploiting them
06:53:24 <ais523> omnipotence trips enemy tripwires intentionally then starts defending, for exampel
06:53:39 <ais523> which tends to cause the opponents to assume fast rush and not use counter-defence mechanisms
06:54:48 <Lymia> What about..
06:55:03 <Lymia> Set a tripwire right next to your flag, then do the reverse decoy setup?
06:55:04 <Lymia> Hrm.
06:55:27 <ais523> Lymia: right, that's what most programs do at the moment
06:55:38 <ais523> typically checking the tripwire every now and then, and panicking if it gets tripped
06:56:01 <ais523> (the basic problem being that you can /detect/ that the enemy is on your flag, but it's much less clear what you're meant to do about it)
06:56:05 <Lymia> I'm trying to think of if there's a case where
06:56:17 <Lymia> I find a conflicting decoy setup, and it matters if the flag tripwire is broken.
06:56:18 <ais523> various possibilities involve attempted locks, and careless clears
06:56:53 <Lymia> I might steal Margin's double tripwire here, and just attempt a lock.
06:57:07 <ais523> well if the flag tripwire is broken as the result of a decoy clash you can typically assume that the tape's no longer than about 11
06:57:46 <ais523> flag tripwire broken as the result of a deep poke or fast rush is much more likely
06:58:01 <ais523> in either case, decoys aren't going to help, but it's less clear what you should do instead
07:00:20 <Lymia> I jumped straight to cell 14 if I didn't find a decoy conflict, in fact.
07:00:42 <Lymia> That might be a bad assumption though
07:00:54 <Lymia> Since it assumes reverse decoy setups from the opponents.
07:01:09 <coppro> amazing how such a simple game has become so complex
07:01:30 <coppro> maybe if I get really bored someday I'll do genetic evolution of bfjoust programs
07:01:34 <ais523> Lymia: well, I think about BF Joust like this:
07:01:38 <ais523> there are two main classes of programs
07:02:03 <ais523> there's the "standard strategy" programs, for which the actual strategy changes slowly over time, but for which the programs tend to converge
07:02:11 <ais523> and the "experimental" programs that are doing something weird
07:02:24 <ais523> to do well you have to beat both classes
07:02:38 <ais523> beating standard strategy programs normally relies on exploiting their common weaknesses (see, e.g. ais523.counterpoke)
07:03:06 <Lymia> I don't think BFJoust is ammendable to genetic evolution.
07:03:16 <ais523> beating experimental programs relies on having a good, resilient strategy (such as a ton of large decoys) that's generally hard to defeat quickly
07:03:25 <Lymia> You'd need to smooth out the fitness landscape somehow
07:03:25 <ais523> and having some sort of valid attack
07:03:36 <ais523> now, the best programs for beating experimental programs are normally the standard ones
07:04:10 <ais523> whereas a programs designed to consistently beat standard programs tends to have to be experimental
07:04:32 <ais523> (but most experimental programs will fail to beat standard programs unless they identify a common weakness that allows them to do so)
07:04:41 <Lymia> Part of it might be that Nyuroki's flaws aren't standard at all, so, experimental programs fail to poke at them..
07:05:35 <ais523> I need to analyze nyuroki more, really
07:05:44 <ais523> typically I run programs on tape length 25 against a few other programs to see how they work
07:05:50 <ais523> because that allows you to see the "main strategy"
07:06:07 <ais523> (you have more tape length to see the patterns play out)
07:06:16 <ais523> but that doesn't really hold in cases where decoy clashes, etc., are an intended part of the duel
07:06:33 <Lymia> Is detecting short tape lengths relatively standard now?
07:07:02 <ais523> I normally make some attempt at it but it normally isn't very successful
07:07:22 <ais523> poking has been done for ages, and is definitely part of what I would consider the standard strategy
07:07:25 <ais523> (although the form of the poke varies)
07:07:36 <ais523> and poking gives a lot of clues about the tape length
07:07:42 <ais523> it was pretty revolutionary when quintopia invented it
07:08:35 <ais523> although Gregor's versions of it (the furry girls) are probably the most definitive; the original quintopia_poke was very primitive
07:09:35 <Lymia> Hrm.
07:09:48 <Lymia> Part of it is that you can only do so much in the earlier steps of the game.
07:10:05 <ais523> wow, ffspg is down at #38
07:10:07 <Lymia> You can't poke after so long
07:10:09 <ais523> how the mighty has fallen
07:10:19 <ais523> Lymia: right, the first few turns are very critical
07:10:24 <Lymia> You think there's still time to do the reverse decoy setup thing after a poke?
07:10:34 <ais523> do you aim to block enemy pokes, set up your own, or a bit of both?
07:10:37 <ais523> and there's totally time
07:10:43 <ais523> you leave a medium decoy on cell 6 or so
07:10:49 <ais523> and hope that the opponent's poke didn't get inside it
07:10:58 <Lymia> But you might just see very directly that the tape is (probably) small.
07:11:00 <Lymia> I guess it makes sense.
07:11:07 <ais523> although, ofc, time you waste doing that means that you may fail to get inside the opponent's decoys when you could have done otherwise
07:11:11 <Lymia> Leave decoy -> poke -> return to decoy setup.
07:11:31 <Lymia> If you get a decoy conflict *then*, either the opponent trails, or you're on a very small tae.
07:11:32 <Lymia> tape*
07:12:04 <ais523> !egojoust is_this_working_yet (>)*8(>[(+)*8[-]])*21
07:12:07 <ais523> err
07:12:10 <ais523> !bfjoust is_this_working_yet (>)*8(>[(+)*8[-]])*21
07:12:35 <ais523> hmm, yes
07:12:45 <Lymia> But what do you do with that information?
07:12:49 <ais523> it'd probably work against preparation
07:13:09 <ais523> also, knowing you're on a short tape should bias you towards fast rush programs
07:13:30 <ais523> margins3's strategy on a short tape is basically a copy and paste of stealth3, but with some details changed
07:13:48 <ais523> and the stealth series is a fast rush idea I had a while back that I never really got to work
07:13:51 <Lymia> This is sort of what my scripting language is for, at least. for($minimumTapeLength in 1 to 30) { > [ $mainBody($minimumTapeLength) ] }
07:13:55 <ais523> but it works much better on short tapes
07:16:19 <Lymia> ... maybe evolutionary algorithm time?
07:16:19 <ais523> !zjoust this_is_working_yet (>)*8(>[(+)*8[-]])*21
07:16:20 <zemhill> ais523.this_is_working_yet: points -8.14, score 13.81, rank 46/47
07:16:33 <ais523> to be fair, I didn't expect it to do well
07:16:39 <ais523> but it didn't come last! :-D
07:16:56 <Lymia> Start with a fixed block that distinguishes minimum tape lengths and some conditions.
07:17:10 <Lymia> And give the decoy constants, etc to an evolutionary algorithm to play with.
07:17:13 <ais523> I have an evolutionary algorithm for tweaking constants
07:17:16 <ais523> I didn't use it on margins3, though
07:17:28 <Lymia> I'd run it against the set of all programs that existed in BFJoust ever.
07:17:45 <ais523> typically I only use it on programs that are close to the top of the hill to squeeze out a few more points
07:18:04 <zemhill> prooftechnique.helloerjan: points -33.14, score 2.92, rank 47/47
07:18:41 <ais523> huh, how long ago was /that/ submitted
07:18:44 <ais523> is prooftechnique online righ tnow?
07:18:48 <prooftechnique> Yeah
07:18:58 <prooftechnique> Just wanted to get on the board before bed :D
07:19:02 <ais523> it's not a very complex-to-run program
07:19:06 <ais523> so I suspect it was submitted by PM
07:19:59 <prooftechnique> I'll probably make a real effort tomorrow at work. I've been reading the wiki on and off all day
07:20:51 <ais523> one thing I like about BF Joust is that you can compete against yourself indefinitely even if nobody else is playing
07:20:58 <ais523> another thing I've noticed is that everyone has their own style
07:21:00 <Lymia> !zjoust rank45plz ---(>>++++)*4(>(-)*20([+{}[-.-+]])%500)*20([-.-+])*-1
07:21:01 <zemhill> Lymia.rank45plz: points -19.74, score 7.34, rank 47/47
07:21:04 <Lymia> :(
07:21:28 <ais523> if I write a gimmick program I often see a lot of correlation between its score and the author of the program it plays against
07:21:48 <prooftechnique> Oh?
07:22:01 <prooftechnique> Also, I like reading the comments in your programs, ais523
07:22:24 <ais523> !zjoust sometimes >(+)*128<(-)*128(+-)*-1
07:22:24 <zemhill> ais523.sometimes: points -5.21, score 14.91, rank 41/47
07:22:25 <prooftechnique> Very informative, and often entertaining
07:22:40 <ais523> prooftechnique: well they're partly for me and partly for other people
07:22:49 <ais523> sorry about the base64
07:23:09 <ais523> I hope it wasn't too hard to get the program into a readable form
07:23:21 <prooftechnique> Not at all. A fish one-liner
07:23:46 <Lymia> Why the base64 anyway
07:23:48 <ais523> I've even developed a sort of "comment grammar" that uses only BF Joust-safe characters
07:23:52 <ais523> lots of semicolons rather than commas
07:24:04 <Lymia> I just went and made a macro processor for BFJoust
07:24:10 <Lymia> Which has a proper grammar for comments.
07:24:10 <ais523> Lymia: it's encoding a Perl script
07:24:13 <Lymia> oh
07:24:16 <Lymia> That explains everything.
07:24:19 <ais523> that generates the program
07:24:33 <ais523> I base64ed it so that I could put it into the program's source without stray parentheses
07:24:39 <Lymia> The script grammar I wrote wasn't written to be BF Joust safe at all though
07:24:44 <Lymia> I just linked to the source instead.
07:25:31 <ais523> linking's fine, and sometimes you have to do that (e.g. anticipation2, which is running up against code size limit)
07:25:40 <prooftechnique> Anyway, time for sleep. Maybe I'll think of a goofy joust gimmick in the meantime. Night, all
07:25:44 <ais523> but I prefer to have everything in one place
07:25:45 <ais523> night prooftechnique
07:26:08 <ais523> people should be able to see how my program was generated just with a copy of the repo, in most cases
07:26:39 <Lymia> Hrm
07:26:51 <Lymia> Maybe a formal BFJoust spec is in order?
07:27:08 <Lymia> Like, BNF and hopefully unambigious semantics.
07:27:08 <ais523> the wiki page is reasonably formal, and has become more so over time
07:27:26 <ais523> also there's some debate about whether the % to {} matching thing even works in BNF
07:27:36 <Lymia> Don't describe it in BNF?
07:27:47 <Lymia> Describe ()% and {} seperately
07:27:52 <Lymia> And presume compilers resolve it at a later stage.
07:28:05 <ais523> come to think of it, I'm not sure which categories of languages can describe it in a remotely semantic way
07:28:14 <Lymia> There's plenty of things in normal programming languages that you can't describe in BNF
07:28:33 <Lymia> I wonder if something like...
07:28:55 <Lymia> 1#(2#(1#{2#{}})%2)%2 has any chance of working
07:28:56 <Lymia> Let's see.
07:31:21 <Lymia> Hrm, nope. Definitely not.
07:32:31 <Lymia> ais523, what do you do about "incompatible" semantics?
07:32:37 <HackEgo> [wiki] [[BF Joust]] https://esolangs.org/w/index.php?diff=46505&oldid=44193 * Ais523 * (-4) /* External resources */ better (i.e. direct-linkable, also it's the original) link for the origins of BF Joust
07:32:46 <Lymia> Like nesting {} inside ()* inside ()%
07:32:51 <Lymia> By making ()* and ()% distinct
07:33:09 <ais523> Lymia: the * meaning the same thing as % thing is just implementation convenience
07:33:21 <Lymia> Right.
07:33:26 <Lymia> But programs are written assuming it.
07:33:42 <ais523> if we allow ()* in the a and b portions of a ()%, inside implementations would just have to suck it up
07:33:52 <ais523> we've fixed programs via editing the hill manually to adjust them for spec changes in the past
07:34:10 <ais523> there are some old hill-toppers with ([)*n in them
07:34:30 <Lymia> hr
07:34:31 <Lymia> hrm*
07:35:42 <Lymia> I wonder if it'd be possible to write new opcodes that expand to infinite (or extremely long) BFJoust programs.
07:36:14 -!- J_Arcane_ has joined.
07:36:15 -!- impomatic has joined.
07:36:22 -!- J_Arcane has quit (Ping timeout: 252 seconds).
07:36:28 -!- J_Arcane_ has changed nick to J_Arcane.
07:36:45 <ais523> !bfjoust comex_the_first_program_ever (>)*9[-]+[>[-]+]
07:36:50 <ais523> (adapted for current rules)
07:36:55 <ais523> (and syntax)
07:36:58 <ais523> !zjoust comex_the_first_program_ever (>)*9[-]+[>[-]+]
07:36:59 <zemhill> ais523.comex_the_first_program_ever: points -17.31, score 9.39, rank 47/47
07:37:03 <ais523> also let's submit it to a hill that works
07:37:05 <\oren\> my interpreter needs your program to end
07:37:23 <ais523> \oren\: ?
07:37:28 <Lymia> There's some cases where I wanted to do something in my BFJoust macro processor
07:37:40 <\oren\> but it may be possible to write one that can handle an infinite stream of bf characters
07:37:44 <Lymia> But it'd have to expand to a hundreds of megabytes long script.
07:37:52 <Lymia> Like
07:37:54 <ais523> haha, it beats smartlock, probably because smartlock is so special-cased
07:38:17 <ais523> Lymia: I'm aware of the problem
07:38:21 <Lymia> ${defmacro name ... ${name} ... ${name} ....}$
07:38:28 <ais523> in general it's the reason there's a program size limit
07:38:32 <ais523> to stop people writing things that go exponential
07:38:39 <ais523> the biggest example is an if/then/else
07:38:40 <Lymia> It'd expand to an exponential length program.
07:38:54 <Lymia> But it's expandable to BFJoust.
07:39:07 <Lymia> I wonder if it'd be worth it to integrate something like that into a hill?
07:39:14 <ais523> a (if nonzero then b else c) d expands to a[bd]cd
07:39:35 <ais523> which tends to blow up very quickly
07:39:38 <Lymia> It's not generally a problem like that.
07:39:42 <ais523> due to the duplication of d
07:39:46 <Lymia> That doesn't blow up too quickly.
07:40:09 <Lymia> Trying to write the equivalent of continue or break does.
07:40:21 <ais523> ah yes, break
07:40:31 <ais523> there are so many cunning methods of writing break that I've seen
07:40:45 <Lymia> nyuroki's main loop is basically
07:41:04 <Lymia> (>[... {} anti-defense continue ...])*21
07:41:43 -!- J_Arcane_ has joined.
07:42:03 <ais523> Lymia: you mean %21
07:42:21 <ais523> also IMO that's inferior to the (>[clear][antidefence])*21 method
07:42:33 <ais523> because it gets tricked by vibrators
07:42:42 <Lymia> It's more complex than that
07:42:44 <Lymia> It's actually
07:42:54 * ais523 checks the nyuroki versus anticipation2 matchup
07:42:55 <Lymia> (>([... {} [anti-defense] continue ...])*2)*21
07:43:09 <Lymia> The .. has a ()% somewhere in it
07:43:13 <Lymia> So i didn't include it
07:44:03 -!- J_Arcane has quit (Ping timeout: 240 seconds).
07:44:08 -!- J_Arcane_ has changed nick to J_Arcane.
07:44:41 <ais523> ah, it comes down to timer clear, I think?
07:45:21 <Lymia> Yeah. The {} is supposed to represent exiting the timer clear.
07:45:35 <ais523> was wondering if it hit one of the unimplemented cases in anticipation2 but it doesn't
07:45:42 <ais523> everthing works fine up until the final defense loop
07:45:45 <ais523> and then the lock just breaks
07:46:44 <Lymia> Is anticipation supposed to hide its flag?
07:46:56 <ais523> yes
07:47:08 <Lymia> Nyuroki doesn't actually skip a cell unless it's zero for 0 cycles. (>([main clear loop])*2)*21
07:47:09 <ais523> if the enemy doesn't vary clear pattern, its flag will always be 0 when encountered for the first time
07:47:22 <ais523> ooh, ([main clear loop])*2
07:47:30 <ais523> I like that
07:47:49 <ais523> (normally I use a specific counter-defence clear loop after the main one rather than just running the main one twice, but those can be hard to write)
07:48:18 <ais523> this is why it's called anticipation, it times the opponent's code and anticipates the moment the opponent will zero-check its flag
07:48:25 <Lymia> Also causes an exponential blowup.
07:48:33 <Lymia> Because break + two loops isn't compatible.
07:48:41 <Lymia> So I didn't do it.
07:48:53 <Lymia> Nyuroki is basically a long list of things I didn't do because the program would have exponential size.
07:49:16 <ais523> tell me about it :-)
07:49:37 <ais523> I like the restrictions that come with the size limit
07:50:14 <Lymia> How does anticipiation deal with timer clears?
07:50:17 <Lymia> Does it just not
07:50:21 <ais523> actually, I designed a "minijoust" with the following rules: very serious length limit on programs (short enough that they all fit onto one line of IRC); and in the case of a timeout, whichever program ran the most . instructions wins
07:50:37 <ais523> Lymia: right, they hadn't been around at the time
07:50:51 <ais523> or, well, they'd been only recently invented
07:50:56 <ais523> and most programs didn't use them
07:51:02 <ais523> also it beats some timer clear programs via the vibration
07:51:54 <Lymia> But the ()*2 pretty much invalidates vibration.
07:51:58 <ais523> yes
07:52:07 <ais523> vibration is easy to defeat if you expect it
07:52:09 <Lymia> I don't think it hurts in any cases?
07:52:17 <Lymia> Nobody in their right mind is going to vibrate off their flag.
07:52:22 <ais523> the only reason I wrote anticipation2 was because someone (maybe even me) submitted a vibration program for fun and it did unexpectedly well
07:52:44 <ais523> I guess some fast rush programs genuinely can't spare the extra cycle
07:53:14 <Lymia> If it's fast enough
07:53:19 <Lymia> And hits cell 30 before cycle 128
07:53:24 <Lymia> it can't be vibrated, right?
07:53:41 <Lymia> And if it gets caught by a flag or a decoy, it can switch to something more careful.
07:53:49 <Lymia> Because it definitely isn't fast rushing anymore.
07:54:32 <ais523> vibration programs normally leave a decoy to get enough time to zero their own flag
07:54:50 <ais523> but yes, the reason you need to go quickly is to get inside the decoys of enemies that set multiple
07:55:16 <ais523> it's nothing to do with vibrators
07:56:00 <Lymia> !zjoust parity (>+>-)*4(>+>([(+)*10([-{}[-.-+]])%500])*2)*-1
07:56:00 <zemhill> Lymia.parity: points -19.52, score 7.63, rank 47/47
07:56:10 <Lymia> !zjoust parity (>)*7(>+>([(+)*10([-{}[-.-+]])%500])*2)*-1
07:56:10 <zemhill> Lymia.parity: points -14.12, score 10.01, rank 47/47 (--)
07:56:24 <ais523> IME parity is hardly ever a factor in matchups nowadays, except for sometimes lock-based ones
07:56:29 <Lymia> !zjoust parity (>)*7(>>[(+)*20[-]]))*-1
07:56:29 <zemhill> Lymia: error: parse error: terminating ) without a matching (
07:56:37 <Lymia> !zjoust parity (>)*7(>>[(+)*20[-]])*-1
07:56:37 <zemhill> Lymia.parity: points -13.52, score 10.72, rank 47/47 (--)
07:56:39 -!- mroman has joined.
07:56:43 <mroman> fnurd
07:56:46 <mroman> @messages-load
07:56:46 <lambdabot> boily said 14h 51m 28s ago: mrelloman.
07:56:50 <Lymia> I'm trying to win the even length tapes only
07:56:56 <Lymia> For the fastest rush ever.
07:56:56 <ais523> ooh, impomatic is here
07:56:56 <Lymia> :P
07:56:59 <ais523> Lymia: oh, I see
07:57:07 <ais523> I think oerjan.netsnail worked like that?
07:57:38 <ais523> an improved version of that is a fast rush program that only checks every nth cell for the first set cell, but rushes more normally once it finds one
07:58:30 <ais523> !zjoust collision2 (>)*7(>>[([(+)*3[-[-]]>])*-1])*-1
07:58:30 <zemhill> ais523.collision2: points -8.62, score 12.87, rank 47/47
07:58:44 <ais523> hmm, at this rate we might actually get somewhere :-)
07:58:49 <ais523> !zjoust collision2 (>+)*7(>>[([(+)*3[-[-]]>])*-1])*-1
07:58:49 <zemhill> ais523.collision2: points -15.81, score 9.42, rank 47/47 (--)
07:58:53 <Lymia> This is such a difficult hill.
07:58:57 <ais523> indeed
07:59:10 <Taneb> I think given enough time all hills become difficult
07:59:12 <Lymia> !zjoust totally (+--+)*-1
07:59:13 <zemhill> Lymia.totally: points -19.60, score 7.02, rank 47/47
07:59:17 <ais523> I find that at this point, the best way to attack it is with a program that does something really unusual
07:59:20 <Taneb> If you made a rock paper scissors hill it would end up difficult
07:59:31 <Lymia> Well
07:59:36 <ais523> Taneb: I don't know, the hill that was basically all turtles got beaten pretty quickly
07:59:36 <Lymia> That's the point of a hill, kinda.
07:59:38 <Lymia> ;p
07:59:48 <Lymia> Which hill?
07:59:51 <ais523> and we'd been playing for a while when that happened
07:59:55 <ais523> Lymia: old version of egojoust
08:00:05 <ais523> turtles had only been recently invented
08:00:09 <ais523> and they were doing really well
08:00:12 <ais523> competent turtles, that is
08:00:21 <ais523> people had submitted non-working versions of them in the past
08:00:21 <Taneb> ais523, cororoallary: if the hill is easy, you haven't given it enough time
08:00:32 <ais523> hills get easier sometimes
08:00:58 <ais523> there was that time when someone (not naming names, but wasn't me) submitted a bunch of copies of omnipotence with different names
08:01:02 <Taneb> I have no idea how to spell, or how to pronounce, corollororary
08:01:06 <ais523> at the time, omnipotence beat every other program
08:01:17 <ais523> so it pushed all the other progams off the hill
08:01:35 <ais523> that hill would have been trivial to top, assuming you can come up with something that beats omnipotence (it's not hard, especially if you know how it works)
08:01:48 <ais523> err, probably wasn't omnipotence
08:01:50 <ais523> might have been waterfall3
08:01:58 <ais523> I don't think omnipotence ever had 100% wins
08:03:23 <b_jonas> oerjan: I see
08:03:52 <Lymia> I still want to implement my 100% win rate bot sometime.
08:03:59 <Lymia> Blatant autogeneration and hill fitting.
08:04:22 <ais523> lots of people have had that idea
08:04:29 <b_jonas> Has the EgoBot bfjoust healed yet?
08:04:34 <Lymia> no
08:04:35 <ais523> it is a) probably possible to do in most practical cases; b) harder than it seems
08:04:47 <ais523> who hosts egobot?
08:04:54 <Lymia> My idea was to decompose all "enemy bots" into tuples of "enemy bot, tape length, parity"
08:04:56 <ais523> they should probably be pinged as I suspect it's pegging a CPU
08:05:02 <Lymia> Then run them all in parallel.
08:05:18 <b_jonas> ais523: are you sure it's EgoBot, rather then the hill that's stuck?
08:05:19 <Lymia> So decide the best action on that tick, and advance every possible case at once.
08:05:20 <ais523> Lymia: fwiw, it's possible to write a set of programs that it is impossible to collectively beat all of
08:05:23 <ais523> b_jonas: no
08:05:32 <ais523> that's why I only /suspect/ it's pegging a CPU
08:05:32 <Lymia> Yeah. Someone brought that up last time I talked about it.
08:05:40 <Lymia> But I don't think 47 bots is enough to do it.
08:05:49 <Lymia> :)
08:05:57 <Taneb> Lymia, I'd be surprised if 2 bots wasn't enough to do it
08:06:00 <ais523> the simplest construction I'm aware of a proof for requires 768
08:06:08 <Taneb> I am surprised
08:06:11 <b_jonas> ais523: yes, but you don't have to beat all of them at once. you just have to beat enough of that in each step to gradually push some off the heap, and eventually start beating enough to get to the top
08:06:15 <Lymia> Taneb, the key is
08:06:40 <Lymia> If three bots would do +, -, and . on your flag all on the same cycle.
08:06:41 <ais523> b_jonas: hmm, clever
08:06:55 <Lymia> You just do ++ sometime beforehand, so your flag is 2 when the bots would clear it if it would be 0.
08:06:57 <b_jonas> huh what?
08:07:05 <b_jonas> what's clever? not achieving 100% wins?
08:07:14 <ais523> yes, this devious gradual hill takeover
08:07:20 <b_jonas> you get to the top of the hill with one bot without making it 100% win
08:07:26 <b_jonas> you've done that multiple times
08:07:41 <Lymia> I wonder how hard an infinite hill would be to maintain
08:07:43 <ais523> b_jonas: yes but most of the time it's because the program is genuinely better than any of the others
08:07:45 <Lymia> Or at least a huge one.
08:07:56 <b_jonas> you even brought up how it's not obvious who the best Go player is that google should challenge or something
08:07:57 <ais523> you could create a sort of Swiss hill
08:08:02 <ais523> where programs only competed against those nearby
08:08:14 <Taneb> Lymia, you'd need a way to remove blurgh bots
08:08:46 <ais523> fwiw the hill sizes are twice as big as they used to be
08:08:48 <Lymia> blurgh bots?
08:08:51 <ais523> because we like the diversity in a larger hill
08:09:02 <ais523> Lymia: I assume Taneb is talking about bots that do nothing useful
08:09:07 <ais523> like the syntax check bots we had earlier
08:09:10 <Taneb> Yeah, those
08:09:14 <Lymia> Hrm.
08:09:16 <ais523> hmm, what about this
08:09:22 <ais523> if you have the exact same breakdown as a previous bot
08:09:28 <Lymia> What about a "qualifier"?
08:09:31 <ais523> you don't get saved
08:09:34 <Lymia> A set of maybe 10-20 fixed bots.
08:09:43 <Lymia> That you don't get on the hill if you can't 100% sweep, or maybe beat 80%
08:09:50 <ais523> that way, we only have one suicide, one nop, etc.
08:09:50 <Lymia> Nothing advanced or clever.
08:10:15 <b_jonas> ais523: what? how would more than one of the syntax check bots even get to the hill? don't they lose too often to get on the hill?
08:10:22 <Lymia> Just a demonstration that you aren't a potato.
08:10:32 <Lymia> b_jonas, we're talking about an infinite hill.
08:10:45 <b_jonas> a... what
08:10:55 <Lymia> A hill without a fixed size.
08:11:06 <ais523> we could at least force people to beat simple
08:11:17 <Lymia> What'd be a good qualifier bot set?
08:11:23 <b_jonas> a hill without a size limit makes no sense
08:11:43 <ais523> (that said, quite a few highly advanced programs lose to simple because its lack of counter-anything causes it to be one cycle faster moving from one tape element to the next than it's possible to detect)
08:12:28 <Lymia> b_jonas, perhaps "hill" isn't the right term. Maybe "ladder"
08:12:33 <Lymia> Or something.
08:12:34 <b_jonas> what you could do is lock a few hand-selected bots on the ill
08:12:46 <Taneb> Maybe a hill that's unbounded upwards but has a fixed bottom?
08:12:52 <Lymia> ais523, I'd say a set of basic (or not so basic?) bots that bots to get on the hill have to beat.
08:12:53 <b_jonas> like, a few champions from each year that are hand-checked to make sense
08:12:57 <b_jonas> plus a few basics
08:13:04 <Lymia> Say...
08:13:11 <Taneb> Like, if a submission loses to the 10 bottom it falls off the hill
08:13:11 <b_jonas> don't make it obligatory to beat them, just lock them on the hill so the hill includes them
08:13:13 <Lymia> 50% or 75% winrate against them to qualify in the first place.
08:13:14 <ais523> Lymia: I guess we could write an intentionally bad implementation of each of the main strategies
08:13:14 <b_jonas> int he score
08:13:22 <ais523> as gatekeepers
08:13:27 <b_jonas> no no
08:13:28 <b_jonas> don't do that
08:13:39 <Lymia> b_jonas, if the hill is infinite
08:13:39 <b_jonas> that would only let bots that work against _all_ strategies on the hill
08:13:47 <Lymia> There's no point in locking anything on the hill.
08:13:57 <Lymia> Because once a bot is on, it can't actually fall off.
08:14:16 <b_jonas> why the heck do you even call it a hill then if you can't fall off?
08:14:20 <Lymia> The markov scoring should make it so that 90% potatos still doesn't affect the upper part of the hill much, right?
08:14:33 <Lymia> What would you call it, then, and why does it matter to you?
08:15:18 <b_jonas> dunno, a pool or something
08:15:20 <ais523> hmm, what about a hill that knocks off programs, not because they score badly, but because they're too similar to a better-scoring program
08:15:25 <b_jonas> but I don't really understand how this would work
08:15:30 <b_jonas> ais523: how would you detect that/
08:15:32 <ais523> using whatever similarity measure we want, maybe breakdown
08:16:15 <b_jonas> ais523: would that make it impossible to add new programs similar to an existing one that aren't _yet_ as good as the original, but eventually might be?
08:16:18 <Lymia> Right now we use names as the "identifier" for replacing programs, right?
08:16:29 <ais523> perhaps we find the two programs with the greatest number of matchups for which they both lose, and delete the one which has the most losses elsewhere
08:16:33 <ais523> Lymia: yes
08:16:47 <ais523> b_jonas: until you improved them, possibly
08:16:48 <Lymia> Hrm.
08:16:50 <ais523> I don't see this as a problem
08:16:53 <Lymia> What about clustering bots somehow?
08:17:04 <ais523> (note that you'd still get feedback on what the score would be, it just hasn't happened)
08:17:04 <Lymia> And keeping the 5-10 best of every cluster?
08:17:11 <ais523> Lymia: fizzie's way ahead of you on the clustering
08:17:24 <Lymia> So, if there's a cluster that's too dense (detecting that somehow)
08:17:30 <Lymia> You cull just that.
08:17:36 <Taneb> Oooh! Going on a tangent a bit
08:17:53 <Taneb> Do you know of any BF Joust-y games that are more accessible?
08:17:55 <ais523> here: http://zem.fi/egostats/tn_plot_cluster.png for breakdown cluster, http://zem.fi/egostats/tn_plot_heatclust.png for heatmap cluster
08:18:10 <Taneb> By which I mean, competitive programming games
08:19:04 <ais523> Taneb: I think BF Joust is one of the most accessible; there's a whole wiki of them at http://programminggames.org/ (e.g. http://programminggames.org/BF-Joust.ashx) that you could look at, I guess
08:19:57 <ais523> huh, BF Joust's even mentioned on the front page, under "programming games of note"
08:20:19 <ais523> as is Final Fantasy XII
08:20:23 <ais523> interesting interpretation of the genre, that
08:22:48 <ais523> interesting thought experiment: given everything that we know about BF Joust now and didn't before, write a program for the original BF Joust that does something clever
08:23:08 <Lymia> "Original"?
08:23:10 <b_jonas> the _original_ one? is that the one that's parity locked?
08:23:22 <b_jonas> ais523: what was the tape size and program size limit for that?
08:23:22 <ais523> b_jonas: no, the original's even older
08:23:37 <Lymia> Taneb, what do you mean by "more accessible"?
08:23:42 <Lymia> To non-esolang programmers?
08:23:42 <ais523> tape size was 128-134 IIRC, and you died from a zero flag in one cycle
08:23:46 <Taneb> Lymia, yeah
08:23:53 <Lymia> Something like robocode, I think
08:23:55 <b_jonas> ais523: right, and no dot command and no repetition syntax
08:24:05 <ais523> fwiw, I've been thinking (as a far-future thing) about making a reflavoured BF Joust game
08:24:15 <ais523> which is mathematically equivalent but less obviously connected to BF
08:24:18 <Lymia> It's not a "programming game" per se, like, BFJoust or Redcode.
08:24:37 <ais523> redcode's the language; the game is called core wars
08:24:41 <Lymia> Opps
08:24:43 <Lymia> Core Wars*
08:24:44 <b_jonas> Lymia: someone suggested https://www.codingame.com/ or something of a similar name. I don't know what those stuff are like, I don't care much about htem.
08:24:45 <ais523> impomatic: <Taneb> Do you know of any BF Joust-y games that are more accessible?
08:24:49 <Lymia> Taneb, basically
08:24:51 <ais523> you might be a good person to ask this
08:25:02 <Lymia> These games are more like conventional video games that a human could play directly too.
08:25:18 -!- AnotherTest has joined.
08:25:22 <Lymia> And the "programs" are AIs for them.
08:25:29 <Lymia> Like, say, a Starcraft AI hill.
08:25:34 <Lymia> That'd be in that category.
08:26:05 <ais523> I think a human playing BF Joust in realtime would be interesting
08:26:10 <ais523> allow them to hold down buttons to select a move
08:26:32 <ais523> [ and ] would be a single instruction that told you if you were looking at a zero cell
08:26:32 <j-bot> ais523: and (] would be a single instruction that told ((<(<,'"'),<(<'you'),<(,'0');_),<(<,'"'),<(<'you'),<(,'0');_) were looking at a zero cell)
08:26:43 <ais523> thank you j-bot
08:27:10 <shachaf> [ if
08:27:11 <j-bot> shachaf: if_syntax_
08:27:18 <shachaf> [ and ] if
08:27:18 <j-bot> shachaf: (and ])if
08:27:43 <ais523> you'd probably start off small, adding more commands along the way
08:27:51 <Lymia> BFJoust wouldn't really count, I think.
08:28:05 <Lymia> Since part of the metagame now is how limited programs are.
08:28:20 <Lymia> A human playing would effectively emulate an arbitrary length program.
08:28:23 <ais523> yes
08:28:27 <ais523> OTOH the human would have human limitations
08:28:43 <ais523> maybe I'll program it with a very basic UI just to see how me personally does against the hill
08:28:49 <ais523> I suspect I wouldn't do too well
08:28:53 <Lymia> Games would take forever.
08:29:06 <b_jonas> Lymia: exactly, and there are many programming games that similarly wouldn't work, eg. the ant brain one which requires you to write a program for a very limited capability ant brain, ran separately on each of your ants
08:29:22 <b_jonas> although there was a very different ant game that allowed any program
08:30:21 <impomatic> ais523, taneb: accessible is what way? Using an easier to use DSL or standard programming language but still capture the flag? Or a different genre of programming game?
08:30:26 <b_jonas> (the first one is ICFP contest 2004, at https://alliance.seas.upenn.edu/~plclub/cgi-bin/contest/ , the second one was at http://ai-contest.com/ but that domain is now owned by someone completely different)
08:30:55 <ais523> impomatic: was just relaying the question, I'm a little confused as to the meaning too
08:31:02 <ais523> btw, new hill-topper
08:31:05 <Taneb> impomatic, I'd prefer one that you could use Python for, and you could watch it looking pretty
08:31:06 <ais523> thanks for getting me back into the sport :-)
08:31:16 <Lymia> ais523, well.
08:31:19 <ais523> Taneb: is egojsout not pretty?
08:31:28 <Lymia> The JoustExt thing I made, for obvious reasons
08:31:42 <Taneb> ais523, it has the disadvantage in that post people in the CS department here do not often program in brainfuck
08:31:46 <Lymia> Any program that can be written in it is equivalent to some Brainfuck program.
08:31:51 <Lymia> It could just be arbitary length.
08:32:15 <Lymia> I figured out a lot of neat tricks like how to implement effectively call/cc
08:32:21 <ais523> Taneb: it might be an interesting experiment to allow arbitrary (i.e. not bf-limitations) programs
08:32:42 <ais523> I fear defence would not work well (you could do things like random walk clears once your timer expired) but the other tactics would still work
08:32:54 <ais523> your API would be forwards, backwards, up, down, and test, each of which would cost a cycle
08:33:02 <ais523> Python has yield, which is perfect for this usecase
08:33:07 <Lymia> Do programs have to be deterministic?
08:33:07 <impomatic> http://www.programminggames.org/INJECTION.ashx / https://bitbucket.org/leeharr/pybotwar / https://github.com/sgimenez/laby are a few I've bookmarked
08:33:24 <Lymia> This is important to decide.
08:33:35 <impomatic> But the most popular seems to be RobotGame http://robotgame.org/
08:33:36 <ais523> Lymia: in brainfuck, yes, as it has no randomization facilities
08:33:45 <Lymia> Because otherwise, it'd be equivalent to a BFJoust variant with non-deterministic instructions.
08:33:51 <Lymia> Not BFJoust with arbitary length programs.
08:33:53 <ais523> in other languages, I would say it helps for tournament structure if the program has to act identically each time
08:34:03 <ais523> /but/ I don't see any reason to ban, say, seeded RNGs
08:34:20 <ais523> impomatic: robotgame.org is NXDOMAIN
08:34:24 <impomatic> ais523. taneb@ RobotGame is in python and has a channel on freenode #robotgame
08:34:38 <impomatic> I'll ask in the channel about the domain :-(
08:34:56 <Lymia> ais523, ofc.
08:35:14 <Lymia> it's still equivalent to some arbitrary length BF program.
08:35:22 <Lymia> hrm.
08:35:26 <ais523> only because of the cycle limit
08:35:31 <Lymia> Otherwise.
08:35:40 <Lymia> s/arbitrary/infinite/
08:35:50 <Taneb> impomatic, I'll look into it
08:35:52 <ais523> assuming you allow the system access to non-TC sources of information
08:36:11 <ais523> (like a random number generator)
08:36:21 <ais523> or, hmm
08:36:34 <Lymia> You can always rewrite the cycles
08:36:39 <Lymia> Like
08:36:45 <impomatic> taneb, ais523: might also be robotgame.net - seems to be up and down all the time :-(
08:36:47 <Lymia> Any time you execute a test
08:37:15 <Lymia> You can rewrite it to [a]b, where a and b are arbitary/infinite length programs.
08:37:18 <Lymia> a doesn't have to terminate
08:38:29 <Lymia> Assuming it's deterministic, at least.
08:38:42 <Lymia> Otherwise, it'd be BF plus a new instruction (I think)
08:38:44 <Lymia> Something like
08:38:54 <Lymia> *{a}b
08:39:06 <Lymia> Where *{} is 0 cycles, and executes a with a 50% probability?
08:39:24 <Lymia> That'd be an interesting extension to test as a BFJoust version.
08:39:43 <Lymia> *{a} is 1 cycle, and executes randomly 50% of the time.
08:41:13 -!- ais523 has quit (Ping timeout: 268 seconds).
08:51:48 -!- augur has joined.
09:08:52 <HackEgo> [wiki] [[Lua Joust]] N https://esolangs.org/w/index.php?oldid=46506 * Lymia * (+1548) Created page with "'''Lua Joust''' is a competitive programming game, equivalent to [[BF Joust]] with arbitrary length programs. Instead of using [[Brainfuck]] as the language for warriors, '''L..."
09:08:59 -!- J_Arcane has quit (Ping timeout: 244 seconds).
09:09:01 <Lymia> opps
09:09:02 <Lymia> i meant to preview
09:09:11 <Lymia> Oh well, let's finish this.
09:18:15 -!- ais523 has joined.
09:22:56 <Lymia> ais523, I'm writing up a spec for BF Joust with arbitary Lua programs.
09:23:43 <ais523> IMO this should be written in a way that easily generalizes to any language (at least any language with generators, but you can do them even in C via use of pthreads)
09:24:41 -!- augur has quit (Remote host closed the connection).
09:25:17 -!- AnotherTest has quit (Ping timeout: 248 seconds).
09:26:43 -!- augur has joined.
09:27:48 <Lymia> I'm writing it for Lua for now.
09:28:00 <Lymia> Since I want to include the provisions for determinism as part of the spec.
09:29:45 <impomatic> ais523, taneb: you can see a robotgame battle in action on the web archive http://web.archive.org/web/20160304042803/https://robotgame.net/
09:31:04 <ais523> hmm, it's hard to follow with all that many robots
09:32:04 -!- augur has quit (Remote host closed the connection).
09:33:18 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46507&oldid=46506 * Lymia * (+4238) Finish specification.
09:34:02 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46508&oldid=46507 * Lymia * (+13)
09:35:40 <izabera> https://i.imgur.com/TJFEkDa.jpg 'Selling Dy notebook'
09:35:42 <izabera> Dy
09:35:44 <ais523> hmm, is it a BF derivative?
09:35:50 <ais523> I guess it's a BF derivative derivative
09:35:53 <izabera> guess why Dy
09:35:59 <Lymia> Don't ask me
09:36:03 <Lymia> There's no BF involved, but.
09:36:09 <Lymia> It shares the tape concept.
09:36:26 <Lymia> Notably, Lua Joust and BF Joust programs can theoretically share the same hill.
09:37:18 <Lymia> Not even theoretically.
09:37:20 <Lymia> They simply can.
09:37:54 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46509&oldid=46508 * Ais523 * (+173) cats, minor clarification
09:38:17 <ais523> Lymia: can I make a naming suggestion? instead of next and prev, use advance and retreat
09:38:26 <Lymia> .. hrm.
09:38:36 <Lymia> I think that definitely works.
09:39:11 <ais523> also they're documented as equivalent
09:39:24 <ais523> do you want to change it or shall I?
09:40:08 <Lymia> <ais523> also they're documented as equivalent
09:40:11 <Lymia> What do you mean?
09:40:21 <ais523> copy and paste error
09:40:24 <ais523> they both increment the tape pointer
09:40:36 <Lymia> opps
09:40:39 <Lymia> Let me fix that
09:41:24 <Lymia> hrm
09:41:27 <ais523> I think that if we want this to be accessible, it needs less computery and BF-y terminology
09:41:30 <ais523> also an implementation
09:41:40 <Lymia> It's just a draft, so.
09:41:48 <Lymia> Is there a good way to say "towards the opposing flag"?
09:42:03 <Lymia> Without implying that it might turn around on the flag or past the end
09:42:44 <ais523> I think it's probably best to say "forwards" and "backwards", then in the battlefield section, define that forwards is the direction from your flag to the opponent's, and backwards is the other direction
09:45:10 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46510&oldid=46509 * Lymia * (+59) Clarify advancing and retreating the tape pointer.
09:45:25 <HackEgo> [wiki] [[User:Lymia]] N https://esolangs.org/w/index.php?oldid=46511 * Lymia * (+4) meow
09:46:05 <Lymia> I'd like to do a Lua implementation, maybe?
09:46:10 <Lymia> That should be relatively simple.
09:46:27 <ais523> how good is lua at sandboxing subsets of itself?
09:47:08 <myname> impomatic: robot game looks interesting, i'd prefer another language though
09:47:10 <ais523> while still gaining access to the bits it locked off
09:47:42 <ais523> I remember when I wrote an automatic marking script for ocaml
09:47:46 <ais523> bits of it ran inside the sandbox
09:47:49 <Lymia> Hrm.
09:47:52 <Lymia> It's decent.
09:48:00 <ais523> and I had to figure out how to write string_of_char without access to anything in the standard library
09:48:03 <Lymia> Esp in Lua 5.3 rather than 5.1
09:48:18 <Lymia> Implementations in Lua have to worry about the string metatable and such
09:48:20 <ais523> it took some discussion in #esoteric and #ocaml but I figured out a way in the end
09:48:22 <Lymia> Which can be used to escape the sandbox.
09:48:44 <Lymia> While a C implementation can just use two separate contexts.
09:48:58 <ais523> (for anyone wondering: «let string_of_char c = (let s = ("" ^ "x") in s.(0) <- c; s)»)
09:49:09 <ais523> this is actually deprecated in recent OCaml, but it still works
09:49:43 <ais523> I can see why it's deprecated; it's ridiculous :-)
09:51:18 <impomatic> myname: I haven't seen anything like Robotgame in other languages, but there are robot vs robot battle games in most languages
09:52:13 <impomatic> Berrybots in Lua, Scalatron in Scala have been active recently I think.
09:52:27 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46512&oldid=46510 * Lymia * (+240) Add in a provision for Lua implementations.
09:52:42 <myname> robocode for java... but who likes java anyways
09:53:11 <Lymia> hrm.
09:53:18 <Lymia> I could define some convinence functions
09:53:19 <Lymia> Like
09:53:25 <Lymia> joust.plus(50)
09:53:34 <Lymia> Or joust.modify(50)
09:54:59 <ais523> let people write their own, they're easy enough
09:55:01 <Lymia> Maybe get rid of the joust. namespace
09:55:15 <Lymia> Well, it's for convinence for when you write out full programs on an IRC line, and such.
09:55:17 <ais523> and I have a feeling Taneb wants to use this as an "intro to programming" anyway
09:59:02 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46513&oldid=46512 * Lymia * (-96) Remove the joust namespace.
10:00:04 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46515&oldid=46513 * Lymia * (+2) Rename nop() to wait()
10:00:14 <Lymia> I should probably not treat this like git commits.
10:01:20 <ais523> it's not a bad model
10:01:29 <ais523> although note that the edit summary doesn't have space for a really long discussion
10:01:34 <ais523> you have to use the talk page for that
10:01:45 <ais523> it beats the useless summaries most people use
10:02:11 <ais523> the main difference is that mediawiki edit summaries tend to be heavily abbreviated with a kind-of grammar of their own; complete sentences aren't wrong but they look out of place
10:05:42 <Lymia> I'm going to rewrite it to split the more technical details and a more "accessible" description.
10:06:52 <ais523> hmm, I wonder if the concept of a reduced offset timer is worth mentioning in the strategies page
10:07:13 <ais523> the idea is that you use an inflexible timer clear with a small timer, maybe only 100, and an offset
10:07:18 <ais523> when it runs out you give up on the offset
10:07:28 <ais523> the idea is that enemy programs rarely set small decoys behind large decoys
10:07:46 <Lymia> Explain further?
10:08:27 <ais523> so the idea is, you do a timer clear, if a cell is cleared, you move on and offset while still under the same timer
10:08:39 <ais523> as long as you're clearing small decoys you don't make much of a dent in the timer, so you keep going
10:08:40 <Lymia> Oh, i see.
10:08:43 <Lymia> So something like
10:08:50 <ais523> when you hit a large decoy the timer runs out very quickly and you change strategy
10:09:03 <Lymia> (>(-)*10[+{} ... ])%100
10:09:04 <Lymia> Right
10:09:05 <Lymia> Er
10:09:10 <Lymia> >(-)*10([+{} ... ])%100
10:09:15 <ais523> this is how margins3's clear loop works against defensive programs
10:09:16 <Lymia> Offset timer clear?
10:09:27 <ais523> you put the offset after the ]
10:09:34 <ais523> nowhere else to put it
10:09:43 <ais523> (or before the [, it comes to much the same thing)
10:09:56 <Lymia> Nyuroki does basically that.
10:10:10 <Lymia> It uses an inflexible timer clear with an offset beforehand.
10:10:36 <ais523> right, it's a sensible enough strategy
10:11:00 <ais523> the main improvement is that older programs used to make the timer quite high (1000 or so) and I feel that lower ones work better
10:11:11 <ais523> based on the principle that against large decoys, the best offset size is 0 or even negative (i.e. reverse offset clear)
10:11:45 <Lymia> What do you do when the timer ends?
10:11:51 <Lymia> I'm not sure I quite understand now
10:11:55 <ais523> plain clear
10:11:57 <ais523> i.e. no offset
10:12:01 <ais523> on a second timer
10:12:17 <ais523> or possibly a small reverse offset clear
10:12:27 <ais523> say you predict all the enemy decoys will be at least 20
10:12:33 <ais523> you do something like (+)*20[+]
10:12:44 <ais523> 20 cycles saved right there
10:13:25 <ais523> (regardless of polarity, assuming that there is a decoy of 20 or larger on the cell)
10:14:10 <Lymia> I see.
10:14:10 <Lymia> so.
10:14:26 <Lymia> Optimize for decoys in the range of 1-a and b-128, or so?
10:14:39 <Lymia> And not work so well for decoys between a and b?
10:14:51 <ais523> yep
10:15:00 <Lymia> Interesting.
10:15:24 <ais523> this relies on the principle that people tend not to use medium decoys behind large ones
10:16:37 <ais523> I guess one big general rule of BF Joust is "if there's /anything/ that programs consistently do, there's some way to exploit it"
10:16:58 <ais523> although it took me a while to figure it out with rule of nine, I got there eventually
10:18:30 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46516&oldid=46515 * Lymia * (+890) Split the rules description into a detailed and "simple" section.
10:19:06 <Lymia> What's "large" and "medium" mean, in general?
10:19:40 <Lymia> Nyuroki, for example, uses decoys of size 20 against rushes and 50 for its larger decoys, then patches up its size 20 decoys to be size ~40.
10:20:00 <ais523> small = detected by the start a wiggle clear, typically 1-3; medium = within the size of an offset clear but not small; large = beyond the offset of a typicaloffset clear
10:20:24 <Lymia> I see
10:20:29 <Lymia> So 50 would be considered large.
10:20:56 <ais523> yes; a few programs do use offsets that large but it's probably a bad idea
10:21:23 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46517&oldid=46516 * Lymia * (-1) Fix a mislocated ending tag.
10:21:33 <Lymia> uh
10:21:40 <Lymia> Why would an offset that big be useful
10:22:33 <Lymia> Think this makes it less technically dense? The Lua joust page.
10:22:57 <ais523> Lymia: a bit
10:23:11 <ais523> it would be good to not conflate the tape pointer with the program with the warrior
10:23:42 <Lymia> hrm.
10:23:48 <Lymia> I'm using "warrior" as a term for "program'
10:24:03 <Lymia> Suggestions for terminology?
10:24:16 <Lymia> "arena", "arena cell", "arena pointer"?
10:24:45 <ais523> I think the best mental image is if the program controls the warrior, who is the pointer
10:25:24 <Lymia> I'm not sure I like the term "warrior" in that context.
10:25:28 <Lymia> Hrm.
10:26:49 <Lymia> Well.
10:26:58 <impomatic> "competitor" instead of "warrior"?
10:27:40 <Lymia> warrior == pointer, program, arena == tape?
10:27:43 <Lymia> Is that what you mean?
10:27:50 <Lymia> (@ais523)
10:28:01 -!- gniourf has quit (Quit: Leaving).
10:28:36 <Lymia> Is there some other easy to understand term for "pointer" available?
10:28:47 <ais523> it's more that "pointer" is a very programmy term
10:28:53 <ais523> but yes, warrior=pointer, program, arena=tape
10:29:03 <Lymia> "warrior" is also used as another term for "program" in stuff like Core Wars, right?
10:29:09 <ais523> and possibly flag=tape element (with each program owning one flag and the others being neutral)
10:29:11 <Lymia> So I'd like to avoid using it for a subtly different meaning.
10:29:21 <ais523> Lymia: I think so, but in core wars the programs are literally attacking each other's code and memory
10:29:30 <Lymia> I think "cell" is understandable enough.
10:29:35 <ais523> in BF Joust, it's more like they're controlling an entity
10:29:48 <ais523> I guess the difference is that you care about technical clarity and I care about flavour
10:29:59 <impomatic> Yes, "warrior" is also used in Core War. "battle program" is another term used in a few programming games
10:30:07 <Lymia> I'm writing it as a spec, after all.
10:30:16 <Lymia> Unambigious between implementations.
10:30:23 <Lymia> I'd like a middle ground though.
10:30:47 <ais523> impomatic: how many programming games are like core wars in that the programs can literally alter each other?
10:32:57 <impomatic> ais523: at the moment I can only think of Darwin, Core War, CoreLife, CoreWar68000, CoreWar8086 and Binary Armageddon although there are probably more.
10:33:19 <ais523> some of the competitive game-of-life based games, you could, I guess
10:33:24 <ais523> (not sure how popular any of those are)
10:33:37 <impomatic> Most programming games are played by controlling an agent in an arena without any access to the opponent's code.
10:34:24 <impomatic> There's a very messy and incomplete wiki for programming games here http://programminggames.org/
10:35:16 <impomatic> While we're on the subject, did I mention there's a Core War tournament in 3 weeks? $50 first prize http://corewar.co.uk/easter2016.htm
10:36:23 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46518&oldid=46517 * Lymia * (-200) Rename the "tape" to the "arena".
10:36:29 <Lymia> First step.
10:37:25 <Lymia> Is arena > cell understandable?
10:37:32 <Lymia> Hrm.
10:37:38 <ais523> impomatic: I linked that wiki earlier :-)
10:37:46 <ais523> I like the way BF Joust is cited on the main page
10:37:49 <Lymia> I get what you mean by using "flag" for cells though. Raising and lowering flags?
10:38:20 <ais523> raising would strike me as meaning "away from zero"
10:38:26 <ais523> I think of it as "clockwise" and "anticlockwise"
10:38:31 <ais523> flag's on a continuous rope that forms a loop
10:38:36 <ais523> highest point is 128, lowest point is 0
10:38:46 <ais523> and depending on which way you turn, you can take it up/down either side of the flagpole
10:39:19 <Lymia> Anyway.
10:39:28 <Lymia> "program" controlling a "warrior'
10:39:36 <Lymia> I'm not sure how that terminology would read.
10:39:56 <Lymia> "<code>advance()</code> advances the warrior forwards one cell."
10:40:02 <Lymia> "<code>plus()</code> increments the cell the warrior is on."
10:40:03 <Lymia> ?
10:40:07 <ais523> yep
10:40:16 <Lymia> hrm
10:40:21 <ais523> I guess "space" would work if you don't like "cell", using board game terminology
10:40:49 <Lymia> To me, using "pointer" terminology is more clear, but, it wouldn't be to someone without C/etc experience.
10:41:14 <Lymia> I think "cell" should be fine.
10:42:27 <Lymia> Could also rename "cycle" to "turn" for board game terminology?
10:42:30 <Lymia> It's not really a cycle anymore anyway
10:43:42 <ais523> "turn" is a good terminology
10:43:48 <Lymia> Oh!
10:43:51 <Lymia> What about "current cell"
10:43:55 <Lymia> Instead of "cell pointer"
10:44:10 <Lymia> "advances the current cell by one"?
10:44:15 <Lymia> "advances the current cell one space"?
10:44:16 <impomatic> How about a 2D version of BF Joust? Flags are in diagonally opposite corners. The agent could be a dwarf with a pick axe, chipping away at locations to decrease the cell value or depositing stone on a location to increase the cells value. If a cell's value is to different from it's neighbour, it could be a wall or chasm blocking your way.
10:45:03 -!- earendel has quit (Ping timeout: 244 seconds).
10:46:13 <ais523> Lymia: that sounds like you're changing the cell itself, not the poitner to it
10:46:39 <ais523> impomatic: presumably with this flavour it isn't wrapping, and there's some limit to how high you can increase a cell?
10:47:05 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46519&oldid=46518 * Lymia * (+711) Add numeric arguments to plus, minus, advance, and retreat
10:47:41 <ais523> hmm, I think the arguments will make it much more confusing to follow the rules
10:47:56 <ais523> because they take multiple turns
10:48:08 <Lymia> Hrm.
10:48:16 <Lymia> Oh, hold on.
10:49:01 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46520&oldid=46519 * Lymia * (-711) Undo revision 46519 by [[Special:Contributions/Lymia|Lymia]] ([[User talk:Lymia|talk]])
10:50:15 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46521&oldid=46520 * Lymia * (+164) Clarify function numeric parameters.
10:51:01 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46522&oldid=46521 * Lymia * (+20)
10:51:31 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46523&oldid=46522 * Lymia * (+1)
10:51:32 <Lymia> There.
10:52:36 -!- jaboja has joined.
10:54:57 <Lymia> ais523, is this more clear?
10:55:00 <ais523> yes, that seems clear enough
10:57:40 <Lymia> What about turn > cycle?
10:57:47 <Lymia> A cycle is both the program's turns.
10:58:58 -!- bender| has joined.
10:59:10 <ais523> I like that, actually
10:59:49 <ais523> so the description of a cycle is something like "both programs are executed; when a program runs an API command that takes a turn, it is paused. Then both commands happen and the programs resume executing."
11:00:12 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46524&oldid=46523 * Lymia * (-335) Distinguish 'cycles' and 'turns'.
11:01:04 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46525&oldid=46524 * Lymia * (+27) Clarify text for test().
11:01:46 <Lymia> .. hrm. Should "warrior's program" be a term?
11:02:03 <Lymia> A warrior is the warrior and the code that controls it.
11:02:08 <Lymia> (Conceptually)
11:02:19 <Lymia> I think that terminology would work.
11:03:56 -!- ais523 has quit (Read error: Connection reset by peer).
11:04:01 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46526&oldid=46525 * Lymia * (+46) :)
11:04:07 -!- ais523 has joined.
11:04:16 <Lymia> <Lymia> .. hrm. Should "warrior's program" be a term?
11:04:17 <Lymia> <Lymia> A warrior is the warrior and the code that controls it.
11:04:17 <Lymia> <Lymia> (Conceptually)
11:04:17 <Lymia> <Lymia> I think that terminology would work.
11:04:58 <myname> a warrior is the warrior?
11:05:47 -!- scarf has joined.
11:07:41 -!- ais523 has quit (Read error: Connection reset by peer).
11:08:50 -!- scarf has quit (Read error: Connection reset by peer).
11:09:08 -!- scarf has joined.
11:09:29 <scarf> ugh, pinging out enough to use second alternate nick :-(
11:09:29 * scarf has no idea if anyone will see tihs
11:09:32 -!- scarf has changed nick to ais523.
11:09:43 <ais523> ooh, looks like it got through
11:10:35 <Lymia> D:
11:13:32 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46527&oldid=46526 * Lymia * (-49) Distinguish between the "program" and "warriors"
11:13:36 <Lymia> I think this works.
11:14:15 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46528&oldid=46527 * Lymia * (+0) Move the ''turn'' to when the term is first introduced.
11:17:10 -!- ais523 has quit (Remote host closed the connection).
11:18:19 -!- ais523 has joined.
11:18:27 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46529&oldid=46528 * Lymia * (+360) Introduce one character aliases.
11:18:52 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46530&oldid=46529 * Lymia * (-1)
11:19:46 <Lymia> Now to implement
11:23:21 * impomatic is slowly working through TIS-100 but apart from maybe one of my solutions they're all fugly :-(
11:24:10 <ais523> Lymia: gah you wrote brainfuck with a captal B
11:24:14 <ais523> it isn't a proper noun
11:24:15 * ais523 fixes
11:24:29 <Lymia> opps
11:24:36 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46531&oldid=46530 * Ais523 * (+0) caps
11:26:16 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46532&oldid=46531 * Lymia * (-3) extra word.
11:30:20 <Lymia> ais523, could you give me some basic BFJoust programs to translate?
11:30:25 <Lymia> Most basic examples of strategies
11:30:49 <ais523> Lymia: (>)*8(>[(+)*5[-]])*21
11:31:06 <ais523> !zjoust basic_attack (>)*8(>[(+)*5[-]])*21
11:31:07 <zemhill> ais523.basic_attack: points -6.69, score 14.33, rank 46/47
11:31:24 <ais523> wrt a basic defence program, it rather depends on whether you want to win or not
11:31:32 <ais523> also I've become disconnected again, haven't I?
11:31:34 <Lymia> Nope
11:31:38 <Lymia> I don't htink so
11:31:55 <ais523> if you see this, let me know next time I'm back online (assuming it's in the near future) so I know I don't have to resend
11:31:55 -!- ais523 has quit.
11:34:24 -!- boily has joined.
11:51:42 -!- AnotherTest has joined.
12:18:25 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46533&oldid=46532 * Lymia * (-14)
12:20:09 -!- jaboja has quit (Ping timeout: 260 seconds).
12:21:03 -!- boily has quit (Quit: SOVIET CHICKEN).
12:21:55 -!- AnotherTest has quit (Ping timeout: 248 seconds).
12:24:38 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46534&oldid=46533 * Lymia * (+71) Use constants for the coroutine.yield values
12:26:30 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46535&oldid=46534 * Lymia * (+38)
12:45:15 -!- earendel has joined.
12:46:14 <izabera> https://manuels.github.io/texlive.js/ neato, texlive compiled with emscripten
12:51:29 -!- gniourf has joined.
13:09:26 <impomatic> The esolang wiki ought to have a category for programming games now there are a few on there.
13:23:17 -!- J_Arcane has joined.
13:45:38 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46536&oldid=46535 * Lymia * (+92)
13:58:48 -!- jaboja has joined.
14:07:13 <Lymia> !ztest syntax (<)*-X1
14:07:13 <zemhill> Lymia.syntax: points -32.14, score 2.98, rank 47/47
14:09:01 <Lymia> !ztest syntax >()*xx-xx1[<<]
14:09:02 <zemhill> Lymia.syntax: points -32.14, score 2.98, rank 47/47
14:09:18 <Lymia> !ztest syntax >-[<<]
14:09:18 <zemhill> Lymia.syntax: points -46.00, score 0.00, rank 47/47
14:09:27 <Lymia> !ztest syntax >()*- [<<]
14:09:28 <zemhill> Lymia.syntax: points -32.14, score 2.98, rank 47/47
14:09:36 <Lymia> !ztest syntax >()*mmmm- [<<]
14:09:36 <zemhill> Lymia.syntax: points -32.14, score 2.98, rank 47/47
14:09:39 <Lymia> !ztest syntax >() - [<<]
14:09:39 <zemhill> Lymia.syntax: points -46.00, score 0.00, rank 47/47
14:10:16 <Lymia> !ztest syntax >()*xx+xx1[<<]
14:10:16 <zemhill> Lymia.syntax: points -46.00, score 0.00, rank 47/47
14:10:24 <Lymia> !bfjoust hi .
14:10:27 <Lymia> still ded
14:14:17 -!- `^_^v has joined.
14:26:30 <fizzie> Ded as a dornil.
14:30:53 <Lymia> !ztest ()*-1<
14:30:53 <zemhill> Lymia: "!ztest progname code". See http://zem.fi/bfjoust/ for documentation.
14:30:57 <Lymia> !ztest test ()*-1<
14:30:57 <zemhill> Lymia.test: points -46.00, score 0.00, rank 47/47
14:31:02 <Lymia> !ztest test (.)*-1<
14:31:02 <zemhill> Lymia.test: points -32.14, score 2.98, rank 47/47
14:34:43 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46537&oldid=46536 * Lymia * (-2)
14:37:59 <fizzie> "(<)*-X1" → "(<)*0 X1" → "". ">()*xx-xx1[<<]" → ">()*0 xx1[<<]" → ">[<<]". ">-[<<]" is just what it is. ">()*- [<<]" → ">()*0 [<<]" → ">[<<]". ">()*mmmm- [<<]" ditto. ">() - [<<]" → ">()*0 -[<<]" → ">-[<<]" (no * or % means () gets treated as ()*0). ">()*xx+xx1[<<]" → ">()*0 +xx1[<<]" → ">+[<<]" (explicit + not part of repeat count but also not "whitespace" that gets ...
14:38:05 <fizzie> ... skipped). "()*-1<" → "<". "(.)*-1<" is again just what it looks like.
14:40:24 <b_jonas> Lymia: are you sure that Lua Joust is deterministic?
14:40:26 <fizzie> Somewhat inconsistently, "(.)*;4" is the same as "....", but "(.)*,4" is "". That's a bug. "," got accidentally added to the list of non-whitespace characters, even though it doesn't have any meaning.
14:40:48 <Lymia> b_jonas, it shoul dbe.
14:40:50 <Lymia> should be*
14:40:56 <Lymia> What would cause it not to be?
14:41:10 <Lymia> oh, bleh
14:41:18 <Lymia> There's ordering of hashes in arrays containing hashes.
14:41:21 <b_jonas> Lymia: in Lua, you can iterate on the keys of a table, or get the length of a non-array table, and those aren't well-defined enough to be deterministic. I'm not sure if they are, that depends on the lua implementation.
14:41:28 <Lymia> I could remove pairs.
14:41:32 <Lymia> And that problem'll be gone.
14:41:36 <Lymia> pairs and next.
14:41:37 <b_jonas> Lymia: no, it wouldn't be
14:41:44 <b_jonas> Lymia: even the # operator can be nondeterministic
14:41:54 <Lymia> Explain in what cases?
14:41:57 <b_jonas> Lymia: plus, removing next would limit lua SERIOUSLY
14:42:02 <b_jonas> like, make it a much less usable language
14:42:13 <b_jonas> Lymia: read the docs for # to know
14:42:14 <b_jonas> um wait
14:42:20 <b_jonas> what version of Lua is this based on exactly?
14:42:23 <Lymia> 5.3
14:42:24 <b_jonas> 5.3
14:42:27 <b_jonas> yes, then it stands
14:42:39 <Lymia> Again.
14:42:46 <Lymia> Explain what code would cause # to have nondeterministic behavior.
14:43:17 <b_jonas> Lymia: I'm not sure it has, but the manual doesn't promise that it's deterministic, just like for the next function: http://www.lua.org/manual/5.3/manual.html#3.4.7
14:43:23 <b_jonas> on tables that is (no problem on strings)
14:44:15 <b_jonas> Lymia: basically, getting the length of a table is optimized so it doesn't have to read each element of integer key
14:44:42 <Lymia> AFAIK
14:44:49 <Lymia> From what I read of the code, the result is undefined, yes
14:44:57 <Lymia> But not non-deterministic.
14:45:06 <Lymia> That's a pretty critical difference.
14:45:12 -!- spiette has joined.
14:45:45 <b_jonas> Lymia: yes, but unless you read the implementation, you can't tell if it's deterministic. It depends on the details of how tables work, just like the order of keys as returend by next.
14:46:06 <Lymia> I have read the implementation before for unrelated versions.
14:46:33 <b_jonas> Lymia: in a not too old version?
14:47:36 <b_jonas> Lymia: also, in recent versions, you have to modify the load function so that you can't load binary (precompiled) chunks
14:47:42 <b_jonas> because that can lead to breaking the lua sandbox
14:47:45 <Lymia> I know.
14:47:47 <b_jonas> loading text chunks is fine
14:47:48 <Lymia> I'm passing "t" to load.
14:48:08 <b_jonas> Lymia: I mean, in the load function you give in the environment to the program
14:48:12 <b_jonas> http://esolangs.org/wiki/Lua_Joust doesn't list this
14:48:19 <Lymia> Oh, I see.
14:48:41 <Lymia> I'll just remove load because I don't think there's a legitimate use for it.
14:48:50 <b_jonas> Lymia: sure there is! evalling code
14:48:55 <b_jonas> dynamically comptued code
14:49:01 <b_jonas> but you can easily make a modified version of it
14:49:06 <Lymia> I'd like to see that program.
14:49:31 <b_jonas> I have such an obfu somewhere... we're still on #esoteric, right?
14:49:58 <Lymia> hrm
14:50:27 <b_jonas> hmm, actually I use loadstring
14:50:35 <b_jonas> it's for an older version of lua
14:50:44 <b_jonas> btu it would have to use load in lua 5.3
14:50:52 <Lymia> I think you can still extract non-deterministic behavior out of tables even if you skip non-safe values in next/pairs
14:51:20 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46538&oldid=46537 * Fizzie * (+4) /* Lua Environment */ I'm pretty sure this was a typo.
14:51:49 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46539&oldid=46538 * Lymia * (+246)
14:52:02 <HackEgo> [wiki] [[Lua Joust]] M https://esolangs.org/w/index.php?diff=46540&oldid=46539 * Lymia * (+1)
14:52:13 -!- Lymia has left ("Hug~♪").
14:52:18 -!- Lymia has joined.
14:52:19 <Lymia> opps
14:52:51 <Lymia> The only solution I can think of is disabling next and pairs. :c
14:53:12 -!- spiette has quit (Quit: :qa!).
14:53:19 -!- bender| has quit (Ping timeout: 250 seconds).
14:53:35 <b_jonas> Lymia: but if you do that, then what you get doesn't resemble to lua much anymore
14:54:03 <Lymia> I could also do a very slow pairs() implementation
14:54:06 <Lymia> Which sorts
14:54:23 <b_jonas> Lymia: can't you just (a) be careful with how you prepare the tables you pass to the program, and (b) set the hash seed to a fixed deterministic value so that any table the user creates is deterministic if you know its history?
14:54:39 <Lymia> b_jonas, the problem is allocation
14:54:48 <Lymia> The hash of, say, {} is its memory address.
14:54:54 <b_jonas> oh...
14:54:55 <b_jonas> ouch
14:55:04 <b_jonas> that would be more difficult to fix, yes
14:55:40 -!- jaboja has quit (Ping timeout: 244 seconds).
14:56:05 <b_jonas> Lymia: luckily for you the lua math standard library doesn't have a signbit or copysign function. The sign bits of NaN values from normal float arithmetic could depend on how you compile your code, but I think with the current lua standard library there might not be any way to extract the sign bit.
14:56:16 -!- spiette has joined.
14:56:27 <Lymia> I believe that'd be artitecture dependent.
14:56:31 <Lymia> Which I'm just going to have to live with.
14:56:41 <Lymia> No good ways out of that one.
14:56:44 <b_jonas> Lymia: exactly, x87 has a saner rule for the sign bit than sse2
14:56:49 <b_jonas> s/sse2/sse/
14:57:06 <b_jonas> no wait
14:57:42 <Lymia> bleh
14:57:44 <b_jonas> x87 and sse also differ on the mantissa of the nan, but you can't generates nans with mantissa different from the "indeterminate" nan, so that doesn't matter
14:57:53 <b_jonas> and x87 has the sane rule for them
14:57:57 <Lymia> The table data structure doesn't let me make the guarantees I want.
14:58:10 <Lymia> So I don't think just skipping over "bad" values in next will work.
14:58:22 <b_jonas> and the sign of nans is actually undefined on sse (as in the documentation says that it's undefined, which is uncharacteristic for x86)
14:58:44 <b_jonas> Lymia: could you fix the addresses too by allocating with a memory allocator you control from a pool of a fixed address?
14:59:02 <b_jonas> Or from a pool of variable address, but modify the hash function?
14:59:08 <Lymia> That would eliminate any possibility of a Lua implementation.
14:59:15 <Lymia> It'd have to be in C, maybe with a patched Lua.
14:59:42 <b_jonas> Lymia: ok, alternately, can you determine determinism if next returns only keys of certain types?
14:59:47 <b_jonas> I don't know how the table works
15:00:00 <Lymia> I don't think so.
15:00:04 <b_jonas> though there's still the problem with # of course
15:00:27 <Lymia> The hash table uses some algorithm that puts colliding elements in different slots, instead of a linked list.
15:00:27 <b_jonas> I have looked at only very few parts of the lua implementation, not the table impl.
15:00:43 <Lymia> So bad elements (From what it looks like) can actually cause reordering in otherwise good elements.
15:00:54 <Lymia> # should be safe.
15:01:07 <b_jonas> Ok, wait, what if you ask a hint from #lua here on freenode? They can handle crazy technical questions about lua as far as I remember.
15:01:35 <Lymia> Hrm.
15:01:37 <Lymia> I could remove next.
15:01:53 <Lymia> And replace pairs() with a custom deterministic ordering.
15:02:48 <b_jonas> Lymia: you say "The tostring function is modified to not reveal the address of tables, threads, functions, or userdata." -- can exception formatting use the builtin tostring, which you could detect with xpcall?
15:03:11 <b_jonas> Lymia: also, wait, can you catch "out of memory" errors from pure lua?
15:03:45 <Lymia> .. er.
15:03:59 <Lymia> I don't know.
15:04:17 <b_jonas> I'm being evil here
15:04:19 <Lymia> I also thought of stack overflows, but.
15:04:48 <b_jonas> wait wait
15:05:04 <Lymia> Running out of stack space.
15:05:06 <b_jonas> you're allowed to set metatables on tables, right?
15:05:09 <Lymia> Yes.
15:05:17 <Lymia> <b_jonas> Lymia: you say "The tostring function is modified to not reveal the address of tables, threads, functions, or userdata." -- can exception formatting use the builtin tostring, which you could detect with xpcall?
15:05:25 <Lymia> I can't figure out how to get that into an error message.
15:05:34 <Lymia> Calling error gets you (error object is a table value)
15:05:41 <b_jonas> that means you can create a table with weak values, which means you can observe the garbage collector, right?
15:06:01 <Lymia> And __gc too.
15:06:03 <Lymia> But that's solvable.
15:06:10 <b_jonas> go on
15:06:14 <Lymia> Those only matter on setmetatable() time, so.
15:06:19 <Lymia> You can just remove those values from the table.
15:06:38 <Lymia> If you add __gc or __mode to the metatable after you setmetatable, they don't do anything.
15:07:42 <b_jonas> Lymia: what if __mode was already there but you modify it later?
15:08:38 <b_jonas> Lymia: also, does the __mode of the metatable get possibly re-examined at the next garbage collection cycle?
15:09:22 <Lymia> I just mentioned that.
15:09:38 <Lymia> Hold on
15:09:54 <Lymia> "Note that if you set a metatable without a __gc field and later create that field in the metatable, the object will not be marked for finalization."
15:10:23 <Lymia> The same is not guarenteed for __mode in the secp.
15:10:24 <Lymia> spec*
15:10:25 <b_jonas> Lymia: I think what you said about __mode is for older versions of lua
15:10:27 <Lymia> But, AFAIK, it still holds.
15:11:00 <b_jonas> Lymia: I don't think so
15:11:43 <Lymia> Hrm. __mode was changed, yeah.
15:11:50 <b_jonas> *snicker*
15:12:03 <b_jonas> I sort of like lua for things like this, but good luck if you fix all this
15:13:14 <Lymia> OK.
15:13:15 <Lymia> Let's do this
15:13:24 <Lymia> Disable garbage collection while running the programs.
15:13:29 <Lymia> And run a cycle manually afterwards.
15:15:05 <Lymia> Eliminate GC non-determinism.
15:16:36 <b_jonas> oh
15:16:47 <b_jonas> you mean you won't re-create the lua interpreter between runs?
15:16:58 <Lymia> The implementation is in Lua.
15:17:11 <Lymia> I guess that is a solution.
15:17:11 <b_jonas> I assumed you would, but it might not be necessary, if you recreate all of the environment (including the math table and stuff)
15:17:18 <Lymia> Yep.
15:17:20 -!- oerjan has joined.
15:17:36 <Lymia> pairs() is the only real nasty problem.
15:17:41 <b_jonas> you might also have to recreate the metatable of strings, and stuff like that
15:17:56 <Lymia> getmetatable and setmetatable are patched to only set metatables on tables.
15:18:03 <Lymia> But I'll just remove them since __mode is an issue.
15:18:14 <b_jonas> ouch
15:18:20 <b_jonas> you remove them entirely?
15:18:26 <Lymia> I might.
15:18:43 <Lymia> I'll have to think about that.
15:18:56 <b_jonas> is there some way to access the metatable of strings without getmetatable?
15:20:53 <Lymia> No.
15:21:04 <Lymia> getfenv used to be a problem
15:21:06 <Lymia> But not anymore.
15:21:11 <oerjan> `? metatable
15:21:30 <HackEgo> metatable? ¯\(°​_o)/¯
15:21:51 <b_jonas> Lymia: ok, well good luck, and ask #lua
15:24:09 <Lymia> The other answer is to drop nondeterminism.
15:24:14 <Lymia> And allow random behavior.
15:27:30 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46541&oldid=46540 * Lymia * (+131) /* Detailed Rules */
15:30:44 <oerjan> @tell ais523 <ais523> but that's at least partly because I do most of my work in bed <-- i believe that doing ordinary activities in bed is considered bad for sleep hth
15:30:44 <lambdabot> Consider it noted.
15:30:58 <Lymia> Hrm.
15:31:02 <Lymia> Different project.
15:31:08 <Taneb> Helloerjan
15:31:20 <oerjan> tafterneb
15:31:23 <Lymia> What's the best way to detect "potato" programs.
15:31:37 <Lymia> In BFJoust which are terrible and unlikely to be useful.
15:31:51 <oerjan> check for initial < hth
15:31:57 <Lymia> I intend to run a large hill of >10000 programs
15:32:19 <Lymia> How do I take the raw scores from that and figure out which programs are potato.
15:32:49 <Taneb> Lymia: recursively eliminate the programs with zero wins?
15:33:00 <Lymia> hrm
15:33:05 <Lymia> That'd indeed cull the worst of the worst.
15:33:12 <Lymia> But not the "maybe OK" programs.
15:33:28 <Lymia> Like.
15:33:37 <b_jonas> `olist 1027
15:33:38 <Lymia> That ends as soon as you find a program where A beats B and B beats A
15:33:42 <HackEgo> olist 1027: shachaf oerjan Sgeo FireFly boily nortti b_jonas
15:33:45 <Lymia> It doesn't actually have to do if they're any good or not.
15:33:48 <oerjan> but whether a program does well depends on the other programs on the hill
15:34:15 <oerjan> oolist
15:34:57 <b_jonas> Lymia: how would you run a hill of 10000 programs? that would mean 10000**2 matches! you'd need a powerful set of computers for that, even if you write really optimized joust backends.
15:35:30 -!- p34k has joined.
15:35:35 <Lymia> Time
15:35:36 <Lymia> Lots o fit
15:35:38 <Lymia> of it*
15:35:52 <b_jonas> but... um...
15:36:54 <oerjan> Volume!
15:37:25 <Lymia> ?
15:37:30 <Lymia> But what
15:38:08 <oerjan> just hack into a supercomputer hth
15:38:28 -!- lambda-11235 has joined.
15:38:29 <oerjan> then it should only take about 80 years.
15:39:38 <Lymia> It's
15:39:51 <b_jonas> wait, he doesn't even mention that Banjo is freaking chaotic and could easily have voted the wrong way?
15:39:56 <Lymia> Only a hundred million matchups
15:40:01 <Lymia> That isn't too terrible.
15:40:08 <Lymia> As far as "computable things" goes.
15:40:12 <int-e> `learn It's written with an apostrophe.
15:40:20 <HackEgo> Learned 'it'': It's written with an apostrophe.
15:40:33 <Lymia> A week at worst, most likely.
15:41:59 <Taneb> > 100 * 100 * 42
15:42:00 <lambdabot> 420000
15:42:18 <Taneb> > 100 * 100 * 42 * 100000 -- :: Cycles
15:42:19 <lambdabot> 42000000000
15:42:32 -!- lleu has joined.
15:43:04 <Taneb> Lymia: assuming 1000 cycles a second, worst case that'll take 16 months
15:44:06 <Taneb> > 50 * 99 * 42 * 100000 -- :: Cycles, removing trivial matchups
15:44:08 <lambdabot> 20790000000
15:44:23 <Taneb> Still 240 days
15:44:44 <Lymia> 1000 cycles a second?
15:44:59 <Lymia> Are you running it on a Pentium III?
15:45:19 <Taneb> Lymia: I have no instinct for how fast a cycle should be
15:45:41 -!- XorSwap has joined.
15:45:50 <Lymia> Or a 8086? That might get the 1000 cycles/s
15:45:56 <Lymia> It's orders of magnitude off.
15:46:00 <Taneb> Well then
15:46:09 <Taneb> You're in luck that I don't decide how fast things go
15:47:55 <Lymia> I'd say very conservatively maybe 1 million cycles a second.
15:48:02 <b_jonas> um
15:57:56 <Lymia> Taneb, basically. If you estimate 1000 cycle/s
15:58:47 <Lymia> You're guessing 2 million processor cycles per BFJoust cycle at 2 GhZ. For one core.
16:01:07 <Taneb> I am way off
16:04:55 <Lymia> I'm measuring 0.019s per core for a full round of (.)*-1 vs (.)*-1
16:05:24 <Lymia> Which implies maybe 50 full rounds per second worst case
16:06:22 <Lymia> Giving 23 days. But that's if every match takes the full 100000 cycles.
16:06:50 <Lymia> So, around a week or so given 4 cores.
16:07:42 <Lymia> I'm not worried.
16:08:02 -!- _46bit has joined.
16:09:31 -!- J_Arcane has quit (Ping timeout: 252 seconds).
16:10:10 -!- mroman has quit (Quit: Lost terminal).
16:10:48 <_46bit> I came second in a Brainfuck competition!
16:11:48 <oerjan> _46bit: are you from york
16:12:00 <_46bit> yes!
16:12:09 <oerjan> Taneb here also participated
16:12:12 <_46bit> indeed
16:12:26 <Taneb> oerjan: we know each other
16:12:36 <_46bit> Taneb actually earned their prize
16:12:44 <fizzie> Lymia: IIRC, it takes on the order of a few seconds (less than three, I think) to run through the 1081 pairings zemhill's 47-program hill has. Assuming it was 2 seconds, and extrapolating to 10000 (so a factor of (10000*9999)/(47*46)), that'd be about ~100k CPU-seconds. That's barely over a day, and that's single-threaded.
16:12:53 <_46bit> I did something like FizzBuzz
16:12:59 <_46bit> and then nobody else entered
16:13:00 <_46bit> so I won
16:13:04 <int-e> @bf ++++++++++[>++++++++++>+++++++++++>+++<<<-]>-.>+.-.<++++.>++++.<------.>++.+.---------.<.>++++++++.<++++++++.++++++.-.>-.<<.
16:13:04 <lambdabot> congratulations
16:13:06 <_46bit> :-( :-)
16:13:08 <oerjan> congrats to both of you
16:13:18 <int-e> @bf ++++++++++[>++++++++++>+++++++++++>+++<<<-]>-.>+.-.<++++.>++++.<------.>++.+.---------.<.>++++++++.<++++++++.++++++.-.>-.>.
16:13:18 <lambdabot> congratulations
16:13:34 <int-e> ah.
16:13:37 <int-e> @bf ++++++++++[>++++++++++>+++++++++++>+++<<<-]>-.>+.-.<++++.>++++.<------.>++.+.---------.<.>++++++++.<++++++++.++++++.-.>-.>+++.
16:13:37 <lambdabot> congratulations!
16:13:39 <Lymia> In practice
16:13:40 <int-e> stupid.
16:13:55 <Lymia> I only actually have 5297 programs.
16:13:57 <Lymia> So cut that by 1/4
16:14:36 -!- J_Arcane has joined.
16:14:47 <fizzie> Also from an old hill -- "Simulated a total of 378501202 cycles in 45402 individual jousts for 1081 duels." That gives an average of 8337 cycles/[whatever term you want to use].
16:15:59 <Lymia> 11470 distinct programs, but.
16:16:09 <Lymia> If my canonicalization is good.
16:16:17 <Lymia> Only 5297 in effect
16:18:24 <Lymia> oh, well
16:18:25 <Lymia> nope
16:18:30 <Lymia> I definitely have canonicalization errors
16:20:51 <b_jonas> hmm
16:21:35 <Lymia> fixed.
16:22:09 <fizzie> Ah, there's an actual number.
16:22:10 <fizzie> 2014-09-22 19:53:50 <fizzie> ais523: gearlanced can run the entire hill (all 1081 program pairs) in 1.7 seconds on this system.
16:22:29 <Lymia> Is what I get for using regex.
16:22:37 <Lymia> How's torquelance?
16:23:00 <fizzie> None of the fancy variants have really been worth it, IIRC.
16:23:15 <Lymia> I did measure a 2x speedup from it
16:23:22 <Lymia> On a simple case
16:24:01 -!- XorSwap has quit (Ping timeout: 244 seconds).
16:24:09 <Lymia> but, urgh protobuf
16:24:21 <fizzie> Yeah, I kind of got carried away.
16:24:40 <fizzie> It's only for the visualization statistics, I think.
16:25:03 <Lymia> Most of my runtime in the version gathering phase
16:25:07 <Lymia> Is from hg
16:25:19 <fizzie> Oh, I guess it's for everything now. Sorry about that.
16:25:19 <Lymia> That thing is slow
16:25:35 <Lymia> I could probably honestly speed it up using git-hg
16:25:37 <Lymia> Let's try that
16:25:55 <fizzie> Well, the "ascii-based" protocol it had wasn't exactly pleasant either.
16:27:05 <fizzie> Anyway, using gearlanced to run a hill is quite a bit faster than calling gearlance individually for each pair.
16:28:13 <Lymia> Can has a torquelanced? :P
16:28:21 <Lymia> iunno
16:28:26 <Lymia> I should benchmark it for real sometime
16:28:30 <Lymia> To see if that stuff is actually worth it
16:29:19 <fizzie> I think wrenchlance worked better than torquelance in my own tests, but I haven't really been very rigorous about this.
16:30:04 <Lymia> wrenchlance invokes gcc
16:30:08 <Lymia> oh, but only once per pair
16:30:17 <Lymia> Er
16:30:19 <Lymia> program*
16:30:48 <Lymia> You could probably put together a torquelanced though
16:30:54 <Lymia> wrenchlance seems more resistant to taht
16:31:34 <Lymia> Not even a torquelanced
16:32:10 <Lymia> torquelance_multiple right_B right_B2 program1A program2A program3A program4A...
16:32:40 <fizzie> Huh, that's interesting. In a straight-forward "run the thing for each pair individually", http://sprunge.us/JHOS -- more elapsed-time but less user-time.
16:34:23 <Lymia> ?
16:34:31 <Lymia> Could it be from your shell script
16:36:39 <fizzie> Could be. These aren't really meant for benchmarking at all, it's part of the regression-testing thing.
16:36:46 <fizzie> I just stuck a "time" there for funsies.
16:36:51 -!- nycs has joined.
16:37:17 -!- `^_^v has quit (Ping timeout: 268 seconds).
16:44:23 -!- jaboja has joined.
16:48:29 <Lymia> Hrm
16:48:39 <Lymia> Maybe I could make do with a specialized program based off torquelance?
16:48:57 <Lymia> Reads BFJoust programs from stdin, compiles and does a full tournament on them in-memory
16:54:34 <oerjan> @tell ais523 <ais523> mad: as I said, this is how quantum bogosort "works" <-- btw i think such things are not really believed possible; they're basically incompatible with the principle of unitary evolution - they require postselection, a feature which quantum mechanics does _not_ seem to support.
16:54:34 <lambdabot> Consider it noted.
16:54:59 -!- J_Arcane has quit (Ping timeout: 244 seconds).
16:56:31 <oerjan> @tell ais523 That is, you can set up an experiment in which two paths (with indistinguishible results) cancel each other, but you cannot do that from inside that paths themselves, and there must always remain possible paths.
16:56:31 <lambdabot> Consider it noted.
16:57:34 <oerjan> @tell ais523 (because unitary evolution means the total probability of all remaining options does not change.)
16:57:34 <lambdabot> Consider it noted.
17:00:26 -!- AnotherTest has joined.
17:05:40 -!- J_Arcane has joined.
17:17:52 <Lymia> fizzie, so. Something more difficult
17:18:06 <Lymia> What do I do if I want full stats for 10000 v 10000
17:20:47 <Lymia> !ztest http://google.com
17:20:47 <zemhill> Lymia: "!ztest progname code". See http://zem.fi/bfjoust/ for documentation.
17:20:52 <Lymia> !ztest google http://google.com
17:20:52 <zemhill> Lymia: error: parse error: encountered { without suitable enclosing (
17:21:08 <Lymia> Hrm
17:21:17 <Lymia> impossible things: html+bfjoust polygot
17:21:22 <Lymia> Or, well.
17:21:25 <Lymia> It's possible, but...
17:21:32 <Lymia> Only for one bfjoust program.
17:24:03 <b_jonas> Lymia: that depends on how exactly you interpret HTML
17:24:35 <Taneb> b_jonas: if you interpret HTML using a brainfuck interpreter....
17:26:06 <Lymia> <!DOCTYPE
17:26:08 <Lymia> you die
17:33:46 -!- XorSwap has joined.
17:34:44 -!- oerjan has quit (Quit: Later).
17:35:08 -!- XorSwap has quit (Client Quit).
17:41:51 -!- jaboja has quit (Ping timeout: 264 seconds).
18:00:48 -!- oerjan has joined.
18:01:01 <oerjan> !sh uptime
18:01:01 <EgoBot> 18:01:01 up 83 days, 11:14, 0 users, load average: 13.09, 13.15, 13.22
18:01:09 <int-e> Lymia: which is just what you deserve
18:01:20 <int-e> I mean, if you did that
18:01:45 <oerjan> !sh ps | grep lance
18:01:46 <EgoBot> ​\ \ Signal 18 (CONT) caught by ps (procps version 3.2.8). \ Please send bug reports to <feedback@lists.sf.net> or <albert@users.sf.net>
18:01:54 <oerjan> wat
18:02:08 <oerjan> oh well.
18:02:12 <int-e> (many brainfuck interpreters won't care, of course... and after the next > you'll be in safe territory again)
18:02:29 -!- oerjan has quit (Client Quit).
18:02:30 <int-e> hmm, that's a cool one...
18:02:56 <int-e> !sh ps | grep lance
18:02:56 <EgoBot> ​\ \ Signal 18 (CONT) caught by ps (procps version 3.2.8). \ Please send bug reports to <feedback@lists.sf.net> or <albert@users.sf.net>
18:03:10 <int-e> okay so apparently it does that every time :/
18:03:16 <Lymia> \o/
18:03:43 <int-e> and what's !sh anyway
18:04:49 <int-e> !sh pstree | grep lance
18:04:50 <EgoBot> ​| | | `-report---gearlance] \ | | | `-report---gearlance]
18:05:10 <Lymia> Can you kill it?
18:05:18 <Lymia> Try killall -9 report
18:05:57 <int-e> !sh grep lance /proc/*/cmdline
18:05:57 <EgoBot> Binary file /proc/12604/cmdline matches \ Binary file /proc/12663/cmdline matches \ Binary file /proc/12728/cmdline matches \ Binary file /proc/13455/cmdline matches \ Binary file /proc/13547/cmdline matches \ Binary file /proc/13728/cmdline matches \ Binary file /proc/13988/cmdline matches \ Binary file /proc/14438/cmdline matches \ Binary file /proc/14988/cmdline matches \ Binary file /proc/15555/cmdline matches
18:06:43 * int-e isn't sure how much he can break there
18:06:45 <int-e> !sh whoami
18:06:46 <EgoBot> ​/usr/bin/whoami: cannot find name for user ID 1546733
18:06:59 <int-e> !sh pstree -u | grep lance
18:07:00 <EgoBot> ​| | | `-report---gearlance] \ | | | `-report---gearlance]
18:07:34 <int-e> !sh pstree -u | grep report
18:07:34 <EgoBot> ​| | | `-report---gearlance] \ | | | `-report---gearlance]
18:07:41 <int-e> !sh killall report
18:07:42 <EgoBot> report(995): Operation not permitted \ report(12604): Operation not permitted \ report(12663): Operation not permitted \ report(12728): Operation not permitted \ report(13455): Operation not permitted \ report(13547): Operation not permitted \ report(13728): Operation not permitted \ report(13988): Operation not permitted \ report(14438): Operation not permitted \ report(14988): Operation not permitted \ report(15555):
18:07:47 <int-e> okay, nothing :)
18:07:53 <Lymia> Wish that'd work.
18:07:55 <int-e> !sh pstree -u | grep report
18:07:56 <EgoBot> ​| | | `-report---gearlance] \ | | | `-report---gearlance]
18:08:00 <Lymia> It needs doing.
18:08:08 <int-e> !sh pstree -p | grep report
18:08:08 <EgoBot> ​| | | `-report(995)---gearlance(31444) \ | | | `-report(12604)---gearlance(3138+ \ | | | `-report(12663)---gearlance(3138+ \ |
18:08:10 <Lymia> Check /tmp for goodies
18:09:05 -!- lynn has joined.
18:09:33 <int-e> !sh du -s /tmp 2>/dev/null
18:09:34 <EgoBot> 4./tmp
18:09:59 <Lymia> I wonder if there's overflows and/or 'fun' to be had with gearlance.
18:10:11 <int-e> probably?
18:10:18 <Lymia> If you can get it to run code as the same user as report.
18:10:22 <Lymia> And killit
18:11:09 <fizzie> Lymia: Well, zhillcrank.rb takes 4.121s of elapsed time to crank full statistics for the 47-program hill, so computationally speaking that doesn't sound like a problem. Though you'd probably need to adjust it to do some batching. The stat file for 47 programs is 8147534 and I would assume it to be approximately linear in the number of pairs. Extrapolating to 10k programs, that'd mean ...
18:11:15 <fizzie> ... 376814026207 bytes ~ 350 GB, which might not fit in RAM on many systems. (Especially since the in-memory representation probably has more overhead.)
18:11:38 <fizzie> s/8147534/8147534 bytes/
18:12:16 <Lymia> You need gearlance, right?
18:12:18 <Lymia> For stats
18:12:24 <Lymia> No fancy lances.
18:12:32 <fizzie> Yes.
18:12:37 <fizzie> But it's not that slow.
18:12:55 <Lymia> I'd also like to modify it to generate .svg files instead of .png
18:13:01 <Lymia> To save on storage spce.
18:13:02 <Lymia> space*
18:13:31 <Lymia> Last time I tried 100x100 I remember problems with it using lots of space on disk.
18:13:33 <fizzie> Oh, you mean running the old-style egostats? That would be entirely impossible.
18:13:34 <Lymia> The final output
18:14:48 <Lymia> How so?
18:16:26 <fizzie> Because those scripts manage to use multiple gigabytes of memory to even run for the 47x47 case.
18:16:37 <fizzie> I assumed you just wanted the raw data.
18:17:33 <fizzie> (To do something with, I don't know what.)
18:18:09 <fizzie> Many (most?) of the plots also wouldn't really work for 10k programs.
18:25:58 <int-e> !sh awk '{ print $22 }' /proc/{995,self}/stat
18:25:59 <EgoBot> 717423685 \ 721318974
18:26:26 <int-e> > (721318974 - 717423685) / 100 / 3600
18:26:27 <lambdabot> 10.820247222222221
18:26:52 <int-e> I think that's how long ago (in hours) that thing was started
18:27:49 <fizzie> I think I vaguely recall a discussion on how EgoBot's copy of gearlance predates the fix for empty loops.
18:28:07 <int-e> oh is that the ()*-1 stuff?
18:28:41 <fizzie> I think so, yes.
18:28:50 <fizzie> Or some more complex forms.
18:29:06 <fizzie> (Like nested ones.)
18:31:53 <int-e> hah, there's a !bfjoust command at 8:36, which fits my calculation
18:37:04 <int-e> !sh grep -l report /proc/[1-9]*/stat | xargs awk 'p { print (s - $22)/100, "seconds ago" } !p { p = 1; s = $22; }' /proc/self/stat | date -f-
18:37:05 <EgoBot> ​/bin/grep: /proc/9303/stat: No such file or directory \ Sun Mar 6 23:57:45 UTC 2016 \ Sun Mar 6 23:57:56 UTC 2016 \ Sun Mar 6 23:58:03 UTC 2016 \ Mon Mar 7 00:00:19 UTC 2016 \ Mon Mar 7 00:00:27 UTC 2016 \ Mon Mar 7 00:00:51 UTC 2016 \ Mon Mar 7 00:01:20 UTC 2016 \ Mon Mar 7 00:02:13 UTC 2016 \ Mon Mar 7 00:02:58 UTC 2016 \ Mon Mar 7 00:03:46 UTC 2016 \ Mon Mar 7 07:12:11 UTC 2016 \ Mon Mar 7 14:10:24 UTC
18:37:09 <Lymia> fizzie, so, better question.
18:37:17 <Lymia> zhillcrank outputs this, right: http://zem.fi/bfjoust/vis/cycles/
18:37:33 <Lymia> How do you expect this UI to hold up to 10000 x 10000 warriors
18:39:13 <int-e> 00:56:23 <b_jonas> !bfjoust pause ()*-1 00:56:26 <EgoBot> ​Score for b_jonas_pause: 6.1 ... hmmmmm.
18:40:33 <int-e> !sh date
18:40:34 <EgoBot> Mon Mar 7 18:40:34 UTC 2016
18:40:51 <Lymia> !bfjoust live .
18:41:14 <int-e> ah, that's the one: 00:57:44 <b_jonas> !bfjoust pause ((({})*999999)*9999999)*999999
18:41:35 <int-e> it's been broken since.
18:42:41 <int-e> `? b_jonas
18:42:49 <HackEgo> b_jonas egy nagyon titokzatos személy. Hollétéről egyelőre nem ismertek.
18:42:58 <int-e> aha.
18:43:05 <int-e> does it say that he's a bad person?
18:44:45 <int-e> !sh grep -l report /proc/[1-9]*/stat | xargs awk 'p { print (s - $22)/100, "seconds ago" } !p { p = 1; s = $22; }' /proc/self/stat | date -f- +%d-%H:%M:%S
18:44:46 <EgoBot> ​/bin/grep: /proc/15886/stat: No such file or directory \ 07-18:40:52 \ 06-23:57:45 \ 06-23:57:56 \ 06-23:58:03 \ 07-00:00:19 \ 07-00:00:27 \ 07-00:00:51 \ 07-00:01:20 \ 07-00:02:13 \ 07-00:02:59 \ 07-00:03:46 \ 07-07:12:11 \ 07-14:10:25 \ 07-07:36:46
18:45:34 <int-e> !sh grep -l report /proc/[1-9]*/stat 2>/dev/null | xargs awk 'p { print (s - $22)/100, "seconds ago" } !p { p = 1; s = $22; }' /proc/self/stat | date -f- +%d-%H:%M:%S | sort | xargs
18:45:35 <EgoBot> 06-23:57:45 06-23:57:56 06-23:58:03 07-00:00:19 07-00:00:27 07-00:00:51 07-00:01:20 07-00:02:14 07-00:02:59 07-00:03:46 07-07:12:11 07-07:36:46 07-14:10:25 07-18:40:52
18:49:07 <int-e> (these are the start times of the various report processes; presumably they all hang waiting on a gearlance process that's merrily consuming CPU cycles)
18:49:37 <int-e> oh and the output is UTC
18:50:25 <Lymia> h,,
18:50:27 <Lymia> hm
18:50:29 <Lymia> Check their pid
18:50:55 <int-e> 995 is the first one (see above)
18:51:05 <Lymia> Er
18:51:06 <Lymia> Not pid, uid
18:53:29 -!- copumpkin has quit (Quit: Textual IRC Client: www.textualapp.com).
18:53:47 <int-e> !sh ls -la /proc/995/stat
18:53:48 <EgoBot> ​/bin/ls: /proc/995/stat: Function not implemented \ -r--r--r-- 1 5000 0 0 Mar 7 14:10 /proc/995/stat
18:53:49 -!- copumpkin has joined.
18:54:02 <int-e> !sh id
18:54:03 <EgoBot> uid=1236523 gid=1236523
18:54:07 <int-e> !sh id
18:54:07 <EgoBot> uid=1332109 gid=1332109
18:54:14 <Lymia> ... is it 100% random?
18:54:27 <Lymia> That could be fun if it randomly happens to be 5000
18:54:37 <Lymia> uname -a? :P
18:54:45 <int-e> !sh uname -a
18:54:45 <EgoBot> Linux codu.org 3.2.0-4-amd64 #1 SMP Debian 3.2.68-1+deb7u3 x86_64 GNU/Linux
18:54:51 <int-e> can't you do that yourself?
18:55:01 <Lymia> !sh test
18:55:01 <EgoBot> No output.
18:55:06 <int-e> !sh test
18:55:07 <EgoBot> No output.
18:55:07 <Lymia> huh
18:55:18 <Lymia> 3.2.0 is old isn't it
18:55:40 <Lymia> I wonder if it fixes the keyrings exploit
18:55:40 <int-e> !ls /boot
18:56:03 <int-e> !sh ls /boot
18:56:04 <EgoBot> ​/bin/ls: cannot access /boot: No such file or directory
18:56:09 <int-e> !sh ls /
18:56:10 <EgoBot> bin \ dev \ etc \ home \ lib \ lib64 \ opt \ proc \ tmp \ usr
18:57:20 <Lymia> !sh find / -perm -4000
18:57:20 <EgoBot> ​/usr/bin/find: `/': Function not implemented
18:57:27 <Lymia> wut
18:57:29 <Lymia> !sh find / -perm 4000
18:57:29 <EgoBot> ​/usr/bin/find: `/': Function not implemented
18:57:34 <Lymia> !sh busybox find / -perm 4000
18:57:55 <EgoBot> find: /proc/tty/driver: Input/output error \ find: /proc/1/task/1/fd: Input/output error \ find: /proc/1/task/1/fdinfo: Input/output error \ find: /proc/1/task/1/ns: Input/output error \ find: /proc/1/fd: Input/output error \ find: /proc/1/fdinfo: Input/output error \ find: /proc/1/ns: Input/output error \ find: /proc/2/task/2/fd: Input/output error \ find: /proc/2/task/2/fdinfo: Input/output error \ find: /proc/2/task/2/ns:
18:58:00 <Lymia> !sh busybox find / -perm 4000 | paste
18:58:17 <EgoBot> find: /proc/tty/driver: Input/output error \ find: /proc/1/task/1/fd: Input/output error \ find: /proc/1/task/1/fdinfo: Input/output error \ find: /proc/1/task/1/ns: Input/output error \ find: /proc/1/fd: Input/output error \ find: /proc/1/fdinfo: Input/output error \ find: /proc/1/ns: Input/output error \ find: /proc/2/task/2/fd: Input/output error \ find: /proc/2/task/2/fdinfo: Input/output error \ find: /proc/2/task/2/ns:
18:58:24 <Lymia> !sh busybox find / -perm 4000 2>/dev/null
18:58:40 -!- Reece` has joined.
19:01:25 <Lymia> !sh busybox ps ax
19:01:26 <EgoBot> PID USER COMMAND \ 1 0 /lib/systemd/systemd --system --deserialize 17 \ 2 0 [kthreadd] \ 3 0 [ksoftirqd/0] \ 5 0 [kworker/u:0] \ 6 0 [migration/0] \ 7 0 [watchdog/0] \ 8 0 [migration/1] \ 10 0 [ksoftirqd/1] \ 11 0 [watchdog/1] \ 12 0 [cpuset] \ 13 0 [khelper] \ 14 0 [kdevtmpfs] \ 15 0
19:01:56 <Lymia> !sh ldd `which find`
19:01:56 <EgoBot> ldd: exited with unknown exit code (139)
19:02:03 <Lymia> !sh busybox ldd `which find`
19:02:04 <EgoBot> ldd: applet not found
19:02:26 <Lymia> !sh LD_PRELOAD=/lib/libc.so.6 ldd `which find`
19:02:26 <EgoBot> ​/bin/bash: /usr/bin/ldd: No such file or directory
19:02:39 <Lymia> !sh LD_PRELOAD=/lib/libc.so.6 LD_LIBRARY_PATH="" ldd `which find`
19:02:40 <EgoBot> ​/bin/bash: /usr/bin/ldd: No such file or directory
19:02:48 <Lymia> !sh ls /usr/bin/ldd
19:02:49 <EgoBot> ​/usr/bin/ldd
19:02:53 <Lymia> !sh ls -alh /usr/bin/ldd
19:02:53 <EgoBot> ​/bin/ls: /usr/bin/ldd: Function not implemented \ -rwxr-xr-x 1 0 0 5.8K Aug 16 2009 /usr/bin/ldd
19:03:01 <Lymia> !sh busybox ls -alh /usr/bin/ldd
19:03:01 <EgoBot> ​-rwxr-xr-x 1 0 0 5.7K Aug 16 2009 /usr/bin/ldd
19:03:12 <Lymia> !sh busybox cp /usr/bin/ldd /tmp/ldd
19:03:12 <EgoBot> No output.
19:03:19 <Lymia> !sh LD_PRELOAD=/lib/libc.so.6 LD_LIBRARY_PATH="" /tmp/ldd `which find`
19:03:20 <EgoBot> ​/tmp/input.32686: line 1: /tmp/ldd: No such file or directory
19:03:26 <Lymia> !sh /tmp/ldd `which find`
19:03:27 <EgoBot> ​/tmp/input.358: line 1: /tmp/ldd: No such file or directory
19:03:33 <Lymia> !sh ls /tmp
19:03:33 <EgoBot> input.504
19:03:43 <Lymia> !sh busybox ls /tmp
19:03:44 <EgoBot> input.693
19:03:50 <Lymia> !sh busybox ls -alh /tmp
19:03:51 <EgoBot> ​-rw-r--r-- 1 5000 0 21 Mar 7 19:03 input.837
19:03:56 <Lymia> !sh busybox ls -alh /
19:03:56 <EgoBot> drwxr-xr-x 2 0 0 4.0K Oct 12 2011 bin \ drwxrwxrwx 0 0 0 0 Jan 1 1970 dev \ drwxrwxrwx 0 0 0 0 Jan 1 1970 etc \ drwxrwxrwx 0 0 0 0 Jan 1 1970 home \ drwxr-xr-x 11 0 0 8.0K Dec 31 2011 lib \ lrwxrwxrwx 1 0 0 4 Jan 1 1970 lib64 -> /lib \ drwxrwxrwx 0 0 0 0
19:03:57 <Lymia> Hrm
19:04:00 <Lymia> Mount namespaces?
19:04:05 <Lymia> !sh busybox mount
19:04:06 <EgoBot> rootfs on / type rootfs (rw) \ sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) \ proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) \ udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=477568,mode=755) \ devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) \ tmpfs on /run type tmpfs (rw,nosuid,relatime,size=771108k,mode=755) \ /dev/xvda1 on / type ext3
19:04:13 <Lymia> !sh busybox mount | grep tmp
19:04:14 <EgoBot> udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=477568,mode=755) \ tmpfs on /run type tmpfs (rw,nosuid,relatime,size=771108k,mode=755) \ tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev) \ tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k) \ tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755) \ tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,size=385556k,mode=700)
19:04:21 <Lymia> !sh busybox mount | grep /tmp
19:04:21 <EgoBot> No output.
19:04:25 <Lymia> !sh busybox mount | grep /
19:04:25 <EgoBot> rootfs on / type rootfs (rw) \ sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime) \ proc on /proc type proc (rw,nosuid,nodev,noexec,relatime) \ udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=477568,mode=755) \ devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000) \ tmpfs on /run type tmpfs (rw,nosuid,relatime,size=771108k,mode=755) \ /dev/xvda1 on / type ext3
19:05:15 <Lymia> !sh busybox ls /run
19:05:15 <EgoBot> ls: /run: No such file or directory
19:05:20 <Lymia> !sh busybox ls /
19:05:20 <EgoBot> bin \ dev \ etc \ home \ lib \ lib64 \ opt \ proc \ tmp \ usr
19:05:33 <Lymia> Mount namespaces, definitely.
19:05:39 <Lymia> !sh busybox ls /home
19:05:39 <EgoBot> egobot
19:05:41 <Lymia> !sh busybox ls /home/egobot
19:05:41 <EgoBot> egobot.hg
19:05:45 <Lymia> !sh busybox ls /home/egobot/egobot.hg
19:05:46 <EgoBot> multibot_cmds
19:05:53 <Lymia> !sh busybox ls /home/egobot/egobot.hg/multibot_cmds
19:05:54 <EgoBot> interps \ lib \ slox
19:06:00 <Lymia> !sh busybox ls -alh /home/egobot/egobot.hg/multibot_cmds
19:06:00 <EgoBot> drwxr-xr-x 39 5000 5000 4.0K Feb 20 2011 interps \ drwxr-xr-x 2 5000 5000 4.0K May 31 2012 lib \ drwxrwxrwx 0 0 0 0 Jan 1 1970 slox
19:06:12 <Lymia> !sh ls /dev/shm
19:06:13 <EgoBot> ​/bin/ls: cannot access /dev/shm: No such file or directory
19:06:15 <Lymia> !sh ls /dev/
19:06:16 <EgoBot> null
19:06:42 <fizzie> I only know about HackEgo sandboxing, I don't know if/how similar EgoBot is.
19:06:45 <Lymia> !sh busybox --help
19:06:45 <EgoBot> BusyBox v1.14.2 (Debian 1:1.14.2-2) multi-call binary \ Copyright (C) 1998-2008 Erik Andersen, Rob Landley, Denys Vlasenko \ and others. Licensed under GPLv2. \ See source distribution for full notice. \ \ Usage: busybox [function] [arguments]... \ or: function [arguments]... \ \.BusyBox is a multi-call binary that combines many common Unix \..utilities into a single executable. Most people will create
19:06:53 <Lymia> !sh ldd `which busybox`
19:06:53 <EgoBot> ldd: exited with unknown exit code (139)
19:07:06 <Lymia> It looks like there's something weird going on with the libc
19:07:13 <Lymia> busybox is usually static, so.
19:07:22 <Lymia> `?
19:07:22 <HackEgo> Mmmmm... no.
19:07:36 <Lymia> I'll get revenge some day.
19:08:14 <Lymia> !sh (sleep 100) &
19:08:20 <Lymia> !sh id ; (sleep 100) &
19:08:31 <Lymia> !sh busybox ps axu | grep sh
19:08:31 <EgoBot> 115 0 [flush-202:0] \ 941 5000 /bin/bash PRIVMSG/tr_21.cmd PRIVMSG #esoteric !bfjoust comex_the_first_program_ever (>)*9[-]+[>[-]+] \ 953 0 /usr/sbin/sshd -D \ 967 5000 /bin/bash scmds/bfjoust bfjoust comex_the_first_program_ever (>)*9[-]+[>[-]+] PRIVMSG #esoteric !bfjoust comex_the_first_program_ever (>)*9[-]+[>[-]+] \ 990 5000 /bin/bash scmds/bfjoust bfjoust comex_the_first_program_ever
19:09:27 <Lymia> !sh busybox ps axu | grep gearlance
19:09:28 <EgoBot> 995 5000 ../report ../gearlance ../cache Deewiant_allegro.bfjoust Deewiant_pendolino.bfjoust Fiora_timestopping-mahou-shoujo.bfjoust Gregor_furry_furry_strapon_pegging_girls.bfjoust Lymia_aurora.bfjoust Lymia_flow.bfjoust Lymia_nyuroki.bfjoust Lymia_two_people_runn \ 6587 5000 /bin/bash PRIVMSG/tr_21.cmd PRIVMSG #esoteric !sh busybox ps axu | grep gearlance \ 6604 5000 /bin/bash PRIVMSG/tr_21.cmd
19:10:17 <Lymia> !sh busybox wget https://api.ipify.org?format=json -
19:10:18 <EgoBot> wget: not an http or ftp url: https://api.ipify.org?format=json
19:10:22 <Lymia> !sh busybox wget http://api.ipify.org?format=json -
19:10:22 <EgoBot> wget: bad address 'api.ipify.org'
19:10:29 <Lymia> !sh busybox wget http://api.ipify.org/?format=json -
19:10:30 <EgoBot> wget: bad address 'api.ipify.org'
19:10:56 <Lymia> !sh busybox wget -
19:10:57 <EgoBot> Connecting to ( \ wget: cannot connect to remote host ( Connection refused
19:11:12 <Lymia> !sh busybox ifconfig
19:11:12 <EgoBot> eth0 Link encap:Ethernet HWaddr AA:00:00:3E:AD:41 \ inet addr: Bcast: Mask: \ inet6 addr: fe80::a800:ff:fe3e:ad41/64 Scope:Link \ UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 \ RX packets:16546593 errors:0 dropped:0 overruns:0 frame:0 \ TX packets:14196923 errors:0 dropped:0 overruns:0 carrier:0 \ collisions:0
19:11:37 <Lymia> !sh busybox ifconfig | grep Link
19:11:37 <EgoBot> eth0 Link encap:Ethernet HWaddr AA:00:00:3E:AD:41 \ inet6 addr: fe80::a800:ff:fe3e:ad41/64 Scope:Link \ lo Link encap:Local Loopback
19:11:58 <Lymia> !sh busybox wget -
19:11:58 <EgoBot> Connecting to ( \ wget: can't open 'index.html': Permission denied
19:12:09 <Lymia> !sh busybox curl
19:12:10 <EgoBot> curl: applet not found
19:12:45 <Lymia> !sh busybox curl -O -
19:12:46 <EgoBot> curl: applet not found
19:12:50 <Lymia> !sh busybox get -O -
19:12:50 <EgoBot> get: applet not found
19:12:52 <Lymia> !sh busybox wget -O -
19:12:52 <EgoBot> Connecting to ( \ <!doctype html> \ <html> \ <head><title>Codu</title> \ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> \ <link rel="openid.server" href="http://www.myopenid.com/server" /> \ <link rel="openid.delegate" href="http://codu.myopenid.com/" /> \ \ <link rel="stylesheet" href="/Gregor.css" type="text/css"/> \ <link rel="stylesheet" href="/css/superfish.css"
19:14:16 <Lymia> !sh busybox wget -O -
19:14:17 <EgoBot> Connecting to ( \ <!doctype html> \ <html> \ <head><title>Codu</title> \ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> \ <link rel="openid.server" href="http://www.myopenid.com/server" /> \ <link rel="openid.delegate" href="http://codu.myopenid.com/" /> \ \ <link rel="stylesheet" href="/Gregor.css" type="text/css"/> \ <link rel="stylesheet" href="/css/superfish.css"
19:14:22 <Lymia> !sh busybox wget -O -
19:14:22 <EgoBot> Connecting to ( \ wget: cannot connect to remote host ( Connection refused
19:14:31 <Lymia> !sh busybox wget -O -
19:14:31 <EgoBot> Connecting to ( \ wget: cannot connect to remote host ( Connection refused
19:16:02 <Lymia> !sh wget http://google.com/ -O -
19:16:02 <EgoBot> ​--2016-03-07 19:16:02-- http://google.com/ \ Resolving google.com... failed: Name or service not known. \ wget: unable to resolve host address `google.com'
19:16:57 -!- jaboja has joined.
19:20:08 <int-e> !sh wget
19:20:10 <EgoBot> ​--2016-03-07 19:20:08-- \ Connecting to connected. \ HTTP request sent, awaiting response... 200 Script output follows \ Length: 4 [application/binary] \ foo: Permission denied \ \ Cannot write to `foo' (No such file or directory).
19:20:15 <int-e> !sh wget -O -
19:20:16 <EgoBot> ​--2016-03-07 19:20:15-- \ Connecting to connected. \ HTTP request sent, awaiting response... 200 Script output follows \ foo \ Length: 4 [application/binary] \ Saving to: `STDOUT' \ \ 0K 100% 285K=0s \ \ 2016-03-07 19:20:16 (285 KB/s) - `-' saved [4/4] \
19:20:45 <int-e> !sh wget -O - 2>/dev/null
19:20:47 <EgoBot> foo
19:20:58 <int-e> !help
19:20:58 <zemhill> int-e: I do !zjoust; see http://zem.fi/bfjoust/ for more information.
19:20:58 <EgoBot> ​help: General commands: !help, !info, !bf_txtgen. See also !help languages, !help userinterps. You can get help on some commands by typing !help <command>.
19:21:34 <int-e> !sh which gcc
19:21:35 <EgoBot> ​/usr/bin/gcc
19:21:45 <int-e> !fetch
19:22:21 <int-e> Lymia: oh well, at least you can access files inside the hackego environment that way
19:22:25 <int-e> `fetch
19:22:28 <HackEgo> http://: Invalid host name.
19:23:03 <Lymia> !sh uname --kernel-release
19:23:03 <EgoBot> 3.2.0-4-amd64
19:23:19 <Lymia> !sh busybox uname --kernel-release
19:23:19 <EgoBot> 3.2.0-4-amd64
19:23:26 <int-e> `fetch http://lpaste.net/raw/2845173683343851520
19:23:29 <HackEgo> 2016-03-07 19:23:06 URL:http://lpaste.net/raw/2845173683343851520 [26] -> "2845173683343851520" [1]
19:23:47 <Lymia> !sh busybox uname --operating-system
19:23:47 <EgoBot> GNU/Linux
19:23:49 <shachaf> `pooch
19:23:54 <int-e> !sh wget -O - 2>/dev/null
19:23:55 <EgoBot> Testing something or other
19:24:04 <int-e> `rm 2845173683343851520
19:24:08 <HackEgo> No output.
19:24:13 <Lymia> !sh busybox uname --kernel-version
19:24:14 <EgoBot> ​#1 SMP Debian 3.2.68-1+deb7u3
19:24:22 <Lymia> Strange.
19:24:36 <Lymia> !sh busybox ps ax | grep apache
19:24:37 <EgoBot> 2746 1000 /usr/sbin/apache2 -k start \ 2763 1000 /usr/sbin/apache2 -k start \ 3089 1000 /usr/sbin/apache2 -k start \ 3096 1000 /usr/sbin/apache2 -k start \ 3097 1000 /usr/sbin/apache2 -k start \ 3497 1000 /usr/sbin/apache2 -k start \ 8357 1000 /usr/sbin/apache2 -k start \ 13355 0 /usr/sbin/apache2 -k start \ 15913 1000 /usr/sbin/apache2 -k start \ 18503 1000
19:24:49 <Lymia> Is this Usermode Linux?
19:24:56 <Lymia> But if it is, why are there all these priviledged processes here
19:24:59 <int-e> `uname -a
19:25:00 <HackEgo> Linux umlbox 3.13.0-umlbox #1 Wed Jan 29 12:56:45 UTC 2014 x86_64 GNU/Linux
19:25:01 <Lymia> !sh busybox ps axu | grep apache
19:25:01 <EgoBot> 2746 1000 /usr/sbin/apache2 -k start \ 2763 1000 /usr/sbin/apache2 -k start \ 3089 1000 /usr/sbin/apache2 -k start \ 3096 1000 /usr/sbin/apache2 -k start \ 3097 1000 /usr/sbin/apache2 -k start \ 3497 1000 /usr/sbin/apache2 -k start \ 8357 1000 /usr/sbin/apache2 -k start \ 13355 0 /usr/sbin/apache2 -k start \ 15913 1000 /usr/sbin/apache2 -k start \ 18503 1000
19:25:13 <int-e> it might be
19:25:47 <int-e> `uname --kernel-release
19:25:48 <HackEgo> 3.13.0-umlbox
19:26:22 <int-e> `uname --kernel-version
19:26:23 <HackEgo> ​#1 Wed Jan 29 12:56:45 UTC 2014
19:26:44 <Lymia> !sh echo -e "\n\1"
19:26:44 <EgoBot> ​\ \1
19:26:51 <Lymia> !sh echo -e '\n\1'
19:26:51 <EgoBot> ​\ \1
19:27:09 <Lymia> !sh echo -e '\n\01'
19:27:09 <EgoBot> ​\ .
19:27:21 <Lymia> !help
19:27:21 <zemhill> Lymia: I do !zjoust; see http://zem.fi/bfjoust/ for more information.
19:27:21 <EgoBot> ​help: General commands: !help, !info, !bf_txtgen. See also !help languages, !help userinterps. You can get help on some commands by typing !help <command>.
19:27:42 <Lymia> !help ne
19:27:42 <EgoBot> ​Sorry, I have no help for ne!
19:27:56 <Lymia> !help <CTCP>
19:27:56 <EgoBot> ​Sorry, I have no help for _!
19:31:26 -!- Reece` has quit (Read error: Connection reset by peer).
19:32:34 <b_jonas> !sh top b
19:32:35 <EgoBot> top - 19:32:35 up 83 days, 12:46, 0 users, load average: 14.34, 14.16, 14.09 \ Tasks: 241 total, 16 running, 225 sleeping, 0 stopped, 0 zombie \ Cpu(s): 0.6%us, 0.2%sy, 1.0%ni, 95.6%id, 2.6%wa, 0.0%hi, 0.0%si, 0.0%st \ Mem: 3855536k total, 3533808k used, 321728k free, 576588k buffers \ Swap: 0k total, 0k used, 0k free, 2309552k cached \ \ PID USER PR NI VIRT RES
19:33:05 <b_jonas> soo, 95.6% idle, so it's probably not stuck on CPU
19:33:15 <b_jonas> I think it's waiting for an external bfjoust server
19:33:52 <b_jonas> which is why other commands work, only bfjoust doesn't work
19:35:31 <Lymia> !say a
19:38:19 <Lymia> !help "a b c"
19:38:19 <EgoBot> ​Sorry, I have no help for _a_b_c_!
19:38:24 <Lymia> !help a b c
19:38:25 <EgoBot> ​Sorry, I have no help for a_b_c!
19:39:06 <Lymia> !.empty
19:39:13 <Lymia> !sh ls /home/egobot
19:39:14 <EgoBot> egobot.hg
19:39:17 <Lymia> !sh ls /home/egobot/egobot.hg
19:39:18 <EgoBot> multibot_cmds
19:39:22 <Lymia> !sh ls /home/egobot/egobot.hg/multibot_cmds
19:39:22 <EgoBot> interps \ lib \ slox
19:39:29 <Lymia> !sh ls -alh /home/egobot/egobot.hg/multibot_cmds
19:39:30 <EgoBot> ​/bin/ls: /home/egobot/egobot.hg/multibot_cmds: Function not implemented \ /bin/ls: /home/egobot/egobot.hg/multibot_cmds/interps: Function not implemented \ /bin/ls: /home/egobot/egobot.hg/multibot_cmds/lib: Function not implemented \ /bin/ls: /home/egobot/egobot.hg/multibot_cmds/slox: Function not implemented \ total 8.0K \ drwxr-xr-x 39 5000 5000 4.0K Feb 20 2011 interps \ drwxr-xr-x 2 5000 5000 4.0K May 31 2012
19:39:34 <Lymia> !sh busbox ls -alh /home/egobot/egobot.hg/multibot_cmds
19:39:35 <EgoBot> ​/tmp/input.1761: line 1: busbox: command not found
19:39:39 <Lymia> !sh busybox ls -alh /home/egobot/egobot.hg/multibot_cmds
19:39:40 <EgoBot> drwxr-xr-x 39 5000 5000 4.0K Feb 20 2011 interps \ drwxr-xr-x 2 5000 5000 4.0K May 31 2012 lib \ drwxrwxrwx 0 0 0 0 Jan 1 1970 slox
19:40:38 <Lymia> !help () { :;}; echo vulnerable
19:40:38 <EgoBot> ​Sorry, I have no help for __________echo_vulnerable!
19:40:46 <Lymia> !sh bash --version
19:40:46 <EgoBot> GNU bash, version 4.0.28(1)-release (x86_64-pc-linux-gnu) \ Copyright (C) 2009 Free Software Foundation, Inc. \ License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> \ \ This is free software; you are free to change and redistribute it. \ There is NO WARRANTY, to the extent permitted by law.
19:41:55 -!- XorSwap has joined.
19:42:13 <Lymia> !sh env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
19:42:14 <EgoBot> vulnerable \ this is a test
19:43:55 <Lymia> When was this system last updated
19:44:47 <b_jonas> Lymia: it's possible that only the bash _inside_ the sandbox has that bug
19:45:32 <Lymia> !sh busybox ps axu | grep bash
19:45:33 <EgoBot> 941 5000 /bin/bash PRIVMSG/tr_21.cmd PRIVMSG #esoteric !bfjoust comex_the_first_program_ever (>)*9[-]+[>[-]+] \ 967 5000 /bin/bash scmds/bfjoust bfjoust comex_the_first_program_ever (>)*9[-]+[>[-]+] PRIVMSG #esoteric !bfjoust comex_the_first_program_ever (>)*9[-]+[>[-]+] \ 990 5000 /bin/bash scmds/bfjoust bfjoust comex_the_first_program_ever (>)*9[-]+[>[-]+] PRIVMSG #esoteric !bfjoust
19:45:45 <Lymia> !sh busybox ls /proc/941
19:45:46 <EgoBot> attr \ autogroup \ auxv \ cgroup \ clear_refs \ cmdline \ comm \ coredump_filter \ cpuset \ cwd \ environ \ exe \ fd \ fdinfo \ io \ limits \ loginuid \ maps \ mem \ mountinfo \ mounts \ mountstats \ net \ ns \ numa_maps \ oom_adj \ oom_score \ oom_score_adj \ pagemap \ personality \ root \ sched \ sessionid \ smaps \ stack \ stat \ statm \ status \ syscall \ task \ wchan
19:45:52 <Lymia> !sh busybox ls -alh /proc/941/exe
19:45:53 <EgoBot> lrwxrwxrwx 1 5000 0 0 Mar 7 18:57 /proc/941/exe -> /bin/bash
19:46:00 <Lymia> !sh busybox strings /proc/941/exe | grep "Bash version"
19:46:01 <EgoBot> ​@(#)Bash version 4.0.28(1) release GNU
19:46:04 <Lymia> nope
19:46:11 <Lymia> Everything uses that version.
19:46:27 <myname> versio
19:46:49 <b_jonas> !ztest suicide256 [-.]
19:46:49 <zemhill> b_jonas.suicide256: points -27.05, score 3.86, rank 47/47
19:47:09 <b_jonas> !ztest suicide128 (-)*128(.)*-1
19:47:09 <zemhill> b_jonas.suicide128: points -37.71, score 1.83, rank 47/47
19:47:17 <b_jonas> !ztest suicide1 <
19:47:17 <zemhill> b_jonas.suicide1: points -46.00, score 0.00, rank 47/47
19:48:05 <b_jonas> !ztest suicide128 (-)*128(.-)*-1
19:48:05 <zemhill> b_jonas.suicide128: points -32.74, score 2.01, rank 47/47
19:48:15 <b_jonas> !ztest suicide128 (-)*128[.-]
19:48:16 <zemhill> b_jonas.suicide128: points -34.76, score 2.08, rank 47/47
19:48:20 <b_jonas> !ztest suicide128 (-)*120[.-]
19:48:21 <zemhill> b_jonas.suicide128: points -33.83, score 2.24, rank 47/47
19:48:27 <Lymia> !sh busybox cat /proc/941/personality
19:48:27 <EgoBot> cat: read error: Operation not permitted
19:48:31 <Lymia> personality?
19:49:02 <Lymia> Weird
19:49:21 <Lymia> Oh, /exe is a symlink. hrm.
19:49:52 -!- l0de has left.
19:49:54 <b_jonas> Lymia: you decided to remove load competely, rather than allowing it for strings?
19:50:01 <b_jonas> in luajoust that is
19:50:19 <Lymia> For now.
19:50:25 <Lymia> Some hard to solve problems.
19:50:43 -!- hppavilion[wc] has joined.
19:50:47 <b_jonas> Lymia: does "for now" mean you're prepared to re-run the hill if you add it later?
19:50:57 <Lymia> ?
19:51:02 <Lymia> It's not near ready for a hill yet.
19:51:04 <b_jonas> sure
19:51:11 <b_jonas> of course
19:51:36 <Lymia> And unless I can fix the determinism issues
19:51:38 <Lymia> It might never be
19:51:47 -!- hppavilion[wc] has quit (Client Quit).
19:52:10 <b_jonas> right
19:52:18 <b_jonas> I still suggest that you try asking #lua
19:52:35 <b_jonas> maybe someone has already tried to make a deterministic variant of lua
19:53:42 -!- hppavilion[wc] has joined.
19:54:21 <Lymia> !sh -f=/tmp
19:54:22 <EgoBot> ​/tmp/input.15005: line 1: -f=/tmp: No such file or directory
19:57:06 <hppavilion[wc]> Taneb: I still want to make a BFOS. Perhaps you could help and we could include your banner maker as a feature?
19:57:17 <Lymia> !help () { :;}; killall -9 report
19:57:17 <EgoBot> ​Sorry, I have no help for __________killall__9_report!
19:57:19 <hppavilion[wc]> @messages-lud
19:57:19 <lambdabot> Sgeo said 2m 16d 13h 29m 18s ago: http://www.h-schmidt.net/FloatConverter/IEEE754.html
19:57:29 <Lymia> !sh busybox ps ax | grep report
19:57:29 <EgoBot> 995 5000 ../report ../gearlance ../cache Deewiant_allegro.bfjoust Deewiant_pendolino.bfjoust Fiora_timestopping-mahou-shoujo.bfjoust Gregor_furry_furry_strapon_pegging_girls.bfjoust Lymia_aurora.bfjoust Lymia_flow.bfjoust Lymia_nyuroki.bfjoust Lymia_two_people_runn \ 12430 5000 ../report ../gearlance ../cache Deewiant_allegro.bfjoust Deewiant_pendolino.bfjoust Fiora_timestopping-mahou-shoujo.bfjoust
19:57:42 <Taneb> hppavilion[wc], I'm not sure that a banner maker is the most important part of an OS
19:57:54 <hppavilion[wc]> Taneb: Yeah, but it
19:58:10 <hppavilion[wc]> 'd be a cool feature
19:58:13 <Lymia> !bf8 .
19:58:13 <EgoBot> No output.
19:58:24 <hppavilion[wc]> (I'm using a netbook with a shit keyboard)
19:58:30 <Lymia> !sh env
19:58:30 <EgoBot> PLASH_FAKE_GID=0 \ XDG_SESSION_ID=1233 \ I_CMD=sh \ ARG_FILE=/tmp/input.18746 \ SHELL=/bin/bash \ TERM=xterm \ IRC_SOCK=/tmp/multibot.EgoBot \ XDG_SESSION_COOKIE=3c3b7af247c6eb1bba05718349f88198-1450975846.369246-2144293266 \ SSH_CLIENT= 42058 22 \ IRC_NICK=Lymia \ PLASH_CAPS=conn_maker;fs_op \ SSH_TTY=/dev/pts/0 \ PLASH_FAKE_EUID=5000 \ USER=root \ LD_LIBRARY_PATH=/usr/lib/plash/lib \ PLASH_FAKE_EGID=0
19:59:06 <Lymia> !sh busybox env
19:59:07 <EgoBot> PLASH_FAKE_GID=0 \ XDG_SESSION_ID=1233 \ I_CMD=sh \ ARG_FILE=/tmp/input.19296 \ SHELL=/bin/bash \ TERM=xterm \ IRC_SOCK=/tmp/multibot.EgoBot \ XDG_SESSION_COOKIE=3c3b7af247c6eb1bba05718349f88198-1450975846.369246-2144293266 \ SSH_CLIENT= 42058 22 \ IRC_NICK=Lymia \ PLASH_CAPS=conn_maker;fs_op \ SSH_TTY=/dev/pts/0 \ PLASH_FAKE_EUID=5000 \ USER=root \ LD_LIBRARY_PATH=/usr/lib/plash/lib \ PLASH_FAKE_EGID=0
19:59:09 <Lymia> !sh busybox id
19:59:10 <EgoBot> uid=1916107 gid=1916107
19:59:39 <Lymia> !sh busybox env | grep I_
19:59:39 <EgoBot> I_CMD=sh \ I_ARG=busybox env | grep I_
19:59:55 <Lymia> !sh () { :;}; killall -9 report
19:59:55 <EgoBot> ​/bin/bash: /usr/bin/killall: Function not implemented
20:00:11 <Lymia> !sh () { :;}; env; killall -9 report
20:00:12 <EgoBot> ​/bin/bash: /usr/bin/env: Function not implemented
20:00:19 <Lymia> !help () { :;}; killall -9 report
20:00:19 <EgoBot> ​Sorry, I have no help for __________killall__9_report!
20:00:25 <Lymia> Er
20:00:26 <hppavilion[wc]> Taneb: As long as you
20:00:28 <hppavilion[wc]> GAAAAH
20:00:35 <Lymia> !sh busybox ps ax | grep report
20:00:36 <EgoBot> 995 5000 ../report ../gearlance ../cache Deewiant_allegro.bfjoust Deewiant_pendolino.bfjoust Fiora_timestopping-mahou-shoujo.bfjoust Gregor_furry_furry_strapon_pegging_girls.bfjoust Lymia_aurora.bfjoust Lymia_flow.bfjoust Lymia_nyuroki.bfjoust Lymia_two_people_runn \ 12430 5000 ../report ../gearlance ../cache Deewiant_allegro.bfjoust Deewiant_pendolino.bfjoust Fiora_timestopping-mahou-shoujo.bfjoust
20:00:43 <Lymia> !help () { :;}; echo test
20:00:44 <EgoBot> ​Sorry, I have no help for __________echo_test!
20:00:51 <Lymia> !sh () { :;}; echo test
20:00:51 <EgoBot> test \ /tmp/input.21095: line 1: syntax error near unexpected token `)' \ /tmp/input.21095: line 1: `() { :;}; echo test'
20:00:54 <hppavilion[wc]> 're a God of Brainfuck, do you know of a floating point implementation for BF?
20:01:12 <Lymia> !sh () { :;}; echo $PID
20:01:13 <EgoBot> ​\ /tmp/input.21441: line 1: syntax error near unexpected token `)' \ /tmp/input.21441: line 1: `() { :;}; echo $PID'
20:01:20 <Lymia> !sh () { :;}; echo $PLASH_FAKE_GID
20:01:20 <EgoBot> ​\ /tmp/input.21595: line 1: syntax error near unexpected token `)' \ /tmp/input.21595: line 1: `() { :;}; echo $PLASH_FAKE_GID'
20:01:27 <Lymia> !sh () { :;}; echo $IRC_NICK
20:01:27 <EgoBot> ​\ /tmp/input.21732: line 1: syntax error near unexpected token `)' \ /tmp/input.21732: line 1: `() { :;}; echo $IRC_NICK'
20:01:45 <Lymia> !sh () { :;}; busybox id
20:01:46 <EgoBot> ​/bin/bash: /bin/busybox: Function not implemented
20:01:55 <Lymia> !sh () { :;}; echo `busybox id`
20:01:56 <EgoBot> ​/bin/bash: fork: Function not implemented \ \ /tmp/input.22220: line 1: syntax error near unexpected token `)' \ /tmp/input.22220: line 1: `() { :;}; echo `busybox id`'
20:01:59 <Lymia> !sh () { :;}; echo `busybox id`;
20:01:59 <EgoBot> ​/bin/bash: fork: Function not implemented \ \ /tmp/input.22320: line 1: syntax error near unexpected token `)' \ /tmp/input.22320: line 1: `() { :;}; echo `busybox id`;'
20:02:26 <Lymia> !sh () { :;}; export ARG_FILE=""
20:02:27 <EgoBot> ​/tmp/input.22828: line 1: syntax error near unexpected token `)' \ /tmp/input.22828: line 1: `() { :;}; export ARG_FILE=""'
20:02:37 <Riviera> waaah
20:02:53 <Riviera> any particular reason you don't do that via /msg?
20:03:24 <Lymia> !sh () { :;}; export LD_DEBUG="all"
20:03:24 <EgoBot> ​/tmp/input.23674: line 1: syntax error near unexpected token `)' \ /tmp/input.23674: line 1: `() { :;}; export LD_DEBUG="all"'
20:03:27 <Lymia> Not particularly
20:03:56 <hppavilion[wc]> Lymia: Then start doing it via /msg
20:04:08 <Lymia> You sure like complaining
20:04:35 <hppavilion[wc]> Lymia: I do
20:04:40 <Lymia> !sh env | sed s/=.*//g
20:04:50 <b_jonas> (In fact, I might ask them myself.)
20:04:51 <myname> he also deletes teue wisdoms
20:05:11 <Lymia> !sh echo $LD_LIBRARY_PATH
20:05:12 <EgoBot> ​/usr/lib/plash/lib
20:05:22 <Lymia> !sh LD_LIBRARY_PATH="" ps ax
20:05:22 <EgoBot> Cannot find /proc/version - is /proc mounted?
20:05:41 <Lymia> !sh LD_LIBRARY_PATH="" busybox ps ax
20:05:42 <EgoBot> PID USER COMMAND \ ps: can't open '/proc': No such file or directory
20:06:53 <b_jonas> Lymia: I think you could permit later extensions of the luajoust built-in library while keeping determinism. You would have a table for this where you store exceptions, and rig the table with its metatable such that if the program tries to access a nonexistant entry, it blows up (with an uncatchable exception, same as you have to treat out of memory errors), and that the metatable can't be changed.
20:07:15 <b_jonas> Lymia: you could also make a few entries (like load) in the global environment like that.
20:07:27 <b_jonas> You'd have to permit accessing those elements if they're assigned first, for ease of use.
20:07:50 <b_jonas> But actually lua does that already.
20:08:01 <zzo38> I believe that the X window system is very well designed, although some of the modern extensions seem to be worthless and/or should be optional. Also in some cases, protocol extensions probably are not needed anyways, to do something
20:08:11 <b_jonas> Also, you'd have to make the table unnextable with its metatable.
20:08:39 <hppavilion[wc]> For the BFOS, I'm adding {} for conditionals and * for pointers
20:09:10 <Lymia> !sh env x='(){:;}; echo vulnerable' bash -c "echo this is a test"
20:09:11 <EgoBot> this is a test
20:09:13 <b_jonas> hmm wait
20:09:21 <b_jonas> do we have a lua 5.3 here to test?
20:09:24 <Lymia> !"sh" echo 3
20:09:27 <b_jonas> if not I'll compile one locally
20:09:34 <b_jonas> `lua --version
20:09:36 <HackEgo> lua: unrecognized option '--version' \ usage: lua [options] [script [args]] \ Available options are: \ -e stat execute string 'stat' \ -i enter interactive mode after executing 'script' \ -l name require library 'name' \ -v show version information \ -E ignore environment variables \ -- stop handling options \
20:09:42 <b_jonas> `lua -v
20:09:42 <HackEgo> Lua 5.2.1 Copyright (C) 1994-2012 Lua.org, PUC-Rio
20:09:48 <b_jonas> local then
20:10:16 <Lymia> !sh a b c
20:10:17 <EgoBot> ​/tmp/input.29799: line 1: a: command not found
20:10:21 <Lymia> !echo a b c
20:10:22 <EgoBot> a b c
20:10:27 <Lymia> !help a b c
20:10:28 <EgoBot> ​Sorry, I have no help for a_b_c!
20:12:58 <Lymia> !sh echo $ARG
20:12:58 <EgoBot> No output.
20:13:57 <Lymia> !addinterp test bf () { :;}; echo vulnerable
20:13:57 <EgoBot> ​There is already an interpreter for test!
20:14:03 <Lymia> !addinterp test_ss bf () { :;}; echo vulnerable
20:14:03 <EgoBot> ​Interpreter test_ss installed.
20:14:09 <Lymia> !test_ss
20:14:09 <EgoBot> vulnerable
20:14:27 <Lymia> !addinterp test_ss bf () { :;}; id
20:14:27 <EgoBot> ​There is already an interpreter for test_ss!
20:14:29 <Lymia> !addinterp test_ss2 bf () { :;}; id
20:14:30 <EgoBot> ​Interpreter test_ss2 installed.
20:14:31 <Lymia> !test_ss2
20:14:32 <EgoBot> uid=5000(egobot) gid=0(root) groups=0(root),150
20:14:48 <Lymia> !addinterp test_ss3 bf () { :;}; $*
20:14:48 <EgoBot> ​Interpreter test_ss3 installed.
20:14:50 <Lymia> !test_ss3 id
20:14:51 <EgoBot> No output.
20:15:41 <b_jonas> Lymia: further nastiness. string.format("%e", 1) calls the libc's sprintf or snprintf function, so on windows it will use one different formats (three digits for exponent instead of two, and some completely nonstandard output for infinity and nan)
20:15:49 <Lymia> ick
20:15:54 <Lymia> That
20:15:59 <Lymia> Might be problematic.
20:16:03 <Lymia> ("").format
20:16:17 <Lymia> But you could do string.format = nil in the global context if you really need to.
20:16:18 <Lymia> Hrm.
20:16:26 <Lymia> This requires thought
20:16:56 <b_jonas> Lymia: also, I think on some platforms (at least windows) you can extract the sign and mantissa of a nan that way (I think the C standard actually allows that, it's only the particular format windows uses that's wrong)
20:17:10 <b_jonas> Lymia: let me see if the default implicit number to string conversion also does this
20:17:21 <b_jonas> as in, 1..(1.0e100/3)
20:17:23 <Lymia> Is it just %e?
20:18:27 <b_jonas> Lymia: no, also %g and %E and %G
20:18:38 <b_jonas> and I think %f is affected too because of nan
20:18:46 <b_jonas> and I don't know if %a is affected or not
20:18:50 <b_jonas> (and %A)
20:19:22 <b_jonas> I'll look up how the number to string conversion works
20:24:47 * Lymia pokes int-e
20:26:34 <int-e> what I do?
20:27:12 <int-e> I mean I'm doing important things right now... like watching the lastest John Oliver youtube video.
20:30:29 <lynn> My entire backlog: Lymia messing with bots
20:30:36 <Lymia> :P
20:31:28 -!- lambda-11235 has quit (Quit: Bye).
20:33:25 <b_jonas> Lymia: it seems you can reveal the sign of nans by an implicit string conversion even on linux
20:35:20 <EgoBot> ​Score for prooftechnique_fishbones: 0.0
20:35:20 <EgoBot> ​Score for ais523_comex_the_first_program_ever: 13.0
20:35:20 <EgoBot> ​Score for prooftechnique_test: 0.2
20:35:20 <EgoBot> ​Score for b_jonas_pause5: 5.2
20:35:20 <EgoBot> ​Score for ais523_attack1: 12.0
20:35:20 <EgoBot> ​Score for b_jonas_dead: 0.0
20:35:20 <EgoBot> ​Score for b_jonas_pause2: 5.2
20:35:21 <EgoBot> ​Score for ais523_is_this_working_yet: 19.8
20:35:21 <EgoBot> ​Score for Lymia_two_people_running_from_a_shark: 1.6
20:35:22 <EgoBot> ​Score for Lymia_live: 0.0
20:35:22 <EgoBot> ​Score for b_jonas_pause3: 5.2
20:35:23 <EgoBot> ​Score for b_jonas_pause: 1.3
20:35:32 <Lymia> I fixed it.
20:35:49 <lynn> two_people_running_from_a_shark :DD
20:36:00 <b_jonas> Lymia: and it seems that ordinary number to string conversion also calls the system libc's sprintf
20:36:14 <b_jonas> Lymia: so you're screwed
20:36:33 <b_jonas> Lymia: basically, you'd have to change a LOT in lua
20:36:47 <Lymia> I am working on a Scala implementation of Lua
20:36:49 <Lymia> It's not far along, but.
20:36:51 <Lymia> It's a thing.
20:37:02 <Lymia> I could add a deterministic mode
20:37:07 <b_jonas> Lymia: should I put notes about these on the esowiki page, or do you want to write them up instead?
20:37:11 <Lymia> You can go ahead.
20:37:15 <b_jonas> scala? why scalar?
20:37:17 <b_jonas> um
20:37:20 <b_jonas> s/ar/a/
20:37:30 <Lymia> Because it's the language I'm most proficient at.
20:37:56 <b_jonas> ok
20:38:03 <Lymia> I'm not particularly interested in writing a Lua interpter in a language I'm not good at.
20:38:04 <b_jonas> I don't really know anything about Scala
20:38:07 <b_jonas> `? scala
20:38:09 <HackEgo> scala? ¯\(°​_o)/¯
20:38:18 <Lymia> It's a JVM language with functional programming features.
20:38:37 <Lymia> Has a few nasty warts, but, there's not much better in the JVM. At least, anything statically typed.
20:38:39 -!- Phantom_Hoover has joined.
20:38:46 <b_jonas> I see
20:38:49 <lynn> have you heard about Frege?
20:39:34 <Lymia> !bfjoust suicide dance ((>><)*10(<<>)*10)*10<
20:39:36 <EgoBot> ​Score for Lymia_suicide: 4.4
20:39:37 <Phantom_Hoover> yes and i'm disappointed it's not pronounced 'frayzh'
20:39:43 <Lymia> !bfjoust suicide_dance ((>><)*10(<<>)*10)*10<
20:39:45 <EgoBot> ​Score for Lymia_suicide_dance: 4.4
20:40:15 <lynn> it's fray-guh, right?
20:40:22 <b_jonas> Lymia: anyway, fixing the string formatting in a customized lua would be possible, but for fixing the table stuff you'd probably need to write an entirely new implementation of tables (presumably one based on a balanced tree and a consistent comparison function)
20:40:38 <myname> Lymia: there is frege
20:40:40 <b_jonas> You'd need to modify the lua core for either.
20:41:15 <myname> lynn: no, it's not
20:41:36 <myname> frege is a german name and to be pronounced german
20:41:44 <Lymia> !bfjoust suicide_dance ((>><)*10>(<<>)*10<)*10<
20:41:46 <EgoBot> ​Score for Lymia_suicide_dance: 6.1
20:41:50 <Lymia> Dance! :D
20:41:58 <lynn> that is an English approximation of the German name
20:41:59 <int-e> Gottfried? I'm so bad with names
20:41:59 <Phantom_Hoover> myname, yes it is
20:42:13 <int-e> Gottlob. Close, but wrong.
20:42:19 <myname> yeah
20:42:25 <myname> i like frege
20:42:40 <myname> the point is, haskell is more convinient for me atm
20:43:37 <Phantom_Hoover> fray-guh is a pretty good approximation to [ˈfreːɡə]
20:44:07 <myname> oh well, maybe english just sucks for that
20:44:25 <lynn> All languages suck for that...
20:44:43 <myname> don't think sp
20:44:48 <lynn> Pronouncing foreign words "right", that is. Approximations are fine
20:45:10 <myname> inglish is just incredibly bad since its own pronouncoation rules are completely broken
20:45:23 <myname> englidh even
20:45:27 <int-e> yeah they can't even pronounce their own words correctly
20:45:29 <myname> well
20:45:46 <Phantom_Hoover> english orthography is a complete mess, yes
20:45:52 <myname> today's not my day
20:46:09 <Phantom_Hoover> but 'ay' for /e/ isn't bad at all
20:46:10 <int-e> @google "dearest creature in creation"
20:46:25 <Phantom_Hoover> how do you justify the dh in englidh?
20:46:25 <lambdabot> Plugin `search' failed with: <<timeout>>
20:46:32 <int-e> @google "dearest creature in creation"
20:46:32 <myname> i hears that on youtube once
20:46:38 * int-e shrugs
20:46:47 <lambdabot> Plugin `search' failed with: <<timeout>>
20:46:48 <myname> i was like "dafuq is this shit"
20:48:10 <myname> https://youtu.be/tfRSvTSY0d4
20:48:27 <int-e> e.g. https://www.cs.cmu.edu/~clamen/misc/humour/TheChaos.html
20:48:46 <int-e> I guess youtube works as well
20:48:59 <myname> i like lindybeige
20:49:02 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46542&oldid=46541 * B jonas * (+1114) /* Unresolved Problems */
20:51:32 <Phantom_Hoover> looool i guess toRational in haskell gives you an injection from Real to Rational?
20:51:50 <int-e> :t toRational
20:51:51 <lambdabot> Real a => a -> Rational
20:52:01 <int-e> types don't lie
20:52:35 <int-e> (the numeric classes in Haskell are a bit of a mess from a practical perspective, and a huge mess from a theoretical one)
20:52:54 <Phantom_Hoover> saw a reddit thread a while back full of haskellers saying that types are all the documentation you ever need
20:53:09 <int-e> mmm
20:53:50 <int-e> types help. types are valuable abstractions restricting program's behavior. but no, they don't fully describe functions.
20:54:16 <int-e> @type inits
20:54:17 <lambdabot> [a] -> [[a]]
20:54:18 <myname> it wuild make djinn incredibly useful
20:54:19 <int-e> @type tails
20:54:20 <lambdabot> [a] -> [[a]]
20:54:30 <Phantom_Hoover> i mean who cares about the difference between fst and snd
20:54:39 <int-e> Phantom_Hoover: that's visible in the type.
20:54:51 <int-e> @type fst
20:54:52 <lambdabot> (a, b) -> a
20:54:54 <int-e> @type snd
20:54:55 <Phantom_Hoover> wait yeah im idiot
20:54:56 <lambdabot> (a, b) -> b
20:54:59 <Phantom_Hoover> i was thinking (a,a)
20:55:21 <Phantom_Hoover> who cares about the difference between K and KI!
20:55:36 <myname> (a,a) would have no advantage to [a], wouldn't it?
20:56:04 <Phantom_Hoover> well you'd know there are exactly 2 things in it...
20:56:38 -!- XorSwap has quit (Quit: Leaving).
20:57:05 <Phantom_Hoover> i suppose this is the same mindset that leads the categorically-inclined to write helpful textbooks that do things like define products purely with a universal property
20:57:10 -!- lynn_ has joined.
21:00:42 -!- lynn has quit (Ping timeout: 260 seconds).
21:07:52 -!- hppavilion[wc] has quit (Ping timeout: 252 seconds).
21:13:02 <lynn_> http://whatsmyuseragent.com/ this result was far sillier than I expected
21:13:11 <int-e> myname: with ghc at least, (x,y) uses less memory than [x,y], too.
21:13:15 <lynn_> today I learned about the User-Agent history I guess @_@
21:13:50 <int-e> have you tried that with the Windows 10 "Edge" browser?
21:14:26 <b_jonas> Lymia: I was wrong
21:14:37 <int-e> (I forgot the result, but it was a long, long list of browsers)
21:14:44 <lynn_> on Chrome, I get Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36.
21:14:45 <b_jonas> Lymia: nowhere do either of the two manuals say that the sign of nans in arithmetic is undefined
21:14:56 <lynn_> on Edge of course it is one longer, excellentttt
21:15:37 <b_jonas> Both the sign and mantissa are deterministic for a particular instruction, but sse instructions use a different (crazy) rule for them than the x87 instructions (which us a sane rule).
21:16:29 <HackEgo> [wiki] [[Lua Joust]] https://esolangs.org/w/index.php?diff=46543&oldid=46542 * B jonas * (-3)
21:17:15 <int-e> fast and loose
21:18:17 <int-e> b_jonas: does that include addition and multiplication too?
21:18:27 <myname> http://asset-a.soupcdn.com/asset/8754/6027_adb0.jpeg :D
21:18:38 <b_jonas> int-e: yes
21:18:49 <b_jonas> int-e: the result is that on sse, addition ISN'T COMMUTATIVE
21:18:56 <int-e> I thought IEEE 754 was rather strict on those (though I guess you can choose a rounding mode that fits your purposes)...
21:18:59 <int-e> ...ouch.
21:19:25 <b_jonas> int-e: no, the IEEE doesn't tell which particular nan value (mantissa and exponent) the result has when it's a nan value
21:19:31 <b_jonas> s/exponent/sign/
21:19:38 <b_jonas> int-e: it's rather strict on everything
21:20:06 <int-e> well... hmm... all nans are equal (even though they compare as different)
21:20:20 <int-e> so what about defined results?
21:20:46 <b_jonas> int-e: um, what's your question?
21:22:41 <b_jonas> int-e: the good news is that I think this might not come up on lua
21:22:48 <b_jonas> hmm
21:22:58 <b_jonas> oh wait
21:23:00 <b_jonas> it does come up
21:23:01 <int-e> b_jonas: does x + y equal y + x for all x and y such that x + y is defined?
21:23:13 <int-e> (i.e. not NaN)
21:23:44 <b_jonas> it comes up because you can generate both indeterminate and its negation, and then add them, and the result has a sign that depends on whether that addition is done on sse or x87, and in the case of sse, which order it's done in (the optimizer is permitted to commute it)
21:24:00 <b_jonas> int-e: oh, so by "defined" you mean it's not nan?
21:24:04 <int-e> yes
21:24:14 <b_jonas> int-e: yes, in that case addition and multiplication is commutative
21:24:23 <int-e> Okay. I don't care then.
21:24:31 <int-e> (Except as a curiosity)
21:27:43 <b_jonas> I care because it's annoying that they ruined the reproducibility of floating point arithmetic this way, when x87 had a perfectly good and documented way of choosing the particular nan result that was commutative and thus deterministic.
21:27:52 <b_jonas> I just don't understand why they did it.
21:28:05 <b_jonas> And since the sse version is also documented, it can't be fixed now.
21:29:07 <b_jonas> That is, it could be fixed by introducing a set of new floating point instructions, or perhaps a new flag in the control register, and then adding a compiler flag, and running your code on cpus that support it.
21:32:05 <b_jonas> I just don't understand why Intel did this.
21:33:17 <b_jonas> Oh!
21:33:48 <b_jonas> On the other hand, this could be used as the basis for an esoteric feature in a strongly typed programming language:
21:35:40 <b_jonas> make the language have two floating point types of each size, implicitly converting in both directions. The first one is such that the mantissa and sign of nan values can be arbitrary, and the second one is where it's deterministic.
21:36:42 <b_jonas> When you convert from the first type to the second, if it's nan, it's converted to a deterministic one (this can be done relatively quickly, between 2 and 7 instructions depending on what exactly you want),
21:38:39 <b_jonas> the signbit function takes the second type as input, other arithmetic builtins take either type and propagate the types in a sane way. Stringification functions makes sure not to reveal details about nan.
21:39:41 <b_jonas> You're permitted to explicitly reinterpret from the first type to the second, unless certain sandbox flags are set, but if you don't do that, then floating point arithmetic will be deterministic.
21:40:11 <b_jonas> (Floating point transcendent functions are a different question. Those are not guaranteed to be deterministic, but in practice they might be on sane systems.)
21:40:23 <izabera> `unidecode v̲e̲r̲y̲
21:41:20 <b_jonas> Presumably there'd also be unsafe stringification functions.
21:43:12 <b_jonas> Also, the floating point functions that let you examine representation (take representation as integer, make from representation integer, bitwise ops) would also operate on the correct types.
21:43:48 <b_jonas> In fact, if I wanted to make a deterministic interpreter, I could implement this in C++ to help writing the interpreter in an eso way.
21:44:49 <b_jonas> Although in that case, unless you're writing a really optimizing interpreter, presumably all the float values the interpreted program works with will be represented as the first type floats, and fixed only before those few functions that need it.
21:50:29 -!- lynn has joined.
21:53:01 -!- lynn_ has quit (Ping timeout: 268 seconds).
21:55:40 -!- hppavilion[wc] has joined.
21:59:40 <Lymia> JVM would be nice for that
21:59:43 <Lymia> I can use strictfp.
21:59:59 <Lymia> And let the JVM take care of making sure floating point is deterministic for me.
22:00:55 <b_jonas> Lymia: only if the stuff is statically typed.
22:01:33 <b_jonas> if it's weakly typed, then it's better to just normalize the float before you do any operation where the nan representation matters, rather than to keep track of which floats are already normalized
22:02:44 <Lymia> That's what strictfp does.
22:03:03 <Lymia> I can write the code normally and let the JVM make all floating point operations do the right thing on all platforms.
22:05:46 -!- hppavilion[wc] has quit (Quit: Page closed).
22:08:15 -!- jaboja has quit (Ping timeout: 264 seconds).
22:10:37 -!- AnotherTest has quit (Quit: ZNC - http://znc.in).
22:31:32 -!- nycs has quit (Quit: This computer has gone to sleep).
22:39:09 -!- spiette has quit (Ping timeout: 250 seconds).
22:42:14 -!- augur has joined.
22:43:06 -!- augur has quit (Read error: Connection reset by peer).
22:43:17 -!- augur has joined.
22:43:20 -!- augur has quit (Remote host closed the connection).
22:44:33 -!- augur has joined.
22:49:12 -!- augur has quit (Ping timeout: 260 seconds).
22:50:25 -!- augur has joined.
22:55:05 -!- lleu has quit (Quit: That's what she said).
22:55:57 -!- augur has quit (Read error: Connection reset by peer).
22:59:09 -!- boily has joined.
23:14:27 <boily> `wisdom
23:14:33 <HackEgo> java/java is a programming-language shaped collection of misfeatures
23:16:02 -!- oerjan has joined.
23:17:56 -!- augur has joined.
23:25:14 <Lymia> How cruel
23:26:16 <boily> Hellymia. I'd say Java is a nice core, wrapped in endless layers of Enterprise Abstraction.
23:26:42 <boily> and then it's AbstractTurtleFactories all the way down.
23:28:42 -!- XorSwap has joined.
23:31:38 <Lymia> Java the language and the JVM are... acceptable.
23:31:47 <Lymia> The ecosystem is a big nope.
23:32:34 <boily> yup.
23:32:41 <boily> `? php
23:32:43 <HackEgo> php is the PigeonHole Principle
23:32:45 <boily> `? python
23:32:48 <HackEgo> python? ¯\(°​_o)/¯
23:32:49 <boily> `? ruby
23:32:50 <HackEgo> Ruby is a programming language from Japan, that Eventually decided to support non-ascii characters.
23:32:54 <shachaf> `culprits wisdom/java
23:33:00 <HackEgo> coppro
23:33:27 <Lymia> For example.
23:33:29 <Lymia> Scala is nice.
23:33:31 <boily> `? scala
23:33:32 <HackEgo> scala? ¯\(°​_o)/¯
23:33:34 <Lymia> Until you pull in a Java library.
23:33:43 <Lymia> And then have to go "wtf is this???"
23:33:48 <boily> Scala's syntax turns me off...
23:34:04 <Lymia> Is the syntax that weird?
23:34:10 <Lymia> It's still roughly C family
23:35:46 <boily> the syntax is weird.
23:36:08 <Lymia> It doesn't bother me anymore, at least.
23:36:19 <Lymia> But nor does any language I use.
23:37:25 <Lymia> The syntax is quite nice to me, but, perhaps I'm conflating its semantics with the actual syntax.
23:37:45 <Lymia> (Expression focused, most blocks return a reasonable value)
23:37:46 <myname> Lymia: needs more frege, still
23:43:49 <zzo38> You could possibly to make C compiling also target JVM?
23:44:55 -!- XorSwap has quit (Ping timeout: 252 seconds).
23:45:35 <myname> also, clojure is an option, too
23:45:54 <myname> from all the functional languages i know for jvm, i like scala the least
23:46:07 -!- boily has quit (Quit: DRYING CHICKEN).
23:51:42 * int-e cries.
23:51:50 <oerjan> int-e: hm?
23:51:57 <int-e> This article was so good, until... "Meanwhile, a third tool, called Monte Carlo tree search, helps the system play strategically as well as tactically."
23:52:08 <int-e> (source: http://www.theguardian.com/technology/2016/mar/07/go-board-game-google-alphago-lee-se-dol )
23:52:41 <oerjan> int-e: btw girl genius: here goes nothing D:
23:53:17 <shachaf> what's going on with olist twh
23:53:30 <oerjan> shachaf: there was an olist earlier today?
23:53:33 <oerjan> *.
23:53:34 <shachaf> yes
23:53:35 <int-e> (well, at least to my limited understanding, the tree search is really about the tactics, though it's a bit blurry because some tactics will be ingrained as patterns in the policy network as well.)
23:53:39 <shachaf> it's updating once a week now?
23:54:18 <fizzie> Someone participated in our university's "Introduction to AI" course's JVM-sandbox-based boardgame AI tournament thing with a non-Java JVM language, I think it might've been Scala.
23:54:47 <fizzie> All the other solutions were generally <100 kB, but theirs was something like 7 MB.
23:55:01 <fizzie> Because of all the libraries they had to include in the .jar to make it go.
23:55:38 <int-e> so did anybody compare the source code size?
23:56:28 <fizzie> That wasn't one of the metrics.
23:56:38 <int-e> oerjan: oh... big jump forward on that story arc
23:56:55 <fizzie> Yeah, Scala it was.
23:57:48 <fizzie> scala.util.parsing.* and scala.xml.* are particularly big chunks in here.
23:58:08 <fizzie> Also their .jar doesn't include the sources.
23:58:13 <oerjan> int-e: well they _were_ pressed for time, they're under attack after all.
23:58:36 <fizzie> The standard Ant build file we shipped did include .java files in the deliverable it made, but I guess they had to use their own.
23:59:09 <int-e> oerjan: but even with the castle's help, extending their tunnels to the right location must've taken a while
23:59:30 <int-e> oerjan: does Gil know about the poison?
23:59:35 <oerjan> int-e: oh. i thought you meant today. yes, it said it took months.
23:59:59 <oerjan> int-e: i don't know how he would. he _should_ be able to notice he's been stabbed...
←2016-03-06 2016-03-07 2016-03-08→ ↑2016 ↑all