DEV Community

Daily Challenge #117 - MinMinMax

dev.to staff on November 14, 2019

Given an unsorted array of integers, find the smallest number in the array, the largest number in the array, and the smallest number between the tw...
Collapse
 
craigmc08 profile image
Craig McIlwrath

Haskell solution:

import Data.List ((\\))

minminmax :: (Ord a, Enum a) => [a] -> (a, a, a)
minminmax xs = let min = minimum xs
                   max = maximum xs
                   range = [min..max] \\ xs
               in  (min, head range, max)

The \\ operator is the list difference, and the .. can be used on any enum type to build a list. This means this works for a large number of types, like:

minminmax "sonicthehedgehog" = ('c', 'f', 't')
Collapse
 
mercatante profile image
Steven Mercatante
function minMinMax(arr) {
  // Sorting `arr` lets us easily select the min and max values
  arr.sort((a, b) => a - b)
  const min = arr[0]
  const max = arr[arr.length - 1]

  // Starting at the `min` number, search between 
  // `min` and `max` until you find a value that's not in `arr`
  let minimumAbsent = null
  for (let i = min; i < max; i++) {
    if (!arr.includes(i)) {
      minimumAbsent = i
      break
    }
  }

  return [min, minimumAbsent, max]
}

minMinMax([-1, 4, 5, -23, 24]); //[-23, -22, 24]
// minMinMax([1, 3, -3, -2, 8, -1]); //[-3, 0, 8]
// minMinMax([2, -4, 8, -5, 9, 7]); //[-5, -3, 9]

Runnable example:

Collapse
 
peter279k profile image
peter279k

Here is the PHP code snippets:

function minMinMax($array) {
  print_r($array);
  $ans = [];
  $ans[0] = min($array);

  $number = $ans[0];
  while (true) {
    $number += 1;

    $ans[1] = $number;
    if (in_array($ans[1], $array) === false) {
      break;
    }
  }

  $ans[2] = max($array);

  return $ans;
}
Collapse
 
kiliman profile image
Kiliman • Edited

TypeScript with tests

github.com/kiliman/dev-to-daily-ch...

export const minMinMax = (
  set: number[],
): [number, number | undefined, number] => {
  if (set.length < 1) {
    throw new Error('set must include at least one number')
  }
  const sorted = [...set].sort((a, b) => a - b)
  const smallest = sorted[0]
  const largest = sorted[set.length - 1]
  let minimumAbsent = smallest + 1
  for (let i = 1; i < sorted.length; i++) {
    if (minimumAbsent !== sorted[i]) break
    minimumAbsent++
  }

  return [
    smallest,
    minimumAbsent > largest ? undefined : minimumAbsent,
    largest,
  ]
}

Test

import { minMinMax } from '.'

it('should throw an error if less than one element', () => {
  expect(() => minMinMax([])).toThrow()
})

it('should return smallest, minimumAbsent, largest from array of numbers', () => {
  expect(minMinMax([-1, 4, 5, -23, 24])).toStrictEqual([-23, -22, 24])
  expect(minMinMax([1, 3, -3, -2, 8, -1])).toStrictEqual([-3, 0, 8])
  expect(minMinMax([2, -4, 8, -5, 9, 7])).toStrictEqual([-5, -3, 9])
})

it('should return undefined for minimumAbsent if not present between smallest and largest', () => {
  expect(minMinMax([-3, -2, -1, 0, 1, 2, 3])).toStrictEqual([-3, undefined, 3])
})

it('should support a single number', () => {
  expect(minMinMax([1])).toStrictEqual([1, undefined, 1])
})

it('should support two numbers', () => {
  expect(minMinMax([1, 2])).toStrictEqual([1, undefined, 2])
  expect(minMinMax([1, 3])).toStrictEqual([1, 2, 3])
})
Collapse
 
kesprit profile image
kesprit

My solution in Swift, I check if the array is not empty and bigger than two elements :

func minMinMax(array: [Int]) -> [Int] {
    guard !array.isEmpty, array.count > 2,
        let min = array.min(),
        let max = array.max(),
        let minimumAbsent = ((min...max).first{!array.contains($0)})
        else {
            return []
    }
    return [min, minimumAbsent, max]
}
Collapse
 
aminnairi profile image
Amin

Elm

import List exposing (minimum, maximum, member)
import Maybe exposing (withDefault)


nextUnknownInteger : Int -> List Int -> Int
nextUnknownInteger integer integers =
    let
        nextInteger = integer + 1
    in
        if member nextInteger integers then
            nextUnknownInteger nextInteger integers
        else
            nextInteger


minMinMax : List Int -> List Int
minMinMax integers =
    let
        minimumInteger     = withDefault 0 <| minimum integers
        maximumInteger     = withDefault 0 <| maximum integers
        nextMinimumInteger = nextUnknownInteger minimumInteger integers

    in
        [minimumInteger, nextMinimumInteger, maximumInteger]

Playground

Here.

Collapse
 
wheatup profile image
Hao

I'm sure there's less time complexity one but this boi will get its job done

const minMinMax = arr => {
    const [min, max] = [...arr].sort().splice(1, arr.length - 3);
    for (let i = min + 1; i < max; i++) {
        if (!arr.includes(i)) {
            return [min, i, max];
        }
    }
    return [min, undefined, max];
}

minMinMax([-1, 4, 5, -23, 24]); // [ -23, -22, 24 ]
Collapse
 
j_medland profile image
John Medland

Here is a solution with LabVIEW. Not tried LabVIEW? The community edition beta is now open!🎉🎉

Coding Challange 117 - LabVIEW Snippet

 
dak425 profile image
Donald Feury

Holy crap I had no idea you could do that in Ruby. Thank ya for the old post that explained it very clearly.

Collapse
 
dak425 profile image
Donald Feury
min, *middle, max = arr.sort

Can you explain this part? I haven't seen sort used like this before.

 
dak425 profile image
Donald Feury

That is fascinating, I had no idea. I will keep that in mind.

Collapse
 
shinelee profile image
shinelee

Explanatory post. Thanks for sharing with US. I am lucky to read this content. Sure. But Array#sort is secondary here, it works with any array on the right hand side of an assignment thank you from walgreenslistens blog for walgreens survey

Collapse
 
colorman4 profile image
colorman4

Lucky to read this article, this is amazing, thanks for sharing!
coloring-pages.io