Closest and Smallest
Description:
Input
- a string
strng
of n positive numbers (n = 0 or n >= 2)
Let us call weight of a number the sum of its digits.
For example 99
will have "weight" 18
, 100
will have "weight" 1
.
Two numbers are "close" if the difference of their weights is small.
Task:
For each number in strng
calculate its "weight" and then find two numbers
of strng
that have:
- the smallest difference of weights ie that are the closest
- with the smallest weights
- and with the smallest indices (or ranks, numbered from 0) in
strng
Output:
- an array of two arrays, each subarray in the following format:
[number-weight, index in strng of the corresponding number, original corresponding number in
strng]
or a pair of two subarrays (Haskell, Clojure, FSharp) or an array of tuples (Elixir, C++)
or a (char*) in C or a string in some other languages mimicking an array of two subarrays or a string
or a matrix in R (2 rows, 3 columns, no columns names)
The two subarrays are sorted in ascending order by their number weights if these weights are different, by their indexes in the string if they have the same weights.
Examples:
Let us call that function closest
strng = "103 123 4444 99 2000"
the weights are 4, 6, 16, 18, 2 (ie 2, 4, 6, 16, 18)
closest should return [[2, 4, 2000], [4, 0, 103]] (or ([2, 4, 2000], [4, 0, 103])
or [{2, 4, 2000}, {4, 0, 103}] or ... depending on the language)
because 2000 and 103 have for weight 2 and 4, their indexes in strng are 4 and 0.
The smallest difference is 2.
4 (for 103) and 6 (for 123) have a difference of 2 too but they are not
the smallest ones with a difference of 2 between their weights.
....................
strng = "80 71 62 53"
All the weights are 8.
closest should return [[8, 0, 80], [8, 1, 71]]
71 and 62 have also:
- the smallest weights (which is 8 for all)
- the smallest difference of weights (which is 0 for all pairs)
- but not the smallest indices in strng.
....................
strng = "444 2000 445 544"
the weights are 12, 2, 13, 13 (ie 2, 12, 13, 13)
closest should return [[13, 2, 445], [13, 3, 544]] or ([13, 2, 445], [13, 3, 544])
or [{13, 2, 445}, {13, 3, 544}] or ...
444 and 2000 have the smallest weights (12 and 2) but not the smallest difference of weights;
they are not the closest.
Here the smallest difference is 0 and in the result the indexes are in ascending order.
...................
closest("444 2000 445 644 2001 1002") --> [[3, 4, 2001], [3, 5, 1002]] or ([3, 4, 2001],
[3, 5, 1002]]) or [{3, 4, 2001}, {3, 5, 1002}] or ...
Here the smallest difference is 0 and in the result the indexes are in ascending order.
...................
closest("239382 162 254765 182 485944 468751 49780 108 54")
The weights are: 27, 9, 29, 11, 34, 31, 28, 9, 9.
closest should return [[9, 1, 162], [9, 7, 108]] or ([9, 1, 162], [9, 7, 108])
or [{9, 1, 162}, {9, 7, 108}] or ...
108 and 54 have the smallest difference of weights too, they also have
the smallest weights but they don't have the smallest ranks in the original string.
..................
closest("54 239382 162 254765 182 485944 468751 49780 108")
closest should return [[9, 0, 54], [9, 2, 162]] or ([9, 0, 54], [9, 2, 162])
or [{9, 0, 54}, {9, 2, 162}] or ...
Notes :
If n == 0
closest("")
should return []
or ([], []) in Haskell, Clojure, FSharp
or [{}, {}] in Elixir or '(() ()) in Racket
or {{0,0,0}, {0,0,0}} in C++
or "[(), ()]" in Go, Nim,
or "{{0,0,0}, {0,0,0}}" in C, NULL in R
or "" in Perl.
See Example tests for the format of the results in your language.
Similar Kata:
Stats:
Created | Jan 1, 2017 |
Published | Jan 1, 2017 |
Warriors Trained | 19089 |
Total Skips | 6162 |
Total Code Submissions | 31110 |
Total Times Completed | 3343 |
Ruby Completions | 110 |
Python Completions | 978 |
JavaScript Completions | 735 |
CoffeeScript Completions | 6 |
Java Completions | 315 |
C# Completions | 185 |
Haskell Completions | 42 |
Clojure Completions | 38 |
Elixir Completions | 59 |
F# Completions | 25 |
Crystal Completions | 6 |
PHP Completions | 99 |
TypeScript Completions | 148 |
C++ Completions | 203 |
C Completions | 136 |
OCaml Completions | 14 |
R Completions | 33 |
Shell Completions | 10 |
Groovy Completions | 9 |
Scala Completions | 75 |
Go Completions | 81 |
Nim Completions | 3 |
Racket Completions | 5 |
VB Completions | 8 |
Kotlin Completions | 58 |
Rust Completions | 79 |
Pascal Completions | 6 |
Perl Completions | 9 |
Elm Completions | 2 |
D Completions | 4 |
Erlang Completions | 4 |
Total Stars | 408 |
% of votes with a positive feedback rating | 87% of 550 |
Total "Very Satisfied" Votes | 438 |
Total "Somewhat Satisfied" Votes | 84 |
Total "Not Satisfied" Votes | 28 |
Total Rank Assessments | 11 |
Average Assessed Rank | 5 kyu |
Highest Assessed Rank | 3 kyu |
Lowest Assessed Rank | 6 kyu |