UP / HOME

Challenge 110

Table of Contents

Task 1 - Valid Phone Numbers

You are given a text file.

Write a script to display all valid phone numbers in the given text file.

Acceptable Phone Number Formats:

+nn  nnnnnnnnnn
(nn) nnnnnnnnnn
nnnn nnnnnnnnnn

Input File:

0044 1148820341
 +44 1148820341
  44-11-4882-0341
(44) 1148820341
  00 1148820341

Output:

0044 1148820341
 +44 1148820341
(44) 1148820341

Raku

PhoneNumber grammar parses each entry one by one. country-code handles the 3 cases for country codes & number handles the other part.

We just loop over every entry & print it if it's a valid phone number.

grammar PhoneNumber {
    token TOP { \s* <country-code> \s+ <number> }
    token country-code { '+' \d \d | '(' \d \d ')' | \d ** 4 }
    token number { \d ** 10 }
}

for $file.IO.lines -> $entry {
    say $entry if PhoneNumber.parse($entry);
}

Task 2 - Transpose File

You are given a text file.

Write a script to transpose the contents of the given file.

Input File:

name,age,sex
Mohammad,45,m
Joe,20,m
Julie,35,f
Cristina,10,f

Output:

name,Mohammad,Joe,Julie,Cristina
age,45,20,35,10
sex,m,m,f,f

Raku

.IO.lines part creates a list of lines in the files, then we split it at ",". zip then returns a list which is formatted the way we want it to be.

From the documentation: https://docs.raku.org/routine/zip

Creates a supply that emits combined values as soon as there is a new value seen on all of the supplies.

zip iterates through each of the input lists synchronously, 'Zipping' them together, so that elements are grouped according to their input list index, in the order that the lists are provided.

We then join the entries with ",", loop over the formatted lines & print them.

.say for zip($file.IO.lines.map(*.split(","))).map(*.join(","));

Andinus / 2021-04-29 / Modified: 2022-10-04 Tue 21:35 Emacs 27.2 (Org mode 9.4.4)