Peter
Peter Campbell Smith

Smallest index, largest element

Weekly challenge 250 — 1 January 2024

Week 250 - 1 Jan 2024

Task 1

Task — Smallest index

You are given an array of integers, @ints. Write a script to find the smallest index i such that i mod 10 == $ints[i], otherwise return -1.

Examples


Example 1
Input: @ints = (0, 1, 2)
Output: 0

i=0: 0 mod 10 = 0 == $ints[0].
i=1: 1 mod 10 = 1 == $ints[1].
i=2: 2 mod 10 = 2 == $ints[2].
All indices have i mod 10 == $ints[i], so we return the 
smallest index 0.

Example 2
Input: @ints = (4, 3, 2, 1)
Output: 2

i=0: 0 mod 10 = 0 != $ints[0].
i=1: 1 mod 10 = 1 != $ints[1].
i=2: 2 mod 10 = 2 == $ints[2].
i=3: 3 mod 10 = 3 != $ints[3].
2 is the only index which has i mod 10 == $ints[i].

Example 3
Input: @ints = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
Output: -1
Explanation: No index satisfies i mod 10 == $ints[i].

Analysis

There seems little alternative to iterating along the array and finding the first (if any) element $i which meets the condition $i % 10 == $ints[$i]. Since we are looking for the lowest $i that satisfies that condition we can stop iterating as soon as we find an element that meets it.

Try it 

Try running the script with any input:



example: 1, 2, 3, 4, 5, 6, 7, 7

Script


#!/usr/bin/perl

use v5.16;    # The Weekly Challenge - 2024-01-01
use utf8;     # Week 250 task 1 - Smallest index
use strict;   # Peter Campbell Smith
use warnings; # Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge

binmode STDOUT, ':utf8';

smallest_index(4, 3, 2, 1);
smallest_index(2, 4, 6, 7, 3, 9, 1, 0, 2, 4, 7, 8, 2, 3);
smallest_index(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);

sub smallest_index {
    
    my (@ints, $i, $i_mod10);
    
    #initialise
    @ints = @_;
    say qq[\nInput:  \@ints = (] . join(', ', @ints) . ')';
    
    # loop over supplied values
    for $i (0 .. @ints - 1) {
        $i_mod10 = $i % 10;
        
        # apply stated rule
        if ($i_mod10 == $ints[$i]) {
            say qq[Output: $i ∵ \$i = $i, \$i mod 10 = $i_mod10, \$ints[$i] = $ints[$i]];
            return;
        }
    }
    say qq[Output:  -1];
}
        

Output


Input:  @ints = (4, 3, 2, 1)
Output: 2 ∵ $i = 2, $i mod 10 = 2, $ints[2] = 2

Input:  @ints = (2, 4, 6, 7, 3, 9, 1, 0, 2, 4, 7, 8, 2, 3)
Output: 12 ∵ $i = 12, $i mod 10 = 2, $ints[12] = 2

Input:  @ints = (1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
Output:  -1