Farming is something that I want to do in the future, farming with using technology and robots and… but I’ll write about that in some other occasion. One of the latest Codility challenges was farmland sprinklers arrangement problem and finding an optimal way to do that. Besides that I got algorithm mind challenge this time I got inspiration and made me daydream about the possibilities in farming with using technology.

So here is what you need to do in order to help Joe the Farmer.

Joe the Farmer owns a square plot of farmland whose sides are of length N. The land is split into N rows and N columns of equal size, so that there are N^{2} identical square fields within the farmland. Thanks to the abundant crops that Joe harvested last year, he could afford to buy N sprinklers. They significantly reduce the amount of time that Joe spends watering his plants.

Every sprinkler can be placed in any field of the farmland, but no two sprinklers can occupy the same field. Upon activation, each sprinkler irrigates every field within the same column and row in which it appears.

After delivery, the sprinklers were placed in a batch, so the K-th sprinkler is positioned in field (X** _{K}**, Y

**). Joe knows that this arrangement is not optimal, as some fields may not be watered by any sprinkler. Moreover, no column or row should be watered by more than one sprinkler, as it may cause over-hydration of the crops.**

_{K}In one move, the farmer can move a single sprinkler to an adjacent unoccupied field. Two fields are adjacent to one another if they have a common side.

What is the minimum number of moves required to rearrange the sprinklers so that all fields will be irrigated by sprinklers, and no two sprinklers will water the same column or row? Since the answer can be very large, provide it modulo 1,000,000,007 (10^{9} + 7).

Write a function:

class Solution { public int solution(int[] X, int[] Y); }

that, given arrays X and Y, both consisting of N integers and representing the coordinates of consecutive sprinklers, returns a minimal number of moves modulo 1,000,000,007, required to irrigate all fields.

For example, given array X = [1, 2, 2, 3, 4] and array Y = [1, 1, 4, 5, 4] the function should return 5, as we can make following moves:

For another example, given array X = [1, 1, 1, 1] and array Y = [1, 2, 3, 4] the function should return 6:

Given array X = [1, 1, 2] and array Y = [1, 2, 1] the function should return 4:

Write an **efficient** algorithm for the following assumptions:

- N is an integer within the range [2..100,000];
- each element of arrays X, Y is an integer within the range [1..N];
- each sprinkler appears in a distinct field (no field may contain more than one sprinkler).

These are my solution results:

I got my Golden Award, if you want to try to come to a solution you can do that here https://app.codility.com/programmers/challenges/selenium2018/

Until next time, happy codding

J.

Congrats!

This challenge is quite though… Can I ask you what approach did you use? 🙂

LikeLiked by 1 person

Thanks! Well first I “projected” the sprinkles on the X and Y axis, and saved the number of sprinkles on each position. Then looped separately both axis to redistribute the sprinkles equally. Actually you can check all of my solutions from 2018.

Here you can find links to all certificates and from there there is a link to the solution.

p.s. when I look at the solution now maybe there is a more elegant way to solve this 🙂

LikeLike

Thank you for your reply, J.!

Actually I can’t find the link for your solutions anywhere. 😦

Can you please post it here? 🙂

LikeLiked by 1 person

Of course you can’t find it because I forgot to paste the link 🙂 Here is it with links to the all of my golden awards https://dotjord.wordpress.com/2019/01/04/2018-codility-challenges-summary/

If you open any of the certificates there is a link “Review detailed assessment” which will take you to the detailed solution 🙂

And here is the solution for this challenge: https://app.codility.com/cert/view/cert3UV48P-ZP97NGYPSNFD9F4M/details/

p.s. If you like really tough challenge check the Chromum 2017, at least it was for me 🙂

LikeLike

Thank you! I totally missed the link on “Review detailed assessment” haha

I’ll definitely check Chromum 2017! 😀

LikeLike