Split a number in every way possible way within a threshold

Jelly, 11 bytes


Try it online!

-1 byte thanks to Jonathan Allan

-1 more byte thanks to Jonathan Allan

How it works

ŒṖḌfV⁼³ʋƇḶ} - Main link. Takes n on the left and t on the right
ŒṖ          - All partitions of the digits of n
  Ḍ         - Convert the lists of digits to a list of numbers
          } - To t:
         Ḷ  -   Yield [0, 1, 2, ..., t-1]
        Ƈ   - Filter the partitions p, keeping those for which the following is true...
       ʋ      ...with each partition p on the left and the lowered range on the right:
   f        -   Keep the numbers in the lowered range (i.e. less than t)
    V       -   Concatenate the numbers into a single number
     ⁼³     -   Is that equal to n?

05AB1E, 9 bytes

Generates all valid partitions and keeps those that join to the input number. This is really slow because it generates partitions of up to as many integers as the input number.


Try it online! Don't try the cases from the challenge, even for the one with threshold 17 this tries to generate roughly \$1.35 \cdot 10^{18839}\$ partitions.


           # first input: threshold, second input: number
Ý          # inclusive range [0 .. threshold]
 s         # swap to the input number
  ã        # take the range to this cartesian power
           # this generates all input-tuples of integers in [0 .. threshold]
   0δÛ     # for each tuple remove leading 0's
      ʒ    # only keep the partitions
       JQ  # which are equal to the input if joined into a single string

05AB1E, 10 bytes

This is more efficient, starting with actual partitions of the number and keeping the valid ones.


Try it online!


            # first input: number, second input: threshold
.œ          # all string partitions of the first input
  ʒ         # keep all partitions where
   à        #   the maximum string 
    @       #   is less or equal compared to the second input
     y*     #   multiply this (0 or 1) with each number in the partition
            #   all strings are converted to integers here, which removes any leading 0's
       J    #   join into single string
        ¹Q  #   is this equal to the first input?

Perl 5, 131 bytes

sub{($n,$t)[email protected]_;grep{!grep$_>$t,/\d+/g}grep$n==s/,//gr,map$n=~s|.|$_/=2;$_*2%2?"$&,":$&|egr=~s/\b0+\B|00+//gr,0..2**($n=~y///c-1)-1}

Try it online!