Largest five adjacent number

From Rosetta Code
Largest five adjacent number is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task


Generate random 1000-digit number.
Find the five adjacent digits in the 1000-digit number that form the largest 5-digit number.

Extra credit

Find the five adjacent digits in the 1000-digit number that form the smallest 5-digit number.


11l

Translation of: Python
V largeNum = [random:(1..9)] [+] (0.<999).map(i -> random:(0..9))

V (maxNum, minNum) = (0, 99999)

L(i) 996
   V num = Int(largeNum[i.+5].join(‘’))
   I num > maxNum
      maxNum = num
   E I num < minNum
      minNum = num

print(‘Largest 5-digit number extracted from random 1000-digit number: ’maxNum)
print(‘Smallest 5-digit number extracted from random 1000-digit number: #05’.format(minNum))
Output:
Largest 5-digit number extracted from random 1000-digit number: 99902
Smallest 5-digit number extracted from random 1000-digit number: 00043

Ada

with Ada.Text_Io;
with Ada.Numerics.Discrete_Random;

procedure Adjacent_Numbers is

   Adjacent_Length : constant := 5;

   subtype Digit is Character range '0' .. '9';
   package Random_Digits
   is new Ada.Numerics.Discrete_Random (Digit);

   Gen   : Random_Digits.Generator;
   Line  : String (1 .. 1000);
   Large : Natural := Natural'First;
   Small : Natural := Natural'Last;
begin
   Random_Digits.Reset (Gen);
   Line := (others => Random_Digits.Random (Gen));

   for I in Line'First .. Line'Last - Adjacent_Length + 1 loop
      declare
         Window : String renames Line (I .. I + Adjacent_Length - 1);
      begin
         Large := Natural'Max (Large, Natural'Value (Window));
         Small := Natural'Min (Small, Natural'Value (Window));
      end;
   end loop;
   Ada.Text_Io.Put_Line ("The largest number : " & Natural'Image (Large));
   Ada.Text_Io.Put_Line ("The smallest number: " & Natural'Image (Small));
end Adjacent_Numbers;
Output:
The largest number :  99625
The smallest number:  102

ALGOL 68

Adding the minimum number for good measure...

BEGIN # generate 1000 random digits and find the largest/smallest numbers formed from 5 consecutive digits #
    [ 1 : 1000 ]CHAR digits;
    FOR i TO UPB digits DO digits[ i ] := REPR ( ENTIER ( next random * 10 ) + ABS "0" ) OD;
    STRING max number := digits[ 1 : 5 ];
    STRING min number := digits[ 1 : 5 ];
    FOR i FROM 2 TO UPB digits - 4 DO
        STRING next number = digits[ i : i + 4 ];
        IF next number > max number
        THEN
            # found a new higher number #
            max number := next number
        FI;
        IF next number < min number
        THEN
            # found a new lower number #
            min number := next number
        FI
    OD;
    print( ( "Largest  5 consecutive digits from 1000 random digits: ", max number, newline ) );
    print( ( "Smallest 5 consecutive digits from 1000 random digits: ", min number, newline ) )
END
Output:
Largest  5 consecutive digits from 1000 random digits: 99987
Smallest 5 consecutive digits from 1000 random digits: 00119

APL

Works with: Dyalog APL
/((⊣+10×⊢)/(⌽↓))5(-⎕IO)+?1000/10
Output:

(example)

99994

Arturo

N: join to [:string] map 1..100 'x -> random 1000000000 9999999999

i: 0
maxNum: 0
minNum: 
while [i < (size N)-5][
    num: to :integer join @[N\[i] N\[i+1] N\[i+2] N\[i+3] N\[i+4]]
    if num > maxNum -> maxNum: num
    if num < minNum -> minNum: num
    i: i + 1
]

print "Our random 1000-digit number is:"
print N

print ""

print ["Max 5-adjacent number found:" maxNum]
print ["Min 5-adjacent number found:" (repeat "0" 5-(size to :string minNum)) ++ (to :string minNum)]
Output:
Our random 1000-digit number is:
2540956677308157418624519953263471599696918276171651168484519407031160813613006352660058588944602704848634276542837184618726044674117357036813240557325769932073351534364289297094415941273117151277729576200542643185699525405079189015204192029912043004161916366921458912887890652627268028071729897387395041640352395354106991129061548748712499227024213135531365974620993813773921850969630855401781344832397898392812417729744785629765286216304456806870691502938136795922685099816652448188701308354551593078486609811394420601431484916913833634669083737749230355341380266781803894385432741405633278873213701238310761908151961510643290964548205746238459266137202173265468217401777681775761126374654289733873900330799576500024068191362342162163615972164105625935627483920193464168192083262176697432155066174175594837721476581087940310642712981291006889657297350894628612724944063786324456854104801432247483498384207351647946918119868105898645178074174003550762101547842674605061792172905254724197215648686667

Max 5-adjacent number found: 99816 
Min 5-adjacent number found: 00024

AutoHotkey

maxNum := 0, str := ""
loop, 1000
{
    Random, rnd, 0, 9
    str .= rnd
    output .= rnd . (Mod(A_Index, 148) ? "" : "`n")
    if A_Index < 5
        continue
    num := SubStr(str, A_Index-4, 5)    
    maxNum := maxNum > num ? maxNum : num
    minNum := A_Index = 5 ? num : minNum < num ? minNum : num
}
MsgBox % result := output "`n`nLargest five adjacent digits = " maxNum 
                    .  "`n`nSmallest five adjacent digits = " minNum
Output:
3893212622395522104846091986776081862634026945871752892124324578621089065097043281907406149009719673003318226562809101957181871693776164191416491334
2509291361707848297387923254298547833186351133036771338719578505791529263806019240009497155124458943732581184022226943392528107498748575424217651885
3083736872582691290721469942482918430078673685947447234032602113276631102983248999047362916320523840282929255314468323644427797630259187509914424396
1523615571637081320270791095221484894567420630155741441396012393172769867922862248399483054652921274863786220527596050784952102267710198517665662903
6335615800351254988779849447078262460051794249274045128158246939351902901862546960248213286880570086476859341012102414828750098051948784732121573660
9618754338433412518619240496583375235634416473003920360759949694724646721954909867058588446320222792637823988375313876167705092153587245148819122980
2777308429997046827297505483667631338885207838402941712216614732232703459440770039141898763110002290662921501156

Largest five adjacent digits = 99970

Smallest five adjacent digits = 00022

AWK

# syntax: GAWK -f LARGEST_FIVE_ADJACENT_NUMBER.AWK
BEGIN {
    limit = 1000
    width = 5
    max_n = 0
    for (i=1; i<=width; i++) {
      min_n = min_n "9"
    }
    srand()
    for (i=1; i<=limit; i++) {
      digits = digits int(rand() * 10)
    }
    for (i=1; i<=limit-width+1; i++) {
      n = substr(digits,i,width)
      if (n > max_n) {
        max_n = n
        max_pos = i
      }
      if (n < min_n) {
        min_n = n
        min_pos = i
      }
    }
    printf("look for %d digit number using %d digits\n",width,limit)
    printf("largest  %0*d in positions %d-%d\n",width,max_n,max_pos,max_pos+width-1)
    printf("smallest %0*d in positions %d-%d\n",width,min_n,min_pos,min_pos+width-1)
    exit(0)
}
Output:
look for 5 digit number using 1000 digits
largest  99873 in positions 300-304
smallest 00099 in positions 697-701

BASIC

BASIC256

Translation of: FreeBASIC
dim number(1000)
highest = 0
lowest = 100000
for i = 0 to 999
	number[i] = int(rand*10)
	if i >= 4 then
		tmp = number[i] + 10*number[i-1] + 100*number[i-2] + 1000*number[i-3] + 10000*number[i-4]
		if tmp < lowest then lowest = tmp
		if tmp > highest then highest = tmp
	end if
next i
print highest, lowest

Chipmunk Basic

Works with: Chipmunk Basic version 3.6.4
Translation of: FreeBASIC
100 randomize timer
110 dim number(999)
120 highest = 0
130 lowest = 100000
140 for i = 0 to 999
150   number(i) = int(rnd(10))
160   if i >= 4 then
170     tmp = number(i)+10*number(i-1)+100*number(i-2)+1000*number(i-3)+10000*number(i-4)
180     if tmp < lowest then lowest = tmp
190     if tmp > highest then highest = tmp
200   endif
210 next i
220 print highest,lowest
230 end

Gambas

Translation of: FreeBASIC
Public number[1000] As Byte

Public Sub Main() 
  
  Randomize
  Dim tmp As Integer, highest As Integer = 0, lowest As Integer = 100000 
  For i As Integer = 0 To 999 
    number[i] = Int(Rnd(10))
    If i >= 4 Then 
      tmp = number[i] + 10 * number[i - 1] + 100 * number[i - 2] + 1000 * number[i - 3] + 10000 * number[i - 4] 
      If tmp < lowest Then lowest = tmp 
      If tmp > highest Then highest = tmp 
    End If 
  Next 
  Print highest, lowest
  
End

PureBasic

Translation of: FreeBASIC
OpenConsole()
Dim number.i(999)
highest.i = 0
lowest.i = 100000
For i.i = 0 To 999
  number(i) = Random(10)
  If i >= 4:
    tmp = number(i) + 10*number(i-1) + 100*number(i-2) + 1000*number(i-3) + 10000*number(i-4)
    If tmp < lowest: lowest = tmp: EndIf
    If tmp > highest: highest = tmp: EndIf
  EndIf
Next i 
PrintN(Str(highest) + #TAB$ + Str(lowest))

QBasic

Works with: QBasic version 1.1
Works with: QuickBasic version 4.5
Translation of: FreeBASIC
RANDOMIZE TIMER
DIM number(0 TO 999)
highest = 0
lowest = 100000
FOR i = 0 TO 999
    number(i) = INT(RND * 10)
    IF i >= 4 THEN
        tmp = number(i) + 10 * number(i - 1) + 100 * number(i - 2) + 1000 * number(i - 3) + 10000 * number(i - 4)
        IF tmp < lowest THEN lowest = tmp
        IF tmp > highest THEN highest = tmp
    END IF
NEXT i
PRINT highest, lowest
END

True BASIC

Translation of: QBasic
RANDOMIZE
DIM number(0 TO 999)
LET highest = 0
LET lowest = 100000
FOR i = 0 TO 999
    LET number(i) = INT(RND*10)
    IF i >= 4 THEN
       LET tmp = number(i)+10*number(i-1)+100*number(i-2)+1000*number(i-3)+10000*number(i-4)
       IF tmp < lowest THEN LET lowest = tmp
       IF tmp > highest THEN LET highest = tmp
    END IF
NEXT i
PRINT highest, lowest
END

Yabasic

Translation of: FreeBASIC
dim number(999)
highest = 0
lowest = 100000
for i = 0 to 999
    number(i) = int(ran(10))
    if i >= 4 then
        tmp = number(i) + 10*number(i-1) + 100*number(i-2) + 1000*number(i-3) + 10000*number(i-4)
        if tmp < lowest  lowest = tmp
        if tmp > highest  highest = tmp
    fi
next i 
print highest, lowest

BQN

´(⊣+10×⊢)˝⌽⍉51000 •rand.Range 10
Output:

(example)

99991

C

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <time.h>

#define DIGITS 1000
#define NUMSIZE 5

uint8_t randomDigit() {
    uint8_t d;
    do {d = rand() & 0xF;} while (d >= 10);
    return d;
}

int numberAt(uint8_t *d, int size) {
    int acc = 0;
    while (size--) acc = 10*acc + *d++;
    return acc;
}

int main() {
    uint8_t digits[DIGITS];
    int i, largest = 0;
    
    srand(time(NULL));
    
    for (i=0; i<DIGITS; i++) digits[i] = randomDigit();
    for (i=0; i<DIGITS-NUMSIZE; i++) {
        int here = numberAt(&digits[i], NUMSIZE);
        if (here > largest) largest = here;
    }

    printf("%d\n", largest);
    return 0;
}
Output:

(example)

99931

CLU

% Generate a number of N random digits
random_digits = proc (n: int) returns (sequence[int])
    digits: array[int] := array[int]$predict(1,n)
    
    % A number never starts with a zero
    array[int]$addh(digits, 1+random$next(9))
    for i: int in int$from_to(1,n-1) do
        array[int]$addh(digits, random$next(10))
    end
    return(sequence[int]$a2s(digits))
end random_digits

% Find the largest and smallest N-adjacent number in the digits 
find_min_max = proc (n: int, digits: sequence[int]) returns (int,int)
    min: int := 10**n  % Guaranteed to be bigger than any N-adjacent number
    max: int := 0
    
    for i: int in int$from_to(1, sequence[int]$size(digits)-n) do
        cur: int := 0
        for j: int in int$from_to(0, n-1) do
            cur := 10*cur + digits[i+j]
        end
        if cur<min then min:=cur end
        if cur>max then max:=cur end
    end
    return(min, max)
end find_min_max

start_up = proc ()
    % Seed the RNG with the current time
    d: date := now()
    random$seed(d.second + 60*(d.minute + 60*d.hour))
    
    % Find the minimum and maximum 5-adjacent numbers in a 1000-digit number
    min, max: int := find_min_max(5, random_digits(1000)) 
    
    po: stream := stream$primary_output()
    stream$putl(po, "Smallest: " || int$unparse(min))
    stream$putl(po, "Largest: " || int$unparse(max))
end start_up
Output:
Smallest: 144
Largest: 99951

Delphi

Works with: Delphi version 6.0


function Get5DigitNumber(S: string; Off: integer): integer;
{Extract 5 digit number from string at Off}
var I: integer;
var NS: string;
begin
NS:=Copy(S,Off,5);
Result:=StrToIntDef(NS,-1);
end;



function BreakupString(S: string): string;
{Breakup thousand digit number for easy display}
var I: integer;
begin
for I:=1 to Length(S) do
 	begin
 	Result:=Result+S[I];
 	if (I mod 55)=0 then Result:=Result+#$0D#$0A;
 	end;
end;

procedure FiveDigitNumber(Memo: TMemo);
{Find the largest and small 5 digit sequence}
{in 1000 digit number}
var S: string;
var N,I: integer;
var Largest,Smallest: integer;
begin
Smallest:=High(Integer);
Largest:=0;
for I:=1 to 1000 do
 S:=S+Char(Random(10)+$30);
for I:=1 to Length(S)-5 do
	begin
	N:=Get5DigitNumber(S,I);
	if N>Largest then Largest:=N;
	if N<Smallest then Smallest:=N;
	end;
Memo.Lines.Add(BreakupString(S));
Memo.Lines.Add('Largest: '+IntToStr(Largest));;
Memo.Lines.Add('Smallest: '+IntToStr(Smallest));;
end;
Output:
0082263134040802937368731342824182794880115050767752659
6926207485596307977119758620628125911215421677000178364
7438810001625238336693427757455861441056098692774612931
9301856160395349334087194184285169534216966507128749101
0333045468523586265833674268791722749102838792380205401
7335212073765802860114410575280403628540910018912794058
9569778977033072890894634763659190635686944921467068416
0978402580498879216810854417805724457730620420683349740
8203884243646784563247619038458645194136841413688117232
0960606571886477139587251334596793042923055521495533796
5592094928040937883628134090110628164451939278452734493
5741344340195488542852682604882967292438604245256357719
4755578568409079269700382959730067457921191314413220282
3502307407547002586284406642530858066838890257743184196
5040611036453640792847940715686736822030381083124941163
3588177613294220880152655471721880286144478485085399563
1095924640071825166992021998152653370680394470682198029
3879102724160697653653330275506532525946257246355415772
4978409544
Largest: 99815
Smallest: 16


F#

// Largest five adjacent number. Nigel Galloway: September 28th., 2021
let n()=let n()=System.Random().Next(10) in Seq.unfold(fun g->Some(g,(g%10000)*10+n()))(n()*10000+n()*1000+n()*100+n()*10+n())
printfn $"Largest 5 adjacent digits are %d{(n()|>Seq.take 995|>Seq.max)}"
Output:
Largest 5 adjacent digits are 99914

Factor

Works with: Factor version 0.99 2021-06-02
USING: grouping io math.functions prettyprint random sequences ;

1000 10^ random unparse 5 <clumps> supremum print
Output:
99987

FreeBASIC

Generate the number digit by digit, and test as we go. If the task didn't specifically ask to generate the whole 1,000 digit number I wouldn't bother storing more than five of its digits at a time.

randomize timer
dim as ubyte number(0 to 999)
dim as uinteger seg, highest = 0, lowest = 100000
for i as uinteger = 0 to 999
    number(i) = int(rnd*10)
    if i >= 4 then
        seg = number(i) + 10*number(i-1) + 100*number(i-2) +_
              1000*number(i-3) + 10000*number(i-4)
        if seg < lowest then lowest = seg
        if seg > highest then highest = seg
    end if
next i 
print highest, lowest
Output:
99748         31

Go

Translation of: Wren
Library: Go-rcu
package main

import (
    "fmt"
    "math/rand"
    "rcu"
    "strings"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    var sb strings.Builder
    for i := 0; i < 1000; i++ {
        sb.WriteByte(byte(rand.Intn(10) + 48))
    }
    number := sb.String()
    for i := 99999; i >= 0; i-- {
        quintet := fmt.Sprintf("%05d", i)
        if strings.Contains(number, quintet) {
            ci := rcu.Commatize(i)
            fmt.Printf("The largest  number formed from 5 adjacent digits (%s) is: %6s\n", quintet, ci)
            break
        }
    }
    for i := 0; i <= 99999; i++ {
        quintet := fmt.Sprintf("%05d", i)
        if strings.Contains(number, quintet) {
            ci := rcu.Commatize(i)
            fmt.Printf("The smallest number formed from 5 adjacent digits (%s) is: %6s\n", quintet, ci)
            return
        }
    }
}
Output:

Sample run:

The largest  number formed from 5 adjacent digits (99928) is: 99,928
The smallest number formed from 5 adjacent digits (00120) is:    120

J

>./5([+10*])/@|:\?1000#10
Output:

(example)

99929

jq

Works with: jq

Also works with gojq, the Go implementation of jq.

First, a direct solution using only jq's standard library and a line for generating the PRN:

< /dev/random tr -cd '0-9' | head -c 1000 | jq -R '
  length as $n
  | . as $s
  | ($s[0:5] | tonumber) as $m
  | reduce range(1; $n - 5) as $i ( {min: $m, max: $m};
      ($s[$i: $i+5] | tonumber) as $x
      | if   $x < .min then .min = $x 
        elif $x > .max then .max = $x 
        else . end)
'
Output:
{
  "min": 224,
  "max": 99772
}

Next, a "one-line solution" apart from generic helper functions and the line for generating the PRN:

< /dev/random tr -cd '0-9' | head -c 1000 | jq -R '
  # Input: an array
  # Output: a stream of the width-long subarrays
  def windows(width):
    range(0; 1 + length - width)  as $i | .[$i:$i+width];

  def minmax(s):
    reduce s as $x ( {};
      if .min == null then {min: $x, max: $x}
      elif $x < .min then .min = $x
      elif $x > .max then .max = $x else . end);

  explode | minmax(windows(5) | implode | tonumber)

Julia

dig = rand(0:9, 1000)
@show maximum(evalpoly(10, dig[i:i+4]) for i in 1:length(dig)-4)
Output:
maximum((evalpoly(10, dig[i:i + 4]) for i = 1:length(dig) - 4)) = 99993

Or, using strings, and see Nigel's comment in the discussion:

julia> setprecision(3324)
3324

julia> s = string(BigFloat(pi))[3:end]
"141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365" ⋯ 180 bytes ⋯ "66940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609631859502445945534690830264252230825334468503526193118817101000313783875288658753320838142061717766914730359825349042875546873115956286388235378759375195778185778053217122680661300192787661119590921642019898"

julia> m, pos = maximum((s[i:i+4], i) for i in 1:length(s)-4)
("99999", 763)

julia> println("Maximum is $m at position $pos.")
Maximum is 99999 at position 763.

Mathematica / Wolfram Language

MinMax[FromDigits /@ Partition[RandomInteger[{0, 9}, 1000], 5, 1]]
Output:
{104,99984}

Nim

import random, strutils

randomize()

const N = 1000
type Digit = 0..9

# Build a 1000-digit number.
var number: array[1..N, Digit]
number[1] = rand(1..9)  # Make sure the first digit is not 0.
for i in 1..N: number[i] = rand(9)

func `>`(s1, s2: seq[Digit]): bool =
  ## Compare two digit sequences.
  ## Defining `<` rather than `>` would work too.
  assert s1.len == s2.len
  for i in 0..s1.high:
    let comp = cmp(s1[i], s2[i])
    if comp != 0: return comp == 1
  result = false

var max = @[Digit 0, 0, 0, 0, 0]
for i in 5..N:
  let n = number[i-4..i]
  if n > max: max = n

echo "Largest 5-digit number extracted from random 1000-digit number: ", max.join()
Output:
Largest 5-digit number extracted from random 1000-digit number: 99855

Pascal

Works with: Free Pascal
inspired by Wren
Assumes that there at least is a "1" 4 digits before end of all digits.Else I have to include sysutils and s := Format('%.5d',[i]); for leading zeros.
var
  digits,
  s : AnsiString;
  i : LongInt;
begin
  randomize;
  setlength(digits,1000);
  for i := 1 to 1000 do
    digits[i] := chr(random(10)+ord('0'));
  for i := 99999 downto 0 do
  begin
    str(i:5,s);
    if Pos(s,digits) > 0 then
      break;
  end;
  writeln(s, ' found as largest 5 digit number ')
end.
Output:
99889 found as largest 5 digit number 

Perl

#!/usr/bin/perl

use strict; # https://rosettacode.org/wiki/Largest_five_adjacent_number
use warnings;

$_ = join '', map int rand 10, 1 .. 1e3;
my @n;
@n[ /(?=(\d{5}))/g ] = ();
print "$#n\n";
Output:
99899

Phix

with javascript_semantics
procedure shlong(string s)
    string hi5 = s[1..5], lo5 = hi5
    for i=2 to length(s)-4 do
        string s5 = s[i..i+4]
        hi5 = max(hi5,s5)
        lo5 = min(lo5,s5)
    end for
    printf(1,"String %s: hi5:%s, lo5:%s\n",{shorten(s),hi5,lo5})
end procedure

string s = repeat(' ',1000)
for i=1 to length(s) do
    s[i] = rand(10)-1+'0'
end for
shlong(s)

include mpfr.e
mpfr pi = mpfr_init(0,-1001) -- (set precision to 1,000 dp, plus the "3.")
mpfr_const_pi(pi)
s = mpfr_get_fixed(pi,1000)
s = s[3..$]
shlong(s)
Output:
String 35369847249221789712...55814915156742014134 (1,000 digits): hi5:99969, lo5:00013
String 14159265358979323846...66111959092164201989 (1,000 digits): hi5:99999, lo5:00031

Python

Seeding the random number generator directly with the datetime stamp produces a warning that it will be deprecated in Python 3.9, hence the "hack" of creating a string out of the timestamp and then seeding with it.

#Aamrun, 5th October 2021

from random import seed,randint
from datetime import datetime

seed(str(datetime.now()))

largeNum = [randint(1,9)]

for i in range(1,1000):
    largeNum.append(randint(0,9))

maxNum,minNum = 0,99999

for i in range(0,994):
    num = int("".join(map(str,largeNum[i:i+5])))
    if num > maxNum:
        maxNum = num
    elif num < minNum:
        minNum = num

print("Largest 5-adjacent number found ", maxNum)
print("Smallest 5-adjacent number found ", minNum)

Results from multiple runs :

Output:


Largest 5-adjacent number found  99743
Smallest 5-adjacent number found  102


Largest 5-adjacent number found  99965
Smallest 5-adjacent number found  84


Largest 5-adjacent number found  99808
Smallest 5-adjacent number found  58


Largest 5-adjacent number found  99938
Smallest 5-adjacent number found  10


Largest 5-adjacent number found  99957
Smallest 5-adjacent number found  35

Quackery

  9 random 1+
  999 times [ 10 * 10 random + ]
  dup 10 995 ** / swap
  say "1000 digit number"
  cr cr
  dup echo
  cr cr
  [] swap 1000 times
     [ 10 /mod
         rot join swap ]
  drop dup
  0 0 rot witheach
    [ swap 10 *
      100000 mod +
      tuck max swap ]
  drop
  say "largest 5 adjacent digits " echo
  cr cr
  5 split nip
  dip dup witheach
    [ swap 10 *
      100000 mod +
      tuck min swap ]
  drop
  say "smallest 5 adjacent digits "
  number$
  char 0 over size 5 swap - of
  swap join echo$
Output:
1000 digit number

6840907174710710253578773992410923828010161316527489025709598588564725782830158923520744533291356763925463645174705745049218864529135157750600471363289558510223445011025163844199130052941524405130793922050669143532883592357897096269697903780509770222546659289832999639637730759831717125055857319129937934353617386529810429642261048827016148476352187592939822910964334104828550764225596939965675519243696921514153715258715961987394884393797714002723369560598384723111928648279375269590756880538160907807290640466592734345970439851284217252141914792365031610947925633607292897379320456985054219371373707477609843617810620097343420379245258762479642377134776965386535533204636182773979582543243782455626021964121509778973939346873293400502531060571761381532229278485105166678017234489439222625767334040651185482277484204647473910364297105035077787620562600454016296114868335345408156093266755340971022669397814048919735693462065796634326535292979494128432997646841467835174156471055078228524511787150409

largest 5 adjacent digits 99963

smallest 5 adjacent digits 00272

Raku

Show minimum too because... why not?

Use some Tamil Unicode numbers for brevity, and for amusement purposes.

   ௰ - Tamil number ten
   ௲ - Tamil number one thousand

Do it 5 times for variety, it's random after all.

(^).roll().rotor(5 => -4)».join.minmax.bounds.put xx 5
Sample output:
00371 99975
00012 99982
00008 99995
00012 99945
00127 99972

Ring

digit = ""
max = 0
min = 99999
limit = 1000

for n = 1 to limit
    rand = random(9)
    randStr = string(rand)
    digit += randStr
next

for n = 1 to len(digit)-5
    res = substr(digit,n,5)
    resNum = number(res)
    if resNum > max 
       max = resNum
    ok
    if resNum < min
       min = res
    ok
next

see "The largest number is:" + nl
see max + nl
see "The smallest number is:" + nl
see min + nl
Output:
The largest number is:
99638
The smallest number is:
00118

RPL

RPL can not handle 1000-digit numbers, so we use a 1000-digit string.

≪ "" 
   1 1000 START RAND 9 * 0 RND →STR + NEXT
   { -99999 0 } 
   1 3 PICK SIZE 4 - FOR j
      OVER j DUP 4 + SUB 
      STR→ NEG LASTARG 2 →LIST MAX 
   NEXT ABS
≫ 'TASK' STO
Output:
2: "46725324552811522…
1: { 198 99886 }

Ruby

digits = %w(0 1 2 3 4 5 6 7 8 9)
arr = Array.new(1000){ digits.sample }
puts "minimum sequence %s, maximum sequence %s." % arr.each_cons(5).minmax_by{|slice| slice.join.to_i}.map(&:join)
Output:
minimum sequence 00096, maximum sequence 99508.

Sidef

var k = 5
var n = 1e1000.irand

say "length(n) = #{n.len}"

var c = n.digits.cons(k)

say ("Min #{k}-digit sub-number: ", c.min_by { .digits2num }.flip.join)
say ("Max #{k}-digit sub-number: ", c.max_by { .digits2num }.flip.join)
Output:
length(n) = 1000
Min 5-digit sub-number: 00072
Max 5-digit sub-number: 99861

V (Vlang)

Translation of: go
import rand
import rand.seed
import strings

fn main() {
    rand.seed(seed.time_seed_array(2))
    mut sb := strings.new_builder(128)
    for _ in 0..1000 {
        sb.write_byte(u8(rand.intn(10) or {0} + 48))
    }
    number := sb.str()
    println('>> $number')
    for i := 99999; i >= 0; i-- {
        quintet := "${i:05}"
        if number.contains(quintet) {
            println("The largest  number formed from 5 adjacent digits ($quintet) is: ${i:6}")
            break
        }
    }
    for i := 0; i <= 99999; i++ {
        quintet := "${i:05}"
        if number.contains(quintet) {
            println("The smallest number formed from 5 adjacent digits ($quintet) is: ${i:6}")
            return
        }
    }
}
Output:
The largest  number formed from 5 adjacent digits (99928) is: 99,928
The smallest number formed from 5 adjacent digits (00120) is:    120

Wren

Library: Wren-fmt

Very simple approach as there's little need for speed here.

import "random" for Random
import "./fmt" for Fmt

var rand = Random.new()
var digits = List.filled(1000, 0)
for (i in 0...999) digits[i] = rand.int(10)
var number = digits.join()
for (r in [99999..0, 0..99999]) {
    var target = (r.from == 0) ? "smallest" : "largest "
    for (i in r) {
        var quintet = Fmt.swrite("$05d", i)
        if (number.contains(quintet)) {
            Fmt.print("The $s number formed from 5 adjacent digits ($s) is: $,6d", target, quintet, i)
            break
        }
    }
}
Output:

Sample output:

The largest  number formed from 5 adjacent digits (99830) is: 99,830
The smallest number formed from 5 adjacent digits (00154) is:    154

XPL0

char    Number(1000);
int     Num, Max, I, J;
[for I:= 0 to 1000-1 do         \generate 1000-digit number
        Number(I):= Ran(10);
Max:= 0;                        \find its largest 5-digit number
for I:= 0 to 1000-5 do
        [Num:= 0;
        for J:= 0 to 5-1 do
                Num:= Num*10 + Number(I+J);
        if Num > Max then
                Max:= Num;
        ];
IntOut(0, Max);
]
Output:
99930