Minor.
This commit is contained in:
		
							parent
							
								
									286588366a
								
							
						
					
					
						commit
						071b3aa821
					
				| @ -21,11 +21,11 @@ word whose length does not exceed 8 characters, although it is a bit slow. | |||||||
| But why not more than 8 characters? My view of memory might have been a bit | But why not more than 8 characters? My view of memory might have been a bit | ||||||
| naive back then, because the first step in my algorithm is to generate and | naive back then, because the first step in my algorithm is to generate and | ||||||
| store all permutations of all subsequences of the given word. That is, if the | store all permutations of all subsequences of the given word. That is, if the | ||||||
| string is "me", my program stores the array `{ "m", "e", "me", "em" }` in | string is "me", my program stores the array ={ "m", "e", "me", "em" }= in | ||||||
| memory before going on to reading the dictionary and looking for matches. | memory before going on to reading the dictionary and looking for matches. | ||||||
| 
 | 
 | ||||||
| If the string is "you", the program stores `{ "y", "o", "yo", "oy", "u", "yu", | If the string is "you", the program stores ={ "y", "o", "yo", "oy", "u", "yu", | ||||||
| "uy", "ou", "uo", "you", "yuo", "oyu", "ouy", "uyo", "uoy" }`. | "uy", "ou", "uo", "you", "yuo", "oyu", "ouy", "uyo", "uoy" }=. | ||||||
| 
 | 
 | ||||||
| If the string is "computer", the program stores the 109600 permutations of the | If the string is "computer", the program stores the 109600 permutations of the | ||||||
| subsequences of "computer". | subsequences of "computer". | ||||||
| @ -51,11 +51,11 @@ Note that this code doesn't actually compile, because of all the wrong | |||||||
| code. However, it did compile back in 2008 which means that either I added the | code. However, it did compile back in 2008 which means that either I added the | ||||||
| wrong code after I had compiled it, or I used an overfriendly compiler (I don't | wrong code after I had compiled it, or I used an overfriendly compiler (I don't | ||||||
| remember which compiler it was, but it ran on Windows). I have run the old | remember which compiler it was, but it ran on Windows). I have run the old | ||||||
| executable with `wine`, and that works. | executable with ~wine~, and that works. | ||||||
| 
 | 
 | ||||||
| It's not necesarry to know C to laugh at this code, but it helps. | It's not necesarry to know C to laugh at this code, but it helps. | ||||||
| 
 | 
 | ||||||
| We'll start with some basic `#include`s. | We'll start with some basic ~#include~s. | ||||||
| 
 | 
 | ||||||
| #+BEGIN_SRC c | #+BEGIN_SRC c | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| @ -74,9 +74,9 @@ char os[0],s[0],r[0],t[0]; | |||||||
| int l,c,rc,k,sk,i,ii,iii,ri; | int l,c,rc,k,sk,i,ii,iii,ri; | ||||||
| #+END_SRC | #+END_SRC | ||||||
| 
 | 
 | ||||||
| The next step is to define our own version of C's builtin `strstr` function | The next step is to define our own version of C's builtin ~strstr~ function | ||||||
| (almost). I was used to PHP, so I wanted the same return values as PHP's | (almost). I was used to PHP, so I wanted the same return values as PHP's | ||||||
| `strpos`. | ~strpos~. | ||||||
| 
 | 
 | ||||||
| #+BEGIN_SRC c | #+BEGIN_SRC c | ||||||
| int strpos (const char *haystack, const char *needle) { | int strpos (const char *haystack, const char *needle) { | ||||||
| @ -116,9 +116,9 @@ int main(int argc, char *argv[]) | |||||||
|  } |  } | ||||||
| #+END_SRC | #+END_SRC | ||||||
| 
 | 
 | ||||||
| Wait, what? We use `strcpy` to copy the string `argv[1]`, which contains the | Wait, what? We use ~strcpy~ to copy the string ~argv[1]~, which contains the | ||||||
| word we want to permute, into the statically allocated `os` with length 0? Or we | word we want to permute, into the statically allocated ~os~ with length 0? Or we | ||||||
| read a line from standard in and save in `os`? And almost the same for `s`? | read a line from standard in and save in ~os~? And almost the same for ~s~? | ||||||
| That's... not good. | That's... not good. | ||||||
| 
 | 
 | ||||||
| At least these two lines aren't that bad. | At least these two lines aren't that bad. | ||||||
| @ -148,7 +148,7 @@ dynamically-generated ints as lengths? | |||||||
|  char ra[rc][l+1]; |  char ra[rc][l+1]; | ||||||
| #+END_SRC | #+END_SRC | ||||||
| 
 | 
 | ||||||
| And then some more assignments and `while` loops... | And then some more assignments and ~while~ loops... | ||||||
| 
 | 
 | ||||||
| #+BEGIN_SRC c | #+BEGIN_SRC c | ||||||
|  ri=0; |  ri=0; | ||||||
| @ -165,7 +165,7 @@ This formula does something. I'm not sure what. | |||||||
|  ca[ii]=floor(i/pow(l,l-ii-1))-floor(i/pow(l,l-ii))*l; |  ca[ii]=floor(i/pow(l,l-ii-1))-floor(i/pow(l,l-ii))*l; | ||||||
| #+END_SRC | #+END_SRC | ||||||
| 
 | 
 | ||||||
| More `while` loops, now also with `if` statements. | More ~while~ loops, now also with ~if~ statements. | ||||||
| 
 | 
 | ||||||
| #+BEGIN_SRC c | #+BEGIN_SRC c | ||||||
|  iii=0; |  iii=0; | ||||||
| @ -182,8 +182,8 @@ More `while` loops, now also with `if` statements. | |||||||
|  strncpy(t,s+ca[ii],1); |  strncpy(t,s+ca[ii],1); | ||||||
| #+END_SRC | #+END_SRC | ||||||
| 
 | 
 | ||||||
| Let's concatenate `t` onto `ra[ri]`, a string which hardly exists due to the | Let's concatenate ~t~ onto ~ra[ri]~, a string which hardly exists due to the | ||||||
| `char ra[rc][l+1];` magic above. | ~char ra[rc][l+1];~ magic above. | ||||||
| 
 | 
 | ||||||
| #+BEGIN_SRC c | #+BEGIN_SRC c | ||||||
|  strcat(ra[ri],t); |  strcat(ra[ri],t); | ||||||
| @ -192,7 +192,7 @@ Let's concatenate `t` onto `ra[ri]`, a string which hardly exists due to the | |||||||
| #+END_SRC | #+END_SRC | ||||||
| 
 | 
 | ||||||
| And why not concatenate an end-of-string mark onto a string which, if it | And why not concatenate an end-of-string mark onto a string which, if it | ||||||
| doesn't have an end-of-string mark, will make `strcat` fail miserably? | doesn't have an end-of-string mark, will make ~strcat~ fail miserably? | ||||||
| 
 | 
 | ||||||
| #+BEGIN_SRC c | #+BEGIN_SRC c | ||||||
|  strcat(ra[ri],"\0"); |  strcat(ra[ri],"\0"); | ||||||
| @ -217,7 +217,7 @@ And then more junk. | |||||||
|  //printf("\nOrd: %s\nOrdl\x91ngde: %d\nOrdkombinationer: %d\n",os,l,ri); |  //printf("\nOrd: %s\nOrdl\x91ngde: %d\nOrdkombinationer: %d\n",os,l,ri); | ||||||
| #+END_SRC | #+END_SRC | ||||||
| 
 | 
 | ||||||
| Phew... At this point, I'm certain that `ra` is supposed to be an array of all | Phew... At this point, I'm certain that ~ra~ is supposed to be an array of all | ||||||
| word permutations. So let's open our dictionary "ord.txt" and look for matches. | word permutations. So let's open our dictionary "ord.txt" and look for matches. | ||||||
| 
 | 
 | ||||||
| #+BEGIN_SRC c | #+BEGIN_SRC c | ||||||
| @ -250,7 +250,7 @@ end-of-string mark. | |||||||
|  while (ii<ri && k==0) { |  while (ii<ri && k==0) { | ||||||
| #+END_SRC | #+END_SRC | ||||||
| 
 | 
 | ||||||
| The magical core of the matching logic, using our own `strpos`: | The magical core of the matching logic, using our own ~strpos~: | ||||||
| 
 | 
 | ||||||
| #+BEGIN_SRC c | #+BEGIN_SRC c | ||||||
|  if (strpos(ra[ii],wrd)>-1) {k=1;} |  if (strpos(ra[ii],wrd)>-1) {k=1;} | ||||||
| @ -357,9 +357,9 @@ fun nPermutations len = foldl op+ 0 (map (fn n => factorial n * binomc len n) | |||||||
|                                          (upTo 1 len)) |                                          (upTo 1 len)) | ||||||
| 
 | 
 | ||||||
| (* Gives the size in bytes for storing all word subsequence permutations for a | (* Gives the size in bytes for storing all word subsequence permutations for a | ||||||
|  * given word length in a space-saving way: there are `len` arrays, each taking |  * given word length in a space-saving way: there are ~len~ arrays, each taking | ||||||
|  * up space for the pointer to the array and the permutations of subsequences of |  * up space for the pointer to the array and the permutations of subsequences of | ||||||
|  * length n where `1 <= n <= len` and n is unique. |  * length n where ~1 <= n <= len~ and n is unique. | ||||||
|  *) |  *) | ||||||
| fun nSize len = 8 * len + foldl op+ 0 ( | fun nSize len = 8 * len + foldl op+ 0 ( | ||||||
|                 map (fn n => (n + 1) * factorial n * binomc len n) |                 map (fn n => (n + 1) * factorial n * binomc len n) | ||||||
|  | |||||||
| @ -4,6 +4,8 @@ | |||||||
| #+startup: showall | #+startup: showall | ||||||
| #&toc | #&toc | ||||||
| 
 | 
 | ||||||
|  | * Sound Programming | ||||||
|  | 
 | ||||||
| Much can be programmed, and that includes sound. In the digital world, sound is | Much can be programmed, and that includes sound. In the digital world, sound is | ||||||
| typically represented by sequences of about 90 kB per second, so "printing" | typically represented by sequences of about 90 kB per second, so "printing" | ||||||
| sound is merely a matter of printing bytes. As such, any general purpose | sound is merely a matter of printing bytes. As such, any general purpose | ||||||
|  | |||||||
| @ -3,9 +3,12 @@ | |||||||
| How I've set up StumpWM on Trisquel | How I've set up StumpWM on Trisquel | ||||||
| #& | #& | ||||||
| #+license: wtfpl | #+license: wtfpl | ||||||
|  | #+startup: showall | ||||||
| 
 | 
 | ||||||
| * My StumpWM setup | * My StumpWM setup | ||||||
| 
 | 
 | ||||||
|  | GNOME | ||||||
|  | 
 | ||||||
| I use StumpWM instead of e.g. Gnome. StumpWM is a tiling window manager, which | I use StumpWM instead of e.g. Gnome. StumpWM is a tiling window manager, which | ||||||
| means that it's a good window manager. | means that it's a good window manager. | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user