Solved

Help with a relatively simple algorithm

Posted on 2004-08-10
9
220 Views
Last Modified: 2010-03-31
Hi,

I've been stuck trying to make this simple algorithm. I'm hoping someone out there can help me with this.

Basically I need to write a function:

/**
 * @param row 1-based row number
 * @param numOriginalRows number of original rows
 * @param numOutputRows number of output rows
 * @return the resolved row (1-based)
 */
public static int resolveRow(int row, int numOriginalRows, int numOutputRows) {
  // return the result here
}

(defintion: "rectangle", I just mean a bunch of rows and cols - like m x n array)

- numOriginalRows represents an original rectangle
- numOutputRows represents a rectangle that could possibly have more rows in it than numOriginalRows

but I need to access information associated with the original Rectangle. The "row" value is relative to the output rectangle. Therefore I cannot just do getOriginalRectangleRow(row). Instead I need to do getOriginalRectangleRow(resolveRow(row)).

hopefully this is enough information. I can't really explain it more without making it more confusing.

Here is my junit code. It shows the input values and the corresponding output values.

  public void testRowResolver() {

    // 4 Original Rows
   
    assertEquals(resolveRow(1,4,4), 1);    
    assertEquals(resolveRow(2,4,4), 2);
    assertEquals(resolveRow(3,4,4), 3);
    assertEquals(resolveRow(4,4,4), 4);    

    assertEquals(resolveRow(1,4,5), 1);    
    assertEquals(resolveRow(2,4,5), 2);
    assertEquals(resolveRow(3,4,5), 2);
    assertEquals(resolveRow(4,4,5), 3);
    assertEquals(resolveRow(5,4,5), 4);    

    assertEquals(resolveRow(1,4,6), 1);    
    assertEquals(resolveRow(2,4,6), 2);
    assertEquals(resolveRow(3,4,6), 2);
    assertEquals(resolveRow(4,4,6), 3);
    assertEquals(resolveRow(5,4,6), 3);
    assertEquals(resolveRow(6,4,6), 4);    
   
    assertEquals(resolveRow(1,4,7), 1);    
    assertEquals(resolveRow(2,4,7), 2);
    assertEquals(resolveRow(3,4,7), 2);
    assertEquals(resolveRow(4,4,7), 2);
    assertEquals(resolveRow(5,4,7), 3);
    assertEquals(resolveRow(6,4,7), 3);
    assertEquals(resolveRow(7,4,7), 4);    
   
    assertEquals(resolveRow(1,4,8), 1);    
    assertEquals(resolveRow(2,4,8), 2);
    assertEquals(resolveRow(3,4,8), 2);
    assertEquals(resolveRow(4,4,8), 2);
    assertEquals(resolveRow(5,4,8), 3);
    assertEquals(resolveRow(6,4,8), 3);
    assertEquals(resolveRow(7,4,8), 3);
    assertEquals(resolveRow(8,4,8), 4);        
   
    // 5 Original Rows
   
    assertEquals(resolveRow(1,5,5), 1);    
    assertEquals(resolveRow(2,5,5), 2);
    assertEquals(resolveRow(3,5,5), 3);
    assertEquals(resolveRow(4,5,5), 4);
    assertEquals(resolveRow(5,5,5), 5);    
   
    assertEquals(resolveRow(1,5,6), 1);    
    assertEquals(resolveRow(2,5,6), 2);
    assertEquals(resolveRow(3,5,6), 3);
    assertEquals(resolveRow(4,5,6), 3);
    assertEquals(resolveRow(5,5,6), 4);
    assertEquals(resolveRow(6,5,6), 5);    
   
    assertEquals(resolveRow(1,5,7), 1);    
    assertEquals(resolveRow(2,5,7), 2);
    assertEquals(resolveRow(3,5,7), 3);
    assertEquals(resolveRow(4,5,7), 3);
    assertEquals(resolveRow(5,5,7), 3);
    assertEquals(resolveRow(6,5,7), 4);
    assertEquals(resolveRow(7,5,7), 5);    
   
    assertEquals(resolveRow(1,5,8), 1);    
    assertEquals(resolveRow(2,5,8), 2);
    assertEquals(resolveRow(3,5,8), 3);
    assertEquals(resolveRow(4,5,8), 3);
    assertEquals(resolveRow(5,5,8), 3);
    assertEquals(resolveRow(6,5,8), 3);
    assertEquals(resolveRow(7,5,8), 4);
    assertEquals(resolveRow(8,5,8), 5);    
   
  }
0
Comment
Question by:ycomp
  • 4
  • 4
9 Comments
 
LVL 13

Expert Comment

by:Webstorm
ID: 11768006
Hi ycomp,

public static int resolveRow(int row, int numOriginalRows, int numOutputRows)
{
    return 1+((numOriginalRows*(row-1))/numOutputRows);
}
0
 

Author Comment

by:ycomp
ID: 11768040
Hi Webstorm,

thanks for the quick response!

unfortunately it doesn't work in all cases:

(the commented lines are problem lines)

    // 4 Original Rows
   
    assertEquals(resolveRow(1,4,4), 1);    
    assertEquals(resolveRow(2,4,4), 2);
    assertEquals(resolveRow(3,4,4), 3);
    assertEquals(resolveRow(4,4,4), 4);    

    assertEquals(resolveRow(1,4,5), 1);    
//    assertEquals(resolveRow(2,4,5), 2);
    assertEquals(resolveRow(3,4,5), 2);
    assertEquals(resolveRow(4,4,5), 3);
    assertEquals(resolveRow(5,4,5), 4);    

    assertEquals(resolveRow(1,4,6), 1);    
//    assertEquals(resolveRow(2,4,6), 2);
    assertEquals(resolveRow(3,4,6), 2);
    assertEquals(resolveRow(4,4,6), 3);
    assertEquals(resolveRow(5,4,6), 3);
    assertEquals(resolveRow(6,4,6), 4);    
   
    assertEquals(resolveRow(1,4,7), 1);    
//    assertEquals(resolveRow(2,4,7), 2);
    assertEquals(resolveRow(3,4,7), 2);
    assertEquals(resolveRow(4,4,7), 2);
    assertEquals(resolveRow(5,4,7), 3);
    assertEquals(resolveRow(6,4,7), 3);
    assertEquals(resolveRow(7,4,7), 4);    
   
    assertEquals(resolveRow(1,4,8), 1);    
//    assertEquals(resolveRow(2,4,8), 2);
    assertEquals(resolveRow(3,4,8), 2);
    assertEquals(resolveRow(4,4,8), 2);
    assertEquals(resolveRow(5,4,8), 3);
    assertEquals(resolveRow(6,4,8), 3);
//    assertEquals(resolveRow(7,4,8), 3);
    assertEquals(resolveRow(8,4,8), 4);        
   
    // 5 Original Rows
   
    assertEquals(resolveRow(1,5,5), 1);    
    assertEquals(resolveRow(2,5,5), 2);
    assertEquals(resolveRow(3,5,5), 3);
    assertEquals(resolveRow(4,5,5), 4);
    assertEquals(resolveRow(5,5,5), 5);    
   
    assertEquals(resolveRow(1,5,6), 1);    
//    assertEquals(resolveRow(2,5,6), 2);
//    assertEquals(resolveRow(3,5,6), 3);
    assertEquals(resolveRow(4,5,6), 3);
    assertEquals(resolveRow(5,5,6), 4);
    assertEquals(resolveRow(6,5,6), 5);    
   
    assertEquals(resolveRow(1,5,7), 1);    
//    assertEquals(resolveRow(2,5,7), 2);
//    assertEquals(resolveRow(3,5,7), 3);
    assertEquals(resolveRow(4,5,7), 3);
    assertEquals(resolveRow(5,5,7), 3);
    assertEquals(resolveRow(6,5,7), 4);
    assertEquals(resolveRow(7,5,7), 5);    
   
    assertEquals(resolveRow(1,5,8), 1);    
//    assertEquals(resolveRow(2,5,8), 2);
//    assertEquals(resolveRow(3,5,8), 3);
//    assertEquals(resolveRow(4,5,8), 3);
    assertEquals(resolveRow(5,5,8), 3);
//    assertEquals(resolveRow(6,5,8), 3);
    assertEquals(resolveRow(7,5,8), 4);
    assertEquals(resolveRow(8,5,8), 5);    
0
 
LVL 13

Expert Comment

by:Webstorm
ID: 11768059
In fact, to get exactly what you need in your assertEquals statements:

public static int resolveRow(int row, int numOriginalRows, int numOutputRows)
{
    int dh=(numOriginalRows+1)/2;
    if (row<dh) return row;
    else if (row>(numOutputRows-dh)) return row+numOriginalRows-numOutputRows;
    else return dh;
}
0
 
LVL 92

Expert Comment

by:objects
ID: 11768079
So what does your current method look like?
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:ycomp
ID: 11768108
unfortunately that doesn't quite work either WebStorm. But the problems are limited to the 4 rows example:

    // 4 Original Rows
   
    assertEquals(resolveRow(1,4,4), 1);    
    assertEquals(resolveRow(2,4,4), 2);
    assertEquals(resolveRow(3,4,4), 3);
    assertEquals(resolveRow(4,4,4), 4);    

    assertEquals(resolveRow(1,4,5), 1);    
    assertEquals(resolveRow(2,4,5), 2);
    assertEquals(resolveRow(3,4,5), 2);
    assertEquals(resolveRow(4,4,5), 3);
    assertEquals(resolveRow(5,4,5), 4);    

    assertEquals(resolveRow(1,4,6), 1);    
    assertEquals(resolveRow(2,4,6), 2);
    assertEquals(resolveRow(3,4,6), 2);
//    assertEquals(resolveRow(4,4,6), 3);
    assertEquals(resolveRow(5,4,6), 3);
    assertEquals(resolveRow(6,4,6), 4);    
   
    assertEquals(resolveRow(1,4,7), 1);    
    assertEquals(resolveRow(2,4,7), 2);
    assertEquals(resolveRow(3,4,7), 2);
    assertEquals(resolveRow(4,4,7), 2);
//    assertEquals(resolveRow(5,4,7), 3);
    assertEquals(resolveRow(6,4,7), 3);
    assertEquals(resolveRow(7,4,7), 4);    
   
    assertEquals(resolveRow(1,4,8), 1);    
    assertEquals(resolveRow(2,4,8), 2);
    assertEquals(resolveRow(3,4,8), 2);
    assertEquals(resolveRow(4,4,8), 2);
//    assertEquals(resolveRow(5,4,8), 3);
//    assertEquals(resolveRow(6,4,8), 3);
    assertEquals(resolveRow(7,4,8), 3);
    assertEquals(resolveRow(8,4,8), 4);        
   
    // 5 Original Rows
   
    assertEquals(resolveRow(1,5,5), 1);    
    assertEquals(resolveRow(2,5,5), 2);
    assertEquals(resolveRow(3,5,5), 3);
    assertEquals(resolveRow(4,5,5), 4);
    assertEquals(resolveRow(5,5,5), 5);    
   
    assertEquals(resolveRow(1,5,6), 1);    
    assertEquals(resolveRow(2,5,6), 2);
    assertEquals(resolveRow(3,5,6), 3);
    assertEquals(resolveRow(4,5,6), 3);
    assertEquals(resolveRow(5,5,6), 4);
    assertEquals(resolveRow(6,5,6), 5);    
   
    assertEquals(resolveRow(1,5,7), 1);    
    assertEquals(resolveRow(2,5,7), 2);
    assertEquals(resolveRow(3,5,7), 3);
    assertEquals(resolveRow(4,5,7), 3);
    assertEquals(resolveRow(5,5,7), 3);
    assertEquals(resolveRow(6,5,7), 4);
    assertEquals(resolveRow(7,5,7), 5);    
   
    assertEquals(resolveRow(1,5,8), 1);    
    assertEquals(resolveRow(2,5,8), 2);
    assertEquals(resolveRow(3,5,8), 3);
    assertEquals(resolveRow(4,5,8), 3);
    assertEquals(resolveRow(5,5,8), 3);
    assertEquals(resolveRow(6,5,8), 3);
    assertEquals(resolveRow(7,5,8), 4);
    assertEquals(resolveRow(8,5,8), 5);    
0
 
LVL 13

Accepted Solution

by:
Webstorm earned 500 total points
ID: 11768124
public static int resolveRow(int row, int numOriginalRows, int numOutputRows)
{
    int dh=(numOriginalRows+1)/2,
         th=(numOutputRows+1)/2;
    if (row<dh) return row;
    else if (row>(numOutputRows-dh)) return row+numOriginalRows-numOutputRows;
    else return (row<=th)?dh:numOriginalRows+1-dh;
}
0
 

Author Comment

by:ycomp
ID: 11768126
objects, my current method is blank. I tried to write something but couldn't figure it out. Basically what I need to do is to somehow divide the thing so that the rows that are closer to the top correlate to the original rows closer to the top and those closer to the bottom correlate to those original rows closer to the bottom.

But I can't really describe it very well, which is one reason why I can't write the code. However I do know that the junit code does describe what I need done much better than I can explain it.
0
 

Author Comment

by:ycomp
ID: 11768137
Webstorm, you are awesome... thanks! Saved me a lot of scratching my head. It works 100%.
0
 
LVL 13

Expert Comment

by:Webstorm
ID: 11768148
:-)
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Problem to start Neon 20 87
Need to track down Infection in a Server 2008 domain user profile 7 48
Java Server Faces parameter pass? 6 39
varialbe initialization 11 30
INTRODUCTION Working with files is a moderately common task in Java.  For most projects hard coding the file names, using parameters in configuration files, or using command-line arguments is sufficient.   However, when your application has vi…
Are you developing a Java application and want to create Excel Spreadsheets? You have come to the right place, this article will describe how you can create Excel Spreadsheets from a Java Application. For the purposes of this article, I will be u…
Viewers learn about the “for” loop and how it works in Java. By comparing it to the while loop learned before, viewers can make the transition easily. You will learn about the formatting of the for loop as we write a program that prints even numbers…
Viewers learn how to read error messages and identify possible mistakes that could cause hours of frustration. Coding is as much about debugging your code as it is about writing it. Define Error Message: Line Numbers: Type of Error: Break Down…

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now