Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connections
Warning: mysqli::query(): Couldn't fetch mysqli in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\index.php on line 66
Article <usgfe4$20gfq$2@dont-email.me>
Deutsch   English   Français   Italiano  
<usgfe4$20gfq$2@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.nobody.at!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail
From: DFS <nospam@dfs.com>
Newsgroups: comp.os.linux.advocacy
Subject: Re: OT programming challenge: fastest/best/shortest C program to
 jumble a sentence, then restore it
Date: Fri, 8 Mar 2024 20:53:08 -0500
Organization: A noiseless patient Spider
Lines: 280
Message-ID: <usgfe4$20gfq$2@dont-email.me>
References: <65e9cad3$0$4689$882e4bbb@reader.netnews.com>
 <l4ufsbF9kdnU4@mid.individual.net> <usf2m9$1n0jh$2@dont-email.me>
 <l518d6FmepqU1@mid.individual.net>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Sat, 9 Mar 2024 01:53:08 -0000 (UTC)
Injection-Info: dont-email.me; posting-host="bd0cd99499b1364606b6e597c9f2633e";
	logging-data="2114042"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX19UaoCoDK6Hn1dtg/+K3CKd"
User-Agent: Betterbird (Windows)
Cancel-Lock: sha1:dGItwoUfsCUbRm+thOKX51qzB44=
In-Reply-To: <l518d6FmepqU1@mid.individual.net>
Content-Language: en-US
Bytes: 9131

On 3/8/2024 2:48 PM, rbowman wrote:
> On Fri, 8 Mar 2024 08:09:33 -0500, DFS wrote:
> 
>> It's harder than you think to randomly shuffle the words in a shorter
>> sentence, so that each word ends up in a different position than it
>> started in.
>>
>> Bring it!
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> #include <time.h>
> 
> int main(int argc, char** argv)
> {
>      char* sentence = strdup("Once you try it, you'll see it doesn't need
> spice.");
>      char* tokens[20];
>      int token_count = 0;
>      int i;
>      int j;
>      int slots;
>      int candidate;
>      int* indices;
> 
>      for (tokens[token_count] = strtok(sentence, " ");
>           tokens[token_count];
>           tokens[token_count] = strtok(NULL, " "))
>      {
>          token_count++;
>      }
> 
>      indices = malloc(token_count * sizeof(int));
>      for (i=0; i<token_count; i++) {
>          indices[i] = -1;
>      }
>      srand((unsigned int) time(NULL));
>      for (i=0, slots=0; slots<token_count; i++) {
>          candidate = rand() % token_count;
>          for (j=0; j<token_count; j++) {
>              if (indices[j] == candidate) {
>                   break;
>              }
>              else if (indices[j] == -1) {
>                  indices[slots++] = candidate;
>                  break;
>              }
>          }
>      }
>      printf("\nshuffled:\n");
>      for (i=0; i<slots; i++) {
>          printf("%s ", tokens[indices[i]]);
>      }
>      printf("\noriginal: \n");
>      for (i=0; i<slots; i++) {
>          printf("%s ", tokens[i]);
>      }
>      printf("\n");
> 
>      return 0;
> }
> 
> ./shuffle
> 
> shuffled:
> doesn't you spice. try Once it, it need see you'll
> original:
> Once you try it, you'll see it doesn't need spice.
> 
> ./shuffle
> 
> shuffled:
> need it, spice. it you you'll see Once try doesn't
> original:
> Once you try it, you'll see it doesn't need spice.


------------------------------------------------------------
~$ ./shuffle
slot = 0, candidate = 1
slot = 1, candidate = 8
slot = 2, candidate = 2  (match)
slot = 3, candidate = 7
slot = 4, candidate = 9
slot = 5, candidate = 5  (match)
slot = 6, candidate = 4
slot = 7, candidate = 6
slot = 8, candidate = 0
slot = 9, candidate = 3

original: Once you try it, you'll see it doesn't need spice.
shuffled: you need try doesn't spice. see you'll it Once it,
------------------------------------------------------------


Some words weren't shuffled.  Your bank acct is now hacked.


When I was writing my version yesterday (see below), I found ~8% of the 
rands matched when the sentence was short.

Double the length of the sentence and the percent of matches falls to 
around 5%.




> Get enough monkeys running it and the shuffled sentence may be the same as
> the original.

That would = bad programming.


> For production, I'd first count the tokens and allocate the tokens array
> but I'm lazy. Further enhancements, allow the string to be entered on the
> command line, read strings from a file and write shuffled strings to a
> file, and so on.

I usually try to take command line inputs.  Makes the program easier to 
test and fun to use.


> Of course in Python you could use split and shuffle to abstract away all
> the messiness.

It amazes me how productive Python can be versus C.




my code
----------------------------------------------------------------------

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <time.h>

//usage $./prog "sentence in quotes" N-jumbles

//is dest already set in the array
int found(int dest,int rarr[], int cnt) {
	int match = 0;
	for (int j = 0; j < cnt; j++) {
		if (dest == rarr[j]) {match = 1;break;}
	}
	return match;
}

int main(int argc, char *argv[]) {

	int i = 0, j = 0, k = 0;	
	char *orig = argv[1];
	int loops = atoi(argv[2]);
	
	//count words = number of spaces + 1
	int wordcnt = 1;
	for (int i = 0; i < strlen(orig); i++) {
		if(isspace(orig[i]) && !isspace(orig[i+1])) {wordcnt++;}
	}

	//arrays to hold words and numbers
	char **words  = malloc(sizeof(char*) * wordcnt);
	char **temp   = malloc(sizeof(char*) * wordcnt);
	int randarr[wordcnt];
	for(int i = 0; i < wordcnt ; randarr[i++] = wordcnt + 1);

	//split string copy on space, add words to array
	char *copy = strdup(orig);
	const char delimiter[] = " ";
     char *token = strtok(copy, delimiter);
     while (token != NULL) {
         words[i++] = token;
		token = strtok(NULL, delimiter);
========== REMAINDER OF ARTICLE TRUNCATED ==========