Challenges

# Multiply two strings

+3
−0

Given two strings, I define their product as follows:

• If any of the two strings is empty, the product is the empty string.

• If the second string consists of a single character, the result is obtained by replacing every character of the first string that compares larger than that character with that character. For example, "1234567" * "5" = "1234555"

• If the second string consists of more than one character, the result is obtained by multiplying the first string with each one-letter substring and concatenating the results. For example, s * "12" = s * "1" + s * "2" where + denotes string concatenation.

The task is to write a program or function that takes two strings and returns or prints their product. It may be assumed that the input strings consist entirely of printable ASCII characters.

You are allowed to take the second string as first argument and the first string as second argument as long as you explicitly state it in your answer (and are consistent about it).

This is code golf, the shortest code wins.

Test cases:

"" * "" = ""
"" * "123" = ""
"12" * "" = ""
"2" * "3" = "2"
"5" * "4" = "4"
"//" * "///" = "//////"
"xxxx" * "xx" = "xxxxxxxx"
"12" * "123" = "111212"
"123" * "abc" = "123123123"
"abc" * "123" = "111222333"
"abc" * "abc" = "aaaabbabc"


Note: While this task is inspired by a string multiplication question I encountered Somewhere Else a while ago, the algorithm used here is not the same as the algorithm in that other question.

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

+3
−0

# BQN, 3 bytes

Anonymous tacit infix function, taking the second string as left argument and the first string as right argument.

⥊⌊⌜


⌊⌜ minimum table

⥊ deshape (flatten)

BQN treats characters as an affine space which is basically a fancy name for each character being an integer (indicating the code point) and a Boolean (indicating the "characterness": 1 for character, 0 for non-character). Arithmetic on characters applies to both the code point and the characterness. Here, we take the minimum which gives the desired code point, and since both arguments are characters, the characterness stays at 1.

Try it!

Why does this post require moderator attention?

+3
−0

# Jelly, 2 bytes

«þ


Try it online!

Technically speaking, this needs to be a full program, due to how Jelly's smash printing works, but it can get away with being run as a function over test cases.

Essentially, this generates a matrix $M$ where $M_{ij}$ is given by $\min(a_i, b_j)$. As this is a matrix of characters, Jelly automatically flattens and concatenates the string on output

Why does this post require moderator attention?

+2
−0

# JavaScript, 37 bytes

I/O as character arrays.

a=>b=>b.flatMap(x=>a.map(y=>x<y?x:y))


Try it online!

Why does this post require moderator attention?

+2
−0

# Japt-m, 5 bytes

Takes input in reverse order. Sadly, Japt has no minimum built-in for strings.

VcmUc


Try it

VcmUc     :Implicit map of each U in the first input string
V         :Second input
c        :Map charcodes
m       :  Minimum with
Uc     :  Charcode of U
Why does this post require moderator attention?

+1
−0

f a=(>>= \c->map(min c)a)


Try it online!

Why does this post require moderator attention?

+1
−0

# Scala, 25 bytes

a=>_.flatMap(a map _.min)


Try it in Scastie!

Pretty trivial solution, but here's a bad explanation anyway:

//a is the first string
a =>_.flatMap(a map _.min)
//b is the second string, x is each char in b
a => b => b.flatMap(x => a map x.min)
//For every char y in a, min(x, y) is chosen
a => b => b.flatMap(x => a.map(y => x.min(y))
//The results are concatenated because flatMap is used

Why does this post require moderator attention?