aboutsummaryrefslogtreecommitdiff
path: root/challenge-113/andinus/README
blob: cef31723b7e86d098f9fdabb1f1dce594c39996c (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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
                            ━━━━━━━━━━━━━━━
                             CHALLENGE 110

                                Andinus
                            ━━━━━━━━━━━━━━━


                               2021-04-29


Table of Contents
─────────────────

Task 1 - Valid Phone Numbers
Task 2 - Transpose File





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
────

  • 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.

  ┌────
  │ 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
────

  • 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>
        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(","));
  └────