# Find relevant digit groupings

Recently, my reputation was 25,121. I noticed that each digit grouping (i.e. the numbers separated by commas) was a perfect square.

Your challenge is, given a non-negative integer N and a unary boolean Black Box Function f : Z*B , yield a truthy value if each value of f applied to the digit groupings of N is truthy, and falsey otherwise.

One can find the digit groupings by splitting the number into groups of 3, starting from the right side. The leftmost group may have 1, 2, or 3 digits. Some examples:

12398123  -> 12,398,123    (3 digit groupings)
10        -> 10            (1 digit grouping)
23045     -> 23,045        (2 digit groupings)
100000001 -> 100,000,001   (3 digit groupings)
1337      -> 1,337         (2 digit groupings)
0         -> 0             (1 digit grouping)


• This function can map to either booleans (e.g. true and false), 1s and 0s, or any truthy/falsey value. Please specify which format(s) are supported by your answer.
• You may take an integer as input, or an integer string (i.e. a string composed of digits).
• You may write a program or a function.
• When passing the digital groups to the function f, you should trim all unnecessary leading zeroes. E.g., f, when applied to N = 123,000 should be executed as f(123) and f(0).

## Test cases

Function notation is n -> f(n), e.g., n -> n == 0. All operators assume integer arithmetic. (E.g., sqrt(3) == 1)

function f
integer N
boolean result

n -> n == n
1230192
true

n -> n != n
42
false

n -> n > 400
420000
false

n -> n > 0
0
false

n -> n -> 0
1
true

n -> sqrt(n) ** 2 == n
25121
true

n -> sqrt(n) ** 2 == n
4101
false

n -> mod(n, 2) == 0
2902414
true

n -> n % 10 > max(digits(n / 10))
10239120
false

n -> n % 10 > max(digits(n / 10))
123456789
true

• If we are unable to take functions as arguments, are we allowed to assume that the function is defined as a variable and we reference that in our program? – caird coinheringaahing Mar 5 '18 at 19:19
• @cairdcoinheringaahing Please read the reference for Black box functions, specifically the references at the end of that post. To summarize, yes, you can, even if your language is capable of taking functions as arguments (afaict) – Conor O'Brien Mar 5 '18 at 19:23
• Can the input be negative? Zero? You talk about integers, but all the examples are positive. I'd also suggest including test cases where a grouping of 000 needs to be handled. – xnor Mar 5 '18 at 21:57
• @ConorO'Brien In that case you should add (n -> n > 0 applied to 0) to the test cases because most answers fail on it. – Asone Tuhid Mar 7 '18 at 8:53
• @EriktheOutgolfer They are [0]. – Conor O'Brien Mar 7 '18 at 14:35

# Jelly, 5 bytes

bȷÇ€Ạ


Try it online!

The command-line argument is the number. The line above the line this function resides in is the main line of the rest of the program, that is, the code that gets called for each of the groups. Be careful not to refer to the line bȷÇ€Ạ is in! The example used here is the 5th test case.

• I'm pretty sure that this is a failure when applying n -> n != 0 to 0 – Asone Tuhid Mar 7 '18 at 9:01
• @AsoneTuhid It's not; The number is 0, and its digit group list is [0], so then Ṇ gets mapped to each element (the single 0 here), turning the list into [1] and, since all of the elements of this list are truthy, 1 is returned. Note that if I had the digit group list be [] instead the result wouldn't change, as all of the elements of [] are truthy (vacuous truth). However, the result can be different for different programs, and the rules aren't exactly clear on this (asked OP). – Erik the Outgolfer Mar 7 '18 at 13:45
• Sorry then, I barely understand Jelly. Nice solution. – Asone Tuhid Mar 7 '18 at 13:47

## Brachylog, 8 bytes

ḃ₁₀₀₀↰₁ᵐ


Try it online!

The blackbox function goes on the second line (or the "Footer" on TIO) and the integer is read from STDIN. Prints true. or false. accordingly.

ḃ₁₀₀₀      Compute the base-1000 digits of the input.
↰₁ᵐ   Map the blackbox predicate over each digit. We don't care about the
result of the map, but the predicate must succeed for each digit,
otherwise the entire map fails.


# APL (Dyalog), 16 13 bytes

3 bytes saved thanks to @Adám

∧/⎕¨1e3⊥⍣¯1⊢⎕


Try it online!

How?

1e3⊥⍣¯1⊢⎕ - input the number and encode in base 1000

⎕¨ - input the function and apply on each

∧/ - reduce with logical and

• Save 3 bytes by going explicit: Try it online! – Adám Mar 6 '18 at 11:33
• @Adám thanks! I liked the alpha-alpha though... – Uriel Mar 6 '18 at 13:33
• correct me if i'm wrong but i think this is a failure – Asone Tuhid Mar 7 '18 at 8:45

# Python 2, 46 bytes

g=lambda f,n,k=1000:f(n%k)and(n<k or g(f,n/k))


Try it online!

• 44 bytes by using * in place of and. – Bubbler Mar 14 '18 at 7:17

f#n=f(mod n 1000)&&(n<1||f#div n 1000)


The blackbox function must return True or False.

Try it online!

Edit: -2 -4 bytes thanks to @ovs.

# C (gcc), 6658 48 bytes

-10 bytes thanks to @Neil!

t=1000;g(f,i)int f();{i=f(i%t)&(i<t||g(f,i/t));}


Try it online!

## Wolfram Language (Mathematica), 30 bytes

And@@#/@#2~IntegerDigits~1000&


Try it online!

## JavaScript (ES6), 40 36 bytes

f=>g=i=>f(i%1e3)&(i<1e3||g(i/1e3|0))


Takes the function and value by currying and returns 0 or 1. Edit: Saved 4 bytes thanks to @Shaggy.

• 1000 -> 1e3 to save a couple of bytes. And could you replace && with & for another byte? – Shaggy Mar 6 '18 at 15:32
• @Shaggy Yes, I think that's safe enough. Same goes for betseg's answer? – Neil Mar 6 '18 at 16:29
• fails for function_name(n=>n>0)(0) (returns true) – Asone Tuhid Mar 7 '18 at 8:38
• @AsoneTuhid Thanks, fixed. – Neil Mar 7 '18 at 10:43

# Pyth, 9 bytes

.AyMjQ^T3


Try it online! (uses the third test case)

Assumes the black-box function is named y. You can declare such a function using L (argument: b), as shown on TIO. I will implement all the test cases later, if I have time.

# Stax, 8 bytes

Vk|Eym|A


Stax programs do not have function calls or arguments, so we store a block in the Y register that consumes and produces a single value. This can be done before the program code.

{...}Yd     store a block in the Y register that executes ...
Vk|E        get "digits" of input using base 1000
ym      map "digits" to array using y as mapping function
|A    all elements are truthy?


Here's an example using the perfect square function.

# Clean, 54 bytes

import StdEnv
$n=if(n<1)True($(n/1000))&&f(n rem 1000)


Try it online!

Defines the function $:: Int -> Bool, expecting a function f :: Int -> Bool to be defined elsewhere. # Java (OpenJDK 9), 94 bytes f->n->{int r=0,l=n.length();for(;l>0;l-=3)r+=f.test(n.substring(l<4?0:l-3,l))?0:1;return r<1;}  Try it online! # Common Lisp, 73 72 bytes (defun g(x f)(and(funcall f(mod x 1000))(or(< x 1e3)(g(floor x 1e3)f))))  Try it online! • This is my first Lisp answer, so it's probably terrible. – Dennis Mar 10 '18 at 18:36 # 05AB1E, 8 bytes ₄вεI.V}P  Try it online! Explanation ₄в # convert first input to base-1000 ε } # apply to each element I.V # execute second input as code P # product of the resulting list  Takes the number as the first line of input and the function as the second. Outputs 1 for truthy and 0 for falsy. • This doesn't execute the code on each element, but on the whole list. – Erik the Outgolfer Mar 6 '18 at 11:48 • @EriktheOutgolfer: With 05AB1E's automatic vectorization it will in most cases. I just realized that it won't work for Qand Ê though. I'll revert back to the 8-byte version. – Emigna Mar 6 '18 at 11:50 • Still, it's not .V that vectorizes, it doesn't even take the list as an argument itself to begin with. – Erik the Outgolfer Mar 6 '18 at 11:53 • @EriktheOutgolfer: I've never said that .V vectorizes. In the example in my link it's È. – Emigna Mar 6 '18 at 11:55 • Actually Q and Ê would work with vectorization unlike I previously stated, but using automatic vectorization would make these commands map on the whole list which feels outside the spirit of the challenge so we need ε. – Emigna Mar 6 '18 at 12:11 # Excel VBA, 79 bytes An anonymous VBE immediate window function that takes input, n as type integer from range [A1], and the name of a publically defined VBA function from range [B1]. t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t  ### Usage example In a public module, the input function, in this case f() is defined. Public Function f(ByVal n As Integer) As Boolean Let f = (n Mod 2 = 0) End Function  The input variables are set. [A1]=2902414 '' Input Integer [B1]="f" '' input function  The immediate window function is then called. t=1:n=[A1]:While n:t=t*-Application.Run(""&[B1],n Mod 1E3):n=Int(n/1E3):Wend:?t 1 '' Function output (truthy)  # Ruby, 37 bytes g=->f,n{f[n%x=1000]&&(n<x||g[f,n/x])}  Try it online! A recursive lambda, taking function and integer and returning boolean. ## 36 bytes (only positive n) g=->f,n{n>0?f[n%k=1000]&&g[f,n/k]:1}  This version returns 1 for truthy, false for falsey. Unfortunately it can fail when n = 0 Try it online! • I think you have to count g= if it's recursive – Asone Tuhid Mar 5 '18 at 23:53 • @AsoneTuhid Oh, that makes sense. I'll add it in. – benj2240 Mar 6 '18 at 0:06 • Also, try this (-1 byte), it returns 1 as the truthy value – Asone Tuhid Mar 6 '18 at 0:11 • That wrinkled my brain a little... I had to tinker around a bit to convince myself it worked in all cases. Thanks! – benj2240 Mar 6 '18 at 19:29 • I was wrong, this version doesn't work for g[->n{n>0},0] (returns true). It only fails if the input is 0 but the question says "non-negative" so you should go back to 37. sorry – Asone Tuhid Mar 7 '18 at 8:37 # Appleseed, 51 bytes (lambda(n f)(all(map f(or(to-base 1000 n)(q(0))))))  Anonymous lambda function that takes a number and a function and returns a boolean value. Try it online! (lambda (n f) ; Function with parameters n and f (all ; Return true if all elements of this list are truthy: (map f ; Map the function f to each element of (or ; This list if it is nonempty: (to-base 1000 n) ; Convert n to a list of "digits" in base 1000 (q (0)) ; Or if that list is empty (when n=0), then use the list (0) instead ))))  # Add++, 15 bytes L,1000$bbbUª{f}


Try it online!

Requires a function f to be declared in the TIO header.

## How it works

D,f,@,0.5^i2^A=	; Declares a function 'f' to check if a perfect square
; E.g. 25 -> 1; 26 -> 0

L,		; Declare the main lambda function
; Example argument: 		[25121]
1000\$bb	; Convert to base 1000	STACK = [[25 121]]
bUª{f}	; Is 'f' true for all?	STACK = [1]


# Husk, 7 bytes

ΛmrC_3


Try it online! Takes N as a string and f as a function object. Given a number, f can return any truthy or falsy value.

# Japt, 9 bytes

Had to sacrifice 3 bytes and take input as a string in order to handle the n=>n>0 test case when n=0. I could get them back if it was permitted to pass the groupings to the function as strings and convert them to integers within the function, when necessary

ò3n)mn eV


Try it

The function, as allowed by consensus, is preassigned to variable V on the second line of the header - the empty first line is essential.

Here are all the test case functions rewritten for Japt.

n -> n == n                           X{X==X}
n -> n != n                           X{X!=X}
n -> n > 400                          X{X>400}
n -> n > 0                            X{X>0}
n -> n -> 0                           X{X{0}}
n -> sqrt(n) ** 2 == n                X{Xq v1}
n -> mod(n, 2) == 0                   X{X%2==0}
n -> n % 10 > max(digits(n / 10))     X{X%10>Xz10 ì rw}
`