←2020-08-31 2020-09-01 2020-09-02→ ↑2020 ↑all
00:01:26 -!- Arcorann__ has joined.
00:26:38 <b_jonas> arseniif_: no, I don't think I ever really talked about them. it's mostly the newer syntax additions, which I think are painfully inconsistent with the existing syntax, and I find that bad because I feel like the devs who introduced those extensions should have done a better work and give them better syntax.
00:27:02 <b_jonas> but I don't use Haskell these days so I mostly managed to swap out the details.
00:42:56 -!- egelbot has quit (Remote host closed the connection).
00:56:45 -!- egelbot has joined.
00:57:05 <spruit11> egelbot: # some nonsense
00:57:11 <spruit11> egelbot: 1+1
00:57:11 <egelbot> 2
01:13:41 <esowiki> [[1CP=1ICL]] M https://esolangs.org/w/index.php?diff=77173&oldid=77152 * RocketRace * (+97) Categorization.
01:14:30 <esowiki> [[1CP=1ICL]] https://esolangs.org/w/index.php?diff=77174&oldid=77173 * RocketRace * (-4)
02:10:24 <int-e> Wow, somebody got a star on the IBM Ponder This August challenge... I had given up. I hope we'll get to see their approach and how much CPU time they invested.
02:11:11 <int-e> OTOH the September challenge is surprisingly easy?
02:12:28 <int-e> (Starting with the fact that it only asks for examples, not for proofs :P)
02:16:28 <int-e> I sank 5 full days of computation (but using only 6 cores) into the August challenge at 0 <= a,b,c <= 10 and all I have to show for it is that 11 <= optimum for 10 <= 13. I did settle the 0 <= a,b,c <= 9 case though. But I failed to find any useful heuristic for establishing lower bounds at all.
02:18:27 <int-e> `learn The password of the month is juberous.
02:18:30 <HackEso> Relearned 'password': The password of the month is juberous.
02:21:40 <Sgeo> Both Nim and Zig's sum types involve giving the type an explicit tag field.
02:21:51 <Sgeo> Why does this seem... unusua?
02:22:34 <int-e> (FWIW, if I had designed that challenge I would've given the star for finding the best known solution for 0 <= a,b,c <= 100. But maybe that's too spammy because people will just send every single improvement they find? I don't know.)
02:22:37 <Sgeo> https://nim-lang.org/docs/json.html#JsonNodeObj
02:23:00 <int-e> Sgeo: I don't know, it doesn't seem unusual?
02:23:14 <Sgeo> Neither Haskell nor Rust do it
02:23:37 <int-e> But people coming from C will do it.
02:24:02 <int-e> Because of the tag/union pattern.
02:25:02 <int-e> Sgeo: To be clear, I think *neither* way is unusual.
02:26:03 <int-e> For a serialization format, having the tags explicit may be useful, because it's easier for the programmer to understand when they change the underlying encoding.
02:29:12 <int-e> Silly example: In Haskell, if you drop a data constructor that was never used in practice, and also derive the serialization code, you may have trouble remaining backward compatible, because you usually do not assign your own tags then.
03:00:50 -!- adu has joined.
04:48:18 -!- Lord_of_Life_ has joined.
04:48:25 -!- Lord_of_Life has quit (Ping timeout: 240 seconds).
04:49:37 -!- Lord_of_Life_ has changed nick to Lord_of_Life.
05:41:59 -!- adu has quit (Quit: adu).
07:00:22 -!- kritixilithos has joined.
07:03:04 -!- imode has quit (Ping timeout: 256 seconds).
07:46:26 -!- Sgeo has quit (Read error: Connection reset by peer).
08:10:16 -!- hendursa1 has joined.
08:12:43 -!- hendursaga has quit (Ping timeout: 240 seconds).
08:35:19 -!- cpressey has joined.
08:44:30 -!- tromp_ has joined.
08:48:09 -!- tromp has quit (Ping timeout: 272 seconds).
09:09:25 -!- b_jonas has quit (Quit: leaving).
10:09:26 -!- mniip has quit (Ping timeout: 608 seconds).
10:15:13 -!- mniip has joined.
10:44:01 -!- t20kdc has joined.
10:51:03 -!- wib_jonas has joined.
10:54:40 -!- arseniiv has joined.
10:58:30 -!- cpressey has quit (Quit: WeeChat 1.9.1).
11:54:57 -!- egelbot has quit (Remote host closed the connection).
12:11:51 <int-e> .dmg <-- whenever I see that I read it as 'damage'. (it's for "disk image", apparently)
12:14:00 <fizzie> It's also a name for the Game Boy (DMG-01), said to be short for Dot Matrix Game.
12:14:39 <fizzie> Maybe not as a file extension though.
12:15:03 <int-e> That is a pretty accurate description of what the Game Boy is.
12:15:18 -!- mniip has quit (Quit: This page is intentionally left blank.).
12:15:58 <int-e> In an era full of fixed graphics LCD display games.
12:16:13 <int-e> (not sure what the proper term for that is)
12:17:18 -!- mniip has joined.
12:17:18 <fizzie> Yeah, I know what those are, but not what they're called.
12:25:06 <int-e> I guess they're just LCDs, or "custom LCD" if you want to stress that they're neither dot matrix nor boring 7 digit segment ones.
12:25:59 <int-e> Wikipedia has a page on the games... https://en.wikipedia.org/wiki/Handheld_electronic_game
12:28:55 <int-e> With a picture of a very clunky looking one... which was led based I guess? https://www.youtube.com/watch?v=YKcd3WjuZhk
12:30:39 <int-e> (And 7 segment display based, not custom. Funny.)
12:30:43 <fizzie> I think we had some of those Game & Watch ones.
12:32:13 <fizzie> https://en.wikipedia.org/wiki/File:Mario_Bros._-_Game%26Watch_-_Nintendo.jpg I think, although that's not the greatest picture.
12:32:38 <int-e> Or maybe it's actually one of those displays... https://en.wikipedia.org/wiki/Vacuum_fluorescent_display ...which went out of fashion before I really tried to understand technology.
12:36:51 <int-e> Ah that page has this helpful (if not conclusive) bit: "This technology was also used from 1979 to the mid-1980s in portable electronic game units."
12:39:15 <fizzie> I think there was one with >2 screens (3 or 4), too, where the gameplay progressed from one to another, but that doesn't seem to have been a Game & Watch title.
12:42:08 <wib_jonas> int-e, fizzie: it's tricky. there are handheld game consoles with one game with a built in custom LCD and a few buttons, some in watch form but most larger, eventually (but only after the Game Boy) even as complex ones as a real Tetris with a 20x10 block board with 3 LCD segments in each block; but there are also "mini-arcade" portable games that
12:42:08 <wib_jonas> are similar but have a passive chasis and a built-in display with a variety of technology;
12:43:11 <wib_jonas> but also a lot of single-game TV game hardware that doesn't have a built-in display and you connect them to a TV like you'd connect a gaming console that uses cartirdges.
12:43:15 -!- hendursa1 has quit (Quit: hendursa1).
12:43:34 -!- hendursaga has joined.
12:44:06 <wib_jonas> and a lot of miscellanious games that don't clearly fall into genres, including games that combine electronics with traditional mechanical elements and/or human-enforced rules
12:45:42 <wib_jonas> these latter still exist today, as chess computers that detect how you move the physical game pieces on a board, presumably using magnets, electronic darts games that detect where the dart hits, and carnival games that count how many times you kicked the ball into the goal or threw it into the hoop
13:07:16 -!- cpressey has joined.
13:07:21 -!- cpressey has quit (Client Quit).
13:10:02 -!- cpressey has joined.
14:11:10 -!- Arcorann__ has quit (Read error: Connection reset by peer).
14:38:19 -!- Sgeo has joined.
15:01:39 <aaaaaa> [Python][SAT] Toy package manager under 200 SLOC on top of SAT solver https://yurichev.com/news/20200901_pkg/
15:04:43 -!- kritixilithos has quit (Ping timeout: 240 seconds).
15:07:05 -!- kritixilithos has joined.
15:21:38 <t20kdc> ...constraint satisfaction is an NP-problem?
15:22:51 <t20kdc> ...sounds like a reason not to build a package system that requires solving it
15:23:02 <myname> how would you do that?
15:23:12 <myname> hardlink everything?
15:24:19 <myname> you could just always use the newest version of everything and hope it works out
15:24:31 <myname> but that does have obvious downsides
15:25:34 <t20kdc> take soname updates for instance - there's already something in place for side-by-side installation, it just has to be propagated to the package names
15:26:07 <t20kdc> and therefore version constraints aren't necessary
15:27:16 <myname> you just have to install anything like a hundred times. and if you are unlucky, those don't share configs if they should or do share configs if they shouldn't
15:28:03 <t20kdc> in practice, one shouldn't have to install anything a hundred times if everything uses the latest version, and if not, then that's better compatibility than the state of things r/n
15:29:09 <myname> i disagree
15:29:17 <int-e> t20kdc: But in practice, packages lag behind, some versions are broken, possibly only for a few select problems...
15:29:29 <myname> constraint satisfaction is in place it works
15:29:31 <int-e> and things become NP-hard sooner than you can blink
15:30:06 <int-e> problems -> packages
15:30:06 <cpressey> Every problem in CSP is either NP-complete or in P hth
15:30:12 <int-e> good Freudian slip, there.
15:30:29 <rain1> CSP = C_____ Salesman Problem ?
15:30:46 <int-e> cpressey: uh, misuse of "problem"?
15:31:00 <int-e> rain1: constraint satisfaction problem
15:31:24 <int-e> So, confused salesdrone problem
15:31:36 <t20kdc> my point is that moving soname major versions to the package name means that nothing changes unless side-by-side support is required, where it's an improvement (it's already done for, say, LLVM in some distros)
15:31:40 <int-e> `? drone
15:31:42 <HackEso> Drones are tools used to perform certain criminal actions that were not possible in ancient times.
15:33:08 <t20kdc> similar plans can be enacted in other places. if it makes the problem no longer NP-complete if applied sufficiently, I'm unsure, but it'd at least simplify things
15:33:17 <arseniiv> <int-e> .dmg <-- whenever I see that I read it as 'damage'. (it's for "disk image", apparently) => read that way too
15:33:51 <int-e> . o O ( brain.dmg )
15:35:00 <t20kdc> of course in theory integrated support for side-by-side soname versions at package manager level is just as good for that specific improvement, just more complex
15:37:10 <int-e> t20kdc: enter diamonds...
15:37:36 <esowiki> [[Special:Log/newusers]] create * HTTPSONION * New user account
15:37:50 <int-e> (A depends on B,C; B,C depend on D, in such a way that you need to use the same version of D for both)
15:38:17 <t20kdc> int-e: there are always going to be failing situations, but this has less failing situations than the current state of "the app uses an ancient version of libpng and I can't run it"
15:39:26 <int-e> I'm just feeding the idea that the question whether there is a working combination of packages, even if it can be accurately reflected in terms of versions, is naturally NP-hard.
15:40:45 <int-e> And I think it is. I wouldn't necessarily want to use a general purpose SAT solver for this... but mostly because it's hard to obtain stable solutions from them.
15:40:52 <int-e> (I think.)
15:41:28 <cpressey> I think "simple package management" (for some definition of "simple") reduces to topological sort and I'm pretty sure topological sort is in P. But I'm equally confident that "practical package management" is not reducible to "simple package management", so. Not saying no to a SAT solver.
15:42:25 <t20kdc> topological sort package management is indeed what I was thinking of
15:42:38 <int-e> cpressey: it's mostly the versions that mess things up
15:43:17 <int-e> cpressey: but there's also things like alternative dependencies (several libraries providing the same API... several tools serving the same purpose)
15:44:52 <int-e> oh and of course different versions may have different dependencies as well
15:45:05 <int-e> (as in, depend on different packages)
15:52:11 <cpressey> If packages can have registered conflicts, and alternative dependencies, and there is some logic where it tries to avoid conflicts by trying alternatives -- sounds plausibly in NP to me
15:53:43 -!- kritixilithos has quit (Ping timeout: 240 seconds).
16:17:18 -!- kritixilithos has joined.
16:19:56 -!- olsner has quit (Ping timeout: 256 seconds).
16:22:13 -!- wib_jonas has quit (Quit: Connection closed).
16:26:01 -!- ais523 has joined.
16:26:31 <ais523> a reminder that apt can be made to solve Sudoku (and probably exact cover problems in general)
16:30:17 -!- ajdlkasd has joined.
16:30:17 <Taneb> ais523: how is the sudoku expressed?
16:32:05 <ais523> oh, dpkg, not apt
16:32:30 <ais523> looking it up now
16:34:08 <ais523> http://web.archive.org/web/20160304015611/http://algebraicthunk.net/~dburrows/blog/entry/package-management-sudoku/
16:36:19 <ais523> Taneb: ^
16:36:44 -!- olsner has joined.
16:42:32 <kritixilithos> cool, i learnt today of a bubblegum quine https://codegolf.stackexchange.com/a/210416 which linked to a zip quine
16:43:52 <ais523> it'd be interesting to have an esolang which was a "more explicit" form of zip
16:44:02 <ais523> i.e. human readable backreferences, copy lengths, etc.
16:44:12 <ais523> so that the zip quine was easier to fully appreciate
16:44:32 <ais523> (not sure if "was" should be "were" there, normally I'm good with subjunctive grammar but this one flummoxes me)
16:44:46 <ais523> perhaps it should be "would be"?
16:46:51 <ais523> it is apt, not dpkg
16:46:57 <ais523> I was right first time
16:47:02 <ais523> I thought so, dpkg doesn't do dependency management
16:47:22 -!- ajdlkasd has quit (Remote host closed the connection).
16:47:41 -!- Lord_of_Life_ has joined.
16:51:04 -!- Lord_of_Life has quit (Ping timeout: 260 seconds).
16:51:09 -!- Lord_of_Life_ has changed nick to Lord_of_Life.
16:53:12 -!- imode has joined.
16:55:10 <Hooloovo0> heh, yeah, dpkg doesn't manage dependencies, it just complains about them
16:55:42 -!- LKoen has joined.
16:55:58 -!- cpressey has quit (Quit: WeeChat 1.9.1).
16:56:04 <t20kdc> ais523: the primary problem with that is the huffman layer
17:01:31 <ais523> you wouldn't have to replicate that, I doubt it's important to the quine's function
17:02:16 -!- ais523 has quit (Quit: quit).
17:38:43 -!- b_jonas has joined.
17:44:58 -!- LKoen has quit (*.net *.split).
17:44:58 -!- Lord_of_Life has quit (*.net *.split).
17:44:59 -!- aaaaaa has quit (*.net *.split).
17:45:00 -!- sprocklem has quit (*.net *.split).
17:45:00 -!- kmc has quit (*.net *.split).
17:45:15 <b_jonas> so I have a really silly idea. TIDE CUBE. oceans have two simultaneous tides during a 24-hour rotation, one on the day side caused by the Sun's gravitational pull, one on the night side caused by the Moon's gravitational pull. the common men of the ancient world, who lived their life in harmony with nature, working outdoors as farmers or sailors, knew this correctly. they didn't know the cause, which is
17:45:21 <b_jonas> understandable because they lived before Saint John told them about the four corners of Earth, so they invented such supernatural explanations as two giant sea monsters, Scylla and Charybdis, causing the tides.
17:46:32 -!- LKoen has joined.
17:46:32 -!- Lord_of_Life has joined.
17:46:32 -!- aaaaaa has joined.
17:46:32 -!- sprocklem has joined.
17:46:32 -!- kmc has joined.
17:46:37 -!- LKoen has quit (Max SendQ exceeded).
17:47:02 -!- LKoen has joined.
17:49:32 <b_jonas> but then a new elite rose, and instead of working, they leeched on the common man, shut themselves in ivory towers, and started to make theories, very rarely emerging to observe the real world and fact-check their theories. thus these people, Aristoteles and Erasthotenes, claimed that Earth was round. so did Columbus, who was more misguided because he had heard of the true teachings of the Bible and yet
17:49:38 <b_jonas> contradicted them, and ordered common men how to build sailing ships on this principle, without having any actual practice in seafaring. he led his men on a false path, and would have perished if it weren't for a timely mutiny of his men taking the ships back to the straight path.
17:50:05 <b_jonas> Columbus, of course, denied this, and claimed that he went the impossible round path and arrived to the East by going to the West, but we know that his men managed to take him straight to the West.
17:50:58 <b_jonas> If a physicist only works 8 hours a day, there's no way they can observe the two simultaneous tides in one day.
17:51:03 -!- kritixilithos has quit (Ping timeout: 240 seconds).
17:51:42 <b_jonas> thus even today textbooks are full of incorrect explanations of tides.
17:53:51 <Hooloovo0> huh, someone already has tidecube.com
17:58:37 <b_jonas> Hooloovo0: yes, there's a well-known washing machine detergent brand called "Tide", and there are at least dishwasher detergents distributed as cubes, so it's not too far-fetched as a brand that they'd want to use
17:59:07 <b_jonas> it would be surprising if no domain name squatter bought such a nice short English compound word under .com
18:01:02 <Hooloovo0> funky, ssh 5.3 on port 26
18:23:36 -!- kritixilithos has joined.
18:35:26 <arseniiv> b_jonas: my cheeks hurt, or my sanity, I don’t know which
18:36:02 <arseniiv> (may I also suggest a TIE CUBE)
18:38:38 <arseniiv> hm. TIRE CUBE. Tires are actually cubical, it’s just our eyes have a peculiar malfunction regarding them, as do our other optical devices as they are produced to fit our eyes’ functions to a degree. Only a garbage-level camera may approach the true image of tires (but while doing this, tire to death and explode)
18:39:06 <arseniiv> this is no competition even for TIDE CUBE, though, yep
18:39:21 <arseniiv> disregarding the original
18:39:43 <arseniiv> s/disregarding/and not even regarding
18:48:50 -!- kritixilithos has quit (Quit: quit).
19:05:45 -!- aaaaaa has quit (Ping timeout: 240 seconds).
19:15:19 <spruit11> No `chr` function in sight. https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/uchar_8h.html
19:15:22 <spruit11> Sigh.
19:15:34 <spruit11> WHy not?
19:16:33 <spruit11> Let's hope it is since it's probably just a cast?
19:19:21 <spruit11> double u_getNumericValue(UChar32 c)
19:19:29 <spruit11> OOps. Sorry for that.
19:23:56 -!- imode has quit (Ping timeout: 240 seconds).
19:49:07 -!- imode has joined.
20:22:18 <spruit11> Looks like it's just a cast.
20:32:52 -!- egelbot has joined.
20:33:19 <spruit11> egelbot: using String;; chr 0x1f994
20:33:19 <egelbot> '🦔🦔'
20:50:05 -!- sprocklem has quit (Ping timeout: 240 seconds).
20:50:52 -!- egelbot has quit (Remote host closed the connection).
20:51:21 -!- sprocklem has joined.
20:53:02 <spruit11> Using libicu which uses utf-16 under water always surprises. Bug fixed.
21:00:09 <zzo38> If a program deals with both UTF-8 and UTF-16, I would suggest implementing WTF-M-8. If it works with UTF-8 only, then I would suggest at least UTF-G-8.
21:00:35 <spruit11> Too late. I already decided in the beginning on libicu.
21:00:49 <spruit11> I have no idea how to implement all the voodoo otherwise.
21:01:02 <spruit11> Plus, regexes. I wanted that too.
21:01:33 <zzo38> I used PCRE for regular expressions.
21:24:24 <shachaf> But PCRE expressions are not regular.
21:24:28 <zzo38> Is there something like magnet: URIs but for NNTP? Such a URI should include newsgroup name and message ID, and optionally timestamp, host/port, and hash value. (I suppose only message ID is really required, but newsgroup name is recommended too.)
21:24:49 <zzo38> shachaf: Yes, they do things that mathematical regular expressions don't do, although these features can often be useful.
21:31:53 <arseniiv> . o O ( let’s call them irregular expressions )
21:32:48 <fizzie> There's the 'news' URI scheme, which (unlike the 'nntp' scheme) can indicate either a specific article (via message ID), or a specific set of newsgroups (by name, with wildcards) optionally indicating a server.
21:32:59 <fizzie> Unfortunately, I don't think it can *both* provide a message ID and any of that other useful data (newsgroup, server, timestamp) that would make locating the message easier. It's a sad omission.
21:33:39 <shachaf> I want a regular expression library with conjunction and negation.
21:34:38 <zzo38> fizzie: Yes, that is why I wanted it, due to that limitation.
21:36:08 <b_jonas> shachaf: would that actually help with http://www.madore.org/~david/weblog/d.2011-04-25.1871.html ?
21:36:53 -!- arseniiv has quit (Ping timeout: 260 seconds).
21:37:00 <shachaf> b_jonas: Make the expression shorter? I'm not sure.
21:37:07 <shachaf> I bet there are other, easier features that would make it shorter.
21:37:26 <shachaf> What does the minimal NFA for that expression look like?
21:38:08 <b_jonas> shachaf: yes, such as perl's feature that lets you copy a subexpression by reference. that would make it very short, because it lets you encode the, I think, 42 states of the regex and all paths among them.
21:38:33 -!- FreeFull has quit.
21:39:36 <shachaf> https://blog.tanyakhovanova.com/2009/08/divisibility-by-7-is-a-walk-on-a-graph-by-david-wilson/ is pretty small.
21:39:47 <b_jonas> shachaf: I think there are 42 states (or 43 if you don't want to accept the empty string as a valid representation of zero), namely 7 for the reminder classes modulo 7 of the part of the number you've seen, times 6 for the 6 different positions
21:40:44 <b_jonas> shachaf: hmm ok, then I guess I'm wrong, you only need 7 states? I dunno
21:57:56 <b_jonas> maybe you need 7 states when reading from left to right, but 42 states when reading from right to left
22:00:03 -!- xelxebar has quit (Ping timeout: 240 seconds).
22:01:13 -!- xelxebar has joined.
22:13:40 -!- aaaaaa has joined.
22:13:58 -!- aaaaaa has quit (Client Quit).
22:20:35 <shachaf> I think you need 7 either way?
22:20:47 <b_jonas> shachaf: dunno
22:20:53 <shachaf> Anyway, you don't need the extra power you get from complement to implement this.
22:21:03 <shachaf> By extra power I mean an extra exponential to turn an AFA into a DFA.
22:32:41 <esowiki> [[Conveyer]] M https://esolangs.org/w/index.php?diff=77175&oldid=77148 * Abbin21 * (+69)
23:09:05 -!- LKoen has quit (Remote host closed the connection).
23:11:25 <int-e> b_jonas: you only need 7 states no matter what
23:11:53 <b_jonas> int-e: yeah. I was just wrong
23:12:37 <int-e> things get more interesting when gcd(d,b) > 1, where d is the number you're dividing by and b is the base.
23:13:41 <b_jonas> as in dividing by 8?
23:14:19 <b_jonas> in base 10 I mean
23:15:42 <int-e> Though, hmm. Divisibility by 8 needs 8 states either way. But from left to right it's just remainders; from right to left, you get 1 + 4 + 2 + 1 states, and maybe one more rejecting state depending on the flavor of DFA.
23:16:53 <int-e> (That flavor depends on whether a DFA is allowed to be partial or not)
23:18:42 <int-e> Oh, no, I'm doing this wrong.
23:21:15 <int-e> 5 states are enough going from left to right. We have to keep track of whether it's divisible by 8. And then we need the remainder modulo 4.
23:21:44 <int-e> (and only one of those remainders allows the number to be divisible by 8, so it's 4+1 = 5 states)
23:23:51 <b_jonas> int-e: I think you also don't need all the remainders from left to right. it doesn't matter which odd number your number starts with
23:23:59 <b_jonas> oh yeah, that's what you said
23:24:01 <int-e> I wonder how that diagram came to look so crappy (there's some odd outstanding pixels on the ellipse boundaries, for example)
23:24:22 <int-e> b_jonas: Oh right.
23:24:44 <b_jonas> isn't it only like four states?
23:24:49 <int-e> So there's some more collapse.
23:25:15 <b_jonas> four states are: odd, divisible by 2 but not by 4, divisible by 4 but not by 8, divisible by 8
23:25:27 <b_jonas> that's all you need left to right
23:25:42 <int-e> One state for each for remainders 1/3/5/7, 2/6, 4, and 0.
23:26:10 <int-e> Except that... no, I got it right.
23:26:18 <int-e> 12 is not divisible by 8; 32 is.
23:26:26 <int-e> So 1 and 3 cannot be in the same state.
23:26:38 <b_jonas> hmm
23:26:47 <b_jonas> drat
23:28:33 <int-e> Oh wow, only 4096 characters.
23:28:50 <int-e> Ah, no. Pasting went wrong.
23:29:46 <int-e> It's 16233. So the 10793 I have is better :-)
23:32:13 <int-e> (for a regular expression testing divisibility by 7. Mine even excludes the empty string... for free (you can just replace the * at the end by +)
23:32:27 <b_jonas> int-e: post it as a comment then
23:47:19 <esowiki> [[Conveyer]] https://esolangs.org/w/index.php?diff=77176&oldid=77175 * Abbin21 * (+156)
23:47:38 <esowiki> [[Conveyer]] M https://esolangs.org/w/index.php?diff=77177&oldid=77176 * Abbin21 * (+2) /* How it works */
←2020-08-31 2020-09-01 2020-09-02→ ↑2020 ↑all