21 Replies Latest reply on Sep 12, 2012 12:18 AM by Trevorׅ

    Sort algorithm: how can I sort two arrays according to one

    frameexpert Level 4

      I have two parallel arrays, similar to this:

       

      var array1 = [4, 3, 1, 5, 2];

      var array2 = ["four", "three", "one", "five", "two"];

       

      I want to sort the first array, and have the second array follow the same sort as the first. Any advice for a good algorithm would be appreciated.

       

      Rick Quatro

        • 1. Re: Sort algorithm: how can I sort two arrays according to one
          bduffy323

          give this a try!

           

          var array1 = [4, 3, 1, 5, 2];
          var array2 = ["four", "three", "one", "five", "two"];
          
          
          bubbleSort(array1,array2);
          
          function bubbleSort(a,b)
          {
              var swapped;
              do {
                  swapped = false;
                  for (var i=0; i < a.length-1; i++) {
                      if (a[i] > a[i+1]) 
                      {
                          var temp = a[i];
                          a[i] = a[i+1];
                          a[i+1] = temp;
          
          
          
          
                          var temp = b[i];
                          b[i] = b[i+1];
                          b[i+1] = temp;
                          swapped = true;
                      }
                  }
              } while (swapped);
          }
          
          alert(array1);
          alert(array2);
          
          
          • 2. Re: Sort algorithm: how can I sort two arrays according to one
            [Jongware] Most Valuable Participant

            Give this a try!

             

            var array1 = [4, 3, 1, 5, 2];
            var array2 = ["four", "three", "one", "five", "two"];
            
            var array3 = [];
            for (i=0; i<Math.min(array1.length, array2.length); i++)
            array3[i] = [ array1[i], array2[i] ];
            array3.sort (function(a,b) { return a[0] - b[0]; });
            alert (array3.join('\r'));
            
            • 3. Re: Sort algorithm: how can I sort two arrays according to one
              Harbs. Level 6

              I would do it similar to Jongware's approach, but I'd probably make an array of objects instead of a two dimentional array.

              • 4. Re: Sort algorithm: how can I sort two arrays according to one
                [Jongware] Most Valuable Participant

                .. I wonder why this does not work .. Perhaps my logic is flawed?

                 

                var array1 = [4, 3, 1, 5, 2];
                var array2 = ["four", "three", "one", "five", "two"];
                var array3 = [];
                for (i=0; i<Math.min(array1.length, array2.length); i++)
                array3[i] = [ i ];
                array3.sort (function(a,b) {
                var swap, diff = array1[a] - array1[b];
                if (diff < 0)
                {
                  swap = array1[a];
                  array1[a] = array1[b];
                  array1[b] = swap;
                  swap = array2[a];
                  array2[a] = array2[b];
                  array2[b] = swap;
                }
                return diff;
                });
                alert (array1.join(' ')+'\r'+array2.join(' '));
                
                • 5. Re: Sort algorithm: how can I sort two arrays according to one
                  KuddRoww Level 1

                  I had a similar issue earlier this week. I found this invaluable.

                   

                  http://jsfiddle.net/7rygA/

                  • 6. Re: Sort algorithm: how can I sort two arrays according to one
                    KuddRoww Level 1

                    var arr1 = ["9","3","4"];

                    var arr2 = ["nine","smile","clown"];

                    var arr = [];

                     

                    function contentsIntoObjects(){

                    for(var i = 0; i<contents.length; i++){

                        arr.push({

                            arr1: arr1[i],

                            arr2: arr2[i],

                            });

                        };

                    }; //contentsIntoObjects

                     

                    contentsIntoObjects();

                    arr.sort(function(a, b){return a.arr1 - b.arr1});

                    1 person found this helpful
                    • 7. Re: Sort algorithm: how can I sort two arrays according to one
                      frameexpert Level 4

                      Thanks for the excellent help. I like this one because it is pretty simple, and it is convenient to store an array of objects.

                       

                      var docs = [];

                      docs.push({number:4,name:"four"});

                      docs.push({number:3,name:"three"});

                      docs.push({number:1,name:"one"});

                      docs.push({number:5,name:"five"});

                      docs.push({number:2,name:"two"});

                       

                      alert (docs[0].name);

                       

                      docs.sort(function(a, b) { return a.number - b.number; });

                       

                      alert (docs[0].name);

                       

                      One the other had, two arrays are convenient because I need one to populate a dropdownlist. So I might use bduffy's bubble sort.

                       

                      BTW, here is what I am doing. I need to collect a list of open documents for use in a script. I am storing the file names without the path on one array and the document objects in another parallel array. I want to sort the file names and display them in a dropdownlist. When the user picks out a file name from the dropdownlist, I want to get the corresponding document object from the other array.

                       

                      Thanks again for the generous help.

                       

                      Rick

                      • 8. Re: Sort algorithm: how can I sort two arrays according to one
                        frameexpert Level 4

                        Since arrays get passed to functions by reference in JavaScript, this one works well as a general function for sorting parallel arrays. It preserves both arrays.

                         

                        var numbers = [4, 3, 1, 5, 2];

                        var names = ["four", "three", "one", "five", "two"];

                         

                        alert (numbers);

                        alert (names);

                         

                        parallelArraySort (numbers, names);

                         

                        alert (numbers);

                        alert (names);

                         

                        function parallelArraySort (a1, a2) {

                           

                            // Make a temporary array of objects and populate it from the two arrays.

                            var arr = [];

                            for (var i = 0; i < a1.length; i += 1) {

                                arr.push ({first: a1[i], second: a2[i]});

                            }

                         

                            // Sort the object based on the first array.

                            arr.sort (function (a, b) { return a.first - b.first; });

                         

                            // Update both arrays, based on the new sort.

                            for (var i = 0; i < arr.length; i += 1) {

                                a1[i] = arr[i].first;

                                a2[i] = arr[i].second;

                            }

                        }

                        • 9. Re: Sort algorithm: how can I sort two arrays according to one
                          Marc Autret Level 4

                          My two cents on this thread.

                           

                          1) In the case where array1 is a 1..N permutation of indices that match array2's elements—as in your original example—there would be no need to sort data at all. Why not just reverse the permutation given in the array:

                           

                          var array1 = [4, 3, 1, 5, 2];
                          var array2 = ["four", "three", "one", "five", "two"];
                          
                          (function(/*uint[]&*/a1,/*str[]&*/a2, i, a)
                          {
                              a = [];
                          
                              i = a1.length;
                              while( i-- )
                                  {
                                  a[a1[i]-1] = a2[i];
                                  a1[i] = 1 + i;
                                  }
                          
                              i = a.length;
                              while( i-- )
                                  {
                                  a2[i] = a[i];
                                  }
                          
                              a.length = 0;
                          })(array1,array2);
                          
                          alert( array1 + '\r' + array2 );
                          

                           

                           

                          2) Now let's consider your goal: “I am storing the file names without the path on one array and the document objects in another parallel array. I want to sort the file names and display them in a dropdownlist.”

                           

                          What you may have missed is that you can append key-value pairs to an array with no side effect on the Array.sort() mechanism. So you can handle all your data from a single array, which basically contains the sorted strings, then additional information that allows you e.g. to link any string element, as a key, to an index, an ID, or anything else. Here is a possible structure:

                           

                          var arr = ['abc', 'def', 'ghi'];

                          arr['_abc'] = 1;

                          arr['_def'] = 2;

                          arr['_ghi'] = 3;

                           

                          (I suggest to always make a key starts with '_' to prevent the 'reflect' property error.)

                          (Also, note that this approach assumes that each string in arr is unique.)

                           

                          An interesting fact is that you can supply such 'enhanced' array to a ScriptUI list control. The control will display the strings in their sort order (if sorted), but, as an Object, arr still contains the additional data.

                           

                          In your example, it doesn't look as you really need to sort two sets of elements. You just want to display the document names sorted AND to keep a 1-to-1 relationship between a name and an index (or any other property that give access to the related document). Therefore, you probably could use the array app.documents.everyItem().properties as a good starting point, then refine that array to make it work as intended. Here is a very simple illustration of this approach:

                           

                          var a = app.documents.everyItem().properties,
                              i = a.length,
                              o, s;
                          
                          while( i-- )
                              {
                              s = (o = a[i]).name.replace(/\.indd$/,'');
                              a[i] = s;
                              a['_'+s] = o.index; // additional info
                              }
                          
                          a.sort( function(x,y){return y.toLowerCase() < x.toLowerCase();} );
                          
                          
                          // Simple dialog
                          // ---
                          
                          var u,
                              w = new Window('dialog', "Rich Array Test"),
                              dl = w.add('panel', u, "Available Documents").add('dropdownlist', u, a);
                          
                          w.add('button', u, '', {name:'OK'}).characters = 20;
                          
                          with( dl )
                              {
                              minimumSize = [180,1];
                              parent.margins = 20;
                              selection = 0;
                              }
                          
                          (dl.onChange = function()
                          {
                              w.OK.text = "Index: " + a['_'+dl.selection.text];
                          })();
                          
                          if( 1==w.show() && s=dl.selection.text )
                              {
                              try{ app.activeDocument = app.documents[a['_'+s]]; }
                              catch(_){}
                              }
                          

                           

                          Does it make sense?

                           

                          @+

                          Marc

                          1 person found this helpful
                          • 10. Re: Sort algorithm: how can I sort two arrays according to one
                            frameexpert Level 4

                            No, it doesn't make sense :-). But let me spend some time digesting what you are doing. One other point: This is a script for FrameMaker, not InDesign, so I can't use this:

                             

                            app.documents.everyItem().properties

                             

                            because FrameMaker doesn't support this. But I don't think this matters with the overall technique. I posted this to the InDesign Scripting forum because it gets more action, and ExtendScript scripting is relatively new in FrameMaker. Thank you very much for the details.

                             

                            Rick

                            • 11. Re: Sort algorithm: how can I sort two arrays according to one
                              frameexpert Level 4

                              Hi Marc,

                               

                              What you may have missed is that you can append key-value pairs to an array with no side effect on the Array.sort() mechanism. So you can handle all your data from a single array, which basically contains the sorted strings, then additional information that allows you e.g. to link any string element, as a key, to an index, an ID, or anything else. Here is a possible structure:

                               

                              var arr = ['abc', 'def', 'ghi'];

                              arr['_abc'] = 1;

                              arr['_def'] = 2;

                              arr['_ghi'] = 3;

                               

                              Yes, now that I have experimented with this, it does make sense. Since an Array is an Object, it is possible to add these custom "properties" to the array, while preserving the array contents. This is a great solution, because, as you said, I can use the array directly in my dropdownlist.

                               

                              I am using a function to build the array and to add each document object as the custom property. A couple of notes: 1) After I sort the document names, I am adding the active document to the front of the array, with the name "Current". 2) You can see that FrameMaker's object model is quite a bit different than InDesign's. While InDesign uses lots of collections, FrameMaker uses linked lists for many of its objects. This is probably a result of its age (late 80s) and its Unix roots.

                               

                              function getOpenDocData () {

                               

                                  var docData = [];

                                  var file, i = 0;

                               

                                  var doc = app.FirstOpenDoc;

                                  while (doc.ObjectValid()) {

                                      // Make sure the document is visible.

                                      if ((doc.id !== app.ActiveDoc.id) && (doc.IsOnScreen === 1)  && (doc.Name !== "")) {

                                          file = File (doc.Name);

                                          docData[docData.length] = file.name;

                                          // Add the document object as a property of the array.

                                          docData["_"+file.name] = doc;

                                      }

                                      doc = doc.NextOpenDocInSession;

                                  }

                                  docData.sort( function(x, y) { return y < x; } );

                               

                                  // Add the active document to the front of the list.

                                  if (app.ActiveDoc.ObjectValid()) {

                                      docData.unshift ("Current");

                                      docData["_Current"] = app.ActiveDoc;

                                  }

                                  return docData;

                              }

                               

                              Thanks for your detailed and generous help.

                               

                              Rick

                              • 12. Re: Sort algorithm: how can I sort two arrays according to one
                                bduffy323 Level 1

                                For a second there, I thought I was going to get my first correct answer! Then all the big guns came in with much better solutions! Heres a nod to all the forum experts out there! You guys keep typing and we'll keep learning

                                • 13. Re: Sort algorithm: how can I sort two arrays according to one
                                  frameexpert Level 4

                                  Technically, there was no correct answer because the problem could be solved in multiple ways, so I marked a bunch of them, including yours, as Helpful. I appreciate all of the feedback because it helped me to understand JavaScript a little bit more.

                                   

                                  Rick

                                  • 14. Re: Sort algorithm: how can I sort two arrays according to one
                                    Trevorׅ Adobe Community Professional

                                    Hi Rick,

                                     

                                     

                                    frameexpert wrote:

                                     

                                    Technically, there was no correct answer because the problem could be solved in multiple ways,

                                    I don't think you're right about not marking the question as correct just because there are multiple ways of solving it.

                                    People search the forums for solutions and threads that are not marked as correct are somewhat relegated.

                                    It wouldn't hurt to make bduffy232's day or even mark your own solution as correct which is more the less the same as the one on the link from KuddRoww and more the less the way I would have done it but see the difference in the results in the table at the bottom of this post.

                                     

                                    I actually think that technically there can be multiple correct answers even though you can only  one can be marked.

                                     

                                    One other small point if you use the advance editor on the forum you can have you code formatted makes it much easier to read.

                                     

                                    Anyway here's my half pence worth on the scripting front.

                                     

                                    Your question was how to sort one array according to another, which I understand to mean that you want the originals arrays reordered

                                    Yours and bduffy232's scripts do that properly the others don't. Jongware's first script is easy to fix up this problem by adding to the end of his script.

                                     

                                    for (i = 0; i<Math.min(array1.length, array2.length); i++)
                                    {
                                    array1[i] = array3[i][0];
                                    array2[i] = array3[i][1];
                                    }
                                    alert(array1+"\r"+array2)
                                    

                                     

                                     

                                     

                                    Now in order of appearance

                                     

                                    Jongware said:

                                     

                                    .. I wonder why this does not work .. Perhaps my logic is flawed?

                                     

                                     

                                    Hi Jongware

                                     

                                    I tried your  (2nd) script twice and on both occurrences it crashed my ESTK

                                    From what I  understand (not said with much confidence) the flaw in your logic is you are passing your arrays values to be sorted array1[?] and array2[?+1] to the sort function as 'a' and 'b' but and then refer to the array array1[a].

                                     

                                    So let's examine a bit of the code

                                    var array1 = [4, 3, 1, 5, 2];

                                    array3.sort (function(a,b) {

                                    var swap, diff = array1[a] - array1[b];

                                     

                                    When run this is the equivalent of saying (for the first run of the sort loop)

                                    diff = array1[4] - array1[3]

                                    i.e.     diff = 2 - 5

                                    i.e.     diff = -3

                                     

                                    What you wanted to do was

                                    diff = a - b

                                            = 4 -3

                                     

                                    That's the way I see it.

                                     

                                    Hi Marc

                                     

                                    Change the first two lines of your first script to:

                                    var array1 = [40, 7, 1, 5, 2];
                                     var array2 = ["forty", "seven", "one", "five", "two"];
                                    


                                    Then run the script

                                     

                                    Now for my offering.

                                    The fancy script

                                    This script is not limited to a specific number of arrays.

                                    after creating the arrays one creates an array of the arrays, specifies the number of the array that one wants to sort by and calls the function.

                                    like this:

                                    sortArraysInSync([a1,a2,a3,a4,a5], 1);
                                    

                                    The arrays a1, a2, a3, ..... will get sorted according to the numeric or alphabetical order of the array specified in the 2nd parameter.

                                    One could easily (I think) change the sort function to first sort by array x and then by array y etc.

                                     

                                    // Advanced Sort Variable Numbers of  Arrays in Sync Script by Trevor
                                    // http://forums.adobe.com/thread/1062126?tstart=0
                                    
                                    
                                    var   a1 = [2, 5, 10, 7, 100, 5, .5, 0]
                                            a2 = ['two', 'five', 'ten', 'seven', 'one hundred', 'five', 'one half', 'zero'],
                                            a3 = [ 'deux', 'cinq', 'dix', 'sept', 'cent', 'cinq', 'un demi', 'zéro' ],
                                            a4 = [ 'twee', 'vijf', 'tien', 'zeven', 'honderd', 'vijf', 'helft', 'nul' ],
                                            a5 = [ 'tsvey ', 'finef', 'tzien', 'zibn', 'eyn honderd', 'finef', 'eyn halb', 'nul' ];
                                    
                                    
                                    alert("\tIndividual Arrays Before Sort\r"+a1+"\r"+a2+"\r"+a3+"\r"+a4+"\r"+a5); 
                                    
                                    sortArraysInSync([a1,a2,a3,a4,a5], 1);
                                    
                                    alert("\tIndividual Arrays After Sort\r"+a1+"\r"+a2+"\r"+a3+"\r"+a4+"\r"+a5);
                                    
                                    
                                    function sortArraysInSync (myArrays, s /* number or the array to sort by (starting from 1) */)
                                    {
                                        arr = []; var l1 = ll1 = myArrays[0].length, i = ll2 = myArrays.length;
                                        s--;
                                        while(l1--)
                                            {
                                                arr[l1]={}            
                                                i = myArrays.length;
                                                while(i--) eval("arr["+l1+"].key"+i+" = myArrays[i][l1]");
                                             }
                                    
                                        arr.sort(mySort);
                                        while (ll1--) for (i=0; i<myArrays.length;i++) eval ("myArrays[i][ll1] = arr[ll1].key"+i);
                                    
                                    
                                        alert("\tFunction Array After Sort\r"+myArrays.join("\r"))
                                    
                                    
                                    function mySort(a, b)
                                        {
                                            if (eval("isNumber(a.key"+s+") || isNumber(b.key"+s+")")) return eval("a.key"+s+"- b.key"+s+"");
                                            else if (eval("a.key"+s+".toLowerCase() > b.key"+s+".toLowerCase()")) return 1 else return -1;
                                        }
                                    }
                                    
                                    
                                    function isNumber(n) {return !isNaN(parseFloat(n)) && isFinite(n)}; // isNumber function from http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric/1830844#1830844
                                    
                                    
                                    

                                     

                                    For the simple 2 array sort I would have done as I said much the same as your one:

                                     

                                    // Simple Sort Arrays in Sync Script by Trevor
                                    // http://forums.adobe.com/thread/1062126?tstart=0
                                    
                                    
                                    var   a1 = ['two', 'five', 'ten', 'seven', 'one hundred', 'five', 'one half', 'zero'],
                                            a2 = [2, 5, 10, 7, 100, 5, .5, 0]
                                    
                                    alert("Individual Arrays Before Sort\r"+a1+"\r"+a2);
                                    sortArraysInSync(a1,a2);
                                    alert("Individual Arrays After Sort\r"+a1+"\r"+a2);
                                    
                                    
                                    function sortArraysInSync (x, y)
                                    {
                                        var arr = [], l1 = l2 = Math.min(y.length, x.length);
                                        while (l1--) arr.push({name: x[l1], number: y[l1]});
                                        arr.sort(function(a, b) { return a.number - b.number; });
                                        while (l2--)
                                        {
                                            x[l2] = arr[l2].name;
                                            y[l2] = arr[l2].number;
                                        }
                                    }
                                    

                                     

                                     

                                    I did a speed test by putting 2 3000 item arrays into my, your dbuffies and Jongware script and timing them.

                                    These were the results.

                                     

                                    Test done with alerts removed with program set to real time priority and alerts removed.

                                    These were the arrays and timing method

                                     

                                     

                                    var   a1 = ['zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two', 'zero', 'one half', 'five', 'one hundred', 'seven', 'ten', 'five', 'two'],
                                            a2 = [, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2, 0, 0.5, 5, 100, 7, 10, 5, 2];
                                    
                                    sdate = new Date();
                                    startTime = sdate.getTime();
                                    
                                    sortArraysInSync([a1,a2],2); // each scipt to its own.
                                    
                                    edate = new Date();
                                    endTime = edate.getTime();
                                    totalTime = (endTime-startTime)/1000;
                                    alert("Individual Arrays After Sort\r"+totalTime+"\r"+a1+"\r"+a2);
                                    
                                    

                                     

                                     

                                    ScriptSeconds taken to sort 2 Arrays 3000 items each
                                    Comments
                                    Trevor's Simple Script1.3
                                    Rick's (Frameexpert) Script12.3
                                    Trevor's Fancy Script33
                                    Bduffy's Script68
                                    Jongware's ScriptCrashed, don't know why?

                                     

                                     

                                    Don't forget to pick the correct answer.

                                     

                                    My 'fancy' script is slowed down considerably because of thoses evil  evals. Does anyone have a solution for this?

                                     

                                     

                                    Regards

                                     

                                    Trevor

                                    • 15. Re: Sort algorithm: how can I sort two arrays according to one
                                      Marc Autret Level 4

                                      Hi Trevor,

                                       

                                      > Hi Marc

                                      > Change the first two lines of your first script to:

                                      var array1 = [40, 7, 1, 5, 2]; var array2 = ["forty", "seven", "one", "five", "two"]; 

                                      > Then run the script

                                       

                                      That's why I provided my code with this caution:

                                      “In the case where array1 is a 1..N permutation of indices that match array2's elements…”

                                       

                                      ;-)

                                      Marc

                                      • 16. Re: Sort algorithm: how can I sort two arrays according to one
                                        frameexpert Level 4

                                        Hi Trevor,

                                         

                                        Wow, thanks for the detailed analysis. I took your advice and marked bduffy232's original answer as correct. Technically, based on my original question, his bubble sort was straighforward and correct.

                                         

                                        As far as my actual task, which I didn't state in my original post, I want to collect a list of open documents and present them alphabetically to the user. When the user picks one of those documents, I want to get the corresponding document object, so I can use the document in the rest of the script. For this, I liked Marc's solution the best because of its use of a single array with parallel document objects attached as properties of the array. This allows me to use the sorted array in my dropdownlist, as well as a "lookup table" to retrieve the appropriate document object.

                                         

                                        As far as the time benchmarks, they are useful for me to understand why your simple script is faster than mine. Of course, realistically, my user should only have a handful of documents opened at once, so the time differences may not be that critical. Thanks again for the detailed work.

                                         

                                        One question though: I am using the advanced editor, but can't figure out how to get the white background on the code samples. Any direction would be appreciated. Thanks.

                                         

                                        Rick

                                        • 17. Re: Sort algorithm: how can I sort two arrays according to one
                                          Trevorׅ Adobe Community Professional

                                          Sorry Mark

                                           

                                          I should have known better than to suspect you botched up!

                                           

                                          Trevor

                                          • 18. Re: Sort algorithm: how can I sort two arrays according to one
                                            Trevorׅ Adobe Community Professional

                                            Hi Rick

                                            ScreenShot067.png

                                            Click on the ScreenShot068.png>> next to the :-)

                                             

                                            Then you get a box like this to put the code in.

                                             

                                             

                                            Or write the code then highlight it and click as above

                                             

                                            Regards

                                             

                                            Trevor

                                             

                                            P.s. Glad I helped and made bduffie's day.

                                            • 19. Re: Sort algorithm: how can I sort two arrays according to one
                                              Trevorׅ Adobe Community Professional

                                              Hi Jongware

                                               

                                              Sorry about the crash report on your 1st script.

                                               

                                              By mistake I left an alert in that wasn't showing on the screen

                                               

                                              Your script took 10.2 Seconds

                                               

                                              Regards

                                               

                                              Trevor

                                              • 20. Re: Sort algorithm: how can I sort two arrays according to one
                                                bduffy323 Level 1

                                                NICE! Funny how a little thing like that can make a nerds day. Excellent summary Trevor!

                                                • 21. Re: Sort algorithm: how can I sort two arrays according to one
                                                  Trevorׅ Adobe Community Professional

                                                  I figured out how to get rid off those evil evals, quite embarrassed that I stuck them in.

                                                  I just needed to use the technique that Marc used of puting the object key in square brackets myArray[n]["key"+i]

                                                   

                                                  Anyway I was happy with the results and my new "fancy script" to 7.6 seconds to sort 2 * 3000 item arrays and 7.8 seconds for 5 * 3000 item arrays

                                                   

                                                  Here's the fixed script

                                                   

                                                  // Advanced Sort Variable Numbers of  Arrays in Sync Script by Trevor
                                                  // http://forums.adobe.com/thread/1062126?tstart=0
                                                  
                                                  
                                                  var   a1 = [2, 5, 10, 7, 100, 5, .5, 0]
                                                          a2 = ['two', 'five', 'ten', 'seven', 'one hundred', 'five', 'one half', 'zero'],
                                                          a3 = [ 'deux', 'cinq', 'dix', 'sept', 'cent', 'cinq', 'un demi', 'zéro' ],
                                                          a4 = [ 'twee', 'vijf', 'tien', 'zeven', 'honderd', 'vijf', 'helft', 'nul' ],
                                                          a5 = [ 'tsvey ', 'finef', 'tzien', 'zibn', 'eyn honderd', 'finef', 'eyn halb', 'nul' ];
                                                  
                                                  
                                                  sortArraysInSync([a1,a2,a3,a4,a5], 1);
                                                  
                                                  alert("Individual Arrays After Sort\r"+[a1,a2,a3,a4,a5].join("\r"));
                                                  
                                                  function sortArraysInSync (myArrays, s /* number or the array to sort by (starting from 1) */)
                                                  {
                                                      arr = []; var l1 = ll1 = myArrays[0].length, i = ll2 = myArrays.length, key = "key";
                                                      s--;
                                                      while(l1--)
                                                          {
                                                              arr[l1]={}            
                                                              i = myArrays.length;
                                                              while(i--) arr[l1][key+i] = myArrays[i][l1];
                                                           }
                                                  
                                                      arr.sort(mySort);   
                                                      while (ll1--) for (i=0; i<myArrays.length;i++) myArrays[i][ll1] = arr[ll1][key+i];
                                                  
                                                  function mySort(a, b)
                                                      {
                                                          if (isNumber(a[key+s]) || isNumber(b[key+s])) return a[key+s]- b[key+s];
                                                          else if (a[key+s].toLowerCase() > b[key+s].toLowerCase()) return 1 else return -1;
                                                      }
                                                  }
                                                  
                                                  
                                                  function isNumber(n) {return !isNaN(parseFloat(n)) && isFinite(n)}; // isNumber function from http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric/1830844#1830844
                                                  
                                                  

                                                   

                                                  Regards to all,

                                                   

                                                  Trevor