5 kyu

Some Egyptian fractions

68 of 2,769g964

Description:

Given a rational number n

n >= 0, with denominator strictly positive

  • as a string (example: "2/3" in Ruby, Python, Clojure, JS, CS, Go)
  • or as two strings (example: "2" "3" in Haskell, Java, CSharp, C++, Swift, Dart)
  • or as a rational or decimal number (example: 3/4, 0.67 in R)
  • or two integers (Fortran)

decompose this number as a sum of rationals with numerators equal to one and without repetitions (2/3 = 1/2 + 1/6 is correct but not 2/3 = 1/3 + 1/3, 1/3 is repeated).

The algorithm must be "greedy", so at each stage the new rational obtained in the decomposition must have a denominator as small as possible. In this manner the sum of a few fractions in the decomposition gives a rather good approximation of the rational to decompose.

2/3 = 1/3 + 1/3 doesn't fit because of the repetition but also because the first 1/3 has a denominator bigger than the one in 1/2 in the decomposition 2/3 = 1/2 + 1/6.

Example:

(You can see other examples in "Sample Tests:")

decompose("21/23") or "21" "23" or 21/23 should return 

["1/2", "1/3", "1/13", "1/359", "1/644046"] in Ruby, Python, Clojure, JS, CS, Haskell, Go, Scala

"[1/2, 1/3, 1/13, 1/359, 1/644046]" in Java, CSharp, C++, Dart

"1/2,1/3,1/13,1/359,1/644046" in C, Swift, R

Notes

  1. The decomposition of 21/23 as

    21/23 = 1/2 + 1/3 + 1/13 + 1/598 + 1/897
    

    is exact but don't fulfill our requirement because 598 is bigger than 359. Same for

    21/23 = 1/2 + 1/3 + 1/23 + 1/46 + 1/69 (23 is bigger than 13)
    or 
    21/23 = 1/2 + 1/3 + 1/15 + 1/110 + 1/253 (15 is bigger than 13).
    
  2. The rational given to decompose could be greater than one or equal to one, in which case the first "fraction" will be an integer (with an implicit denominator of 1).

  3. If the numerator parses to zero the function "decompose" returns [] (or "",, or "[]").

  4. The number could also be a decimal which can be expressed as a rational.

Example:

0.6 in Ruby, Python, Clojure,JS, CS, Julia, Go

"66" "100" in Haskell, Java, CSharp, C++, C, Swift, Scala, Kotlin, Dart, ...

0.67 in R.

Ref: http://en.wikipedia.org/wiki/Egyptian_fraction

Algorithms
Mathematics

More By Author:

Check out these other kata created by g964

Stats:

CreatedMar 5, 2015
PublishedMar 5, 2015
Warriors Trained19544
Total Skips6781
Total Code Submissions38187
Total Times Completed2769
Ruby Completions68
Python Completions817
Clojure Completions33
Haskell Completions71
JavaScript Completions321
CoffeeScript Completions7
Java Completions245
C# Completions157
Elixir Completions32
TypeScript Completions78
C++ Completions281
PHP Completions54
Crystal Completions7
C Completions189
Swift Completions79
R Completions19
Julia Completions21
Scala Completions49
Go Completions77
Nim Completions7
Racket Completions10
F# Completions14
VB Completions7
Kotlin Completions49
Groovy Completions10
Fortran Completions5
Rust Completions117
Dart Completions57
Pascal Completions6
Lua Completions27
Perl Completions5
Elm Completions2
D Completions3
Prolog Completions5
Total Stars452
% of votes with a positive feedback rating86% of 476
Total "Very Satisfied" Votes374
Total "Somewhat Satisfied" Votes75
Total "Not Satisfied" Votes26
Ad
Contributors
  • g964 Avatar
  • myjinxin2015 Avatar
  • kazk Avatar
  • Blind4Basics Avatar
  • Voile Avatar
  • hobovsky Avatar
  • user8436785 Avatar
  • KayleighWasTaken Avatar
  • saudiGuy Avatar
Ad