Weekly Challenge 273
Each week Mohammad S. Anwar sends out The Weekly Challenge, a chance for all of us to come up with solutions to two weekly tasks. My solutions are written in Python first, and then converted to Perl. It's a great way for us all to practice some coding.
Task 1: Percentage of Character
Task
You are given a string, $str
and a character $char
.
Write a script to return the percentage, nearest whole, of given character in the given string.
My solution
Let's talk about 'nearest integer', and rounding. When you go to supermarket and something costs 45¢, you generally will be charged 50¢ if paying with cash and your currency doesn't have a 5¢ coin. This is called cash rounding, and probably what you were taught at school.
Python uses bankers rounding, where numbers are rounded to the nearest even. Therefore both 35¢ and 45¢ would be rounded to 40¢, while the sum remains the same (80¢).
This task is ambiguous as it does not mention which method to use when the percentage is a half figure. I've used the cash rounding method, as the sixth example supports this.
For this task, I take the number of characters that occur in the length of the string divided by the length of the string multiplied by 100 + 0.5 (for the rounding).
def char_percentage(s: str, char: str) -> int:
return floor(s.count(char) / len(s) * 100 + 0.5)
The Perl solution is a bit more involved, as I don't believe there is a way to count the number of characters in a string. For this solution, I loop through each character and increase the occurrences
value if is char
.
my $occurrences = 0;
for my $pos ( 0 .. length($str) - 1 ) {
if ( substr( $str, $pos, 1 ) eq $char ) {
$occurrences++;
}
}
say int( $occurrences / length($str) * 100 + 0.5 );
Examples
$ ./ch-1.py perl e
25
$ ./ch-1.py java a
50
$ ./ch-1.py python m
0
$ ./ch-1.py ada a
67
$ ./ch-1.py ballerina l
22
$ ./ch-1.py analitik k
13
Task 2: B After A
Task
You are given a string, $str
.
Write a script to return true
if there is at least one b
, and no a
appears after the first b
.
My solution
There are two likely ways to perform this task. One would be to take the position of last a
(or -1 if there is no a
) and check this is less than the position of the first b
.
The second option is to use regular expressions. This is the approach that I took. The regexp I used is ^[^b]*b[^a]*$
. This matches zero or characters other than b
, a b
and then makes sure there are no a
s after that.
Examples
$ ./ch-2.py aabb
True
$ ./ch-2.py abab
False
$ ./ch-2.py aaa
False
$ ./ch-2.py bbb
True
Top comments (0)