Wersja 1, mało efektywna i mało elegancka:
object Main extends Application {
def contract(number: String): String = {
if (number.length < 2)
return number
contract(number.map(_.asDigit).sum.toString)
}
print(contract(Console.readLine))
}
Wersja 2, elegancka i efektywna, funkcje w funkcjach - fajny bajer:
object Main extends Application {
def contract(sNumber: String) = {
def contractInt(iNumber: Int): Int = {
if (iNumber < 10)
iNumber
else
contractInt(iNumber % 10 + iNumber / 10)
}
contractInt(sNumber.map(_.asDigit).sum)
}
print(contract(Console.readLine))
}
Wersja 3, najmniej elegancka i średnio efektywna, ale za to najkrótsza:
object Main extends Application {
var bigInt = BigInt(readLine)
while (bigInt > 9) {
bigInt = bigInt % 10 + bigInt / 10;
}
print(bigInt)
}
Ogłaszam konkurs na najbardziej elegancki kod rozwiązujący zadanie podobne do zadania z pierwszego posta, tzn wczytywany numer nie musi się mieścić w 32-bitach. Autor nie dopisał też jednej rzeczy: cyfry sumujemy rekurencyjnie, aż wyjdzie nam suma jednocyfrowa.