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 <l518d6FmepqU1@mid.individual.net>
Deutsch   English   Français   Italiano  
<l518d6FmepqU1@mid.individual.net>

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

Path: ...!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: rbowman <bowman@montana.com>
Newsgroups: comp.os.linux.advocacy
Subject: Re: OT programming challenge: fastest/best/shortest C program to
 jumble a sentence, then restore it
Date: 8 Mar 2024 19:48:54 GMT
Lines: 90
Message-ID: <l518d6FmepqU1@mid.individual.net>
References: <65e9cad3$0$4689$882e4bbb@reader.netnews.com>
	<l4ufsbF9kdnU4@mid.individual.net> <usf2m9$1n0jh$2@dont-email.me>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Trace: individual.net A3SyFW1aeMWR7cA+eMtWEwHcj+WzFeFUfZbKjE0OfrqSa/uTQ7
Cancel-Lock: sha1:8bCwI1TOmAo/oeD8AymOlEZUBrM= sha256:AKxS/qFmOSltmeH670CDIJSid6Jo3rSL5RpKmvxO/Gw=
User-Agent: Pan/0.149 (Bellevue; 4c157ba)
Bytes: 3074

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. 

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

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.

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