Hacker News new | ask | show | jobs
by __del__ 202 days ago
for those who think brainfuck is too pedestrian, have a browse through the esolang wiki:

https://esolangs.org/wiki/Language_list

5 comments

StupidStackLanguage is by far my favorite:

https://esolangs.org/wiki/StupidStackLanguage

Piet is mine - the programs are 2D images: https://esolangs.org/wiki/Piet

Primarily because of the note on the "calculating pi" example program:

> Richard Mitton supplies this amazing program which calculates an approximation of pi... literally by dividing a circular area by the radius twice.

> Naturally, a more accurate value can be obtained by using a bigger program.

https://www.dangermouse.net/esoteric/piet/samples.html

One of my favorite calculations of pi is to pick random coordinates in a unit square and count how many of them are in a circle. it's so stupid and so clever at the same time.

This was recreated from memory. I think it is close but I may have a bounding bug.

    import random

    def pi(count):
      inside = 0
      for i in range(count):
        test_x = random.random() 
        test_y = random.random()
        if test_x ** 2 + test_y ** 2 < 1:
          inside += 1
        return inside / count * 4 #above is a quarter circle
    
    print(pi(2 ** 30) )
With the metatopic of this thread being obscure languages, I had some fun squeezing this into some list comprehensions (maybe someone's got an idea of how to keep track of the state within the list):

```

$ cat << EOF > pi.py

state = [0, 0, 2*8, 2*12]; _ = [print(f'\rRun {state.__setitem__(0, state[0] + 1) or state[0]}/{state[3]} | Last \u03c0: {current_pi:.6f} | *Average \u03c0: {(state.__setitem__(1, state[1] + current_pi) or state[1]) / state[0]:.6f}*', end='', flush=True) for current_pi in [(4 * sum([1 for _ in range(state[2]) if __import__("random").random()*2 + __import__("random").random()*2 < 1]) / state[2]) for _ in range(state[3])]]; print()

EOF

$ time python3 pi.py

Run 4096/4096 | Last π: 3.140625 | *Average π: 3.143051*

python3 pi.py 0.41s user 0.01s system 99% cpu 0.429 total

```

Play around with the `2*8` and `2*10` values in the state, they control the amount of rounds and the range in which the random values get generated respectively.

I'm not sure about a bounding bug, but there's definitely an indent error on the return line (good old Python!)
I have no idea how I'd be able to pitch this to a university (or even who I could pitch it to), but I would absolutely love to teach a computability course using Brainfuck as the language, just to really show students how low-level logic can be.

I would probably need to find a similar language with a different name though.

You might find mlatu-6[0] interesting- it’s convertible to SKI calculus but concatenative (like Forth) rather than applicative. It’s actually a subset of Mlatu, a language I created for similar reasons to explore “how low can you go.”

[0]: https://esolangs.org/wiki/Mlatu-6

When I was an undergrad at Georgia Tech, one of my intro computer science classes had us implement something in brainfuck. Turns out college kids are quite comfortable with swear words.
Of course they are ... It's college administration that are uncomfortable
How about Assembly?
Assembly is higher level logic than brainfuck, especially on modern chips. You have built in instructions for arithmetic and conditionals/branches and you can allocate memory and point to it.

You don’t really get any of that with brainfuck. You have a theoretical tape and counters and that’s basically it.

SKI calculus is pretty neat, too. You get no tape, no counters. (But it's not quite as bad to program in as brainfuck, because you can built more ergonomic contraptions to help you along.)
SKI can, of course, be de-optimised a bit further by replacing I with SKK. You are right though that it is relatively simply to go from something that looks like a normal program languages to a pile of S and K combinators. Not the most efficient way to compute though!
Unlambda solves that problem.

"What if we had the lambda calculus without the lambda forms?" asked no one.

http://www.madore.org/~david/programs/unlambda/

Oh my god, that list lacks DATAFlex!
Dear Lord.
I remain utterly baffled how they made a lisp compiler with malbolge