aboutsummaryrefslogtreecommitdiff
path: root/challenge-114/andinus/README.org
blob: 221092d3f00246c435f46f8882c87dfa4a330452 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#+title: Challenge 110
#+date: 2021-04-29
#+html_link_up: ../index.html
#+export_file_name: index
#+setupfile: ~/.emacs.d/org-templates/level-2.org

* 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:
#+begin_src
+nn  nnnnnnnnnn
(nn) nnnnnnnnnn
nnnn nnnnnnnnnn
#+end_src

Input File:
#+begin_src
0044 1148820341
 +44 1148820341
  44-11-4882-0341
(44) 1148820341
  00 1148820341
#+end_src

Output:
#+begin_src
0044 1148820341
 +44 1148820341
(44) 1148820341
#+end_src

** Raku

- Program: [[file:raku/ch-1.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.

#+begin_src raku
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);
}
#+end_src

* Task 2 - Transpose File

You are given a text file.

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

Input File:
#+begin_src
name,age,sex
Mohammad,45,m
Joe,20,m
Julie,35,f
Cristina,10,f
#+end_src

Output:
#+begin_src
name,Mohammad,Joe,Julie,Cristina
age,45,20,35,10
sex,m,m,f,f
#+end_src

** Raku

- Program: [[file:raku/ch-2.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
#+begin_quote
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.
#+end_quote

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

#+begin_src raku
.say for zip($file.IO.lines.map(*.split(","))).map(*.join(","));
#+end_src