#!/usr/bin/perl 

use 5.040;

$|++;

# Historia: los números-montaña están acotados, son un número concreto
# si no se permiten empates. Se pueden obtener por heurística si se 
# sigue la estrategia de abordar el número en dos mitades.

# Ahora voy a tratar de hacer lo mismo, más determinísticamente, aunque
# sé por experiencia que tengo recursos para abordarlo por fuerza bruta
# aleatoria. Máximo número-valle 9876543210123456789.

# Una estrategia conservadora en número de líneas sería ir generando 
# números normales desde el número-valle mínimo 101 y desechar los que 
# incumplen las reglas básicas.

# vie 14 jun 2024 00:10:45 CEST

# Desechado. Mejor tomar una mitad y hacerla de manera que siempre haya 
# el mismo signo de la diferencia y después copiarla al otro lado y 
# mezclar todos con todos, izquierda y derecha.

# my @d = 0..9;

sub valid {
    my @digits = split //, shift;
    my $kant = $digits[0]+1;
    for my $k (@digits){
	return 0 unless ($k < $kant);
	$kant = $k;
    }
    return 1;
}

if (-e "valley2num.right"){
    goto algrano;
}

my (@left, @right);

# open my $fha, '>', "valleynum.left" or die $!;
# open my $fhb, '>', "valleynum.right" or die $!;
my $pre = 0;
for (my $i=10; $i <= 9876543210; $i++){
    next unless ( valid($i) );    
#    say $fha "$i";
    push @left, $i;
    my $j = reverse $i;
#    $j = sprintf "%d", $j;    # esto quitaría el 0 a la izq pero el num lo imprimiría 2 veces
    unless ($j =~ /^0/){
#	say $fhb "$j";
	push @right, $j;
    }
    $pre++;
    print "\r$pre";
}
# close $fha;
# close $fhb;
say "\n--- $0 done previous lefts ---";
say "--- $0 done previous rights ---";

# Aquí el problema es que @izq y @der no caben en memoria

algrano:

my $c =0;
open my $OUT , '>', "valley2num.out" or die $!;
# open my $fha1, '<', "valleynum.left" or die $!;
while (my $i = shift @left ) {
#    chomp $i;
    $i =~ /.+(\d{1})$/;
    my $x = $1;
#    open my $fhb1, '<', "valleynum.right" or die $!;
#    while (my $j = <$fhb1>) {
    for my $j (@right){
#	chomp $j;
	$j =~ /^(\d{1})/;
	my $y = $1;
	if ($y > $x){
	    $c++;
	    say $OUT "$c,$i$j";     # csv format
	}
    }
#    close $fhb1;
}
# close $fha1;
close $OUT;

say "--- $0 ALL DONE ---";

exit 2;

