Suppose you did not have the outfix operator, but still have array ops. x=: 4 3 2 8 I=: =i.#x I 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 (-.I)*/ .(^~) x 48 64 96 24
On Thu, Mar 27, 2014 at 12:37 PM, Dan Bron <[email protected]> wrote: > A question on StackExchange [1]: > > " > I was asked the following interview question over the phone: > Given an array of integers, produce an array whose values > are the product of every other integer excluding the current index. > > > Example: > [4, 3, 2, 8] -> [3*2*8, 4*2*8, 4*3*8, 4*3*2] -> [48, 64, 96, 24] > > " > > His answer is given in the postscript. It spans 3 kilobytes over 86 lines. > The community's responses aren't much of an improvement (by that metric; > by other metrics - Java-specific ones, they decent advancements). > > The J answer? > > 1 */\. 4 3 2 8 > 48 64 96 24 > > Could've answered the interviewer in a sentence, right over the phone. > > -Dan > > > [1] Code Review StackExchange question > "Array whose values are the product of every other integer": > > > http://codereview.stackexchange.com/questions/45498/array-whose-values-are-the-product-of-every-other-integer > > > > import java.math.BigInteger; > import java.util.Arrays; > > public class ProductOfAnArray { > > public static void main(String[] args) { > > try { > System.out.println(Arrays.toString(ProductOfAnArray > .calcArray(new int[] { 4, 3, 2, 8 }))); > System.out.println(Arrays.toString(ProductOfAnArray > .calcArray(new int[] { 4, 0, 2, 8 }))); > System.out.println(Arrays.toString(ProductOfAnArray > .calcArray(new int[] { 4, 0, 2, 0 }))); > System.out.println(Arrays.toString(ProductOfAnArray > .calcArray(new int[] {}))); > System.out > .println(Arrays.toString(ProductOfAnArray > .calcArray(new int[] { 4, 3, 2, 8, 3, 2, 4, 6, > 7, > 3, 2, 4 }))); > System.out > .println(Arrays.toString(ProductOfAnArray > .calcArray(new int[] { 4, 3, 2, 8, 3, 2, 4, 6, > 7, > 3, 2, 4 }))); > System.out.println(Arrays.toString(ProductOfAnArray > .calcArray(new int[] { 4432432, 23423423, 34234, > 23423428, > 4324243, 24232, 2342344, 64234234, 4324247, > 4234233, 234422, 234244 }))); > } catch (Exception e) { > // debug exception here and log. > } > } > > /* > * Problem: Given an array of integers, produce an array whose values > are > * the product of every other integer excluding the current index. > * > * Assumptions. Input array cannot be modified. input is an integer > array > * "produce an array" - type not specified for output array > * > * Logic explanation: > * > * Assume we have array [a,b,c,d] Let multiple be multiple of each > element > * in array. Hence multiple = 0 if one of the element is 0; To produce > the > * output. Ans at i -> multiple divided by the value at i. if 2 numbers > are > * 0 then entire output will be 0 because atleast one 0 will be a > multiple > * if 1 number is 0 then every thing else will be 0 except that index > whole > * value is to be determined > * > */ > public static BigInteger[] calcArray(final int[] inp) throws Exception > { > if (inp == null) > throw new Exception("input is null"); > > int cnt = 0; > BigInteger multiple = new BigInteger("1"); > boolean foundZero = false; > > for (int i : inp) { > if (i == 0) { > cnt++; > foundZero = true; > if (cnt < 2) > continue; > else > break; > } > multiple = multiple.multiply(BigInteger.valueOf(i)); > } > > BigInteger ans[] = new BigInteger[inp.length]; > > for (int i = 0; i < inp.length; i++) { > if (foundZero) { > if (cnt < 2) { > ans[i] = (inp[i] == 0) ? multiple : new > BigInteger("0"); > } else { > ans[i] = new BigInteger("0"); > } > } else { > ans[i] = multiple.divide(BigInteger.valueOf(inp[i])); > } > } > return ans; > } > > } > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
