Peter’s blog ✴ Week 380 ✴ 29 June 2026

THE WEEKLY CHALLENGE
Frequencies and degrees

The Perl Camel

Task 2

Reverse degree

You are given a string. Write a script to find the reverse degree of the given string.

For each character, multiply its position in the reversed alphabet
(‘a’ = 26, ‘b’ = 25, …, ‘z’ = 1) with its position in the string. Sum these products for all characters in the string to get the reverse degree.

Examples


Example 1
Input: $str = 'z'
Output: 1
Reverse alphabet value of 'z' is 1.
Position 1: 1 x 1
Sum of product: 1

Example 2
Input: $str = 'a'
Output: 26
Reverse alphabet value of 'a' is 26.
Position 1: 1 x 26
Sum of product: 26

Example 3
Input: $str = 'bbc'
Output: 147
Reverse alphabet value of 'b' is 25 and 'c' is 24.
Position 1: 1 x 25
Position 2: 2 x 25
Position 3: 3 x 24
Sum of product: 25 + 50 + 72 => 147

Example 4
Input: $str = 'racecar'
Output: 560
Reverse alphabet value of 'r' is 9, 'a' is 26, 'c' is 24 and 'e' is
   24.
Position 1: 1 x 9
Position 2: 2 x 26
Position 3: 3 x 24
Position 4: 4 x 22
Position 5: 5 x 24
Position 6: 6 x 26
Position 7: 7 x 9
Sum of product: 9 + 52 + 72 + 88 + 120 + 156 + 63

Example 5
Input: $str = 'zyx'
Output: 14
Reverse alphabet value of 'z' is 1, 'y' is 2 and 'x' is 3.
Position 1: 1 x 1
Position 2: 2 x 2
Position 3: 3 x 3
Sum of product: 1 + 4 + 9

Analysis

The Unicode code points given by ord('λ') for characters a-z are 97-122. What is required to calculate the reverse degree is thus 123 - ord('λ'), which will range from a = 26 to z = 1.

Add those together for each character in the string and that's its reverse degree.

Note that as in task 1 I have converted any upper case letters to lower case and removed any characters not in [a-z].

Perl Weekly’s review

from PW issue 780

Peter utilising natively fast ASCII byte operations and provides a very elegant and performance-based method to solving weekly challenge. With the help of integer array indices created through the ord() function instead of performing heavier hash lookups, Peter produces an outstandingly fast frequency counter.

Try it 

Your input:



eg: floccinaucinihilipilification

Script


#!/usr/bin/perl

# Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge

use v5.26;    # The Weekly Challenge - 2026-06-29
use utf8;     # Week 380 - task 2 - Reverse degree
use warnings; # Peter Campbell Smith
binmode STDOUT, ':utf8';
use Encode;

reverse_degree('bbc');
reverse_degree('racecar');
reverse_degree('zyx');
reverse_degree('supercalifragilisticexpialidocious');

sub reverse_degree {
    
    my ($string, $j, $reverse_degree);
    
    # initialise
    $string = shift;
    say qq[\nInput:  '$string'];
    $string =~ s|[^a-z]||g;
    $string = lc($string);
    
    # calculate reverse degree
    for $j (0 .. length($string) - 1) {
        $reverse_degree +=
            ($j + 1) * (123 - ord(substr($string, $j, 1)));
    }

    say qq[Output: $reverse_degree];
}


10 lines of code

Output from script


Input:  'bbc'
Output: 147

Input:  'racecar'
Output: 560

Input:  'zyx'
Output: 14

Input:  'supercalifragilisticexpialidocious'
Output: 9387

 

Any content of this website which has been created by Peter Campbell Smith is in the public domain