Peter’s blog ✴ Week 377 ✴ 8 June 2026

THE WEEKLY CHALLENGE
Strings within strings

The Perl Camel

Task 1

Reverse existence

You are given a string. Write a script to find whether any substring of length 2 is also present in the reverse of the given string.

Examples


Example 1
Input: $str = 'abcba'
Output: true
Reverse of given string is 'abcba'.
The substring 'ab' in original string is also present in
   the reverse string too.

Example 2
Input: $str = 'racecar'
Output: true
The substring 'ce' is present in both.

Example 3
Input: $str = 'abcd'
Output: false

Example 4
Input: $str = 'banana'
Output: true
The substring 'an' is present in both.

Example 5
Input: $str = 'hello'
Output: true
The substring 'll' is present in both.

Analysis

After last week's dramatic use of regular expressions from some contributors I feel a little old-fashioned in submitting a solution which only uses a trivial $reverse =~ m|$substring|.

However, I tried it with a string of a million random characters from a set of 1000 different ones with multibyte UTF-8 representations, and it completed in under a second, so I think my solution scores reasonably on my usual criteria of easily understood and maintainable code.

I look forward to reading the one-liners.

Try it 

Your input:



eg: supercalifragilisticexpialidocious

Script


#!/usr/bin/perl

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

use v5.26;    # The Weekly Challenge - 2026-06-08
use utf8;     # Week 377 - task 1 - Reverse existence
use warnings; # Peter Campbell Smith
binmode STDOUT, ':utf8';
use Encode;

reverse_existence('abcba');
reverse_existence('racecar');
reverse_existence('abcd');
reverse_existence('banana');
reverse_existence('xx');
reverse_existence('x');
reverse_existence('');

# 1000 random chars from set of 160
my $s;
$s .= chr(0xc0 + rand(160)) for 1 .. 1000; 
reverse_existence($s);

sub reverse_existence {
    
    my ($string, $reverse, $j, $substring);
    $string = $_[0];
    say qq[\nInput:  '$string'];
    
    # initialise
    $reverse = reverse($string);
    for $j (0 .. length($string) - 2) {
        $substring = substr($string, $j, 2);
        
        # does substring exist in reversed string?
        next unless $reverse =~ m|$substring|;
        say qq[Output: true - '$substring']; 
        return;
    }
    say qq[Output: false];
}

11 lines of code

Output from script


Input:  'abcba'
Output: true - 'ab'

Input:  'racecar'
Output: true - 'ra'

Input:  'abcd'
Output: false

Input:  'banana'
Output: true - 'an'

Input:  'xx'
Output: true - 'xx'

Input:  'x'
Output: false

Input:  ''
Output: false

Input: 
   'äėïĝŇàòÙûśøİĽĀÒÍĹÍîŘøŐÛĚĀŞŅŋŅÐĝùÃÖīČŋĶŇÈśéćÚáĬŀĜĐĵĵŞŋŀşġċâĻöőħńÄĝ÷
   ðĞãĻŋùĵÙĂIJğŜĨŅĸëœĉúÑýŔéĄĻÍīŋěŒĸŇŚĖÔĔġÑ÷ŞĜ×ôąĔāŊĶËŚÖâďŃŐĺÜûÚòĹĭĽİĬßÕ
   ÀŏċŝãşĚæÞþÑĨĄĒìĖĞŝÃþÀĭăİĔœÖóčõIJåëĿēŃħľřöðijąŐýùŌëÃĕňĉĬÎĝħýőÈÍòÅńÄĸįŌ
   ŘĞŇÕñijëŘŎÌáÔÊÈíą×ĐģáÞŀÛíŁéľŖĖŒĤĦÙĠĉĞÞĻċçăĬćĆßÉěĘĊĎĐģĝäşĚÅģşĎÆŖÏäÚÜĂ
   ĺĸķÏıőċđŗóğĘęĴ÷ÚĿñăåĖÍģãÔčłÓęĪŜŞéÓÎIJœœŐłëÒüáŒÉħĪàĵÏÂĔņŎĺÓÉôłÃŋÀùûÍĞ
   ïŒŅĶĥĽñĉÛĿčáijæĮŋŞčŃĉĞĤêĜÑŏňúŗĨěÜĨŞŏŊĞŐĎÖŜöâìÀŗęÀċIJśďŖÝÏýÑďôŝãĿŐĻÁąă
   äÙříÃÒŗėŕÄååċÚĿĹĔþŝŁÓĒĻõŁüćãĮĄĸÿüĻÉôĺċàŔçìĂħŎņßÅČĜĐĿĖĮİïÊĉĊġÚúŊãÙŐĎ
   ĢÉĩŐħİśîÕĪĉÞÚÒóŇŜŞňÅŞŝĄÆĂûÈĺŇÁĻÞĪìħĨĭþÂĈûÉøāŒúđþõġŇŏŋĔģèùėÈÚÅĆÇijŚíó
   ĜáĀģáÜēŊĩĢşèæÀŖÆķúĪÛĘijĬĞġÍËÕëùŝÿħÞÉÔIJńńŚČÓâŒŗąďňØċĞņĠöêÑėĞņĐçĦÈÑÉįï
   čĵðě÷ŋŝĞýÁÝĹûŕóČĶÎĿĢěőİʼnĚłÍôĂêòŎŋĔŝąĜłĆœØĭIJÔĠÝÒçęőåçŝĤĊôĞËçĄŔÇáŐÌĐù
   łĦŕĪĂijėňòłĘŖŀĥèĐņĬĤĝÙÞÙġÅëæõŇśŐÑâęŖļĽľûëĪēĎŝôđ×ŔäńŃïĭʼnÁěÿòđïÛįçßÃăï
   ÑĵķĹĜŒĖĶīÃùňìÃĬĕıŞÅÂìĎĴĺúĈÇōĄÃĊĚîîřÐďŔİijÚŌőĴēâÇřÞÿçöĵĀĂĤÎŊĉâŒîĢÀĖĕú
   îĞŅĩìĹśäŗİąěÁæěľáŁýôėÒûëÎÊŌÃŏĻÞŎĭÖÓïçįijŚĪęáÓáăķĊĴėÏÖŘĠáĜʼnćŀËÏŘĨÑŜĐÝ
   ëúňīĒÌýńÈÅĿĞŇĻïěæÎłÓïęßŎÿéèĿĺÞĩĻÚÉņîĞŐďãĤßúàģúÞöīņ÷ŁőĿòōüùÿéĚğèŕĵęŚ
   çĹĹÉďÝČÇİĎÙĈçõéċÙüĺċĄĦōŎĖĹńĽōľŊģijùśĆćĚĂīÃÎýÉċØÑÚĹĵřIJðÀéăĐÊłòìÛÇ'
Output: true - 'İĽ'

 

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