lundi 9 novembre 2020

While loop hangs during higher output

this is my first First post!

I run a jazz band that has a music book of over 500 tunes. Every gig I create a setlist of about 30 tunes of varying genres. I'm attempting to make a program that creates a randomized setlist for me so that I don't have to spend an hour doing it myself.

Explanation of code:

  1. Each tune is an object with a number, title, and genre. These objects are in an array called "master".
  2. I filter out each tune into three separate arrays of genres: swings, latins, and bossas.
  3. function containsObject(): outputs false if object exists in list and true if object does not exist. This is used to check if a tune already exists in the setlist im creating.
  4. swing_func(), latin_func(), and bossa_func() are all the same, and randomly splice tunes from the various genre arrays into the final setlist array. These are all called at the end in make_setlist().

The final setlist cannot have repeating tunes, or repeating genres. The preferred order is swing, latin, bossa, swing, latin, bossa, etc.

Output: 30 (or another number) randomized tunes in swing, latin, bossa order. No tune is repeated.

Problems: So far this code works if I keep the setlist length below 50.

  1. Is there a better way to write swing_func(), latin_func(), and bossa_func()? It took me forever to figure this part out.
  2. If I make the setlist length too high, the code hangs...

SETLIST LENGTH CODE:

function make_setlist(){
    while (setlist.length < 30) { //if length is too high, it hangs
        swing_func();
        latin_func();
        bossa_func();
    }
}

FULL CODE:

var master = [
    {Number: 0, Title: "Amor", Genre: "latin"},
    {Number: 1, Title: "All", Genre: "bossa"},
    {Number: 2, Title: "Alomony", Genre: "swing"},
    {Number: 3, Title: "Arrow", Genre: "latin"},
    {Number: 4, Title: "Ba", Genre: "latin"},
    {Number: 5, Title: "Bale", Genre: "swing"},
    {Number: 6, Title: "Bonno", Genre: "bossa"},
    {Number: 7, Title: "Bell", Genre: "bossa"},
    {Number: 8, Title: "Call", Genre: "bossa"},
    {Number: 9, Title: "Cow", Genre: "swing"},
    {Number: 10, Title: "Start With This", Genre: "swing"},
    {Number: 11, Title: "Conn", Genre: "latin"},
    {Number: 12, Title: "Ja", Genre: "latin"},
    {Number: 13, Title: "jule", Genre: "bossa"},
    {Number: 14, Title: "ren", Genre: "swing"},
    {Number: 15, Title: "Argh", Genre: "latin"},
    {Number: 16, Title: "wam", Genre: "latin"},
    {Number: 17, Title: "wham", Genre: "swing"},
    {Number: 18, Title: "good", Genre: "bossa"},
    {Number: 19, Title: "create", Genre: "bossa"},
    {Number: 20, Title: "Celllary", Genre: "bossa"},
    {Number: 21, Title: "pig", Genre: "swing"},
    {Number: 22, Title: "Second set start", Genre: "swing"},
    {Number: 23, Title: "lawn", Genre: "latin"},
    {Number: 24, Title: "a", Genre: "latin"},
    {Number: 25, Title: "b", Genre: "bossa"},
    {Number: 26, Title: "c", Genre: "swing"},
    {Number: 27, Title: "d", Genre: "latin"},
    {Number: 28, Title: "e", Genre: "latin"},
    {Number: 29, Title: "f", Genre: "swing"},
    {Number: 30, Title: "g", Genre: "bossa"},
    {Number: 31, Title: "h", Genre: "bossa"},
    {Number: 32, Title: "i", Genre: "bossa"},
    {Number: 33, Title: "j", Genre: "swing"},
    {Number: 34, Title: "k", Genre: "swing"},
    {Number: 35, Title: "l", Genre: "latin"},
    {Number: 36, Title: "m", Genre: "latin"},
    {Number: 37, Title: "n", Genre: "bossa"},
    {Number: 38, Title: "o", Genre: "swing"},
    {Number: 39, Title: "p", Genre: "latin"},
    {Number: 40, Title: "q", Genre: "latin"},
    {Number: 41, Title: "r", Genre: "swing"},
    {Number: 42, Title: "s", Genre: "bossa"},
    {Number: 43, Title: "t", Genre: "bossa"},
    {Number: 44, Title: "u", Genre: "bossa"},
    {Number: 45, Title: "v", Genre: "swing"},
    {Number: 46, Title: "w", Genre: "swing"},
    {Number: 47, Title: "x", Genre: "bossa"},
    {Number: 48, Title: "y", Genre: "swing"},
    {Number: 49, Title: "z", Genre: "latin"},
    {Number: 50, Title: "zacs tune", Genre: "latin"}
];

//...................Variables......................................
var setlist = [];
var swings = master.filter(tune => tune.Genre === "swing");
var latins = master.filter(tune => tune.Genre === "latin");
var bossas = master.filter(tune => tune.Genre === "bossa");
var r;
var temparr = [];

//..........................................................................
//This function works: outputs false if object exists in list and true if object does not exist 
function containsObject(obj, list) {
  var i;
  for (i = 0; i < list.length; i++) {
        console.log(list[i]);
    if (list[i] === obj) {
            // console.log("object exists within list");
      return false;
    }
  }
    // console.log("object does not exist within list");
  return true;
}

//...................SWING FUNC.....................................
function swing_func(){
    r = Math.floor(Math.random() * swings.length);
    while(temparr.length === 0){
        if(containsObject(swings[r], temparr) === true){
            temparr = swings.splice(r, 1);
        } else {
            r = Math.floor(Math.random() * swings.length);
        }
    }
    setlist.push(temparr.splice(0, 1));
}

//...................LATIN FUNC.....................................
function latin_func(){
    r = Math.floor(Math.random() * latins.length);
    while(temparr.length === 0){
        if(containsObject(latins[r], temparr) === true){
            temparr = latins.splice(r, 1);
        } else {
            r = Math.floor(Math.random() * latins.length);
        }
    }
    setlist.push(temparr.splice(0, 1));
}

//...................BOSSA FUNC.....................................
function bossa_func(){
    r = Math.floor(Math.random() * bossas.length);
    while(temparr.length === 0){
        if(containsObject(bossas[r], temparr) === true){
            temparr = bossas.splice(r, 1);
        } else {
            r = Math.floor(Math.random() * bossas.length);
        }
    }
    setlist.push(temparr.splice(0, 1));
}

//...................make_setlist FUNC..............................
function make_setlist(){
    while (setlist.length < 30) { //if length is too high, it hangs
        swing_func();
        latin_func();
        bossa_func();
    }
}

//...........................call functions.....................................
make_setlist();
console.log(setlist);

Aucun commentaire:

Enregistrer un commentaire