(*/@{/~<@<@<"0@i.@#) 4 3 2 8
48 64 96 24
On Thu, Mar 27, 2014 at 4:10 PM, Dan Bron <[email protected]> wrote:
> Oh, I like this game!
>
> (*/ % ]) 4 3 2 8
> 48 64 96 24
>
> (*/@#~1-=@i.) 4 3 2 8
> 48 64 96 24
>
> -Dan
>
> ----- Original Message ---------------
>
> Subject: Re: [Jprogramming] J as an interviewing tool
> From: Roger Hui <[email protected]>
> Date: Thu, 27 Mar 2014 12:44:59 -0700
> To: Programming forum <[email protected]>
>
> 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
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm