Multiply two strings
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.
BQN, 3 bytes Anonymous taci …
3y ago
[Jelly], 2 bytes «þ …
3y ago
JavaScript, 37 bytes I/O as …
3y ago
Japt `-m`, 5 bytes Takes in …
3y ago
[Haskell], 25 bytes …
3y ago
Scala, 25 bytes ``` a=>.fl …
3y ago
6 answers
Jelly, 2 bytes
«þ
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
0 comment threads
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.
0 comment threads
JavaScript, 37 bytes
I/O as character arrays.
a=>b=>b.flatMap(x=>a.map(y=>x<y?x:y))
0 comment threads
Scala, 25 bytes
a=>_.flatMap(a map _.min)
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
0 comment threads