## DEV Community is a community of 668,514 amazing developers

We're a place where coders share, stay up-to-date and grow their careers.

# Daily Challenge #9 - What's Your Number? dev.to staff
The hardworking team behind dev.to ❤️

Write a function that accepts an array of 10 integers (between 0 and 9), that returns a string of those numbers in the form of a phone number.

The returned format must be correct in order to complete this challenge.
Don't forget the space after the closing parentheses!

Today's challenge comes from user xDranik on Codewars

Thank you to CodeWars, who has licensed redistribution of this challenge under the 2-Clause BSD License!

Want to propose a challenge for a future post? Email yo+challenge@dev.to with your suggestions!

## Discussion (26) Frederik 👨‍💻➡️🌐 Creemers

I think this challenge description is very country specific, as every country has a different way of formatting these. Corey Alexander

I agree with the other commentors that we need an example in the post to make it easier to understand! Especially with all the different ways telephone numbers are handled country to country.

Luckily the linked Codewars page has an example!

``````createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) // => returns "(123) 456-7890"
`````` Alvaro Montoro • Edited

JavaScript

I assumed the US phone number format that is (XXX) XXX-XXXX

``````const formatNumber = numbers => {

let phoneNumber = "";

// prerequisites:
//   - input must be an array
//   - with 10 elements
//   - each element will be a single digit number
if (
Array.isArray(numbers) &&
numbers.length === 10 &&
numbers.every(n => n > -1 && n < 10)
) {
// break the phone number into parts and generate the formmated string
const areaCode = numbers.slice(0,3).join('');
const firstPart = numbers.slice(3,6).join('');
const secondPart = numbers.slice(6).join('');
phoneNumber = `(\${areaCode}) \${firstPart}-\${secondPart}`;
}

return phoneNumber;
}
``````

Live demo on CodePen (with an alternative version in one line). Dylan Paulus

Nim

``````import strutils
from sequtils import map

const phone_number = @[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]

proc createPhoneNumber(numbers: seq[int]): string =
if len(numbers) < 10:
raise newException(ValueError, "invalid length provided to createPhoneNumber(), requires 10 digits")

return "(\$#\$#\$#) \$#\$#\$#-\$#\$#\$#\$#" % numbers.map(proc (p: int): string = intToStr(p))

# Run
echo createPhoneNumber(phone_number)
`````` Yozen Hernandez • Edited

Well I think I've found my new language I want to learn. Cécile Lebleu

Could you provide an example? The length and format tends to differ in different countries.
In Costa Rice, for example, it might be 8 or 11 numbers long; as in `8765-4321`, or, with the country code, `(+506) 8765-4321`. Either way it’s not 10 characters.
Thanks! Jaime López

That's not the first time a challenge is not well explained. You need to grab the whole problem description here to let people give possible solutions. I like these challenges but need a good and clear description of the problem, why don't connect to codewars directly? E. Choroba
``````#! /usr/bin/perl
use warnings;
use strict;

sub phone_num {
local \$" = "";
"(@_[0 .. 2]) @_[3..5]-@_[6..9]"
}

use Test::More tests => 1;
is phone_num(0 .. 9), '(012) 345-6789';
``````

The special variable `\$"` is used to separate arrays interpolated in double quotes. By default, it contains a space, but we need the numbers to be adjacent, so we set it locally (i.e. in a dynamic scope) to an empty string.

Another possible short solution is

``````sub phone_num {
"(012) 345-6789" =~ s/(\d)/\$_[\$1]/gr
}
``````

The substitution replaces each digit in the template string with the corresponding element of the `@_` array which keeps the list of the subroutine arguments. `/g` means "global", it's needed to replace all the digits, not just the first one. The `/r` means "return" - normally, a substitution changes the bound left-hand side value, but with `/r`, it just returns the value. Yozen Hernandez • Edited

Nice, basically what I got. `sprintf` works as well.

``````#!/usr/bin/env perl

use strict;
use warnings;

sub createPhoneNumber {
sprintf "(%s%s%s) %s%s%s-%s%s%s%s", @_;
# local \$" = "";
# "(@_[0..2]) @_[3..5]-@_[6..9]";
}

print createPhoneNumber(1, 2, 3, 4, 5, 6, 7, 8, 9, 0) . "\n";
``````

The regex solution was pretty interesting. Thanks for the explanation! Steven

python3

``````#!/usr/bin/env python3

def createPhoneNumber(array_of_integers):
return "(%s%s%s) %s%s%s-%s%s%s%s" % tuple(array_of_integers)

if __name__ == '__main__':
print(createPhoneNumber([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]))
`````` Erlang: (in the REPL)

``````Num = [8,0,0,5,5,5,1,2,1,2].
io:format("(~B~B~B) ~B~B~B-~B~B~B~B~n", Num).
(800) 555-1212
ok
``````

Or you can use io_lib:format and assign the result to a variable instead.

Checking for valid input is fairly trivial, but the Erlang convention is to assume that something this far into the system is okay, and correct for the error by dying and letting the supervisor deal with it. Python

``````var = input("Enter 10 integers: ")
var = list(var)

if len(var) != 10:
print("Invalid Entry")
else:
print('(',var,var,var,') ',var,var,var,'-',var,var,var,var, sep='')
``````

anyone's skin crawling? peter279k

Here is the simple solution with PHP:

``````function createPhoneNumber(\$numbersArray) {
\$format = "(%s%s%s) %s%s%s-%s%s%s%s";

return sprintf(
\$format,
\$numbersArray, \$numbersArray, \$numbersArray, \$numbersArray,
\$numbersArray, \$numbersArray, \$numbersArray, \$numbersArray,
\$numbersArray, \$numbersArray
);
}
`````` margo1993
``````package utils

import (
"errors"
"fmt"
"strconv"
)

func FormatPhoneNumber(phoneNumberArray []int) (string, error) {

if len(phoneNumberArray) != 10 {
return "", errors.New("Array length must be 10")
}

return fmt.Sprintf("(%s) %s-%s", intArrayToString(phoneNumberArray[:3]), intArrayToString(phoneNumberArray[3:6]), intArrayToString(phoneNumberArray[6:])), nil
}

func intArrayToString(intArray []int) string {
number := ""

for _, num := range intArray {
number += strconv.Itoa(num)
}

return number
}
`````` Fernando B 🚀 • Edited

I am not a big fan of code challenges in this format. For one people can see other answers. That can skew your thinking before even attempting the challenge. Secondly I think you should submit your own answers on codewars, and then link it here. Only people that has passed the challenge would be able to see it.

@ben definitely need a spoiler tag. ``````formatNumber :: [Int] -> Maybe String
formatNumber xs
| length xs /= 10 = Nothing
| not \$ and \$ (map (<10) xs) ++ (map (>=0) xs) = Nothing
| otherwise = Just \$ "(" ++ (showSlice 0 3 xs) ++ ") " ++ (showSlice 3 3 xs) ++ "-" ++ (showSlice 6 4 xs)
where showSlice from len = concat . map show . take len . drop from
`````` Kevin Sullivan • Edited
``````const iterative = (input: number[], schema: string = "(###) ###-####") => {
let result = schema;
input.forEach(number => (result = result.replace("#", String(number))));

return result;
};

const recursive = (
input: number[],
schema: string = "(###) ###-####",
result: string = schema
): string => {
if (head === undefined) return result;

};

export const createPhoneNumber = {
iterative,
recursive
};
`````` Ilyes Chouia • Edited

Better late than never ;p

Here's my attempt in PHP

``````function formPhoneNumber(array \$integers): string
{

if(count(\$integers) != 10) {
throw new Exception('Please provide a valid array!');
}

\$phone = "(";
foreach(\$integers as \$index => \$number){
if(\$number < 10 && \$number >= 0){
\$phone .= \$number;
if(\$index == 2){
\$phone .= ") ";
}elseif(\$index == 5){
\$phone .= "-";
}
}else{
throw new Exception("One of the numbers is invalid!");
}
}
return \$phone;

}
echo formPhoneNumber([4, 5, 5, 4, 5, 1, 7, 8, 9, 0]);
`````` Corey Alexander

My Rust Solution and test cases!

I felt this one was a little easier than some of the previous days, but nothing wrong with that!

``````#[derive(Debug, PartialEq)]
pub enum Error {
InvalidLength,
NotSingleDigitInput,
}

pub fn format_phone_numer(numbers: &[u32]) -> Result<String, Error> {
if numbers.len() != 10 {
Err(Error::InvalidLength)
} else if numbers.iter().any(|x| *x > 9) {
Err(Error::NotSingleDigitInput)
} else {
Ok(format!(
"({}{}{}) {}{}{}-{}{}{}{}",
numbers,
numbers,
numbers,
numbers,
numbers,
numbers,
numbers,
numbers,
numbers,
numbers,
))
}
}

#[cfg(test)]
mod tests {
use crate::*;

#[test]
fn it_for_a_valid_phone_number() {
assert_eq!(
format_phone_numer(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]),
Ok("(123) 456-7890".to_string())
);
assert_eq!(
format_phone_numer(&[3, 2, 1, 5, 5, 5, 3, 1, 6, 3]),
Ok("(321) 555-3163".to_string())
);
}

#[test]
fn it_errors_invalid_length_phone_number() {
assert_eq!(
format_phone_numer(&[1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 5, 6, 3]),
Err(Error::InvalidLength)
);
assert_eq!(
format_phone_numer(&[1, 2, 3, 4, 5, 6, 7,]),
Err(Error::InvalidLength)
);
}

#[test]
fn it_errors_for_non_single_digit_numbers() {
assert_eq!(
format_phone_numer(&[10, 2, 3, 4, 5, 6, 7, 8, 9, 0]),
Err(Error::NotSingleDigitInput)
);
}
}

`````` official_dulin

Go:

``````import (
"fmt"
"strconv"
"strings"
)

func CreatePhoneNumber(numbers uint) string {
strs := []string{}
for _, n := range numbers {
strs = append(strs, strconv.FormatUint(uint64(n), 10))
}
a := strings.Join(strs[:3], "")
b := strings.Join(strs[3:6], "")
c := strings.Join(strs[6:], "")
return fmt.Sprintf("(%s) %s-%s", a, b, c)
}
`````` Franco Traversaro • Edited

No PHP solutions yet? Here I come!

``````<?php

function phoneFormat(array \$numbers): string
{
if (10 !== count(\$numbers)) {
throw new \RuntimeException("Wrong input");
}
array_unshift(\$numbers, '(%d%d%d) %d%d%d-%d%d%d%d');

return call_user_func_array('sprintf', \$numbers);
}

assert('(123) 456-7890' === phoneFormat([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]), "Function not functioning :-/");
``````

But please edit the OP to explain what format do you want, not everybody comes from USA! Kasper Meyer • Edited

Ruby solution

``````require "minitest/autorun"

class PhoneNumberFormatter
def initialize digits
@digits = digits
end

def format
"(#{area_code}) #{central_office_code}-#{line_number}"
end

private

def area_code
@digits[0..2].join
end

def central_office_code
@digits[3..5].join
end

def line_number
@digits[6..9].join
end
end

class PhoneNumberFormatterTest < MiniTest::Test
def test_formatted_phone_number
output = PhoneNumberFormatter.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]).format

assert_equal "(123) 456-7890", output
end
end

`````` jmc

Clojure:

``````(defn format-number [digits]
(apply format "(%s%s%s) %s%s%s-%s%s%s%s" digits))
`````` Siddharth Venkatesan

Ruby

``````def phone_number(nums)
puts "(#{nums[0..2].join("")}) #{nums[3..5].join("")}-#{nums[6..-1].join("")}"
end

puts phone_number([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) #(123) 456-7890
``````