Re^2: Odometer pattern iterator (in C).
by hdb (Monsignor) on May 29, 2015 at 09:12 UTC
|
| [reply] |
|
| [reply] [d/l] |
Re^2: Odometer pattern iterator (in C).
by salva (Canon) on May 29, 2015 at 09:48 UTC
|
| [reply] |
|
| [reply] |
Re^2: Odometer pattern iterator (in C).
by BrowserUk (Patriarch) on May 29, 2015 at 11:58 UTC
|
As cute as that is (and it is damn cute!), calling back into Perl and then invoking the regex engine won't make for a performant solution.
Also, as I've highlighted in my update above, I want the positions of the set bits, not the bit patterns themselves.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
| [reply] |
|
Translating that regex into C is trivial: (1) Find rightmost occurence of substring '01' (we are done if there is none), (2) change '01' to '10', (3) reverse the string to the right of that.
Finding the indices of the '1's is also simple.
| [reply] |
|
| [reply] |
|
|
|
|
// inc_c - http://perlmonks.org/?node_id=1128230
#include <stdlib.h>
#include <stdio.h>
#define M 5 // place
#define N 3 // number of elements wanted
static int place[N];
int
step(void)
{
for(int i = 0; i < N; i++)
{
if(i < N - 1 ? place[i] < place[i + 1] - 1 : place[i] < M - 1 )
{
place[i]++;
for(int j = i - 1; j >= 0; j--) place[j] -= place[0];
return 1;
}
}
return 0;
}
int
main(int argc, char **argv)
{
int i;
int more = 1;
for(i = 0; i < N; i++) place[i] = i;
while(more)
{
for(i = 0; i < N; i++) printf(" %d", place[i]);
putchar('\n');
more = step();
}
exit(0);
}
| [reply] [d/l] |
|
[17:27:38.79] C:\test\humanGenome>junk 32 16
^C
[17:41:10.28] C:\test\humanGenome>junk 32 16
Iters:601080390
[17:41:17.49] C:\test\humanGenome>junk2 32 16
^C
[17:41:40.82] C:\test\humanGenome>junk2 32 16
Iters:601080390
[17:41:52.30] C:\test\humanGenome>
junk2 is your code adapted to count rather than print.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
| [reply] [d/l] |
|
|
|