Next highest int from digits: Difference between revisions

→‎{{header|Perl 6}}: Handle negative as well as positive integers.
(→‎{{header|zkl}}: added code)
(→‎{{header|Perl 6}}: Handle negative as well as positive integers.)
Line 224:
=={{header|Perl 6}}==
{{works with|Rakudo|2020.01}}
Minimal error trapping. Assumes that the passed number is an integer. Handles positive or negative integers, always returns next largest regardless (if possible).
 
<lang perl6>use Lingua::EN::Numbers;
 
sub next-greatest-index ($str, &op = &infix:«<» ) {
my @i = $str.comb;
(1..^(@i - 1)).reverse.first: { &op(@i[$_] <- 1], @i[$_ + 1]) }, :end, :k;
}
 
submulti next-greatest-integer (Int $num where * >= 0) {
return 0 if $num.chars < 2;
return $num.flip > $num ?? $num.flip !! 0 if $num.chars == 2;
return 0 unless my $i = $num.&next-greatest-index( $num ) // 0;
return 0 unless $i > 0;
my $digit = $num.substr($i, 1);
my @rest = (flat $num.substr($i).comb).sort(+*);
Line 244:
}
 
printfmulti "%30s -> %s\n", .&comma, .&next-greatest-integer.&comma for(Int $num where * < 0) {
return 0 unlessif $inum.chars >< 03;
0, 9, 12, 21, 12453, 738440, 45072010, 95322020, 9589776899767587796600;
return $num.abs.flip < -$num ?? -$num.abs.flip !! 0 if $num.chars == 3;
</lang>
return 0 unless my $i = next-greatest-index( $num, &CORE::infix:«>» ) // 0;
my $digit = $num.substr($i, 1);
my @rest = (flat $num.substr($i).comb).sort(-*);
my $next = @rest.first: * < $digit, :k;
$digit = @rest.splice($next,1);
join '', flat $num.substr(0,$i), $digit, @rest;
}
 
say "Next largest integer able to be made from these digits, or zero if no larger exists:";
printf "%30s -> %s%s\n", .&comma, .&next-greatest-integer < 0 ?? '' !! ' ', .&next-greatest-integer.&comma for
flat 0, (9, 12, 21, 12453, 738440, 45072010, 95322020, 9589776899767587796600, 3345333).map: { $_, -$_ };</lang>
{{out}}
<pre>Next largest integer able to be made from these digits, or zero if no larger exists:
<pre> 0 -> 0
90 -> 0
12 9 -> 21 0
21-9 -> 0
12,453 -> 12,534 21
738,440 -12 -> 740,348 0
45,072,010 21 -> 45,072,100 0
95,322,020 -21 -> 95,322,200-12
<pre> 12,453 0 -> 0 12,534
9,589,776,899,767,587,796,600 -> 9,589,776,899,767,587,900,667</pre>
-12,453 -> -12,435
738,440 -> 740,348
-738,440 -> -738,404
45,072,010 -> 45,072,100
-45,072,010 -> -45,072,001
95,322,020 -> 95,322,200
-95,322,020 -> -95,322,002
9,589,776,899,767,587,796,600 -> 9,589,776,899,767,587,900,667</pre>
-9,589,776,899,767,587,796,600 -> -9,589,776,899,767,587,796,060
3,345,333 -> 3,353,334
-3,345,333 -> -3,343,533</pre>
 
=={{header|Python}}==
10,333

edits