数字の合計の2倍で割り切れますか?


40

入力として正の整数が与えられた場合、タスクは、数値がその数字の合計の2倍で割り切れる場合は真実の値を出力し、そうでない場合は偽の値を出力します(OEIS A134516)。言い換えると:

(sum_of_digits)*2 | number
  • 真と偽の場合に真実/偽の値の代わりに、真/偽の場合に値の有限セットを指定し、それらが他の値を補完することができます。簡単な例0として、真の場合に使用し、偽の場合に他のすべての数値を使用することができます(必要に応じて、その逆も可能です)。

  • 標準の入力および出力ルールが適用されます。デフォルトの抜け穴も適用されます。

  • 入力は、整数またはその整数の文字列表現として受け取ることができます。

  • これはなので、バイト単位の最短コードが勝ちです!

  • 私はPPCGが初めてなので、可能であれば説明を投稿してください。


テストケース

入力-出力-(理由)

80-Truthy-(16で80を分割)
100-真実-(2は100を除算)
60-Truthy-(12は60で割る)
18-Truthy-(18は18を分割)
12-Truthy-(6分割12)

4-偽-(8は4を分割しません)
8-偽-(16は8を分割しません)
16-偽-(14は16を分割しません)
21-偽-(6は21を分割しません)
78-偽-(30は78を分割しません)
110-偽物-(4は110をしませんでした)
111-偽-(6は111を分割しません)
390-偽-(24は390を分割しない)

良い挑戦、PPCGへようこそ!
Skidsdev

@Mayubeありがとう、それは私の2番目の挑戦ですが、最初の挑戦は閉じられました:P

整数のリストとして数字を使用できますか?
ヘンリー

4
@ヘンリーいいえ、それはあまりにも些細すぎるだろう

1
確かに、「真の場合と偽の場合の真実/偽の値の代わりに、真の場合の値の有限セット、および偽の場合の補完を指定することができます。簡単な例として、真の場合は0、偽の場合は他のすべての数値(または、必要に応じてその逆)」は互いに矛盾しているようです(特に、「有限」と「逆」)。
グレッグマーティン

回答:


7

ニーム、3 バイト

𝐬ᚫ𝕞

説明:

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

オンラインでお試しください!

詳細バージョン


うーん...入力が数字の合計の倍数であるかどうかを確認する必要があります。
エリックアウトゴルファー

@EriktheOutgolferどういう意味ですか?入力が数字の倍の倍数であるかどうかを確認します。おそらく私はそれを正しく説明しなかったのでしょう。
Okx

4
Neimはさらにゴルファーになる必要があります-提出が長すぎると、ブラウザが遅れ始めます。
エソランジングフルーツ

1
@ Challenger5ゴルフネスの欠如を心から謝罪します。次回もやり直します。繰り返しますが、それについてすみません。
Okx

@Okxそして、私が話していることのより良いデモンストレーションであるニームの答えを見つけるのが面倒だと心から謝罪します。
エソランジングフルーツ

16

JavaScript(ES6)、31 29 27バイト

入力を文字列として受け取ります。真実の場合はゼロを、偽の場合はゼロ以外を返します。

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

コメント済み

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

テストケース


分割の[... x]メソッドを見たことがありません。これに具体的な名前はありますか?
ジェイコブペルシ

@JacobPersiこれはスプレッド演算子です。
アーナルド

7

C#、46バイト

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

フル/フォーマット済みバージョン:

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();
    }
}

4

網膜38 27バイト

-11バイト。@ MartinEnderのおかげでコードのエラーを修正

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

オンラインでお試しください!

割り切れる場合は1、そうでない場合は0を出力します

説明(これが正しいことを願っています)

$
$_¶$_

入力全体、改行、および入力を再度追加します

.+$|.
$*

各一致を単項に変換します(元の入力である2行目全体、または1行目の各数字)

^(.+)¶\1+$

最初の行(2桁の合計)が2行目の除数かどうかを確認します


4

MATL、7バイト

tV!UsE\

0割り切れる場合は出力、それ以外の場合は正の整数。具体的には、数字の合計の2倍で数値を除算した余りを出力します。

オンラインでお試しください!

説明

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

4

05AB1E5 4バイト

Okxのおかげで-1バイト

SO·Ö

オンラインでお試しください!

最後のÖを削除して、真実の場合は0を、偽の場合は3バイトだけを得ることができますが、私にとっては定義に適切に適合しないようです。

説明

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

あなたは置き換えることにより、4バイトにゴルフをすることができます%_Ö
Okx

4

x86-64マシンコード、24バイト

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

上記のコードは、入力値がその数字の合計の2倍で割り切れるかどうかを決定する64ビットx86マシンコードの関数を定義しています。この関数はSystem V AMD64呼び出し規約に準拠しているため、C関数であるかのように、事実上すべての言語から呼び出すことができます。

EDIテストする整数である呼び出し規約に従って、レジスタを介した入力として単一のパラメータを取ります。(これはチャレンジルールと一致する正の整数であると想定され、CDQ使用する命令が正しく機能するために必要です。)

EAX呼び出し規約に従って、再び結果をレジスタに返します。入力値その数字の合計で割り切れる場合、結果は0になり、そうでない場合はゼロ以外になります。(基本的に、チャレンジルールで与えられた例とまったく同じ逆ブール。)

そのCプロトタイプは次のようになります。

int DivisibleByDoubleSumOfDigits(int value);

以下に、各命令の目的の簡単な説明が注釈されていない、アセンブリされていないアセンブリ言語の命令を示します。

; 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

最初のブロックでは、レジスタの予備的な初期化を行います。

  • PUSH+ POP命令はESI、10 に初期化する低速で短い方法として使用されます。これはDIV、x86 の命令にレジスタオペランドが必要なため必要です。(たとえば、10の即値で除算する形式はありません。)
  • XORは、ECXレジスタをクリアするための短くて速い方法として使用されます。このレジスタは、今後のループ内で「アキュムレーター」として機能します。
  • 最後に、(EDI)からの入力値のコピーが作成されEAX、に保存されます。これは、ループを通過するときに上書きされます。

次に、ループを開始し、入力値の数字を合計します。これは、x86 DIV命令に基づいています。x86 命令は、EDX:EAXオペランドで除算し、で商EAXと剰余を返しますEDX。ここでは、入力値を10で除算して、残りが最後の桁(アキュムレータレジスタに追加するECX)で、商が残りの桁になるようにします。

  • このCDQ命令は、EDX0に設定する短い方法です。実際にはEAXto の値を符号拡張します。EDX:EAXこれはDIV、被除数として使用されます。入力値は符号なしであるため、ここでは実際に符号拡張は必要ありませんが、clear CDQを使用XORするのではなく、1バイトであるためEDX、2バイトになります。
  • その後、我々はDIV、IDE EDX:EAXによってESI(10)。
  • 残り(EDX)はアキュムレータ(ECX)に追加されます。
  • EAXレジスタ(商)がもしそうなら、それは0に等しいかどうかを確認するためにテストされ、我々はすべての桁を通してそれを作っていると我々はフォールスルー。そうでない場合、合計する桁がまだあるので、ループの先頭に戻ります。

最後に、ループが終了した後、実装しますnumber % ((sum_of_digits)*2)

  • このLEA命令はECX、2 を掛ける(または同等ECXにそれ自体に加算する)ための短い方法として使用され、結果を別のレジスターに格納します(この場合はEAX)。

    add ecx, ecx+ を実行することもできますがxchg ecx, eax、両方とも3バイトですが、LEA命令はより高速でより一般的です。)

  • それから、CDQ分割の準備をするためにもう一度やります。のでEAX(すなわち、符号なし)正となり、これがゼロの効果があるEDXだけで以前のように、。
  • 次は除算で、今度EDX:EAXは入力値で割ったものです(その中にあるのは、まだ残っているのですEDI)。これはモジュロと同等で、残りはになりEDXます。(商もに入れられますがEAX、必要ありません。)
  • 最後に、我々XCHG(為替)の内容EAXEDX。通常、MOVここで実行しますが、XCHG1バイトしかありません(低速ですが)。EDX除算後の余りが含まれるため、値が均等に割り切れる場合は0になり、そうでない場合はゼロ以外になります。したがって、RETurnでEAX、入力値がその桁の合計の2倍で割り切れる場合、(結果)は0になり、そうでない場合は0以外になります。

うまくいけば説明で十分です。
これは最短のエントリではありませんが、ゴルフ以外のほとんどすべての言語に勝るもののようです。:-)


3

Japt7 4バイト

入力を文字列として受け取ります。出力0trueまたはより数の大きい0のためのfalse他のソリューションから、有効であるように思われます、、。そうでない場合はお知らせください。ロールバックします。

%²¬x

試して


説明

stringの暗黙的な入力U
"390"

²

U2回繰り返します。
"390390"

¬

個々の文字の配列に分割します。
["3","9","0","3","9","0"]

x

合計することで削減し、プロセスで各文字を整数に自動的にキャストします。
24

%

U結果で除算の残りを取得Uし、プロセスで整数に自動的にキャストします。結果の整数を暗黙的に出力します。
6 (=false)


2
あなたの説明は通常、多くの垂直方向のスペースを使い果たしますが、これは必要ないと感じています。いずれにせよ、それはあなたの答えです。
Okx

@Okx; 数日前にこの形式に切り替えただけでは、「通常」になることがわかりません。
シャギー

4
説明の形式が気に入りました。特にこの問題では、線形の縮小であり、数学の問題のようにページを下に移動したため、簡単に追跡できました。ちょうど私の2セント。
ヘンリー

3
この説明形式は、特に言語に精通していない人にとっては、通常の形式よりもはるかに優れています。これらのゴルフ言語を使用する他のゴルファーもこれを行うことを望む。
Peter1807

3

C89、55の、53バイト

(Steadyboxに感謝!

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

単一の入力を受け取りますx。これは、テストする値です。x数字の合計の2倍で割り切れる場合は0を返し、そうでない場合は0以外を返します。

オンラインでお試しください!

ゴルフをしていない:

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

ご覧のとおり、これはC89の暗黙的整数規則を利用しています。グローバル変数stは、暗黙的にints として宣言されます。(これらはグローバルであるため、暗黙的に0に初期化されますが、関数を複数回呼び出し可能にする場合、これを利用することはできません。)

同様に、関数はfx,暗黙的にである単一のパラメーターを受け取り、をint返しますint

関数内のコードはかなり単純forですが、構文に慣れていない場合、ループは非常に奇妙に見えます。基本的に、forCのループヘッダーには3つの部分が含まれます。

for (initialization; loop condition; increment)

「初期化」セクションでは、グローバル変数を初期化しました。これは、ループに入る前に1回実行されます。

「ループ条件」セクションでは、ループを継続する条件を指定しました。これは明らかです。

「増分」セクションでは、すべてのループの終わりに実行されるため、基本的に任意のコードを配置しました。

ループのより大きな目的は、入力値の各桁を反復して、に追加することsです。最後に、ループが終了した後、s2倍にされ、モジュロxが取られて、均等に割り切れるかどうかが確認されます。(ここでのロジックのより良い、より詳細な説明は、これが基づいている他の答えで見つけることができます。)

人間が読めるバージョン:

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

t代わりにt>0loop conditionとして使用すると、2バイトを節約できます。
Steadybox

ああ、もちろん!いいね、@ Steadybox。0に対するテストは、私のasm実装が行ったこととまったく同じであるため、私がそれを見逃した理由はわかりません。
コーディグレー





2

PHP、41バイト

割り切れる場合はゼロ、それ以外の場合は正の整数を出力します。

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

オンラインでお試しください!


割り当てをヘッダーブロックに配置します。を使用することもでき$a=10ますが、バイトカウントにカウントするのを忘れていました
17

@aross入力をバイトカウントにカウントする必要があるのはなぜですか。(この場合)またはオプションで$argn利用可能です-F-R
ヨルグヒュルサーマン

うーん、面白い。私は知りませんでした-F。しかし、それはTIOに反映されていません(STDINからのエコーをサポートしていますか?)。
アロス

@arossそれはあなたのアプローチの使用のみの代わりに、コードのファイルと同じように動作-Fの代わりに、オプション-R php.net/manual/en/features.commandline.options.phpあなたはcommndのようョで同じを作るためのより良い方法を発見した場合行を教えてください
ヨルクヒュルサーマン

2

Excel、63バイト

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

数字の合計は長いビットです。



2

9 8バイト

1バイトを節約してくれたLeoに感謝します。

Ṡ¦ȯ*2ṁis

オンラインでお試しください!

説明

Ṡ¦ȯ         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.

ṁを使用して、1つのコマンドでマッピングと合計を行い、1バイトを節約することができます
レオ

2

Haskell38 37 42バイト

1バイトのゴルフをしてくれたZgarbに感謝

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

オンラインでお試しください!

入力を文字列として受け取ります。割り切れる場合は0を返し、それ以外の場合はゼロ以外を返します。


(:[])することができますpure
ズガルブ

ラムダを関数宣言で置き換えることで1バイトを節約します
-bartavelle

@bartavelle:確かにそれは洗い物です。例?
ジュリアンウルフ

あなたは正しい、それはまったく同じ長さです。それが私の心をどのように横切ったかわからない:/
bartavelle

2

Python 3、35バイト

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

こんにちは、サイトへようこそ。ここで空白を削除できます。特に周り=と後)の中でint(c)。さらにsum、ジェネレーターを引数として取ることができるため、その[..]内部を削除できます。他にご質問がある場合は、お気軽にお問い合わせください。
小麦ウィザード

int(c)for c in aを使用map(int,a)して、数バイトを節約することもできます。
小麦ウィザード

これは機能しません-むしろ逆方向に機能します。4バイトの追加で簡単に修正:lambda a:not a%(sum(map(int,str(a)))*2)
osuka_

@osuka_質問の説明の箇条書きの1つを参照してください
-wrymug

2

TI-BASIC、27 26 21 バイト

-5 @Okiに感謝

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

これは、TI-BASICに整数桁を合計する簡潔な方法がないという事実によって、より複雑になります。に対してを返し0、に対してTrue異なる数を返しますFalse

説明:

: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

2
10^-randIntNoRep(1,1+int(log(Ansseq(10^(~A-1),A,0,log(Ans順序は重要ではないため、バイト数が少ない場合と同じです(バージョン2.55MPを想定)

1

Braingolf13 12バイト

VR.Mvd&+2*c%

オンラインでお試しください!

真実の場合は0、偽の場合はその他の数値を出力します。

説明

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

1

Japt、7バイト

vUì x*2

戻り値1のためtrue0false

オンラインでお試しください!

説明

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

私はこれのために他のいくつかの7バイトのソリューションも思いつきました(ただし、これはそれらの1つではないと思います)-しかし、より短いソリューションがあると確信しています。
シャギー


1

Java、66バイト

オリビエのおかげで-1バイト

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

ゴルファーなし&説明:

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
}

int代わりに使用byteして...バイトを保存します。
オリビエグレゴワール

@OlivierGrégoireありがとう。気づかなかった。
Okx

@Okxゴルフのコードも変更する必要があります。
ヘンリー

(ゴルフ)コードは、110、111の値が正しくありません。おそらく、モジュラスと乗算の順序は同じであるため、これはa%i*2解析され(a%i)*2ます。
オリビエグレゴワール

@OlivierGrégoireああ、それはひどい。
Okx

1

J、15バイト

0は真実を示し、0以外は偽を示します。

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

説明

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

かっこまたは複数を避けるための非常に賢い方法@または[:
ジョナ

1
私はこれを自分の答えとして投稿することを議論しましたが、それは実際に十分な違いはありません。|~2*1#.,.&.":13バイト。
コール

J Qt IDEでこれについて「ドメインエラー」が表示されます。(|〜[:+ / 2# "。" 0 @ ":112)次に、コールのコードに対して(|〜2 * 1#。、。&。":112)= 0を取得します。:/おそらく私の側に何か間違っている。
DrQuarius



1

Haskell35 34バイト

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

オンラインでお試しください!

真の場合は '0'を返し、そうでない場合は残りを返します。

Haskell、nimiによるポイントフリー版、34バイト

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

オンラインでお試しください!


同じバイト数あなたがpointfreeを行けば:mod<*>(2*).sum.map(read.pure).show
nimi

よさそうだ、私は提出物にそれを追加しました。
-bartavelle

1

PHP、44バイト

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

次のように実行します。

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

説明

数字を反復処理して合計を計算し、ほとんどの回答と同様にモジュロを出力します。


1

Java(OpenJDK 8)55 53バイト

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

オンラインでお試しください!

の戻り値0は真実を意味し、それ以外は偽を意味します。

Okxの答えに対する私のコメントは波紋を作らなかったので、それを削除してこの答えとして投稿しました。

@KrzysztofCichockiと@Laikoniのおかげでさらにゴルフができました。彼は私に真実/虚偽の値に答える必要はありませんが、結果を説明する限り値は答えません。


末尾の<1部分を削除できるので、結果はtrueの場合は0、falseの場合は> 0になりますが、これは-2バイトが追加されるため、coiuldは53バイトのように答えます。
クシシュトフチチョッキ

@KrzysztofCichokiいいえ、できません。これはJavaです。唯一の真実の値はtrueです。
オリビエグレゴワール

@OlivierGrégoireこれは、他に何も指定されていない場合に当てはまりますが、このチャレンジは特に述べてい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.ます。
ライコニ

@KrzysztofCichockiとLaikoni申し訳ありませんが、その部分を読み間違えました。修正しました!両方ともありがとう:)また、この場合実際に適切であった編集拒否して申し訳ありません。
オリビエグレゴワール

1

Mini-Flak、296 292バイト

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

オンラインでお試しください!

TIOリンクには私からのコメントがもっとあるので、部分的に読みやすくなっています。

Truthy / Falsey:2番目の数値が3番目の数値と等しい場合はTruthy(分割可能)、そうでない場合は偽。したがって、真実と偽の両方のセットは無限ですが、それは許されるべきだと思います。そうでない場合は、+ 10バイト。

注:入力の先頭/末尾の改行/空白は許可されていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.