AbelianGrape

@AbelianGrape@beehaw.org
0 Post – 36 Comments
Joined 1 years ago

Programmer, graduate student, and gamer. I'm also learning French and love any opportunity to practice :)

Because lots of people I talk to where I live (eastern Canada) don't seem to realize this: the forcible "transfer" (i.e. deportation) of children is an act of genocide according to international law.

I almost exclusively play for A20 heart kills. I play all 4 classes but in a "whichever I feel like today" way. I tried rotating between the characters for a while and really didn't enjoy playing silent or watcher while in the wrong mood for those classes.

My favorite deck in recent memory was probably a silent discard combo with Grand Finale as the only damage-dealing card in the deck. My favorite archetype in general is probably ice defect. A good all-you-can-eat ironclad run is great too.

I don't think I agree that STS is especially well balanced - some regular hallway combats do irrationally more damage on average even to players much better than me (for example, floor one jaw worms or any act 3 darklings). In general, the game could be quite a bit harder on A20 and still be fun for players who want a challenge. It's also weird to me that A1 makes the game easier compared to A0. Between the classes, there is a class which is clearly stronger than the others. However I also don't think this is a bad thing. Imbalances create more opportunities for new experiences, and for different kinds of players to have different kinds of fun. And that certainly agrees with "infinite replayability." I'm sure in 5 years' time I will still be seeing interactions I've never seen before.

I'm not sure the median is what you want. The worst case behavior is unbounded. There is no guarantee that such an algorithm ever actually terminates, and in fact (with very low probability) it may not! But that means there is no well-defined median; we can't enumerate the space.

So let's instead ask about the average, which is meaningful, as the increasingly high iteration-count datapoints are also decreasingly likely, in a way that we can compute without trying to enumerate all possible sequences of shuffles.

Consider the problem like this: at every iteration, remove the elements that are in the correct positions and continue sorting a shorter list. As long as we keep getting shuffles where nothing is in the correct position, we can go forever. Such shuffles are called derangements, and the probability of getting one is 1/e. That is, the number of derangements of n items is the nearest integer to n!/e, so the probability of a derangement would be 1/n! * [n!/e]. This number converges to 1/e incredibly quickly as n grows - unsurprisingly, the number of correct digits is on the order of the factorial of n.

We're now interested in partial derangements D_{n,k}; the number of permutations of n elements which have k fixed points. D_{n,0} is the number of derangements, as established that is [n!/e]. Suppose k isn't 0. Then we can pick k points to be correctly sorted, and multiply by the number of derangements of the others, for a total of nCk * [(n-k)!/e]. Note that [1/e] is 0, indeed, it's not possible for exactly one element to be out of place.

So what's the probability of a particular partial derangement? Well now we're asking for D_{n,k}/n!. That would be nCk/n! * [(n-k)!/e]. Let's drop the nearest integer bit and call it an approximation, then (nCk * (n-k)!)/(n! * e) = 1/(k!*e). Look familiar? That's a Poisson distribution with λ = 1!

But if we have a Poisson distribution with λ = 1, then that means that on average we expect one new sorted element per shuffle, and hence we expect to take n shuffles. I'll admit, I was not expecting that when I started working this out. I wrote a quick program to average some trials as a sanity check and it seems to hold.

Bril is the only compiler IL I know of that is specifically designed for education.

R. Kent Dybvig's compilers course has had approximately 15 "intermediate" representations designed for his course since at least 2004 -- a consequence of teaching the course using the nanopass compiler framework for scheme. You could broadly divide these into "representations that are restrictions of scheme," and "representations that are increasingly-annotated versions of UIL" where UIL is the underlying intermediate representation. As far as I know, UIL was also designed for this course.

Search for !geometrydash@lemmy.world in Beehaw's search and it should come up. This initial search would cause federation.

However, if the instance you're searching for has been explicitly defederated with by Beehaw, you won't be able to see it here at all. We're federated with that instance already though, I thought, so it's strange that it wasn't showing up with other search terms.

5 more...

If you want to make simpler games, you could start with scratch or stencyl. These tools aren't really programming languages per se but they let you build programs out of blocks that are much easier to visualize and play around with. There's some research that suggests they are good entry languages and some research that suggests they aren't, so ymmv. I've used both, but I knew how to program already.

For the record you shouldn't let "usually made with" drive your decisions. Java is still popular for some games. Slay the spire, a very popular deck building game, was written in Java, which is a decently popular choice if you want to support modding. But C++ and C# are more popular simply because that's what you use if you're using engines like unity or unreal.

side note: C, C++, and C# are all different languages.

1 more...

How does this compare with GumTree? It's weird that the page doesn't even mention existing state-of-the-art tools for this task.

edit: I've compared GumTree and difftastic myself while working on a project this past week. Difftastic is harder to use programatically (the JSON format is unstable and leaves something to be desired) but other than that it's miles and miles better.

Yeah, I like subleq.

  • compiler is extremely fast, faster even than tinycc
  • strongly statically typed: all values are ints. Since it's all of them, you don't even need to write it!
  • memory safe: the entire (virtual) address space is guaranteed to be accessible at all times so there's no way to leak any of it (can't release it anyway) or to segfault (it's all accessible).

Subleq is the obvious winner in my mind.

Yeah i think you found the boss on accident if that's the quest name you were seeing.

But so did I, so this can't be that uncommon. I question the design of having some mid-game content in the same (surface) place as the end-game because it becomes unclear what you're being pointed at. Put simply, tell me to walk towards the giant chasm; I'm jumping in.

I realized I wasn't supposed to be there yet when I recognized a typical pre-boss pattern that Zelda games use a lot. Trying to avoid spoilers there.

I've only ever seen "one-time" in cryptography to refer to One-Time Pads (OTP). They are literally uncrackable (because every possible plaintext could be encoded by every possible ciphertext) but they achieve that by using a shared private key. The cipher becomes attackable if the key is re-used, hence the "one-time."

But that key has to be exchanged somehow, and that exchange can be attacked instead. Key exchange algorithms can't necessarily transfer every possible OTP which means eavesdropping on the exchange would make an OTP attackable. So the best option we know of that doesn't require secret meetings to share OTPs* really is to use RSA encryption. Once we have efficient quantum-resistant schemes, they'll be the best option we know.

* and let's be honest, secret meetings can be eavesdropped on as well.

I've used it to fix regressions, most recently in a register allocator for a compiler. There's pretty much no chance I would've found that particular bug otherwise; it was caused by an innocuous change (one of those "this shouldn't matter" things) clashing badly with an incorrect assumption baked into a completely different part of the allocator.

I had seen the same effect from an unrelated bug on a different program. When I added a new test and saw the same effect, I had a "didn't I fix this already?" moment. When I saw that the previous fix was still there, I checked if an older version of the allocator exhibited the same bug on the new test, and it did not. Bisecting found the offending change relatively quickly and further conventional testing exposed the incorrect assumption.

I'm a computer scientist mainly but with a heavy focus/interest in computer architecture. My plan is to teach at a university at this point - but it seems to me like that would be a good place to create completely open standards technology from.^1Specifically because if the point isn't to make money, there's no reason to create walled gardens.

There's certainly enough interest from people who want to be able to build their own systems. What would actually worry me isn't the ability to make a new open standard or any of that. It's that AMD64 is very hard to compete with in this space, because the processors are just faster, and there is so much x86 software that people who build PCs usually want access to.

AMD64's performance is the result of years and years of optimizations and patenting new hardware techniques, followed by aggressively litigating people trying to compete. ARM performance is catching up but ARM prefers licensing their core IP over making their own systems, making it harder for them to break into the PC space even if they want to.

A new player would be in for a long, long time of unprofitable work just to compete with AMD64 - which most people are still happy with anyway.

^1 some others and I are actually working on some new ISA / open soft processors for it. However it is focused at an educational setting and unlikely to ever be used outside of embedded devices at most.

I'm a bit confused by your comment. They say in their post that they will reevaluate when Lemmy's mod tools improve. More granular control over federation could help too. It's a temporary measure.

It's not like they're taking extreme action because they want to cause schisms. "They will defederate with everyone" only seems to apply if every other huge instance also has high numbers of trolls. Maybe not so unlikely, but mod tools on Lemmy will hopefully improve by then. Note: you sign up for beehaw's rules when you choose to interact on beehaw, not when you sign up to beehaw. The issue they are dealing with here is that they have had to disproportionately moderate users interacting on beehaw coming from those instances.

And at the end of the day, if beehaw becomes too isolated, it takes like 5 clicks to open a different instance in my browser and sign up there instead.

There is no official definition, in part because there isn't any formal way to define the term that satisfies our intuition.

Most treatments will handle "transpiling" as a special case of "compiling" and some will even handle decompilation as a special case where the object language is higher level than the source. Of course, even defining "higher level" can be quite hard.

Plenty of languages "compile to C" and I see no issue with saying something "compiles to js," especially given that js mostly lacks features of purescript rather than the other way around.

I find there's a lot less variety in my monster train runs. Most classes have a distinctly best strategy and the artifacts generally also funnel you towards that strategy. For example, I can't remember the last time I played an Umbra run that didn't set up a morsel engine behind a warden or alloyed construct - as far as I'm concerned, those are the same strategy, it doesn't feel different. The only other build I think is viable is just "play Shadowsiege," which rarely happens early enough to build for it.

Every class in STS has at least three viable archetypes and almost every run within those archetypes still feels different to me.

The s in « s'appelle » is the (reflexive) pronoun « se », whereas the t in « t'appelles » is « te ». It's the difference between "what does he call himself" and "what do you call yourself."

The Quebec thing would be « comment tu t'appelles-tu ? » where the second « tu » is a question marker, not a pronoun (but also I don't think I've ever heard that form used for this question).

Casually, I enjoyed it a lot. It felt like better BOTW, with much more new stuff to explore than I expected. My only gripes where the delay on quick menus (botw did not have that, and it feels awful) and I generally think the sage mechanic leads to bad play patterns. But overall, it's amazing.

I've been involved in speedrunning both games. Versioning issues in TOTK are way worse. Movement tech in botw was a lot more interesting and varied, until windbombs were found anyway. The menu lag feels even worse while speedrunning. The stuff we've got for inside shrines is pretty cool, and there's some very cool out-of-bounds stuff found already. So it'll probably stay fresh for a while. I'm not sure if it'll hold me for as long as botw did though.

1 more...

Yeah, these are examples of the bad gameplay patterns I was referring to. One of them in particular (trying to be spoiler-light) provides you a ranged power... But you have to go to melee range to activate it. Whose idea was that?

Patrick's parabox?

Only the number of shuffles is linear. Shuffling an array and marking/deleting correctly-placed elements still take linear time even with a "placement oracle." It's at best O(n^2) so the algorithm still wouldn't be a good sorting algorithm.

It's like doing selection sort, except we're selecting a random set of elements (from that poisson distribution) instead of the smallest one.

Not only is tunic beautiful; the experience is amazing. It's even better if you try to solve the main optional puzzle as you go.

Definitely agree that it's one of the best.

Second Shadow of the Colossus. The moments where you can just sit and look, coupled with the soundtrack, are some of the best in gaming history. Plus that bit of tension knowing what you're about to get into...

As a Haskell programmer, "OCaml has the nicest type features" hurts just a little bit.

I sometimes teach a course in OCaml. The students who are very engaged inevitably ask me about Haskell, I encourage them to try it, and then they spend the rest of the semester wondering why the course is taught in OCaml. Bizarre how different that is from when colleagues in industry want to try Haskell.

3 more...

Lemmy specifically hasn't implemented less harsh measures yet. This is a stop-gap action to cut off a trolling problem at its source. The beehaw admins say they will reevaluate when less drastic tools are available, e.g. allow beehaw users to interact with lemmy.world but not the other way around.

I'm not sure I 100% agree, personally, but beehaw's ethos is "be(e) nice" and if trolls are trolling, it can make it very hard for some people to open up and contribute. So I see where it's coming from.

Largely reasonable?

Haskell is not good for systems programming which sums up about 60-70% of that post. Laziness is lovely in theory but many industry uses of Haskell use stricthaskell for all or most of their code, so I certainly agree with that part too.

Their largest complaint about using Haskell for small non-systems programs seems to be the mental overhead induced by laziness. But for me, for small programs where performance isn't a huge concern (think Advent of code or a script for daily life) laziness reduces my mental overhead. I think that author is just especially concerned about having a deep understanding of their programs' performance because of their systems background. I worry about performance when it becomes relevant. Debugging Haskell performance issues is certainly harder than strict languages but still totally doable.

The lack of type classes or other form of ergonomic overloading in OCaml is easily the single "feature" most responsible for the language never taking off.

1 more...

You have to be explicit about which module you're using at all times, even though 99% of the time only one could apply. When the type class resolution is unique, but complicated, there's no mental overhead for the Haskell programmer but getting all the right modules is a lot of overhead for the OCaml programmer. It also lets us write functions that are polymorphic under a class constraint. In OCaml you have to explicitly take a module argument to do this. If you want to start composing such functions, it gets tedious extremely fast.

And then even once you're using a module, you can't overload a function name. See: + vs +.. Basically modules and type classes solve different problems. You can do some things with modules that you cannot ergonomically do with type classes, for example. create a bit-set representation of sets of integers, and a balanced search tree for sets of other types, and expose that interface uniformly from the same module functor. But Haskell has other ways to achieve that same functionality and more.

OCaml's type system cannot replicate the things you can do with Haskell's higher kinded types, type families, or data kinds at all (except for a fraction of Haskell's GADTs).

As in could instances on different forks federate with each other? Sure. We already federate with mastodon instances and with kbin and other fediverse platforms. Having two versions of Lemmy is more an issue for maintenance, as well sharing new features and fixes between the forks.

Ive been learning French for about two years now. Consuming media in the target language is good but... there is no substitute, none, for actively having conversations in the target language every day. Seek out a conversation partner! Personally, I moved (coincidentally, lol) to a Canadian French city about a year after I started learning the language. I regularly speak French with people I've met there.

I've seen many polyglots practice speaking languages on ome(dot)tv, though I can't personally say whether it's effective.

Most recently, KeyWe and modded Keep Talking with friends. Solo, still ol' reliable slay the spire.

I have a plan to teach someone how to play schnapsen and crazyhouse chess tomorrow so that's exciting.

Learning how to program in any language will make it easier to pick up any other language, because the main burden for a beginner is how to think programmatically. However once you're enough past that wall, being an expert on one language will mostly only help pick up languages that are similar. So if you knew C++, you could pick up the syntax and probably most of the semantics of the others very quickly, because they are similar in that regard. But you'd still probably struggle to actually program in C, because C is lower level (has way fewer features) than C++.

Technically speaking, C is a subset of C++. But that doesn't mean being a good C++ programmer automatically makes you a good C programmer.

C# is similar to the other two in syntax as well, but it's much more like Java than either of them.

Shadow of the Colossus and Undertale.

Is Printf.printf not a good generic print function? It's even variadic!

Are you asking who believes that signal is the gold standard? Other encrypted chat services implement "the signal protocol" now, so... if not gold, it's at least standard.

"Monadic type" has something like three meanings depending on context, and it's not clear which one you mean. One of them is common in math, but not so common in programming, so probably not that. But neither "parametric types with a single argument" nor "types that encode a category-theoretic monad" have the property you say, as far as I know.

I imagine you're probably referring to the latter, since the optional monad exists. That's very different from returning null. The inhabitants of Integer in Java, for example, are the boxed machine ints and null. The inhabitants of Optional[Integer] (it won't let me use angle brackets here) are Optional.of(i) for each machine int i, Optional.empty(), and null.

Optional.empty() is not null and should not be called a "Null object." It's also not of type Integer, so you're not even allowed to return it unless the function type explicitly says so. Writing such function types is pretty uncommon to do in java programs but it's more normal in kotlin. In languages like Haskell, which don't have null at all, this is idiomatic.

Invidious does use a YouTube API. FreeTube uses Invidious, so probably same story there. I don't know about the others.

I recently had a back and forth with one of invidious's developers. Judge for yourself.

I searched for it before posting the original comment and it appeared.