Advertisement
Guest User

13 digit Sum Benchnmark

a guest
May 18th, 2016
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.58 KB | None | 0 0
  1. class ChangeNumbers
  2. {
  3.     public static void main( final String[] args )
  4.     {
  5.         final int[] input = new int[] { 7, 3, 1, 6, 7, 1, 7, 6, 5, 3, 1, 3, 3, 0, 6, 2, 4, 9, 1, 9, 2, 2, 5, 1, 1, 9, 6,
  6.                 7, 4, 4, 2, 6, 5, 7, 4, 7, 4, 2, 3, 5, 5, 3, 4, 9, 1, 9, 4, 9, 3, 4, 9, 6, 9, 8, 3, 5, 2, 0, 3, 1, 2, 7,
  7.                 7, 4, 5, 0, 6, 3, 2, 6, 2, 3, 9, 5, 7, 8, 3, 1, 8, 0, 1, 6, 9, 8, 4, 8, 0, 1, 8, 6, 9, 4, 7, 8, 8, 5, 1,
  8.                 8, 4, 3, 8, 5, 8, 6, 1, 5, 6, 0, 7, 8, 9, 1, 1, 2, 9, 4, 9, 4, 9, 5, 4, 5, 9, 5, 0, 1, 7, 3, 7, 9, 5, 8,
  9.                 3, 3, 1, 9, 5, 2, 8, 5, 3, 2, 0, 8, 8, 0, 5, 5, 1, 1, 1, 2, 5, 4, 0, 6, 9, 8, 7, 4, 7, 1, 5, 8, 5, 2, 3,
  10.                 8, 6, 3, 0, 5, 0, 7, 1, 5, 6, 9, 3, 2, 9, 0, 9, 6, 3, 2, 9, 5, 2, 2, 7, 4, 4, 3, 0, 4, 3, 5, 5, 7, 6, 6,
  11.                 8, 9, 6, 6, 4, 8, 9, 5, 0, 4, 4, 5, 2, 4, 4, 5, 2, 3, 1, 6, 1, 7, 3, 1, 8, 5, 6, 4, 0, 3, 0, 9, 8, 7, 1,
  12.                 1, 1, 2, 1, 7, 2, 2, 3, 8, 3, 1, 1, 3, 6, 2, 2, 2, 9, 8, 9, 3, 4, 2, 3, 3, 8, 0, 3, 0, 8, 1, 3, 5, 3, 3,
  13.                 6, 2, 7, 6, 6, 1, 4, 2, 8, 2, 8, 0, 6, 4, 4, 4, 4, 8, 6, 6, 4, 5, 2, 3, 8, 7, 4, 9, 3, 0, 3, 5, 8, 9, 0,
  14.                 7, 2, 9, 6, 2, 9, 0, 4, 9, 1, 5, 6, 0, 4, 4, 0, 7, 7, 2, 3, 9, 0, 7, 1, 3, 8, 1, 0, 5, 1, 5, 8, 5, 9, 3,
  15.                 0, 7, 9, 6, 0, 8, 6, 6, 7, 0, 1, 7, 2, 4, 2, 7, 1, 2, 1, 8, 8, 3, 9, 9, 8, 7, 9, 7, 9, 0, 8, 7, 9, 2, 2,
  16.                 7, 4, 9, 2, 1, 9, 0, 1, 6, 9, 9, 7, 2, 0, 8, 8, 8, 0, 9, 3, 7, 7, 6, 6, 5, 7, 2, 7, 3, 3, 3, 0, 0, 1, 0,
  17.                 5, 3, 3, 6, 7, 8, 8, 1, 2, 2, 0, 2, 3, 5, 4, 2, 1, 8, 0, 9, 7, 5, 1, 2, 5, 4, 5, 4, 0, 5, 9, 4, 7, 5, 2,
  18.                 2, 4, 3, 5, 2, 5, 8, 4, 9, 0, 7, 7, 1, 1, 6, 7, 0, 5, 5, 6, 0, 1, 3, 6, 0, 4, 8, 3, 9, 5, 8, 6, 4, 4, 6,
  19.                 7, 0, 6, 3, 2, 4, 4, 1, 5, 7, 2, 2, 1, 5, 5, 3, 9, 7, 5, 3, 6, 9, 7, 8, 1, 7, 9, 7, 7, 8, 4, 6, 1, 7, 4,
  20.                 0, 6, 4, 9, 5, 5, 1, 4, 9, 2, 9, 0, 8, 6, 2, 5, 6, 9, 3, 2, 1, 9, 7, 8, 4, 6, 8, 6, 2, 2, 4, 8, 2, 8, 3,
  21.                 9, 7, 2, 2, 4, 1, 3, 7, 5, 6, 5, 7, 0, 5, 6, 0, 5, 7, 4, 9, 0, 2, 6, 1, 4, 0, 7, 9, 7, 2, 9, 6, 8, 6, 5,
  22.                 2, 4, 1, 4, 5, 3, 5, 1, 0, 0, 4, 7, 4, 8, 2, 1, 6, 6, 3, 7, 0, 4, 8, 4, 4, 0, 3, 1, 9, 9, 8, 9, 0, 0, 0,
  23.                 8, 8, 9, 5, 2, 4, 3, 4, 5, 0, 6, 5, 8, 5, 4, 1, 2, 2, 7, 5, 8, 8, 6, 6, 6, 8, 8, 1, 1, 6, 4, 2, 7, 1, 7,
  24.                 1, 4, 7, 9, 9, 2, 4, 4, 4, 2, 9, 2, 8, 2, 3, 0, 8, 6, 3, 4, 6, 5, 6, 7, 4, 8, 1, 3, 9, 1, 9, 1, 2, 3, 1,
  25.                 6, 2, 8, 2, 4, 5, 8, 6, 1, 7, 8, 6, 6, 4, 5, 8, 3, 5, 9, 1, 2, 4, 5, 6, 6, 5, 2, 9, 4, 7, 6, 5, 4, 5, 6,
  26.                 8, 2, 8, 4, 8, 9, 1, 2, 8, 8, 3, 1, 4, 2, 6, 0, 7, 6, 9, 0, 0, 4, 2, 2, 4, 2, 1, 9, 0, 2, 2, 6, 7, 1, 0,
  27.                 5, 5, 6, 2, 6, 3, 2, 1, 1, 1, 1, 1, 0, 9, 3, 7, 0, 5, 4, 4, 2, 1, 7, 5, 0, 6, 9, 4, 1, 6, 5, 8, 9, 6, 0,
  28.                 4, 0, 8, 0, 7, 1, 9, 8, 4, 0, 3, 8, 5, 0, 9, 6, 2, 4, 5, 5, 4, 4, 4, 3, 6, 2, 9, 8, 1, 2, 3, 0, 9, 8, 7,
  29.                 8, 7, 9, 9, 2, 7, 2, 4, 4, 2, 8, 4, 9, 0, 9, 1, 8, 8, 8, 4, 5, 8, 0, 1, 5, 6, 1, 6, 6, 0, 9, 7, 9, 1, 9,
  30.                 1, 3, 3, 8, 7, 5, 4, 9, 9, 2, 0, 0, 5, 2, 4, 0, 6, 3, 6, 8, 9, 9, 1, 2, 5, 6, 0, 7, 1, 7, 6, 0, 6, 0, 5,
  31.                 8, 8, 6, 1, 1, 6, 4, 6, 7, 1, 0, 9, 4, 0, 5, 0, 7, 7, 5, 4, 1, 0, 0, 2, 2, 5, 6, 9, 8, 3, 1, 5, 5, 2, 0,
  32.                 0, 0, 5, 5, 9, 3, 5, 7, 2, 9, 7, 2, 5, 7, 1, 6, 3, 6, 2, 6, 9, 5, 6, 1, 8, 8, 2, 6, 7, 0, 4, 2, 8, 2, 5,
  33.                 2, 4, 8, 3, 6, 0, 0, 8, 2, 3, 2, 5, 7, 5, 3, 0, 4, 2, 0, 7, 5, 2, 9, 6, 3, 4, 5, 0 };
  34.        
  35.         // WARMUP
  36.        
  37.         long tempresult = 0;
  38.  
  39.         for ( int i = 0; i < 10000; ++i )
  40.         {
  41.             tempresult += defaultApproach( input ) / 1000;
  42.         }
  43.        
  44.         for ( int i = 0; i < 10000; ++i )
  45.         {
  46.             tempresult += defaultWithSkip( input ) / 1000;
  47.         }
  48.  
  49.         for ( int i = 0; i < 10000; ++i )
  50.         {
  51.             tempresult += shiftingFrame( input ) / 1000;
  52.         }
  53.  
  54.         System.out.println( "Warmup Result: " + tempresult );
  55.        
  56.         // BENCHMARK
  57.        
  58.         long result1 = 0;
  59.  
  60.         long timer1 = System.nanoTime();
  61.         for ( int i = 0; i < 100000; ++i )
  62.         {
  63.             result1 += defaultApproach( input ) / 1000;
  64.         }
  65.         timer1 = System.nanoTime() - timer1;
  66.        
  67.         long result2 = 0;
  68.  
  69.         long timer2 = System.nanoTime();
  70.         for ( int i = 0; i < 100000; ++i )
  71.         {
  72.             result2 += defaultWithSkip( input ) / 1000;
  73.         }
  74.         timer2 = System.nanoTime() - timer2;
  75.        
  76.         long result3 = 0;
  77.  
  78.         long timer3 = System.nanoTime();
  79.         for ( int i = 0; i < 100000; ++i )
  80.         {
  81.             result3 += shiftingFrame( input ) / 1000;
  82.         }
  83.         timer3 = System.nanoTime() - timer3;
  84.  
  85.         System.out.println( "Orginal:    " + result1 + "  Time: " + timer1 / 1000 );
  86.         System.out.println( "ZeroSkip:   " + result2 + "  Time: " + timer2 / 1000 );
  87.         System.out.println( "ShiftFrame: " + result3 + "  Time: " + timer3 / 1000 );
  88.     }
  89.    
  90.     private static long defaultApproach( final int[] input )
  91.     {
  92.         final int totalDigits = input.length - 13;
  93.  
  94.         long product, max = 0;
  95.        
  96.         for ( int i = 0; i < totalDigits; ++i )
  97.         {
  98.             product = (long) input[ i ]
  99.                     * input[ i + 1 ]
  100.                     * input[ i + 2 ]
  101.                     * input[ i + 3 ]
  102.                     * input[ i + 4 ]
  103.                     * input[ i + 5 ]
  104.                     * input[ i + 6 ]
  105.                     * input[ i + 7 ]
  106.                     * input[ i + 8 ]
  107.                     * input[ i + 9 ]
  108.                     * input[ i + 10 ]
  109.                     * input[ i + 11 ]
  110.                     * input[ i + 12 ];
  111.             max = product > max ? product : max;
  112.         }
  113.        
  114.         return max;
  115.     }
  116.  
  117.     private static long defaultWithSkip( final int[] input )
  118.     {
  119.         final int totalDigits = input.length - 13;
  120.  
  121.         long product, max = 0;
  122.        
  123.         for ( int i = skipZeroes( input, 0, 13 ); i < totalDigits; ++i )
  124.         {
  125.             if ( input[ i ] == 0 )
  126.             {
  127.                 i = skipZeroes( input, i, 13 );
  128.  
  129.                 if ( i >= totalDigits )
  130.                 {
  131.                     break;
  132.                 }
  133.             }
  134.            
  135.             product = (long) input[ i ]
  136.                     * input[ i + 1 ]
  137.                     * input[ i + 2 ]
  138.                     * input[ i + 3 ]
  139.                     * input[ i + 4 ]
  140.                     * input[ i + 5 ]
  141.                     * input[ i + 6 ]
  142.                     * input[ i + 7 ]
  143.                     * input[ i + 8 ]
  144.                     * input[ i + 9 ]
  145.                     * input[ i + 10 ]
  146.                     * input[ i + 11 ]
  147.                     * input[ i + 12 ];
  148.             max = product > max ? product : max;
  149.         }
  150.        
  151.         return max;
  152.     }
  153.    
  154.     private static long shiftingFrame( final int[] input )
  155.     {
  156.         final int totalDigits = input.length;
  157.        
  158.         long divs = 1;
  159.         long mults = 1;
  160.        
  161.         // first index >= 0 followed by 13 non-zero digits
  162.         int i = skipZeroes( input, 0, 13 );
  163.         long maxprod = i < totalDigits ? multiplyDigits( input, i, 13 ) : 0;
  164.         i = i + 12;
  165.        
  166.         long lastprod = maxprod;
  167.         long diffactor = 1;
  168.        
  169.         for ( ++i; i < totalDigits; ++i )
  170.         {
  171.             final int digit = input[ i ];
  172.             if ( digit == 0 )
  173.             {
  174.                 i = skipZeroes( input, i, 13 );
  175.                 if ( i >= totalDigits )
  176.                 {
  177.                     break;
  178.                 }
  179.                 lastprod = multiplyDigits( input, i, 13 );
  180.                 i = i + 12;
  181.                 if ( lastprod >= maxprod )
  182.                 {
  183.                     maxprod = lastprod;
  184.                     diffactor = 1;
  185.                 }
  186.                 else
  187.                 {
  188.                     diffactor = ( maxprod / lastprod );
  189.                 }
  190.                 divs = 1;
  191.                 mults = 1;
  192.             }
  193.             else
  194.             {
  195.                 final int spareDigit = input[ i - 13 ];
  196.                
  197.                 mults *= digit;
  198.                 divs *= spareDigit;
  199.                 diffactor *= spareDigit;
  200.                
  201.                 if ( mults > diffactor )
  202.                 {
  203.                     final long newprod = lastprod * mults / divs;
  204.                     if ( newprod > maxprod )
  205.                     {
  206.                         maxprod = newprod;
  207.                         lastprod = newprod;
  208.                         diffactor = 1;
  209.                         mults = 1;
  210.                         divs = 1;
  211.                     }
  212.                 }
  213.             }
  214.         }
  215.        
  216.         return maxprod;
  217.     }
  218.    
  219.     private static long multiplyDigits( final int[] input, final int start, final int digits )
  220.     {
  221.         long product = input[ start ];
  222.         final int end = start + digits;
  223.  
  224.         for ( int i = start + 1; i < end; ++i )
  225.         {
  226.             product *= input[ i ];
  227.         }
  228.         return product;
  229.     }
  230.    
  231.     private static int skipZeroes( final int[] input, int start, final int digits )
  232.     {
  233.         final int length = input.length;
  234.         int end = start + digits;
  235.  
  236.         for ( int i = start; i < end; ++i )
  237.         {
  238.             if ( i >= length )
  239.             {
  240.                 return length;
  241.             }
  242.  
  243.             if ( input[ i ] == 0 )
  244.             {
  245.                 start = i + 1;
  246.                 end = start + digits;
  247.             }
  248.         }
  249.  
  250.         return start;
  251.     }
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement