jfrech.com
jblog
table of contents

krrp

2019-04-20, post № 214

C, krrp, programming, #2018

A project of epic proportions has come to a close. Yesterday, the 19th of April 2019, saw the first public release of my new programming language, krrp.

As of the 24th of April 2019, krrp is kindly included in the TIO language collection, making krrp interpretation available from within the web. Great thanks go out to TIO for providing this service.

krrp is a functional, dynamic, interpreted and (theoretically) Turing-complete esolang implemented only using standard C. As such, on top of designing the actual language, any data structures, memory management and general auxiliary functionality deviating from the lacking capabilities offered by C had to be home-brewed and hand-crafted. A time-consuming task — I have been working on this language for the past year. However, it gives the language a certain purity, as its high-level functional approach rests firmly and closely on the state-changing, mutable and segmentation-faulting depths that are the C language.

Sudoku Generation

2019-03-23, post № 213

games, Haskell, programming, #generator, #puzzle

Over two years ago, I wrote a basic 𝟥 ⨉ 𝟥-sudoku solver which uses both fundamental rule-based elimination and guessing to arrive at the solution. Revisiting the topic of computer-aided sudoku manipulation, I wrote a generalized sudoku generator (sudoku-generation.hs).

    | 4  
  3 |    
---------
  2 | 1  
  4 |    

./sudoku 5 2

Pi Day MMXIX

2019-03-14, post № 212

C, programming, #cyclic quine, #iteration quine

w=0;b(){w>27&&puts("",w=0);}
p(c){b();putchar(c),b(++w);}
main(){int/**/N=0,D[][85]={{
0,1048320,4194272,8372472,1,
16646172,33030158,33030150,1
,33030144,16252928,16252928,
3932160,1,1966080,983040,1,1
,229376,57344,14336,7168,1,1
,134219520,1,1,1,1,67109312,
133169264,1,67108860,1,1,1,1
,33554431,-1},{3670016,1,1,1
,3932160,1835008,917504,1,1,
917504,458752,491520,229376,
114688,122880,57344,28672,1,
28672,14336,15360,7168,7680,
3840,1792,1920,960,448,-1},{
0,134217712,134217720,1,1,1,
62914620,31457294,31457286,1
,15728640,7340032,7864320,1,
3932160,1966080,1966080,1,1,
983040,1015808,491520,245760
,245760,122880,61440,61440,1
,30720,15360,-1},{0,0,0,0,0,
0,0,0,0,0,2097088,2097088,0,
0,0,0,0,0,0,0,0,0,-1},{0,0,0
,0,0,1048064,8259552,1,1,1,1
,16515576,15729144,504,504,1
,985024,1048320,1008,504,252
,25166332,29360632,7342064,1
,2097024,0,0,-1},},*d,C[]={1
,119,61,48,59,98,40,41,123,1
,119,62,50,55,38,38,112,117,
116,115,40,34,34,44,119,61,1
,48,41,59,125,112,40,99,41,1
,123,98,40,41,59,112,117,116
,99,104,97,114,40,99,41,44,1
,98,40,43,43,119,41,59,125,1
,109,97,105,110,40,41,123,1,
105,110,116,47,42,42,47,78,1
,61,48,44,68,91,93,91,56,53,
93,61,123,2,125,44,42,100,44
,67,91,93,61,123,3,48,125,44
,42,99,61,67,44,106,59,67,91
,56,48,93,61,40,67,91,56,48,
93,45,52,55,41,37,55,43,52,1
,56,59,105,102,40,78,60,54,1
,41,102,111,114,40,100,61,68
,91,78,63,78,45,49,58,48,93,
59,42,100,43,49,59,42,100,43
,43,45,49,38,38,112,117,116,
115,40,34,34,41,41,105,102,1
,40,42,100,45,49,41,102,111,
114,40,106,61,42,100,59,106,
59,106,47,61,50,41,112,117,1
,116,99,104,97,114,40,51,50,
43,106,37,50,42,49,53,41,59,
59,59,102,111,114,40,59,42,1
,99,59,99,43,43,41,123,105,1
,102,40,42,99,61,61,50,41,1,
102,111,114,40,106,61,48,59,
106,60,53,59,106,43,43,41,1,
123,112,40,49,50,51,41,59,59
,59,102,111,114,40,100,61,68
,91,106,93,59,42,100,43,1,49
,59,112,40,52,52,41,41,1,119
,43,61,112,114,105,110,1,116
,102,40,34,37,100,34,44,1,42
,100,43,43,41,59,112,40,1,52
,53,41,59,112,40,52,57,41,59
,112,40,49,50,53,41,59,1,112
,40,52,52,41,59,125,101,108,
115,101,32,105,102,40,1,42,1
,99,61,61,51,41,102,111,1,1,
114,40,100,61,67,59,42,100,1
,59,112,40,52,52,41,41,119,1
,43,61,112,114,105,110,116,1
,102,40,34,37,100,34,44,42,1
,100,43,43,41,59,1,101,108,1
,115,101,32,105,102,40,42,99
,62,49,41,112,40,42,99,41,59
,125,102,111,114,40,106,61,1
,53,59,45,1,45,106,59,112,40
,53,57,41,1,41,59,1,1,1,125,
0},*c=C,j;C[80]=(C[80]-47)%7
+48;if(N<6)for(d=D[N?N-1:0];
*d+1;*d++-1&&puts(""))if(*d-
1)for(j=*d;j;j/=2)putchar(32
+j%2*15);;;for(;*c;c++){if(*
c==2)for(j=0;j<5;j++){p(123)
;;;for(d=D[j];*d+1;p(44))w+=
printf("%d",*d++);p(45);p(49
);p(125);p(44);}else if(*c==
3)for(d=C;*d;p(44))w+=printf
("%d",*d++);else if(*c>1)p(*
c);}for(j=5;--j;p(59));};;;;

Try it online. Happy pi day.

Lichen, Extraterrestrials, Diodes #1

2019-02-23, post № 211

art, #LED, #photography

lichen-extraterrestrials-diodes-1.jpg

Kickboy #0

2019-01-26, post № 210

art, #stop motion

kickboy-0.gif
Kickboy.

Foam Cube Puzzle

2018-12-29, post № 209

programming, Python, #brute-force, #solver

After having solved the puzzle shown below a few times by combining six foam pieces to construct a hollow cube, I wondered if it had a unique solution. A simple brute-force search reveals it does.
Source code: foam-cube-puzzle.py

foam-cube-puzzle.jpg
All six foam pieces.

As a first step, I digitalized all pieces seen above. Having an internal representation, I wrote a script which tries all possible rotations and reflections (as three-dimensional rotations can imply two-dimensional reflection) to try and construct a three-dimensional cube from the given pieces. Using short-circuit evaluation to not bother with already impossible solutions, the search space is narrow enough to not require any considerable computing time. The resulting unique solution modulo rotation is shown above; the top face is placed on the bottom right.

Winter MMXVIII

2018-12-24, post № 208

art, C, programming, #fir, #quine, #tree

                                         I
                                        ,O;
                                       main(
                                      ){char*
                                     Q,_[]={73
                                    ,44,79,59,2
                                   ,109,97,105,2
                                  ,110,40,41,123,
                                 99,104,97,114,42,
                                81,44,95,91,93,61,2
                               ,123,1,48,125,44,42,2
                              ,74,59,102,111,114,40,2
                             ,81,61,95,44,73,61,79,61,
                            48,59,42,81,59,43,43,81,41,
                           123,105,102,40,42,81,60,50,41
                          ,102,111,114,40,74,61,95,59,42,
                         74,59,74,43,43,41,73,60,49,38,38,
                        112,114,105,110,116,102,40,34,37,42
                       ,99,34,44,52,50,45,79,47,50,45,49,44,
                      51,50,41,44,73,43,61,112,114,105,110,2,
                     116,102,40,34,37,100,34,44,42,74,41,44,73
                    ,62,79,63,73,61,48,44,79,43,61,50,44,112,2,
                   117,116,115,40,34,34,41,58,48,44,73,43,43,60,
                  49,63,112,114,105,110,116,102,40,34,37,42,99,34
                 ,44,52,50,45,79,47,50,44,52,52,41,58,112,117,116,
                99,104,97,114,40,52,52,41,44,73,62,79,63,73,61,48,2
               ,44,79,43,61,50,44,112,117,116,115,40,34,34,41,58,48,
              59,105,102,40,42,81,62,50,41,73,43,43,60,49,63,112,114,
             105,110,116,102,40,34,37,42,99,34,44,52,50,45,79,47,50,44
            ,42,81,41,58,112,117,116,99,104,97,114,40,42,81,41,44,73,62
           ,79,63,73,61,48,44,79,43,61,50,44,112,117,116,115,40,34,34,41
          ,58,48,59,125,102,111,114,40,73,61,48,59,73,43,43,60,49,55,59,2
         ,112,117,116,99,104,97,114,40,52,55,41,41,59,102,111,114,40,73,61
        ,112,117,116,115,40,34,34,41,59,73,43,43,60,53,59,112,117,116,115,2
       ,40,34,34,41,41,123,112,114,105,110,116,102,40,34,37,42,99,34,44,51,2
      ,50,44,52,55,41,59,102,111,114,40,74,61,48,59,74,43,43,60,50,48,59,41,2
     ,2,112,117,2,116,99,2,2,104,2,97,2,114,2,40,52,2,55,41,2,59,125,2,2,125,2
    ,2,0},*J;for(Q=_,I=O=0;*Q;++Q){if(*Q<2)for(J=_;*J;J++)I<1&&printf("%*c",42-
   O/2-1,32),I+=printf("%d",*J),I>O?I=0,O+=2,puts(""):0,I++<1?printf("%*c",42-O/
  2,44):putchar(44),I>O?I=0,O+=2,puts(""):0;if(*Q>2)I++<1?printf("%*c",42-O/2,*Q)
 :putchar(*Q),I>O?I=0,O+=2,puts(""):0;}for(I=0;I++<17;putchar(47));for(I=puts("");
I++<5;puts("")){printf("%*c",32,47);for(J=0;J++<20;)putchar(47);}}/////////////////
                               /////////////////////
                               /////////////////////
                               /////////////////////
                               /////////////////////

Try it online.

Symbolic Closed-Form Fibonacci

2018-12-01, post № 207

Haskell, mathematics, programming, #diagonalization

Theoretical Framework

Let V:=\{(a_j)_{j\in\mathbb{N}}\subset\mathbb{C}|a_n=a_{n-1}+a_{n-2}\forall n>1\} be the two-dimensional complex vector space of sequences adhering to the Fibonacci recurrence relation with basis B:=((0,1,\dots),(1,0,\dots)).
Let furthermore f:V\to V,(a_j)_{j\in\mathbb{N}}\mapsto(a_{j+1})_{j\in\mathbb{N}} be the sequence shift endomorphism represented by the transformation matrix

A:=M^B_B(f)=\begin{pmatrix}1&1\\1&0\end{pmatrix}.

By iteratively applying the sequence shift a closed-form solution for the standard Fibonacci sequence follows.

Prime Intirety

2018-11-03, post № 206

C, mathematics, programming, #integer, #list, #primes, #representation

Since ancient times humanity knew that there are infinitely many primes — though countable, writing a complete list of every prime is impossible if one intends to finish.
However, in practice one often only considers a minute subset of the naturals to work with and think about. When writing low-level languages like C, one is nearly forced to forget about almost every natural number — the data type u_int_32, for example, is only capable of representing \{\mathbb{N}_0\ni n<2^{32}\}.
Therefore, it is possible to produce a complete list of every prime representable in thirty-two bits using standard bit pattern interpretation — the entirety of the first 𝟤𝟢𝟥 𝟤𝟪𝟢 𝟤𝟤𝟣 primes.

Generating said list took about two minutes on a 4GHz Intel Core i7 using an elementary sieve approach written in C compiled with gcc -O2.
All primes are stored in little-endian format and packed densely together, requiring four bytes each.

Using the resulting file, one can quickly index the primes, for example p_{10^7}=179\,424\,691 = \text{ab1cdb3}_{16} (using zero-based indexing). Since each prime is stored using four bytes, the prime’s index is scaled by a factor of four, resulting in its byte index.

dd status=none ibs=1 count=4 if=primes.bin skip=40000000 | xxd 
00000000: b3cd b10a                                ....

Source code: prime-intirety.c
Prime list (gzipped and split): prime-intirety_primes.bin.gz.parts

Halloween MMXVIII

2018-10-31, post № 205

art, haiku, poetry, #bat

Tiny droplet falls.
A bat’s screech echoes through the cave.
Flowstone grew again.

Conky Clock

2018-10-06, post № 204

art, ASCII, programming, Python, #ASCII art, #time

For a few months now, I have been a vivid user of the ArchLabs distribution which — in a recent release — added the system monitor Conky to display various pieces of information such as uptime, CPU usage and UTC time.

However, Conky does not statically produce a wall of text and plops it on your desktop; it periodically updates itself as to be able to display time-dependent information.
Furthermore, it allows to be fully configured through a simple ~/.config/conky/ArchLabs.conkyrc file.

I wanted to display a useful time-dependent piece of information which does not require user interaction of any kind and found it — an analogue ASCII-art clock.

conky-clock.png
Time smiley optional.

For installation, download conky-clock.py and add a ${exec python <chosen_path>/conky-clock.py} line to your conky configuration file.