Those who can’t farm – make farmland fields algorithms

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.

SprinklersArrangement.png

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 N2 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 (XK, YK). 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.

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 (109 + 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:

SprinklersPerfectScore.png

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/

SeleniumGoldenAward.png

Until next time, happy codding

J.

5 thoughts on “Those who can’t farm – make farmland fields algorithms

    • 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 🙂

      Like

  1. 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 🙂

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s