6 ms·
As Lovely as a Tree
- 082349872349872 2y agoPoetry involves a specific choice of words (perhaps with some thought to metre or rhyme), so if anything, we should expect programs to be as beautiful as poem. (would there then be algorithms as beautiful as an argument, or functions as beautiful as an idea?)
- deadbabe 2y agoBinary heap
- labster 2y agoHere, have some Perl poetry: https://en.wikipedia.org/wiki/Black_Perl https://en.wikipedia.org/wiki/Black_Perl
- adityaathalye 2y agoAlso the fact that 93% of paint splatters are valid Perl programs (2019) (mcmillen.dev) https://news.ycombinator.com/item?id=40197013 https://news.ycombinator.com/item?id=40197013 And riffing off poetry in prog langs, Dylan Beattie's Rockstar comes to mind: https://codewithrockstar.com/ https://codewithrockstar.com/
- 082349872349872 2y agoDifficult to mention Beattie without also mentioning his musical work, eg "Bug in the Javascript" https://www.youtube.com/watch?v=jxi0ETwDvws&list=PLw0jj21rhfkMY8jE99M0Um85-l8MdOeAA&index=4 https://www.youtube.com/watch?v=jxi0ETwDvws&list=PLw0jj21rhf...
- adityaathalye 2y agoOh my, I haven't seen this one before... grinning like silly. I referenced his talk "The Art of Code" in my essay (I'm OP), a personal favourite. Watching "Dylan Beattie's Tech Parodies" seems like a nice way to goof off this Sunday... brb.
- 082349872349872 2y agoCool, speaking of rock stars, "You Give REST a Bad Name" is a bit heavier; since you're OP, maybe the next one could be "Is there a program that rocks as hard as...?" I still remember a particular moment in the early 1980s. I was working through K&R, and temperature conversion (§1.2) had been mid, but the RPN calculator (§4.3) was lit, and having typed it in, then figured out its principles of operation, I just knew I wanted to become a programmer. He heard one guitar, just blew him away He saw stars in his eyes, and the very next day * From then on, I was destined for a life of Hex, Bugs, and Rock&Roll. * https://www.youtube.com/watch?v=Ic02W1bWeFU https://www.youtube.com/watch?v=Ic02W1bWeFU
- bostik 2y agoI remember when Perl poetry was a thing. Mates in university combined it with code golfing, and came up with some pretty wacky results. Being bad at both poetry and golf, I went with brevity instead: require clue;
- Turing_Machine 2y agoThe Fast Fourier Transform.
- tucnak 2y agoTedious, inobvious, trickish. Might do it for some people, but not for me. Double for-loop substring search tells so much more! Oh, pain, oh, obscenity.
- avmich 2y agohttp://archive.vector.org.uk/art10500390 http://archive.vector.org.uk/art10500390 ...Roger Hui: In the year 2033 Earth was discovered by Survey Fleet MCXII of the Galactic Empire. The Emperor ordered Earth to send a representative to the court, with strict instructions to “bring something beautiful”. Emperor What beautiful things does Earth have? Earth Representative Your excellency, our...
- avmich 2y agoServer went down (?), so the full text here: 49. Bring Something Beautiful +/(1+⍳∞)-s ←→ ×/÷1-(⍭⍳∞)-s The following e-mail exchange took place on 2010-06-24 during a discussion on numeric representation. Morten Kromberg: And… I shall fight against adding any form of NaN/Infinity — to the death! They will horribly complicate our implementation and don’t help users do anything useful. Roger Hui: In the year 2033 Earth was discovered by Survey Fleet MCXII of the Galactic Empire. The Emperor ordered Earth to send a representative to the court, with strict instructions to “bring something beautiful”. Emperor What beautiful things does Earth have? Earth Representative Your excellency, our mathematician Euler proved in our year 1737 that +/(1+⍳∞)*-s ←→ ×/÷1-(⍭⍳∞)*-s Emperor What is the ⍭ symbol? Earth Rep. ⍭i is the i-th prime. Emperor And what is ∞? Does it do anything useful? Earth Rep. It denotes infinity, your excellency. Emperor (ponders equation for a minute or two) Respect! Emperor Neat notation you have there. Tell me more. Earth Rep. Your excellency, it’s called APL. It was invented by the Canadian Kenneth E. Iverson …
- bee_rider 2y agoWell, I don’t think it is the point of the article, but we might as well list the most beautiful algorithms we can think of, right? Mergesort is quite beautiful I think. There’s something beautiful in the simplicity of just merging the sorted lists. Stable. No pathological cases. Nice access patterns.
- 082349872349872 2y agoIIRC, Knuth said Tarjan's SCC had a certain beauty in that exactly when each node is visited, the relevant information has just been calculated.
- adastra22 2y agoEvolution by natural selection is the most beautiful algorithm imho.
- dumpsterdiver 2y agoI was looking for a word earlier that describes when it slowly dawns on a person how profound a thing is that’s been right in front of their eyes most of their life. The word I settled on was revelation, and one of the revelations I revisit as I grow older is the menacing terror presented by evolving lifeforms. If you press the fast forward button as a theoretical “survivor in the game of life”, the creatures that were benign when they were static now become terrifying, constantly morphing organisms which gain and lose all manner of sharp and venomous appendages. Like those early Deep Dream videos that always had creepy eyes and teeth everywhere on inanimate objects… that truly is what evolution looks like. It inspires instinctive fear of all the bad things, because that is exactly how it manifests. When you release the fast forward button though and come back to the present, what was creepy and terrifying before suddenly becomes magnificent. A living representation of localized perfection.
- adastra22 2y agoOnly in niches that get locked in an evolutionary arms race, as does sometimes happen but is not the norm. There’s also prokaryotic life out there chilling and doing the same thing it’s been doing for billions of years.
- andrewflnr 2y agoSpeaking of poems, algorithms, and trees: https://courses.cs.washington.edu/courses/cse461/14sp/lectures/spanningtreepoem.txt https://courses.cs.washington.edu/courses/cse461/14sp/lectur...
- adityaathalye 2y agoFeels like a riff on "Trees" by Joyce Kilmer https://www.poetryfoundation.org/poetrymagazine/poems/12744/trees https://www.poetryfoundation.org/poetrymagazine/poems/12744/...
- 082349872349872 2y agoSee also http://mercury.lcs.mit.edu/~jnc/humour/lisp.tree http://mercury.lcs.mit.edu/~jnc/humour/lisp.tree (GLS "quux")
- adityaathalye 2y agoI find it hard to disagree That only LISP Can Make a Tree :D
- MrVandemar 2y agoI may be misremembering, but I saw a 'C' strcpy that looked concise and elegant, and seemed like a kind of poetry to me at the time. while(*s1++ = *s2++);
- saghm 2y agoIt's certainly concise, but two post-evaluation assignments inside another assignment evaluated as a boolean condition feels more like the code equivalent of an Lovecraftian eldritch horror than a beautiful sunset.
- ajuc 2y agoThis is code golf, not algorithmic beauty tho. I'd say it's like a limeric - short and witty, but not deeply moving. But I admit I also remember this :)
- proc0 2y agoHaskell (and some other pure FP langs) produces a lot of code that is basically technical poetry, at the cost of performance. just look at the fib example: >> fib = 1 : 1 : [a + b | (a, b) <- zip fib (tail fib)]
- Sharlin 2y agoAlso the two-line "quicksort": qsort [] = [] qsort pivot : xs = qsort [x <- xs, x < pivot] : pivot : qsort [x <- xs, x >= pivot]
- tromp 2y agoI prefer fib = f 0 1 where f a b = a : f b (a+b) which needs neither zip nor tail.
- fanf2 2y agoI like this paper on the sieve of Eratosthenes in Haskell https://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf https://www.cs.hmc.edu/~oneill/papers/Sieve-JFP.pdf by Melissa O’Neill (of PCG fame)
- deleted 2y ago[deleted]
- 082349872349872 2y agoa moldy oldy (in the tradition of Dijkstra and Euclid): proc gcd(n,m): do n>m ⇒ n:=n-m ⫿ m>n ⇒ m:=m-n od; return max(n,m) EDIT: note the different levels of abstraction: this is a program which implements a particular GCD algorithm, in a manner attempting to reflect the symmetry of the function which that algorithm calculates.
- __loam 2y agoFFT
- creaktive 2y agoDiscrete Fourier Transform alone is transcendental, IMHO.
- yazaddaruvala 2y agoIm a huge fan of iterative Quickselect and also iterative dfs. I find especially all their slight variations to be quite poetic.
- remoquete 2y agoEspecially when you're coding poems using english-lang: https://github.com/theletterf/english-lang https://github.com/theletterf/english-lang
- FartyMcFarter 2y agoMinimax search. Such a simple algorithm, but it perfectly solves chess and similar games.
- tromp 2y agoAlpha beta search solves games more efficiently...
- FartyMcFarter 2y agoI was referring to the beauty of the algorithm, not efficiency.
- JohnKemeny 2y agoλx.(λx.f(xx))(λx.f(xx))
- tromp 2y agoThat ignores its first argument x. You mean the fixpoint combinator λf.(λx.f(x x))(λx.f(x x)), or λf.(λx.x x)(λx.f(x x)), or as a lambda diagram: ────┬──── ┬─┬ ┼─┬─┬ └─┤ │ ├─┘ │ ├─┘ └─┘
- tromp 2y agoI would say the combinator \x\y\z.x z (y (\t.z)) is more poetic than Y, since it forms a basis for combinatory logic all by itself. Not only can you make Y from it, but every other combinator as well. And it's the smallest term with that property.
- Simon_ORourke 2y agoIt depends, are you talking about W.B. Years here, or some bozo from a hip-hop outfit not going three words without saying b*ch?
- defrost 2y ago> you talking about W.B. Years here Oh Simon, we're talking both Yeats as in doesn't rhyme with Keats and the Sleaford Mods et al. You might need an IRL friend to school you on the good bars. addendum: Humphrey B. Flaubert covers W.B.'40' Years https://www.youtube.com/watch?v=oGxDVXGRQpY https://www.youtube.com/watch?v=oGxDVXGRQpY
- 082349872349872 2y agoSome bozo from a hip-hop outfit not going three words without cutting glass: https://www.youtube.com/watch?v=mG2zN9xuGVw https://www.youtube.com/watch?v=mG2zN9xuGVw (it's the XXI, you can type bitch now, but note that apart from a notable hapax, Mr B prefers to refer to ladies)
- ajuc 2y agoAlgorithms can certainly be elegant. A greedy algorithm with a lot of special cases added to force it to work feels yucky. A simple algorithm that does the minimal amount of work to get the job done and handles all the special cases without case-specific code feels good. Like a well-crafted, reliable tool. It might not be beauty yet, but it's close. What makes it beautifull in my mind is the same thing that makes some poems beautifull - the fact that it seems simpler than the problem it solves, and yet it solves it well. If it evokes that surprising feeling of "That's it? That's enough?" - then it's beautifull, like a poem which expresses complex feeling in a few short verses. For me Floyd-Warshall is one example.
- tromp 2y agoThere's a universal algorithm (λ 1 1) (λ (λλλ 1 (λ 1 (λ 4 (λλλ 3 1 (2 (λ 2)))) (4 (λ 5 (λ 5 (2 1)))))) (1 1)) (λ 1) (in de-Bruijn notation) which, given a list of input bits, parses the encoding of an arbitrary algorithm (as a combinator over the minimal single point basis λxλyλz.x z (y (λt.z))) from this bit stream, and runs that algorithm on the remaining input.
- _nalply 2y agoFor me, tree traversal is beautiful. traverse(node): if node: [ ...traverse(node.left), ...traverse(node.right), node.value, ] The pseudo-code recursively produces a list of the node values in post-order.
- amomchilov 2y agoHuffman encoding
- gumby 2y agoThe author even quoted Sussman but neglected to include Guy Steele’s version: I think that I shall never see A matrix lovely as a tree. Trees are fifty times as fun As structures a la PL/I (Which Dijkstra claims are too baroque). And SNOBOL's strings just can't compare With all the leaves a tree may bear, And COMIT strings are just a joke. Vectors, tuples too, are nice, But haven't the impressive Hair Of trees to which a LISP is heir. A LISPer's life is paradise! Many people think that JOSS And others, too, are strictly boss; And there are many BASIC fans Who think their favorite language spans All that would a user please. Compared to LISP they're all a loss, For none of them gives all the ease With which a LISP builds moby trees. RPG is just a nurd (As you no doubt have often heard); The record layouts are absurd, And numbers packed in decimal form Will never fit a base-two word Without a veritable storm Of gross conversions fro and to With them arithmetic to do. And one must allocate the field Correct arithmetic to yield And decimal places represent Truncation loss to circumvent: Thus RPG is second-rate. In LISP one needn't allocate (That boon alone is heaven-sent!) The scheme is sheer simplicity: A number's just another tree. When numbers threaten overflow LISP makes the number tree to grow, Extending its significance With classic tree-like elegance. A LISP can generate reports, Create a file, do chains and sorts; But one thing you will never see Is moby trees in RPG. One thing the average language lacks Is programmed use of push-down stacks. But LISP provides this feature free: A stack — you guessed it — is a tree. An empty stack is simply NIL. In order, then, the stack to fill A CONS will push things on the top; To empty it, a CDR will Behave exactly like a pop, A simple CAR will get you back The last thing you pushed on the stack; An empty stack's detectable By testing with the function NULL, Thus even should a LISPer lose With PROGs and GOs, RETURNs and DOs, He need his mind not overtax To implement recursive hacks: He'll utilize this clever ruse Of using trees as moby stacks. Some claim this method is too slow Because it uses CONS so much And thus requires the GC touch; It has one big advantage, though: You needn't fear for overflow. Since LISP allows its trees to grow, Stacks can to any limits go. COBOL input is a shame: The implementors play a game That no two versions are the same. And rocky is the FORTRAN road One's alpha input to decode: The FORMAT statement is to blame, But on the user falls the load. And FOCAL input's just a farce- But all LISP input comes pre-parsed! (The input reader gets its fame By getting storage for each node From lists of free words scattered sparse. Its parses all the input strings With aid of mystic mutterings; From dots and strange parentheses, From zeros, sevens, A's and Z's, Constructs, with magic reckonings, The pointers needed for its trees. It builds the trees with complex code With rubout processing bestowed; When typing errors do forebode The rubout makes recovery tame, And losers then will oft exclaim Their sanity to LISP is owed — To help these losers is LISP's aim.) The flow-control of APL And OS data sets as well Are best described as tortured hell. For LISPers everything's a breeze; They neatly output all their trees With format-free parentheses And see their program logic best By how their lovely parens nest. While others are by GOs possessed, And WHILE-DO, CASE, and all the rest, The LISPing hackers will prefer With COND their programs to invest And let their functions all recur When searching trees in maddened quest. Expanding records of fixed size Will quickly programs paralyze. Though ISAM claims to be so wise In allocating overflow, Its data handling is too slow And finding it takes many tries. But any fool can plainly see Inherent flexibility In data structured as a tree.
- qazxcvbnm 2y agoOn trees - how could we neglect the Succinct trees? Succinctness - expressing trees with as little bits as entropically possible. The representation is as simple as it could be - simply write down nested parentheses whose abstract syntax tree is your given tree. Practically all tree operations in logarithmic or constant time. How it works - recursively with range-min trees and range-max trees - simple and elegant number theory. A primer - https://arxiv.org/pdf/0905.0768 https://arxiv.org/pdf/0905.0768