Am I divisible by double the sum of my digits?

40

2

Given a positive integer as input, your task is to output a truthy value if the number is divisible by the double of the sum of its digits, and a falsy value otherwise (OEIS A134516). In other words:

(sum_of_digits)*2 | number
  • Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true/false case, and their complement the other values. For a simple example, you may use 0 for the true case and all other numbers for the false case (or vice versa, if you like).

  • Standard input and output rules apply. Default Loopholes also apply.

  • You can take input as an integer or as the string representation of that integer.

  • This is , hence the shortest code in bytes wins!

  • I am new to PPCG, so I would like you to post an explanation if it's possible.


Test Cases

Input - Output - (Reason)

80  - Truthy - (16 divides 80)
100 - Truthy - (2 divides 100)
60  - Truthy - (12 divides 60)
18 - Truthy - (18 divides 18)
12 - Truthy - (6 divides 12)

4 - Falsy - (8 does not divide 4)
8 - Falsy - (16 does not divide 8)
16  - Falsy  - (14 does not divide 16)
21 - Falsy - (6 does not divide 21)
78  - Falsy  - (30 does not divide 78)
110 - Falsy - (4 does not dide 110)
111 - Falsy - (6 does not divide 111)
390 - Falsy  - (24 does not divide 390)

user70974

Posted 2017-07-03T13:00:47.433

Reputation:

Good challenge, welcome to PPCG! – Skidsdev – 2017-07-03T13:59:13.087

@Mayube Thanks, it is my second challenge, but the first one got closed :P – None – 2017-07-03T14:00:13.563

Are we allowed to take digits as a list of Integers? – Henry – 2017-07-03T14:32:32.223

4@Henry No, that would be way too trivial – None – 2017-07-03T14:34:47.657

Would outputting 0 for true and any other number for false be allowed? – Shaggy – 2017-07-03T15:42:38.537

@Shaggy "The truthy / falsy values do not necessarily have to be constant, as long as for truthy you have a finite set of values, and their complement for the falsy ones." - so you have the set {0} for truthy and its complement, Z \ {0} for false. Hence, I think it is allowed. – Mr. Xcoder – 2017-07-03T16:32:07.303

@Shaggy Sorry for the delay I answered: Yes, it is allowed. – None – 2017-07-03T16:33:39.753

Why does the truthy set have to be finite? – CalculatorFeline – 2017-07-03T21:46:56.853

1Indeed, the two sentences of "Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true case, and their complement for the falsy ones. For a simple example, you may use 0 for the true case and all other numbers for the false case (or vice versa, if you like)" seem to contradict each other (in particular, the "finite" and the "or vice versa"). – Greg Martin – 2017-07-04T02:52:33.663

@CalculatorFeline You can have the falsy set finite and its complement truthy – None – 2017-07-04T11:31:50.720

In my opinion, all calculate-able set should be accepted. (that is, there exists a Turing machine which, given an output, output True or False deterministically within a finite time.) For example, True = odd number, False = even number. – user202729 – 2017-07-04T12:01:04.453

Answers

7

Neim, 3 bytes

Explanation:

      Implicitly convert to int array and sum the digits
 ᚫ     Double
     Is it a divisor of the input?

Try it online!

Detailed version

Okx

Posted 2017-07-03T13:00:47.433

Reputation: 15 025

Umm...you should check if the input is a multiple of double the sum of the digits, not vice versa. – Erik the Outgolfer – 2017-07-03T13:31:18.350

@EriktheOutgolfer What do you mean? I do check if the input is a multiple of double the sum of the digits. Perhaps I did not explain it correctly. – Okx – 2017-07-03T13:32:18.050

4Neim needs to get even golfier - when submissions get too long, my browser starts to lag. – Esolanging Fruit – 2017-07-08T18:12:56.967

1@Challenger5 I sincerely apologise for the lack of golfiness. I will try again next time. Again, sorry about that. – Okx – 2017-07-08T19:59:43.257

@Okx And I sincerely apologize for being too lazy to find a Neim answer that was a better demonstration of what I was talking about. – Esolanging Fruit – 2017-07-08T21:48:29.770

16

JavaScript (ES6), 31 29 27 bytes

Takes input as a string. Returns zero for truthy and non-zero for falsy.

n=>n%eval([...n+n].join`+`)

Commented

n => n % eval([...n + n].join`+`)
n =>                                   // take input string n  -> e.g. "80"
                  n + n                // double the input     -> "8080"
              [...     ]               // split                -> ["8", "0", "8", "0"]
                        .join`+`       // join with '+'        -> "8+0+8+0"
         eval(                  )      // evaluate as JS       -> 16
     n %                               // compute n % result   -> 80 % 16 -> 0

Test cases

let f =

n=>n%eval([...n+n].join`+`)

console.log('[Truthy]');
console.log(f("80"))
console.log(f("100"))
console.log(f("60"))
console.log(f("18"))
console.log(f("12"))

console.log('[Falsy]');
console.log(f("4"))
console.log(f("8"))
console.log(f("16"))
console.log(f("21"))
console.log(f("78"))
console.log(f("110"))
console.log(f("111"))
console.log(f("390"))

Arnauld

Posted 2017-07-03T13:00:47.433

Reputation: 111 334

I've never seen the [...x] method of splitting before, is there a name for this specifically? – Jacob Persi – 2017-11-23T19:02:56.133

@JacobPersi This is the spread operator.

– Arnauld – 2017-11-23T20:07:47.777

7

C#, 46 bytes

using System.Linq;n=>n%(n+"").Sum(c=>c-48)*2<1

Full/Formatted version:

using System;
using System.Linq;

class P
{
    static void Main()
    {
        Func<int, bool> f = n => n % (n + "").Sum(c => c - 48) * 2 < 1;

        Console.WriteLine(f(80));
        Console.WriteLine(f(100));
        Console.WriteLine(f(60));

        Console.WriteLine();

        Console.WriteLine(f(16));
        Console.WriteLine(f(78));
        Console.WriteLine(f(390));

        Console.ReadLine();
    }
}

TheLethalCoder

Posted 2017-07-03T13:00:47.433

Reputation: 6 930

5

x86-64 Machine Code, 24 bytes

6A 0A 5E 31 C9 89 F8 99 F7 F6 01 D1 85 C0 75 F7 8D 04 09 99 F7 F7 92 C3

The above code defines a function in 64-bit x86 machine code that determines whether the input value is divisible by double the sum of its digits. The function conforms to the System V AMD64 calling convention, so that it is callable from virtually any language, just as if it were a C function.

It takes a single parameter as input via the EDI register, as per the calling convention, which is the integer to test. (This is assumed to be a positive integer, consistent with the challenge rules, and is required for the CDQ instruction we use to work correctly.)

It returns its result in the EAX register, again, as per the calling convention. The result will be 0 if the input value was divisible by the sum of its digits, and non-zero otherwise. (Basically, an inverse Boolean, exactly like the example given in the challenge rules.)

Its C prototype would be:

int DivisibleByDoubleSumOfDigits(int value);

Here are the ungolfed assembly language instructions, annotated with a brief explanation of the purpose of each instruction:

; EDI == input value
DivisibleByDoubleSumOfDigits:
   push 10
   pop  rsi             ; ESI <= 10
   xor  ecx, ecx        ; ECX <= 0
   mov  eax, edi        ; EAX <= EDI (make copy of input)

SumDigits:
   cdq                  ; EDX <= 0
   div  esi             ; EDX:EAX / 10
   add  ecx, edx        ; ECX += remainder (EDX)
   test eax, eax
   jnz  SumDigits       ; loop while EAX != 0

   lea  eax, [rcx+rcx]  ; EAX <= (ECX * 2)
   cdq                  ; EDX <= 0
   div  edi             ; EDX:EAX / input
   xchg edx, eax        ; put remainder (EDX) in EAX
   ret                  ; return, with result in EAX

In the first block, we do some preliminary initialization of registers:

  • PUSH+POP instructions are used as a slow but short way to initialize ESI to 10. This is necessary because the DIV instruction on x86 requires a register operand. (There is no form that divides by an immediate value of, say, 10.)
  • XOR is used as a short and fast way to clear the ECX register. This register will serve as the "accumulator" inside of the upcoming loop.
  • Finally, a copy of the input value (from EDI) is made, and stored in EAX, which will be clobbered as we go through the loop.

Then, we start looping and summing the digits in the input value. This is based on the x86 DIV instruction, which divides EDX:EAX by its operand, and returns the quotient in EAX and the remainder in EDX. What we'll do here is divide the input value by 10, such that the remainder is the digit in the last place (which we'll add to our accumulator register, ECX), and the quotient is the remaining digits.

  • The CDQ instruction is a short way of setting EDX to 0. It actually sign-extends the value in EAX to EDX:EAX, which is what DIV uses as the dividend. We don't actually need sign-extension here, because the input value is unsigned, but CDQ is 1 byte, as opposed to using XOR to clear EDX, which would be 2 bytes.
  • Then we DIVide EDX:EAX by ESI (10).
  • The remainder (EDX) is added to the accumulator (ECX).
  • The EAX register (the quotient) is tested to see if it is equal to 0. If so, we have made it through all of the digits and we fall through. If not, we still have more digits to sum, so we go back to the top of the loop.

Finally, after the loop is finished, we implement number % ((sum_of_digits)*2):

  • The LEA instruction is used as a short way to multiply ECX by 2 (or, equivalently, add ECX to itself), and store the result in a different register (in this case, EAX).

    (We could also have done add ecx, ecx+xchg ecx, eax; both are 3 bytes, but the LEA instruction is faster and more typical.)

  • Then, we do a CDQ again to prepare for division. Because EAX will be positive (i.e., unsigned), this has the effect of zeroing EDX, just as before.
  • Next is the division, this time dividing EDX:EAX by the input value (an unmolested copy of which still resides in EDI). This is equivalent to modulo, with the remainder in EDX. (The quotient is also put in EAX, but we don't need it.)
  • Finally, we XCHG (exchange) the contents of EAX and EDX. Normally, you would do a MOV here, but XCHG is only 1 byte (albeit slower). Because EDX contains the remainder after the division, it will be 0 if the value was evenly divisible or non-zero otherwise. Thus, when we RETurn, EAX (the result) is 0 if the input value was divisible by double the sum of its digits, or non-zero otherwise.

Hopefully that suffices for an explanation.
This isn't the shortest entry, but hey, it looks like it beats almost all of the non-golfing languages! :-)

Cody Gray

Posted 2017-07-03T13:00:47.433

Reputation: 2 639

4

05AB1E, 5 4 bytes

-1 byte thanks to Okx

SO·Ö

Try it online!

You can also remove the last Ö to get 0 for truthy and something else for falsy resulting in only 3 bytes but to me that just doesn't seem to appropriately fit the definition.

Explanation

SO·Ö
SO    # Separate the digits and sum them
  ·   # Multiply the result by two
   Ö  # Is the input divisible by the result?

Datboi

Posted 2017-07-03T13:00:47.433

Reputation: 1 213

You can golf it to 4 bytes by replacing %_ with Ö. – Okx – 2017-07-03T13:24:42.853

4

MATL, 7 bytes

tV!UsE\

Outputs 0 if divisible, positive integer otherwise. Specifically, it outputs the remainder of dividing the number by twice the sum of its digits.

Try it online!

Explanation

t   % Implicit input. Duplicate
V!U % Convert to string, transpose, convert to number: gives column vector of digits
s   % Sum
E   % Times 2
\   % Modulus. Implicit display

Luis Mendo

Posted 2017-07-03T13:00:47.433

Reputation: 87 464

4

Retina, 38 27 bytes

-11 bytes and fixed an error with the code thanks to @MartinEnder

$
$_¶$_
.+$|.
$*
^(.+)¶\1+$

Try it online!

Prints 1 if divisible, 0 otherwise

Explanation (hope I got this right)

$
$_¶$_

Appends the entire input, plus a newline, plus the input again

.+$|.
$*

Converts each match to unary (either the entire second line which is the original input, or each digit in the first line)

^(.+)¶\1+$

Check if the first line (the doubled digit sum) is a divisor of the second line

PunPun1000

Posted 2017-07-03T13:00:47.433

Reputation: 973

3

Japt, 7 4 bytes

Takes input as a string. Outputs 0 for true or a number greater than 0 for false, which, from other solutions, would appear to be valid. If not, let me know and I'll rollback.

%²¬x

Test it


Explanation

Implicit input of string U.
"390"

²

Repeat U twice.
"390390"

¬

Split to array of individual characters.
["3","9","0","3","9","0"]

x

Reduce by summing, automatically casting each character to an integer in the process.
24

%

Get the remainder of dividing U by the result, also automatically casting U to an integer in the process. Implicitly output the resulting integer.
6 (=false)

Shaggy

Posted 2017-07-03T13:00:47.433

Reputation: 24 623

2Your explanations usually use up a lot of vertical space, which I feel isn't needed. Either way, it's your answer. – Okx – 2017-07-03T13:47:12.380

@Okx; I don't know how "usual" it can be when I only switched to this format a couple of days ago. – Shaggy – 2017-07-03T13:51:41.337

4I liked the explanation format. Was easy to follow, especially for this problem, as it was a linear reduction and moved down the page like a math problem. Just my two cents. – Henry – 2017-07-03T14:34:40.437

3This explaination format is a lot better than the usual format, especially for those who are not familiar with the languages. I wish other golfers using these golfing languages would do this too. – Peter1807 – 2017-07-03T14:48:47.807

3

C89, 55 53 bytes

(Thanks to Steadybox!

s,t;f(x){for(t=x,s=0;t;t/=10)s+=t%10;return x%(s*2);}

It takes a single input, x, which is the value to test. It returns 0 if x is evenly divisible by double the sum of its digits, or non-zero otherwise.

Try it online!

Ungolfed:

/* int */ s, t;
/*int */ f(/* int */ x)
{
    for (t = x, s = 0; t /* != 0 */; t /= 10)
        s += (t % 10);
    return x % (s * 2);
}

As you can see, this takes advantage of C89's implicit-int rules. The global variables s and t are implicitly declared as ints. (They're also implicitly initialized to 0 because they are globals, but we can't take advantage of this if we want the function to be callable multiple times.)

Similarly, the function, f, takes a single parameter, x, which is implicitly an int, and it returns an int.

The code inside of the function is fairly straightforward, although the for loop will look awfully strange if you're unfamiliar with the syntax. Basically, a for loop header in C contains three parts:

for (initialization; loop condition; increment)

In the "initialization" section, we've initialized our global variables. This will run once, before the loop is entered.

In the "loop condition" section, we've specified on what condition the loop should continue. This much should be obvious.

In the "increment" section, we've basically put arbitrary code, since this will run at the end of every loop.

The larger purpose of the loop is to iterate through each digit in the input value, adding them to s. Finally, after the loop has finished, s is doubled and taken modulo x to see if it is evenly divisible. (A better, more detailed explanation of the logic here can be found in my other answer, on which this one is based.)

Human-readable version:

int f(int x)
{
    int temp = x;
    int sum  = 0;
    while (temp > 0)
    {
        sum  += temp % 10;
        temp /= 10;
    }
    return x % (sum * 2);
}

Cody Gray

Posted 2017-07-03T13:00:47.433

Reputation: 2 639

You can save two bytes, if you use t instead of t>0 as the loop condition.

– Steadybox – 2017-07-04T12:33:44.380

Ah, of course! Good catch, @Steadybox. Not sure how I missed that, since testing against 0 is exactly what my asm implementation did, on which this answer was heavily based. – Cody Gray – 2017-07-06T13:11:48.730

45 – PrincePolka – 2017-11-28T01:41:11.023

2

Brachylog, 8 bytes

ẹ+×₂;I×?

Try it online!

Explanation

ẹ+           Sum the digits
  ×₂         Double
    ;I×?     There is an integer I such that I×(double of the sum) = Input

Fatalize

Posted 2017-07-03T13:00:47.433

Reputation: 32 976

2

Python 2, 34 32 bytes

-2 bytes thanks to @Rod

lambda n:n%sum(map(int,`n`)*2)<1

Try it online!

ovs

Posted 2017-07-03T13:00:47.433

Reputation: 21 408

6based on the example of "clearly distinguishable" provided in the question, I believe you can remove the <1. – Post Rock Garf Hunter – 2017-07-03T13:34:41.973

2

Mathematica, 26 bytes

(2Tr@IntegerDigits@#)∣#&

No clue why has a higher precedence than multiplication...

Martin Ender

Posted 2017-07-03T13:00:47.433

Reputation: 184 808

2

PHP, 41 bytes

prints zero if divisible, positive integer otherwise.

<?=$argn%(2*array_sum(str_split($argn)));

Try it online!

Jörg Hülsermann

Posted 2017-07-03T13:00:47.433

Reputation: 13 026

You put the assignment in the header block. You might as well use $a=10, but you forgot to count that towards your byte count – aross – 2017-07-05T09:34:35.930

@aross why should I count the input towards to my byte count. $argn is available with the -F (in this case) or -R option – Jörg Hülsermann – 2017-07-05T10:48:45.043

Hm, interesting. I didn't know about -F. But that's not reflected in your TIO (does it support echoing from STDIN?). – aross – 2017-07-05T11:53:19.283

@aross it works like your approach use only a file instead of code and the -Foption instead of -R http://php.net/manual/en/features.commandline.options.php If you found an better way to make the same in tio like in the commnd line let me know

– Jörg Hülsermann – 2017-07-05T12:03:22.850

2

Excel, 63 bytes

=MOD(A1,2*SUMPRODUCT(--MID(A1,ROW(OFFSET(A$1,,,LEN(A1))),1)))=0

Summing digits is the lengthy bit.

Wernisch

Posted 2017-07-03T13:00:47.433

Reputation: 2 534

2

Perl 6, 19 bytes

{$_%%(2*.comb.sum)}

Try it online!

Sean

Posted 2017-07-03T13:00:47.433

Reputation: 4 136

2

Husk, 9 8 bytes

Thanks to Leo for saving 1 byte.

Ṡ¦ȯ*2ṁis

Try it online!

Explanation

Ṡ¦ȯ         Test whether f(x) divides x, where f is the function obtained by
            composing the next 4 functions.
       s    Convert x to a string.
     ṁi     Convert each character to an integer and sum the result.
   *2       Double the result.

Martin Ender

Posted 2017-07-03T13:00:47.433

Reputation: 184 808

You can use ṁ to map and sum with a single command, saving one byte – Leo – 2017-07-03T17:09:51.483

2

Haskell, 38 37 42 bytes

Thanks to Zgarb for golfing off 1 byte

f x=read x`mod`foldr((+).(*2).read.pure)0x

Try it online!

Takes input as a string; returns 0 if divisible and nonzero otherwise.

Julian Wolf

Posted 2017-07-03T13:00:47.433

Reputation: 1 139

(:[]) can be pure. – Zgarb – 2017-07-03T17:00:06.800

You will save 1 byte by replacing the lambda by function declaration – bartavelle – 2017-07-04T06:37:34.653

@bartavelle: Pretty sure it's a wash. Example? – Julian Wolf – 2017-07-04T15:33:31.403

You're right, it is the exact same length. Not sure how that crossed my mind :/ – bartavelle – 2017-07-04T15:43:45.157

2

TI-BASIC, 27 26 21 bytes

-5 thanks to @Oki

:fPart(Ans/sum(2int(10fPart(Ans10^(~randIntNoRep(1,1+int(log(Ans

This is made trickier by the fact that there is no concise way to sum integer digits in TI-BASIC. Returns 0 for True, and a different number for False.

Explanation:

:fPart(Ans/sum(2int(10fPart(Ans10^(-randIntNoRep(1,1+int(log(Ans
                               10^(-randIntNoRep(1,1+int(log(Ans #Create a list of negative powers of ten, based off the length of the input, i.e. {1,0.1,0.01}
                            Ans                                  #Scalar multiply the input into the list
                    10fPart(                                     #Remove everything left of the decimal point and multiply by 10
               2int(                                             #Remove everything right of the decimal point and multiply by 2
           sum(                                                  #Sum the resulting list
       Ans/                                                      #Divide the input by the sum
:fPart(                                                          #Remove everything left of the decimal, implicit print

Scott Milner

Posted 2017-07-03T13:00:47.433

Reputation: 1 806

210^-randIntNoRep(1,1+int(log(Ans does the same as seq(10^(~A-1),A,0,log(Ans in fewer bytes as order doesnt matter (Assuming version 2.55MP) – Oki – 2017-07-09T18:01:01.900

2

Python 3, 35 bytes

lambda a:a%(sum(map(int,str(a)))*2)

wrymug

Posted 2017-07-03T13:00:47.433

Reputation: 772

Hello and welcome to the site. You can remove some whitespace here. Particularly around = and after the ) in int(c). In addition since sum can take a generator as an argument you can remove the [..] inside it. If you have any additional questions feel free to ping me. – Post Rock Garf Hunter – 2017-07-04T15:58:10.960

int(c)for c in a could also be map(int,a), to save a few bytes. – Post Rock Garf Hunter – 2017-07-04T16:52:04.130

This doesn't work - or rather, works backwards. Easily fixed with 4 extra bytes: lambda a:not a%(sum(map(int,str(a)))*2) – osuka_ – 2017-11-21T16:01:59.960

@osuka_ see bullet point one in the question description – wrymug – 2017-11-21T16:08:10.510

1

Braingolf, 13 12 bytes

VR.Mvd&+2*c%

Try it online!

Outputs 0 for truthy, any other number for falsey.

Explanation

VR.Mvd&+2*c%  Implicit input from command-line args
VR            Create stack2, return to stack1
  .M          Duplicate input to stack2
    vd        Switch to stack2, split into digits
      &+      Sum up all digits
        2*    Double
          c   Collapse stack2 back into stack1
           %  Modulus
              Implicit output of last item on stack

Skidsdev

Posted 2017-07-03T13:00:47.433

Reputation: 9 656

1

Java, 66 bytes

-1 byte thanks to Olivier

a->{int i=0;for(int b:(""+a).getBytes())i+=b-48;return a%(i*2)<1;}

Ungolfed & explanation:

a -> {
    int i = 0;

    for(int b : (""+a).getBytes()) { // Loop through each byte of the input converted to a string
        i += b-48; // Subtract 48 from the byte and add it to i
    }

    return a % (i*2) < 1 // Check if a % (i*2) is equal to one
    // I use <1 here for golfing, as the result of a modulus operation should never be less than 0
}

Okx

Posted 2017-07-03T13:00:47.433

Reputation: 15 025

Use int instead of byte to save... a byte. – Olivier Grégoire – 2017-07-03T14:42:40.580

@OlivierGrégoire Thanks. Didn't notice that. – Okx – 2017-07-03T14:45:50.530

@Okx Need to change golfed code as well. – Henry – 2017-07-03T14:48:07.487

Your (golfed) code gives incorrect values for 110, 111. Probably the a%i*2 that's parsed as (a%i)*2 since modulus and multiplication have the same order. – Olivier Grégoire – 2017-07-03T14:52:22.563

@OlivierGrégoire Ah, that sucks. – Okx – 2017-07-03T14:53:20.880

1

Japt, 7 bytes

vUì x*2

Returns 1 for true, 0 for false

Try it online!

Explanation

vUì x*2
v        // Return 1 if the input is divisible by:
 Uì      //   Input split into a base-10 array
    x    //   Sum the array
     *2  //   While mapped by *2

Oliver

Posted 2017-07-03T13:00:47.433

Reputation: 7 160

I came up with a few other 7 byte solutions for this, too (although, I don't think this was one of them) - I'm convinced there's a shorter solution, though. – Shaggy – 2017-07-03T15:36:18.147

1

Haskell, 49 Bytes

f x=(==) 0.mod x.(*)2.sum.map(read.return).show$x

Usage

f 80

Try it online!

Henry

Posted 2017-07-03T13:00:47.433

Reputation: 461

3

Tips: there is an extra space, return==pure, list comprehensions are often very compact : Try it online!

– bartavelle – 2017-07-03T16:41:58.970

1

J, 15 bytes

0 indicates truthy, nonzero indicates falsy.

|~[:+/2#"."0@":

Explanation

        "."0@":  convert to list of digits
  [:+/2#         sum 2 copies of the list ([: forces monadic phrase)
|~               residue of sum divided by argument?

hoosierEE

Posted 2017-07-03T13:00:47.433

Reputation: 760

Very clever way to avoid parens or multiple @ or [:! – Jonah – 2017-07-03T20:05:35.097

1I debated posting this as my own answer, but it's not really different enough. |~2*1#.,.&.": for 13 bytes. – cole – 2017-11-29T04:14:53.743

I get a 'domain error' for this on my J Qt IDE. (|~[:+/2#"."0@": 112) Then for cole's code I get (|~2*1#.,.&.": 112)=0. :/ Possibly something wrong on my end. – DrQuarius – 2019-08-24T11:41:03.357

1

Ohm, 5 bytes

D}Σd¥

Try it online!

FrodCube

Posted 2017-07-03T13:00:47.433

Reputation: 539

1

tcl, 45

puts [expr 1>$n%(2*([join [split $n ""] +]))]

demo

sergiol

Posted 2017-07-03T13:00:47.433

Reputation: 3 055

1You can replace 0== with 1>. – Mr. Xcoder – 2017-07-03T19:25:18.560

1

Haskell, 35 34 bytes

f x=mod x$2*sum[read[c]|c<-show x]

Try it online!

Returns '0' in the true case, the remainder otherwise.

Haskell, pointfree edition by nimi, 34 bytes

mod<*>(2*).sum.map(read.pure).show

Try it online!

bartavelle

Posted 2017-07-03T13:00:47.433

Reputation: 1 261

Same byte count if you go pointfree: mod<*>(2*).sum.map(read.pure).show – nimi – 2017-07-04T15:34:54.827

Looks good, I added it in my submission. – bartavelle – 2017-07-04T15:46:01.000

1

Mini-Flak, 296 292 bytes

({}((()[()]))){(({}[((((()()()){}){}){}){}])({}(((({})){}){}{}){})[({})])(({}({})))({}(({}[{}]))[{}])({}[({})](({}{})(({}({})))({}(({}[{}]))[{}])({}[({})]))[{}])(({}({})))({}(({}[{}]))[{}])({}[({})])}{}({}(((({}){})))[{}]){({}((({}[()]))([{(({})[{}])()}{}]()){{}{}(({}))(()[()])}{})[{}][()])}

Try it online!

The TIO link have more comments from me, so it is partially easier to read.

Truthy/Falsey: Truthy (divisible) if the second number is equal to the third number, falsy otherwise. So both the truthy and falsy set are infinite, but I suppose that should be allowed. +10 byte if that is not.

Note: Leading/trailing newlines/whitespaces are not allowed in input.

user202729

Posted 2017-07-03T13:00:47.433

Reputation: 14 620

1

Java (OpenJDK 8), 55 53 bytes

a->{int i=0,x=a;for(;x>0;x/=10)i+=x%10*2;return a%i;}

Try it online!

A return value of 0 means truthy, anything else means falsy.

Since my comment in Okx's answer made no ripple, I deleted it and posted it as this answer, golfed even a bit more.

Further golfing thanks to @KrzysztofCichocki and @Laikoni who rightfully showed me I needn't answer a truthy/falsy value, but any value as long as I describe the result.

Olivier Grégoire

Posted 2017-07-03T13:00:47.433

Reputation: 10 647

You can remove the <1 part at the end, so the result will be 0 for true and >0 for false, which is accebtable, this will result in additional -2 bytes, so you answer coiuld be like 53 bytes. – Krzysztof Cichocki – 2017-07-05T07:50:55.997

@KrzysztofCichoki No I can't: this is Java. The only truthy value is true. – Olivier Grégoire – 2017-07-05T07:56:18.697

@OlivierGrégoire While this true if nothing else is specified, this challenge specifically states Instead of truthy / falsy values for the true and false cases, you may instead specify any finite set of values for the true/false case, and their complement the other values.. – Laikoni – 2017-07-05T08:13:50.317

@KrzysztofCichocki and Laikoni Sorry I misread that part, I just fixed it! Thank you both :) Also, sorry for rejecting the edit which was actually appropriate in this case.

– Olivier Grégoire – 2017-07-05T10:32:58.263

1

PHP, 44 bytes

for(;~$d=$argn[$i++];)$t+=2*$d;echo$argn%$t;

Run like this:

echo 80 | php -nR 'for(;~$d=$argn[$i++];)$t+=2*$d;echo$argn%$t;'

Explanation

Iterates over the digits to compute the total, then outputs the modulo like most answers.

aross

Posted 2017-07-03T13:00:47.433

Reputation: 1 583

1

APL, 13 bytes

{⍵|⍨2×+/⍎¨⍕⍵}

Outputs 0 as a truthy value, and any other as falsy.

Uriel

Posted 2017-07-03T13:00:47.433

Reputation: 11 708

1

C# (.NET Core), 51 bytes

n=>{int l=n,k=0;for(;l>0;l/=10)k+=l%10;return n%k;}

Try it online!

0 for truthy, anything else for falsey.

jkelm

Posted 2017-07-03T13:00:47.433

Reputation: 441

1

Perl 5, 21 + 1 (-p) = 22 bytes

$_%=eval s/./+2*$&/rg

Try it online!

Xcali

Posted 2017-07-03T13:00:47.433

Reputation: 7 671

-1 byte: $_%=eval s//+2*/rg.0 – Grimmy – 2019-02-06T22:25:39.177

1

Pyth - 12 Bytes

%sZ*2ssMscZ1

Explanation:

%       - implicitly print modulus of
 s      - parse int
  Z     - input
 *      - two times
  s    - sum of
   M   - map
    s  - parse int to
    c  - substrings
     Z - of input
     1 - of length 1

Tornado547

Posted 2017-07-03T13:00:47.433

Reputation: 389

1

Befunge-93, 34 bytes

p&::v>0g2*%.@
+19:_^#:/+91p00+g00%

Try it online!

Prints 0 for truthy, a different integer for falsey.

Jo King

Posted 2017-07-03T13:00:47.433

Reputation: 38 234

1

Brachylog, 7 bytes

f.&ẹj+∈

Try it online!

The predicate succeeds if the input is divisible by twice the sum of its digits, and fails otherwise. Run as a program, success prints true. and failure prints false..

This started off as a minor edit to Fatalize's answer, golfing a byte off by replacing +×₂ with j+, but as I was testing it I noticed that one or another of the updates he's made to the language in the last year and a half seems to have broken his solution on the case of 18, with I apparently being unable to assume the value of 1, so I ended up having to restructure it somewhat (fortunately without changing the byte count).

f.         The output variable is a list of the input's factors.
  &        And,
   ẹ       the digits of the input,
    j      all duplicated,
     +     sum up to
      ∈    a member of the output variable.

Unrelated String

Posted 2017-07-03T13:00:47.433

Reputation: 5 300

1

K (ngn/k), 15 14 bytes

{(2*+/10\x)!x}

Try it online!


0 is truthy

scrawl

Posted 2017-07-03T13:00:47.433

Reputation: 1 079

1

Keg+Reg, 11 bytes

Boring algorithm.

¿:;9%1+2*%

Finds the digital root of the top of the stack and then finds the remainder.

0 is a truthy value, any value that is not 0 is a falsy value. (Including ASCII characters)

Explanation (Syntactically invalid)

¿#         Integer input
 :#        Duplicate
  ;9%1+#   Digital Root Formula (1+(n-1)mod 9)
       2*%#Multiply by 2 and find the remainder

I believe everyone here used repetition/reduction but not an existing formula.

user85052

Posted 2017-07-03T13:00:47.433

Reputation:

0

Jelly, 4 bytes

DSḤḍ

Try it online!

Explanation:

DSḤḍ Takes an integer as input.
D    Get digits (convert to base 10)
 S   Sum
  Ḥ  Unhalve (double)
   ḍ Check if y (the input itself) is divisible by x

Erik the Outgolfer

Posted 2017-07-03T13:00:47.433

Reputation: 38 134

@TheIOSCoder Added explanation. – Erik the Outgolfer – 2017-07-03T13:50:29.107

0

Pari/GP, 24 bytes

n->!(n%(2*sumdigits(n)))

Try it online!

alephalpha

Posted 2017-07-03T13:00:47.433

Reputation: 23 988

0

jq, 37 characters

.%(tostring/""|map(tonumber)|add*2)<1

Sample run:

bash-4.4$ jq '.%(tostring/""|map(tonumber)|add*2)<1' <<< '60'
true

bash-4.4$ jq '.%(tostring/""|map(tonumber)|add*2)<1' <<< '390'
false

Try on jp‣play

manatwork

Posted 2017-07-03T13:00:47.433

Reputation: 17 865

0

PowerShell, 39 bytes

($a="$args")%($a*2-replace'\B','+'|iex)

0 as Truthy output, any other number as Falsey.

PS D:\> D:\t.ps1 80
0

PS D:\> D:\t.ps1 81
9

It takes the args array as a string, does string multiplication to double all the digits, regex-replaces non-word-boundaries to make '8+0+8+0', eval's that to get the sum, and calculates a remainder of original/sum.

TessellatingHeckler

Posted 2017-07-03T13:00:47.433

Reputation: 2 412

0

CJam, 11 10 bytes

1 byte saved thanks to @Challenger5

{_Ab:+2*%}

Anonymous block that takes the input from the stack and replaces it by the output, which is 0 if divisible or a positive integer otherwise.

Try it online! Or verify all test cases.

Explanation

{        }   e# Block
 _           e# Duplicate
  Ab         e# Convert to base 10. Gives an array of digits
    :+       e# Fold addition over array
      2*     e# Multiply by 2
        %    e# Modulus

Luis Mendo

Posted 2017-07-03T13:00:47.433

Reputation: 87 464

You can replace s:~ with Ab (convert to base 10) – Esolanging Fruit – 2017-07-04T06:36:39.387

@Challenger5 Thanks! Edited – Luis Mendo – 2017-07-04T08:26:14.533

0

Bash + coreutils + bc, 46 bytes

yes $1%\(0`echo $1|sed 's/\(.\)/+\1*2/g'`\)|bc

Input via command line. 0 is truthy.

First I tried to loop through the characters of the input string, but bash loops are to big. I ended up using sed to replace each character with an addition and multiplication, which then goes to bc. I saved a byte using yes instead of echo.

It Guy

Posted 2017-07-03T13:00:47.433

Reputation: 61

0

Perl 5, 27 bytes

$_%(2*eval join'+',split//)

Returns 0 for Truthy and non-zero for Falsy

jmatix

Posted 2017-07-03T13:00:47.433

Reputation: 21

Welcome on the site. Answers need to be either full programs or functions, while your answer is only a snippet. To make it a full program, you could add -p flag (cost 1 byte), and start with $_%=(2*...). Also, join'+',split// can be simplified to join'+',@F is you use -F flag, or even better, s/./+$&/gr :) – Dada – 2017-07-04T09:21:46.070

0

Ruby, 25 bytes

->x{x%(x.digits.sum*2)<1}

Try it online!

G B

Posted 2017-07-03T13:00:47.433

Reputation: 11 099

0

LOGO, 24 bytes

[modulo ? 2*reduce "+ ?]

Try it online!
Only FMSLogo and its older version (MSWLogo) support ? in template-list; and only FMSLogo supports apply for infix operator +.

That is a template-list (equivalent of lambda function in other languages). Return 0 for truthy and other values for falsy.

Usage:

pr invoke [modulo ? 2*reduce "+ ?] 100

(invoke calls the function, pr prints the result)

Explanation:

There is only one points need explaining: reduce. That is similar to fold in some other languages: reduce "f [1 2 3 4] calculate (f (f (f 1 2) 3) 4). In this case, reduce "+ ? calculate total of elements of digits in ?.

Numbers in LOGO is represented by word, so reduce, a library function can receive a word as its second parameter (while apply can't)

user202729

Posted 2017-07-03T13:00:47.433

Reputation: 14 620

0

Alice, 16 bytes

/o. &
\i@h /+.+F

Try it online!

Prints twice the digit sum as the truthy result and 0 otherwise.

The code looks so painfully suboptimal with the two spaces and the repeated . and +, but I just can't figure out a more compact layout.

Explanation

/    Switch to Ordinal mode.
i    Read all input as a string.
.    Duplicate.
h    Split off the first character.
&    Fold the next command over the remaining characters (i.e. push each character
     in turn and then execute the command).
/    Switch back to Cardinal mode (not a command).
+    Add. This is folded over the characters, which implicitly converts them 
     to the integer value they represent and adds them to the leading digit.
.+   Duplicate and add, to double the digit sum.
F    Test for divisibility. Gives 0 if the input is not divisible by twice its
     digit sum and the (positive/truthy) divisor otherwise.
\    Switch to Ordinal mode.
o    Implicitly convert the result to a string and print it.
@    Terminate the program.

Martin Ender

Posted 2017-07-03T13:00:47.433

Reputation: 184 808

0

Java 7, 197 133 126 bytes

First try Second try, fixed it, -9 characters on variable name, and changing it into function for the other subtraction with help of Olivier Grégoire

Changed boolean to int, now return 0 for true values, other number for falsy

int b(String a){int t=0;for(int i=0;i<a.length();i++){t+=Integer.parseInt(""+a.charAt(i));}return(Integer.parseInt(a)%(t*2));}

boolean a(String a){int t=0;for(int i=0;i<a.length();i++){t+=Integer.parseInt(""+a.charAt(i));}return(Integer.parseInt(a)%(t*2)==0);}

Ungolfed

int b(String a){
int t=0;for(int i=0;i<a.length();i++){
t+=Integer.parseInt(""+a.charAt(i));
}
return(Integer.parseInt(a)%(t*2));}

Java Gonzar

Posted 2017-07-03T13:00:47.433

Reputation: 173

1

Hello and welcome to the golfing part of codegolf! First you can get a lot of tips from this thread to help you getting started. So let's golf, shall we? You're not forced to write full programs: you can write only a function, or if you use Java 8+, a lambda. Make sure to give short variable names and remove all your unneeded spaces (A { can be written as A{; String[] args as String[]a). You can return results instead of printing. The code doesn't pass the test cases of the challenge, fixing it would be 1st.

– Olivier Grégoire – 2017-07-04T18:02:18.363

Hello, which test case didn't it pass? About only a function, I have read other post that says you have to create full executable program, this includes imports if you use them, correct me if I'm wrong, thank you :) – Java Gonzar – 2017-07-05T07:01:51.963

Ah, I forgot to multiply it *2 sorry – Java Gonzar – 2017-07-05T07:04:49.290

Fixed and changed to a function, thank you – Java Gonzar – 2017-07-05T07:16:22.967

0

Pyth, 7 bytes

%QyssM`

Test it online! It returns 0 for truthy, a non null positive integer for falsy.

Explanations

       Q    # Implicit input Q
      `     # Convert the input to a string
    sM      # For each character in Q, convert to integer
   s        # Sum the resulting list
  y         # Multiply by two
%Q          # Perform the modulo with the input

Jim

Posted 2017-07-03T13:00:47.433

Reputation: 1 442

0

Java, 53 bytes

a->{int i=0,c=a;for(;c>0;c/=10)i+=c%10*2;return a%i;}

0 true

>0 false

Krzysztof Cichocki

Posted 2017-07-03T13:00:47.433

Reputation: 101

Welcome to PPCG! – Laikoni – 2017-07-05T08:10:48.790

0

Python, 150 characters

def func(number)
    num = number #your number
    sum = 0
    while(num!=0):
        sum += num%10
        num /= 10
    return (2*sum) % number == 0

Riyaan Bakhda

Posted 2017-07-03T13:00:47.433

Reputation: 1

Welcome to PPCG Stack Exchange! Please read the [help] to see how this site works. This challenge is a code-golf challenge so the purpose is to make your code as small as possible. To start with, you could remove spaces and comments. I would also recommend you look at the site TIO which lets you run your code online.

– Notts90 supports Monica – 2017-07-05T11:35:13.343

1

Riyaan Bakhda, I edited your answer for readability (see Markdown help and Consensus for formatting of “language and score line”) but will need some fixes from you to become a valid solution: “All solutions to challenges should: (…) Be a serious contender for the winning criteria in use. For example, an entry to a code golf contest needs to be golfed, and an entry to a speed contest should make some attempt to be fast.”

– manatwork – 2017-07-05T11:39:06.963

0

R, 71 bytes

f=function(x)`if`(x%%(sum(floor(x/10^(0:(nchar(x)-1)))%%10)*2)==0,T,F)

Using floor(x/10^(0:(nchar(x)-1)))%%10 saves the usual hassle of converting to character and back.

> f(1)
[1] FALSE
> f(12)
[1] TRUE
> f(123456789)
[1] FALSE

Andrew Haynes

Posted 2017-07-03T13:00:47.433

Reputation: 311

0

R, 58 bytes

(a<-scan())%%(2*sum(strtoi(el(strsplit(paste(a),"")))))<1

a <- scan() stores user's input in variable a.

This variable is of type numeric. The paste function converts it into character for the strsplit function to separate its digits. el permits to use only the first element of the list created by strsplit.

The strtoi function converts then the digits back into numeric, for the function sum to, well, sum, before doubling the result.

To finish, divisibility of a with the double sum of its digits is tested by the ... %% ... < 1 part, outputing TRUE or FALSE.

Frédéric

Posted 2017-07-03T13:00:47.433

Reputation: 2 059

0

><>, 26 bytes

000\~2*%n;
0(?\c%:{a*+}+i:

Try it online!

Output is 0 for truthy, non-0 for falsey.

Sok

Posted 2017-07-03T13:00:47.433

Reputation: 5 592

0

Excel VBA, 72 Bytes

Anonymous VBE immediate window function that takes input from cell [A1] and outputs to the VBE immediate window

For i=1To[Len(A1)]:s=s+Int(Mid([A1],i,1)):Next:s=s*2:?Int([A1]/s)=[A1]/s

Taylor Scott

Posted 2017-07-03T13:00:47.433

Reputation: 6 709

0

Element, 29 bytes

Here goes my first "real" codegolf attempt...

_2:x;2:$'0 z;[(z~+z;]x~z~2*%`

Outputs "0" if true, anything else if false.

Try it online!

Explanation:

_             push input into main stack
2:            pop number and push it twice
x;            store one of them as x
2:            pop again and push twice 
$'            pop and get length, push it to control stack
0 z;          initiate accumulator "z" with value zero 
[             for length of input number (loop start), 
(             pop off first digit,
z~            retrieve "z",
+             add popped digit to it,
z;            store "z"  again 
]             (end of looped statement)
x~            retrieve "x" (copy of original number)
z~            retrieve "z" (accumulated digit sum)
2*            double accumulated digit sum
%             modulus the digit sum and original number
`             pop result to output.

aAaa aAaa

Posted 2017-07-03T13:00:47.433

Reputation: 141

0

Java (OpenJDK 8), 40 bytes

i->i%(i+"").chars().map(k->k*2-96).sum()

Try it online!

Returns 0 as truthy value and a value greater than 0 as falsy value.

Nevay

Posted 2017-07-03T13:00:47.433

Reputation: 421

0

Julia, 30 29 bytes

f(x)=x/2sum(digits(x)) in 0:x

saved a byte thanks to caird-coinheringaahing

EricShermanCS

Posted 2017-07-03T13:00:47.433

Reputation: 121

1

This seems to fail for 60: Try it online!

– caird coinheringaahing – 2017-11-23T14:01:46.280

you're right, the problem was order of operations. fixed it by saving a byte, thanks! – EricShermanCS – 2017-11-23T18:47:46.633

0

K (oK), 14 bytes

Solution:

(2*+/48!$x)!x:

Try it online!

Examples:

  (2*+/48!$x)!x:18
0
  (2*+/48!$x)!x:123
3
  (2*+/48!$x)!x:390
6

Explanation:

Evaluation is performed right-to-left, unfortunately modulo is b!a rather than a!b hence the need for brackets. Returns 0 for truthy, positive integer for falsey per spec.

(2*+/48!$x)!x: / the solution
            x: / store input in variable x
           !   / modulo right by the left ( e.g. 3!10 => 1, aka 10 mod 3 ) 
(         )    / the left
        $x     / string ($) input, 123 => "123"
     48!       / modulo with 48, "123" => 1 2 3
   +/          / sum over, +/1 2 3 => 6
 2*            / double, 6 => 12

Notes:

  • Prepend solution with ~ (not) to give a true/false result.

streetster

Posted 2017-07-03T13:00:47.433

Reputation: 3 635

0

Add++, 11 bytes

L,EDEs;A@%!

Try it online!

First time I've used either a Lambda or ; in an Add++ answer

How it works

L,   - Create a lambda function. Example argument; 172
  ED - Push the digits;   STACK = [[1 7 2]]
  Es - Stack-clean sum;   STACK = [10]
  ;  - Double;            STACK = [20]
  A  - Push the argument; STACK = [20 172] 
  @% - Modulo;            STACK = [12]
  !  - Logical NOT;       STACK = [0]

caird coinheringaahing

Posted 2017-07-03T13:00:47.433

Reputation: 13 702

0

><>, 36 Bytes

Unlike the other ><> response, this takes the number itself as input as opposed to the digits. Of course, because of that it's a bit longer longer.

:&>:a%:}-\1-?\2*&$%n;
  \?)0:,a/l +<

Explanation:

:&

Duplicates input, stores a copy in the register.

  >:a%:}-\
  \?)0:,a/

Converts the number into its digits.

         \1-?\
         /l +<

Sum the digits

              2*&$%n;

Multiplies the digit sum by 2, and prints the original number modulo that sum. Output is, then, 0 for truthy and something else otherwise.

Bolce Bussiere

Posted 2017-07-03T13:00:47.433

Reputation: 970

0

Ly, 10 bytes

nsS&+2*lf%

Try it online!

Ly is lucky enough to have a splitting built-in.

Returns 0 for truthy and a number greater than 0 for falsy.

LyricLy

Posted 2017-07-03T13:00:47.433

Reputation: 3 313

0

Deorst, 16 bytes

iE"E|miEH:+zE|%N

Try it online!

How it works

Implicitly inputs and outputs, example: 172

iE"              - To string;  STACK = ['172']
   E|            - Splat;      STACK = ['1' '7' '2']
     mi          - To integer; STACK = [1 7 2]
       EH        - Sum;        STACK = [10]
         :+      - Double;     STACK = [20]
           zE|   - Push input; STACK = [20 172]
              %N - Divides?    STACK = [0]

caird coinheringaahing

Posted 2017-07-03T13:00:47.433

Reputation: 13 702

0

ARBLE, 33 bytes

nt(a%(sum(explode(""..a,"."))*2))

Try it online!

ATaco

Posted 2017-07-03T13:00:47.433

Reputation: 7 898

0

Clojure, 59 bytes

(fn[n](= 0(rem n(* 2(apply +(map #(-(int %)48)(str n)))))))

(defn sum-of-digits? [n]
  (let [ds (map #(- (int %) 48) (str n)) ; Stringify n, and parse each digit char of the string
        d-sum (* 2 (apply + ds))] ; Get the doubled sum
    (= 0 (rem n d-sum)))) ; Check if the remainder of (/ n sum) is 0

Carcigenicate

Posted 2017-07-03T13:00:47.433

Reputation: 3 295

0

Runic Enchantments, 11 bytes

i:'+A2*%0=@

Try it online!

Explanation

i:             Read input, duplicate it
  '+A          Sum its digits
     2*        Multiply by 2
       %       Modulo input with digit sum
        0=     Compare to 0
          @    Print and terminate

Draco18s no longer trusts SE

Posted 2017-07-03T13:00:47.433

Reputation: 3 053

0

Forth (gforth), 58 bytes

: f 0 over begin 10 /mod >r + r> ?dup 0= until 2* mod 0= ;

Try it online!

Code Explanation

: f           \ start a new word definition
  0 over      \ create an accumulator and copy the input above it on the stack
  begin       \ start an indefinite loop
    10 /mod   \ divide by 10 and get quotient and remainder
    >r + r>   \ add remainder to accumulator
    ?dup      \ duplicate the quotient if it's greater than 0
    0=        \ check if quotient is 0
  until       \ end the indefinite loop if it is
  2* mod      \ multiply result by 2, then modulo with input number
  0=          \ check if result is 0 (input is divisible by result)
;             \ end word definition

reffu

Posted 2017-07-03T13:00:47.433

Reputation: 1 361