Wiki: K
GitHub: edit | view

K is like APL with fewer built-ins. The syntax is ASCII-only, and most built-in functions are heavily overloaded single bytes of ASCII punctuation.

There are several implementations with subtly varying behavior. uses ngn/k, which is documented with the reference card found under "help" at the online interpreter. If you're new to K (and J, APL, etc...), this style of documentation might not be very helpful, but other learning material is available:


Let's look at a program that outputs all of the input arguments with their length appended to them: `0:{x,$#x}'x

(Try it on United States: it outputs Nebraska8 Rhode Island12…)

           x    Get the list of inputs.
   {     }'     Apply some lambda function to each input.
                ({} makes a lambda, and the adverb ' means each.)
    x   x       Inside a monad lambda, "x" refers to the single argument.
       #        Monad # means "length"
      $         Monad $ means "convert to string"
     ,          Dyad , means "concatenate"
`0:             Output the list of strings line by line.
                0: is a dyadic writing-lines-to-a-file verb,
                and the left argument ` (the empty symbol) means "write to STDOUT".

You can see that K is essentially read and written "right-to-left", much like J and APL. x,$#x means (x,($(#x))). There's no operator precedence.

Golf tips

char" "space
function::identity function
symbols`empty symbol

Base Conversion

These come up a lot, almost in every other problem. A few ideas can be found on the APL tips and J tips page on StackExchange, so here is a quick translation table:

Convert from base/#.
Convert to base\#: or #.inv or ⊥⍣¯1
28+,/4\">>/"  / days in a month (the string is `c$62 11 62 47)

External resources