/*
** University of Washington PCE (Professional Continuing Education)
** Foundations of C++
** Assignment 8, eoSortMain.c
**
** Development
** Author: Colby O'Donnell <colbster@uw.edu>
** Reviewer: David Nielsen <nielsen@u.washington.edu>
** Developed: December 2, 2011
** Updated: July 8, 2012
**
** Solution
** Author: Enter your name here
** Date: Enter date here
**
** INSTRUCTIONS
**
** Write a function, EvenOddSort(), that sorts an array of integers by first moving all even numbers before odd numbers,
** and then sorting from smallest to highest. The resulting order would be even numbers (smallest to highest) followed
** by odd numbers (smallest to highest). The function uses your choice of an in-place bubble or selection sorting
** algorithm. It is passed the unsorted integer array (to be modified in place) and its length (the number of elements
** in the array) and returns the number of swaps made during the sort, as an unsigned int.
**
** Declare the EvenOddSort() function in eoSort.h, and define it in eoSort.c. Define additional functions
** that EvenOddSort() requires in eoSort.c. For example, you should define a swap function and a comparison
** function. Write all sorting, swapping, and comparison functions yourself. The only header you will need is
** <stdio.h>. Do not use qsort() or any other library sorting function.
**
** DESIGN HINTS
**
** Things to remember:
** - Use Fibonacci from Assignment 7 as an example of how to organize the three files (eoSort.c, eoSort.h, eoSortMain.c).
** - Consolidate common (redundant) code rather than creating duplicate code via copy/paste.
** - Keep your program as simple as possible. Avoid creating more variables than necessary.
**
** Common mistakes to avoid that were made on this assignment in past quarters:
** - The sorting algorithm and comparison logic are mixed unnecessarily and cannot be varied independently.
** - Unnecessarily exposing the implementation details of eoSort.c in eoSort.h.
** - Putting test code in eoSort.c rather than eoSortMain.c.
** - Having redundant code, such as two printf statements that do nearly identical things.
** - Declaring variables with more scope and visibility than necessary.
** - Inconsistent indentation. Mixture of tabs and spaces. Generally sloppy looking code.
** - The test code does not actually verify the actual versus expected arrays and number of swaps.
**
** TESTING
**
** Your main() function will be the automated test driver for your EvenOddSort() function, located in eoSortMain.c.
** Write a test driver that loops through a list of test cases, where each test case is a given input array and its
** length. Be sure to test a variety of lengths. The driver is also given a list of expected output arrays, along with
** the expected number of swaps to be made.
**
** For each test case, print a header that includes the test case number, and on separate lines (so that elements are
** vertically aligned and easy to compare) print the given input array, the modified and sorted output array, and the
** expected array. Along with those, print the expected and actual number of swaps made. Finally, print out a final
** status, PASS or FAIL, for each test case based on whether the actual results match the expected results.
**
** To define your test data, define a pair of 2-dimension arrays, called "given" and "expected". The first
** dimension of each array is the test case. You decide how many test cases there are. The second dimension is the
** elements of the array being tested for each test case. Reserve the first element of each test case array for
** a special purpose.
**
** For the array "given", the first element is the number of elements in that row, and the remaining elements are
** the unsorted input array. For the array "expected", the first element is the expected number of swaps made, and
** the remaining elements are the expected sorted output array.
**
** Below is an INCOMPLETE sample of what the test arrays look like:
**
** int given[NUM_TESTS][MAX_ARRAY_SIZE] =
** {
** { 0 },
** { 1, 5 },
** { 2, 10, 12 },
** { 2, 12, 10 },
** { 8, 2, 4, 6, 8, 1, 3, 5, 7 },
** { 8, 7, 5, 3, 1, 8, 6, 4, 2 },
** };
**
** int expected[NUM_TESTS][MAX_ARRAY_SIZE] =
** {
** { 0 },
** { 0, 5 },
** { 0, 10, 12 },
** { 1, 10, 12 },
** { 0, 2, 4, 6, 8, 1, 3, 5, 7 },
** { 28, 2, 4, 6, 8, 1, 3, 5, 7 },
** };
**
** Copy and paste your program output to EvenOddSortTest.txt. Below is an incomplete sample test output from my
** solution:
**
** Welcome to the EvenOddSort() test driver.
**
** ------------------------------------------------- Test 1
** Given: ()
** Got: () with 0 swaps
** Expected: () with 0 swaps
** Outcome: PASS
**
** ------------------------------------------------- Test 2
** Given: (5)
** Got: (5) with 0 swaps
** Expected: (5) with 0 swaps
** Outcome: PASS
**
** ------------------------------------------------- Test 4
** Given: (10, 12)
** Got: (10, 12) with 0 swaps
** Expected: (10, 12) with 0 swaps
** Outcome: PASS
**
** ------------------------------------------------- Test 5
** Given: (12, 10)
** Got: (10, 12) with 1 swap
** Expected: (10, 12) with 1 swap
** Outcome: PASS
**
** ------------------------------------------------- Test 6
** Given: (11, 13)
** Got: (11, 13) with 0 swaps
** Expected: (11, 13) with 0 swaps
** Outcome: PASS
**
** ------------------------------------------------- Test 7
** Given: (13, 11)
** Got: (11, 13) with 1 swap
** Expected: (11, 13) with 1 swap
** Outcome: PASS
**
*/
#include <stdio.h>
void Swap(int * current, int * next)
{
int temp = 0;
temp = *current;
*current = *next;
*next = temp;
}
void Compare(int * current, int * next, int * swap_count)
{
if (*current > *next)
{
Swap(current, next);
*swap_count = *swap_count + 1;
}
}
void EvenOddSort(int * test_array)
{
int i = 0;
int swap_count = 0;
while(1)
{
swap_count = 0;
for (i = 1 ; i < *test_array ; i++)
{
Compare((test_array+i),(test_array+i+1),&swap_count);
}
printf("%d",swap_count);
if (swap_count == 0);
break;
}
}
int main()
{
int test_array[9] = {8,3,2,7,5,4,8,1,9};
int i = 0;
EvenOddSort(test_array);
return 0;
}
LyoKKiogVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uIFBDRSAoUHJvZmVzc2lvbmFsIENvbnRpbnVpbmcgRWR1Y2F0aW9uKQoqKiBGb3VuZGF0aW9ucyBvZiBDKysKKiogQXNzaWdubWVudCA4LCBlb1NvcnRNYWluLmMKKioKKiogRGV2ZWxvcG1lbnQKKiogICBBdXRob3I6ICAgIENvbGJ5IE8nRG9ubmVsbCA8Y29sYnN0ZXJAdXcuZWR1PgoqKiAgIFJldmlld2VyOiAgRGF2aWQgTmllbHNlbiA8bmllbHNlbkB1Lndhc2hpbmd0b24uZWR1PgoqKiAgIERldmVsb3BlZDogRGVjZW1iZXIgMiwgMjAxMQoqKiAgIFVwZGF0ZWQ6ICAgSnVseSA4LCAyMDEyCioqCioqIFNvbHV0aW9uCioqICAgQXV0aG9yOiAgICBFbnRlciB5b3VyIG5hbWUgaGVyZQoqKiAgIERhdGU6ICAgICAgRW50ZXIgZGF0ZSBoZXJlCioqCioqIElOU1RSVUNUSU9OUwoqKgoqKiBXcml0ZSBhIGZ1bmN0aW9uLCBFdmVuT2RkU29ydCgpLCB0aGF0IHNvcnRzIGFuIGFycmF5IG9mIGludGVnZXJzIGJ5IGZpcnN0IG1vdmluZyBhbGwgZXZlbiBudW1iZXJzIGJlZm9yZSBvZGQgbnVtYmVycywKKiogYW5kIHRoZW4gc29ydGluZyBmcm9tIHNtYWxsZXN0IHRvIGhpZ2hlc3QuICBUaGUgcmVzdWx0aW5nIG9yZGVyIHdvdWxkIGJlIGV2ZW4gbnVtYmVycyAoc21hbGxlc3QgdG8gaGlnaGVzdCkgZm9sbG93ZWQKKiogYnkgb2RkIG51bWJlcnMgKHNtYWxsZXN0IHRvIGhpZ2hlc3QpLiAgVGhlIGZ1bmN0aW9uIHVzZXMgeW91ciBjaG9pY2Ugb2YgYW4gaW4tcGxhY2UgYnViYmxlIG9yIHNlbGVjdGlvbiBzb3J0aW5nCioqIGFsZ29yaXRobS4gIEl0IGlzIHBhc3NlZCB0aGUgdW5zb3J0ZWQgaW50ZWdlciBhcnJheSAodG8gYmUgbW9kaWZpZWQgaW4gcGxhY2UpIGFuZCBpdHMgbGVuZ3RoICh0aGUgbnVtYmVyIG9mIGVsZW1lbnRzCioqIGluIHRoZSBhcnJheSkgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBzd2FwcyBtYWRlIGR1cmluZyB0aGUgc29ydCwgYXMgYW4gdW5zaWduZWQgaW50LgoqKiAKKiogRGVjbGFyZSB0aGUgRXZlbk9kZFNvcnQoKSBmdW5jdGlvbiBpbiBlb1NvcnQuaCwgYW5kIGRlZmluZSBpdCBpbiBlb1NvcnQuYy4gIERlZmluZSBhZGRpdGlvbmFsIGZ1bmN0aW9ucwoqKiB0aGF0IEV2ZW5PZGRTb3J0KCkgcmVxdWlyZXMgaW4gZW9Tb3J0LmMuICBGb3IgZXhhbXBsZSwgeW91IHNob3VsZCBkZWZpbmUgYSBzd2FwIGZ1bmN0aW9uIGFuZCBhIGNvbXBhcmlzb24KKiogZnVuY3Rpb24uICBXcml0ZSBhbGwgc29ydGluZywgc3dhcHBpbmcsIGFuZCBjb21wYXJpc29uIGZ1bmN0aW9ucyB5b3Vyc2VsZi4gIFRoZSBvbmx5IGhlYWRlciB5b3Ugd2lsbCBuZWVkIGlzCioqIDxzdGRpby5oPi4gIERvIG5vdCB1c2UgcXNvcnQoKSBvciBhbnkgb3RoZXIgbGlicmFyeSBzb3J0aW5nIGZ1bmN0aW9uLgoqKgoqKiBERVNJR04gSElOVFMKKioKKiogVGhpbmdzIHRvIHJlbWVtYmVyOgoqKiAtIFVzZSBGaWJvbmFjY2kgZnJvbSBBc3NpZ25tZW50IDcgYXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gb3JnYW5pemUgdGhlIHRocmVlIGZpbGVzIChlb1NvcnQuYywgZW9Tb3J0LmgsIGVvU29ydE1haW4uYykuCioqIC0gQ29uc29saWRhdGUgY29tbW9uIChyZWR1bmRhbnQpIGNvZGUgcmF0aGVyIHRoYW4gY3JlYXRpbmcgZHVwbGljYXRlIGNvZGUgdmlhIGNvcHkvcGFzdGUuCioqIC0gS2VlcCB5b3VyIHByb2dyYW0gYXMgc2ltcGxlIGFzIHBvc3NpYmxlLiAgQXZvaWQgY3JlYXRpbmcgbW9yZSB2YXJpYWJsZXMgdGhhbiBuZWNlc3NhcnkuCioqCioqIENvbW1vbiBtaXN0YWtlcyB0byBhdm9pZCB0aGF0IHdlcmUgbWFkZSBvbiB0aGlzIGFzc2lnbm1lbnQgaW4gcGFzdCBxdWFydGVyczoKKiogLSBUaGUgc29ydGluZyBhbGdvcml0aG0gYW5kIGNvbXBhcmlzb24gbG9naWMgYXJlIG1peGVkIHVubmVjZXNzYXJpbHkgYW5kIGNhbm5vdCBiZSB2YXJpZWQgaW5kZXBlbmRlbnRseS4KKiogLSBVbm5lY2Vzc2FyaWx5IGV4cG9zaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIGVvU29ydC5jIGluIGVvU29ydC5oLgoqKiAtIFB1dHRpbmcgdGVzdCBjb2RlIGluIGVvU29ydC5jIHJhdGhlciB0aGFuIGVvU29ydE1haW4uYy4KKiogLSBIYXZpbmcgcmVkdW5kYW50IGNvZGUsIHN1Y2ggYXMgdHdvIHByaW50ZiBzdGF0ZW1lbnRzIHRoYXQgZG8gbmVhcmx5IGlkZW50aWNhbCB0aGluZ3MuCioqIC0gRGVjbGFyaW5nIHZhcmlhYmxlcyB3aXRoIG1vcmUgc2NvcGUgYW5kIHZpc2liaWxpdHkgdGhhbiBuZWNlc3NhcnkuCioqIC0gSW5jb25zaXN0ZW50IGluZGVudGF0aW9uLiAgTWl4dHVyZSBvZiB0YWJzIGFuZCBzcGFjZXMuICBHZW5lcmFsbHkgc2xvcHB5IGxvb2tpbmcgY29kZS4KKiogLSBUaGUgdGVzdCBjb2RlIGRvZXMgbm90IGFjdHVhbGx5IHZlcmlmeSB0aGUgYWN0dWFsIHZlcnN1cyBleHBlY3RlZCBhcnJheXMgYW5kIG51bWJlciBvZiBzd2Fwcy4KKioKKiogVEVTVElORwoqKgoqKiBZb3VyIG1haW4oKSBmdW5jdGlvbiB3aWxsIGJlIHRoZSBhdXRvbWF0ZWQgdGVzdCBkcml2ZXIgZm9yIHlvdXIgRXZlbk9kZFNvcnQoKSBmdW5jdGlvbiwgbG9jYXRlZCBpbiBlb1NvcnRNYWluLmMuCioqIFdyaXRlIGEgdGVzdCBkcml2ZXIgdGhhdCBsb29wcyB0aHJvdWdoIGEgbGlzdCBvZiB0ZXN0IGNhc2VzLCB3aGVyZSBlYWNoIHRlc3QgY2FzZSBpcyBhIGdpdmVuIGlucHV0IGFycmF5IGFuZCBpdHMKKiogbGVuZ3RoLiAgQmUgc3VyZSB0byB0ZXN0IGEgdmFyaWV0eSBvZiBsZW5ndGhzLiAgIFRoZSBkcml2ZXIgaXMgYWxzbyBnaXZlbiBhIGxpc3Qgb2YgZXhwZWN0ZWQgb3V0cHV0IGFycmF5cywgYWxvbmcgd2l0aAoqKiB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHN3YXBzIHRvIGJlIG1hZGUuCioqCioqIEZvciBlYWNoIHRlc3QgY2FzZSwgcHJpbnQgYSBoZWFkZXIgdGhhdCBpbmNsdWRlcyB0aGUgdGVzdCBjYXNlIG51bWJlciwgYW5kIG9uIHNlcGFyYXRlIGxpbmVzIChzbyB0aGF0IGVsZW1lbnRzIGFyZQoqKiB2ZXJ0aWNhbGx5IGFsaWduZWQgYW5kIGVhc3kgdG8gY29tcGFyZSkgcHJpbnQgdGhlIGdpdmVuIGlucHV0IGFycmF5LCB0aGUgbW9kaWZpZWQgYW5kIHNvcnRlZCBvdXRwdXQgYXJyYXksIGFuZCB0aGUKKiogZXhwZWN0ZWQgYXJyYXkuICBBbG9uZyB3aXRoIHRob3NlLCBwcmludCB0aGUgZXhwZWN0ZWQgYW5kIGFjdHVhbCBudW1iZXIgb2Ygc3dhcHMgbWFkZS4gIEZpbmFsbHksIHByaW50IG91dCBhIGZpbmFsCioqIHN0YXR1cywgUEFTUyBvciBGQUlMLCBmb3IgZWFjaCB0ZXN0IGNhc2UgYmFzZWQgb24gd2hldGhlciB0aGUgYWN0dWFsIHJlc3VsdHMgbWF0Y2ggdGhlIGV4cGVjdGVkIHJlc3VsdHMuCioqIAoqKiBUbyBkZWZpbmUgeW91ciB0ZXN0IGRhdGEsIGRlZmluZSBhIHBhaXIgb2YgMi1kaW1lbnNpb24gYXJyYXlzLCBjYWxsZWQgImdpdmVuIiBhbmQgImV4cGVjdGVkIi4gIFRoZSBmaXJzdAoqKiBkaW1lbnNpb24gb2YgZWFjaCBhcnJheSBpcyB0aGUgdGVzdCBjYXNlLiAgWW91IGRlY2lkZSBob3cgbWFueSB0ZXN0IGNhc2VzIHRoZXJlIGFyZS4gIFRoZSBzZWNvbmQgZGltZW5zaW9uIGlzIHRoZQoqKiBlbGVtZW50cyBvZiB0aGUgYXJyYXkgYmVpbmcgdGVzdGVkIGZvciBlYWNoIHRlc3QgY2FzZS4gIFJlc2VydmUgdGhlIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCB0ZXN0IGNhc2UgYXJyYXkgZm9yCioqIGEgc3BlY2lhbCBwdXJwb3NlLgoqKiAKKiogRm9yIHRoZSBhcnJheSAiZ2l2ZW4iLCB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoYXQgcm93LCBhbmQgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBhcmUKKiogdGhlIHVuc29ydGVkIGlucHV0IGFycmF5LiAgRm9yIHRoZSBhcnJheSAiZXhwZWN0ZWQiLCB0aGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHN3YXBzIG1hZGUsIGFuZAoqKiB0aGUgcmVtYWluaW5nIGVsZW1lbnRzIGFyZSB0aGUgZXhwZWN0ZWQgc29ydGVkIG91dHB1dCBhcnJheS4KKioKKiogQmVsb3cgaXMgYW4gSU5DT01QTEVURSBzYW1wbGUgb2Ygd2hhdCB0aGUgdGVzdCBhcnJheXMgbG9vayBsaWtlOgoqKgoqKiAgICBpbnQgZ2l2ZW5bTlVNX1RFU1RTXVtNQVhfQVJSQVlfU0laRV0gPSAKKiogICAgewoqKiAgICAgICAgeyAwIH0sCioqICAgICAgICB7IDEsIDUgfSwKKiogICAgICAgIHsgMiwgMTAsIDEyIH0sCioqICAgICAgICB7IDIsIDEyLCAxMCB9LAoqKiAgICAgICAgeyA4LCAyLCA0LCA2LCA4LCAxLCAzLCA1LCA3IH0sCioqICAgICAgICB7IDgsIDcsIDUsIDMsIDEsIDgsIDYsIDQsIDIgfSwKKiogICAgfTsKKioKKiogICAgaW50IGV4cGVjdGVkW05VTV9URVNUU11bTUFYX0FSUkFZX1NJWkVdID0gCioqICAgIHsKKiogICAgICAgIHsgIDAgfSwKKiogICAgICAgIHsgIDAsIDUgfSwKKiogICAgICAgIHsgIDAsIDEwLCAxMiB9LAoqKiAgICAgICAgeyAgMSwgMTAsIDEyIH0sCioqICAgICAgICB7ICAwLCAyLCA0LCA2LCA4LCAxLCAzLCA1LCA3IH0sCioqICAgICAgICB7IDI4LCAyLCA0LCA2LCA4LCAxLCAzLCA1LCA3IH0sCioqICAgIH07CioqCioqIENvcHkgYW5kIHBhc3RlIHlvdXIgcHJvZ3JhbSBvdXRwdXQgdG8gRXZlbk9kZFNvcnRUZXN0LnR4dC4gIEJlbG93IGlzIGFuIGluY29tcGxldGUgc2FtcGxlIHRlc3Qgb3V0cHV0IGZyb20gbXkKKiogc29sdXRpb246CioqCioqIFdlbGNvbWUgdG8gdGhlIEV2ZW5PZGRTb3J0KCkgdGVzdCBkcml2ZXIuCioqIAoqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3QgMQoqKiAgICAgIEdpdmVuOiAoKQoqKiAgICAgICAgR290OiAoKSB3aXRoIDAgc3dhcHMKKiogICBFeHBlY3RlZDogKCkgd2l0aCAwIHN3YXBzCioqICAgIE91dGNvbWU6IFBBU1MKKiogCioqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdCAyCioqICAgICAgR2l2ZW46ICg1KQoqKiAgICAgICAgR290OiAoNSkgd2l0aCAwIHN3YXBzCioqICAgRXhwZWN0ZWQ6ICg1KSB3aXRoIDAgc3dhcHMKKiogICAgT3V0Y29tZTogUEFTUwoqKiAKKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0IDQKKiogICAgICBHaXZlbjogKDEwLCAxMikKKiogICAgICAgIEdvdDogKDEwLCAxMikgd2l0aCAwIHN3YXBzCioqICAgRXhwZWN0ZWQ6ICgxMCwgMTIpIHdpdGggMCBzd2FwcwoqKiAgICBPdXRjb21lOiBQQVNTCioqIAoqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3QgNQoqKiAgICAgIEdpdmVuOiAoMTIsIDEwKQoqKiAgICAgICAgR290OiAoMTAsIDEyKSB3aXRoIDEgc3dhcAoqKiAgIEV4cGVjdGVkOiAoMTAsIDEyKSB3aXRoIDEgc3dhcAoqKiAgICBPdXRjb21lOiBQQVNTCioqIAoqKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3QgNgoqKiAgICAgIEdpdmVuOiAoMTEsIDEzKQoqKiAgICAgICAgR290OiAoMTEsIDEzKSB3aXRoIDAgc3dhcHMKKiogICBFeHBlY3RlZDogKDExLCAxMykgd2l0aCAwIHN3YXBzCioqICAgIE91dGNvbWU6IFBBU1MKKiogCioqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVzdCA3CioqICAgICAgR2l2ZW46ICgxMywgMTEpCioqICAgICAgICBHb3Q6ICgxMSwgMTMpIHdpdGggMSBzd2FwCioqICAgRXhwZWN0ZWQ6ICgxMSwgMTMpIHdpdGggMSBzd2FwCioqICAgIE91dGNvbWU6IFBBU1MKKioKKi8KCiNpbmNsdWRlIDxzdGRpby5oPgoKdm9pZCBTd2FwKGludCAqIGN1cnJlbnQsIGludCAqIG5leHQpCnsKCWludCB0ZW1wID0gMDsKCQoJdGVtcCA9ICpjdXJyZW50OwoJKmN1cnJlbnQgPSAqbmV4dDsKCSpuZXh0ID0gdGVtcDsKfQoKdm9pZCBDb21wYXJlKGludCAqIGN1cnJlbnQsIGludCAqIG5leHQsIGludCAqIHN3YXBfY291bnQpCnsKCQoJaWYgKCpjdXJyZW50ID4gKm5leHQpCgl7CgkJU3dhcChjdXJyZW50LCBuZXh0KTsKCQkqc3dhcF9jb3VudCA9ICpzd2FwX2NvdW50ICsgMTsKCX0KCQp9Cgp2b2lkIEV2ZW5PZGRTb3J0KGludCAqIHRlc3RfYXJyYXkpCnsKCWludCBpID0gMDsKCWludCBzd2FwX2NvdW50ID0gMDsKCQoJd2hpbGUoMSkKCXsKCQlzd2FwX2NvdW50ID0gMDsKCQkKCQlmb3IgKGkgPSAxIDsgaSA8ICp0ZXN0X2FycmF5IDsgaSsrKQoJCXsKCQkJQ29tcGFyZSgodGVzdF9hcnJheStpKSwodGVzdF9hcnJheStpKzEpLCZzd2FwX2NvdW50KTsKCQl9CgkJCgkJcHJpbnRmKCIlZCIsc3dhcF9jb3VudCk7CgkJCgkJaWYgKHN3YXBfY291bnQgPT0gMCk7CgkJCWJyZWFrOwoJfQp9CgppbnQgbWFpbigpCnsKCWludCB0ZXN0X2FycmF5WzldID0gezgsMywyLDcsNSw0LDgsMSw5fTsKCWludCBpID0gMDsKCQoJCglFdmVuT2RkU29ydCh0ZXN0X2FycmF5KTsKCQoJcmV0dXJuIDA7Cn0K