Just wanted to say...

....Seriously blowing my mind here guys. I keep reconsidering
completely learning J when I see things like this.

As for an interviewing tool, well, I'm sure it would impress many.



On Thu, Mar 27, 2014 at 3:44 PM, Roger Hui <[email protected]> wrote:
> 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

Reply via email to