Challenges

# Reduce over the range [1..n]

+6
−0

I often need to find the factorial of a number or the sum of all numbers up to a number when cheating on math tests. To help me with this, your task is to write $F$, a generalized version of those functions:

$$F(n) = 1 * 2 * \space ... \space * (n-1) * n$$

Please note that the operator $*$ does not necessarily represent multiplication here, but stands for a commutative, associative operator that will be an input to your program/function. This means that $a * b$ is the same as $b * a$, and $a * (b * c)$ is the same as $(a * b) * c$. Its inputs are positive integers, and its outputs are integers.

# Rules

• $n$ will be a positive integer.
• $*$ is a binary function/operator that can be taken in any convenient format, including but not limited to:
• A function object
• A function pointer
• An object with a method with a specific name (e.g. Java's BiFunction)
• A string that can be evaluated to get a function
• $*$ is a blackbox function. That means that you will not be able to examine it to see how it works; all you can do is feed it two positive integers and get an integer back.
• The output of your function will be an integer (not necessarily positive).
• This is code golf, so shortest code in bytes wins!

# Testcases

f         | n  | F(f, n)
Multiply  | 1  | 1
Multiply  | 5  | 120
XOR       | 1  | 1
XOR       | 2  | 3
XOR       | 5  | 1
XOR       | 10 | 11

Why does this post require moderator attention?
Why should this post be closed?

+3
−0

# Ruby, 17 bytes

->{_2.reduce(_1)}


Takes function (Proc) followed by Array.

## 32 bytes without inject or reduce

->f,(a,*r){r.map{|n|a=f[a,n]};a}

Why does this post require moderator attention?

+3
−0

n!g=foldl1 g[1..n]


Try it online!

Why does this post require moderator attention?

+2
−0

# APL (Dyalog Unicode), 4 bytes

⎕/⍳⎕


Try it online!

⎕ input / reduction over ⍳ the integers until ⎕ input.

Why does this post require moderator attention?

+2
−0

# JavaScript, 25 bytes

The function is called with f(g)(n), where g is a function.

g=>h=n=>n-1?g(h(n-1),n):1


Try it online!

Why does this post require moderator attention?

+2
−0

# Jelly, 3 bytes

Rç/


Try it online!

Takes f as the helper link. Very basic, R casts to range, then ç/ reduces by the helper link

Why does this post require moderator attention?

+2
−0

# Python 2, 33 bytes

lambda a,b:reduce(a,range(1,1+b))


Try it online!

Or, without using the reduce built-in:

# Python 2, 37 bytes

f=lambda a,b:b-1and a(f(a,b-1),b)or 1


Try it online!

Why does this post require moderator attention?

+2
−0

# Japt, 4 bytes

Takes the operator as a string but would also work without modification using a function by assigning it to variable V. That can be done in the header by leaving a blank line and then entering a function in the form XY{X[op]Y}, where [op] is the operator or method.

õ rV


Try it

õ rV     :Implicit input of integer U and operator V, as string
õ        :Range [1,U]
rV     :Reduce by V
Why does this post require moderator attention?

+2
−0

# VyxalR, 1 byte

R


Try it Online!

Function must be inserted in the header.

The R flag casts integers to ranges when an integer can't be used. R is the builtin for 'Reduce list by function', and it can't use an integer, so ranges before reducing.

Why does this post require moderator attention?

+1
−0

# C (clang), 59 bytes

c;f(int a,(*b)(int,int)){for(c=a;a>1;)c=b(--a,c);return c;}


Try it online!

This program written by @Hakerh400 in the comments is basically how the other answers before this post existed actually did it, by a reduction sort of method. I'd like to thank them for making such program and the amount of bytes it literally shaved compared to the program below.

# C (clang), 142 103 bytes

i,j;f(a,b){if(b==42){j=1;}for(i=1;i<=a;i++){if(b==43){j+=i;}if(b==42){j*=i;}if(b==94){j^=i;}}return j;}


Try it online!

I wanted to try to make something similar to this, but with whatever Python has that C doesn't, I couldn't do so.

Instead, I chose to make a function. It works differently from the others, but it's all I could do.

Ungolfed form of the function with comments:

int f(int num, char operator){ // Assign a function with 2 parameters: a number and character for operations
int x, result = 0; // Assign 2 integers: the succeeding number and the base
if(operator == '*' || operator == '/'){result = 1;} // Check if the character resembles multiplication or division; if so, set base as 1
for(x = 1; x <= num; x++){ // Start a loop to prompt the calculation that satisfies the challenge
if(operator == 43){result += x;} // Addition
if(operator == 42){result *= x;} // Multiplication
if(operator == 94){result ^= x;} // XOR
}
return result; // Return the result
}

Why does this post require moderator attention?

Subtraction and division (1 comment)
Function instead of an operator (1 comment)
+1
−0

# BQN, 8 bytes

{𝔽´1+↕𝕩}


Try it!

basic fold builtin version. Use as a dyadic 1-modifier.

Longer than APL since evaluated output is shorter than using first class functions.

A more fun recursive implementation without fold:

{1𝔽{(𝕨𝔽⊑𝕩)(1<≠𝕩)◶⊣‿𝕊1↓𝕩}1+1↓↕𝕩}


A previous(wrong) version of this exposed a bug which prevented the program from erroring here.

EDIT: the bug is fixed!

Why does this post require moderator attention?

+1
−0

# C (gcc), 50 bytes

f(int(*o)(i,j),int n){return n-1?o(f(o,n-1),n):1;}


Try it online!

Why does this post require moderator attention? 