**Other posts from this series:**

__DataWeave programming challenge #1: Add numbers separated by paragraphs and get the max number____DataWeave programming challenge #2: Rock Paper Scissors game score system____DataWeave programming challenge #3: Count palindrome phrases using the Strings module____DataWeave programming challenge #4: Solve the Tower of Hanoi mathematical puzzle____DataWeave programming challenge #5: Reverse a phrase's words, but keep the punctuation__**DataWeave programming challenge #6: Using tail-recursion to get the factorial of a number**__DataWeave programming challenge #7: Modify certain values from a JSON structure____DataWeave programming challenge #8: Sum all digits to get a 1-digit number__

**In this post:**

Try to solve this challenge on your own to maximize learning. We recommend you refer to the __DataWeave documentation____ __** only**. Try to avoid using Google or asking others so you can learn on your own and become a DataWeave expert!

## Input

Consider the following input payload (can be of **txt** format):

```
3
5
-6
300
```

## Explanation of the problem

Create a

__tail-recursive function__to get the__factorial__of each**positive**number from the payload.Sum the results.

Retrieve the digits/characters located at positions 20-25.

Make sure to return a number and not a string.

Numbers 0 or less won't be calculated.

For example:

The factorial of 3 is 6 (3 x 2 x 1)

The factorial of 5 is 120 (5 x 4 x 3 x 2 x 1)

The factorial of -6 won't be calculated so the result will be 0

And so on

Once the results are summed (6 + 120 + 0...), extract the digits at indexes 20 to 25.

Return this last 6-digit number.

## Expected output

In this case, the expected output would be:

`537046`

## Clues

If you're stuck with your solution, feel free to check out some of these clues to give you ideas on how to solve it!

## Answer

If you haven't solved this challenge yet, we encourage you to keep trying! It's ok if it's taking longer than you thought. We all have to start somewhere âœ¨ Check out the clues and read the docs before giving up. You got this!! ðŸ’™

There are many ways to solve this challenge, but you can find here one of my solutions!

Solution #1

Feel free to comment your code below for others to see! ðŸ˜„

Subscribe to receive notifications as soon as new content is published âœ¨

For those using dw::core::Arrays slice it excludes the last index, so select 20-26

%dw 2.0 output application/json fun solve(x)= x reduce(item, acc) -> ( (if(item > 0) acc + factorial(item) else acc)) fun factorial(x)= 2 to x reduce(item, acc) -> (acc*item) --- (solve(payload splitBy('\n')) splitBy(''))[20 to 25] joinBy('')

%dw 2.0 fun factorial(num)= num to 1 reduce ((item, accumulator) -> accumulator * item) fun pos(val) = val[20 to 25] --- pos(sum((payload splitBy "\n" ) map factorial($))) as Number

Tried this out. :)

https://gist.github.com/Shadow-Devil/38922025e3ab95f18bc21633eae5f27f