Harshad番号ですか?


8

Harshad数は、その数字の合計で割り切れる数です。これは明らかに整数が書き込まれる基数に依存します。10進数のHarshad数はOEISのシーケンスA005349です。

あなたのタスク:

与えられた整数が与えられた底のHarshad数であるかどうかを決定するプログラムまたは関数を記述します。

入力:

正の整数<10 ^ 9、2から36までの基数、またはその基数に正の整数、11-36の数字に小文字を使用し、2から36までの基数を使用します。これらのオプション。

出力:

最初の入力が2番目の入力の底のHarshad数であるかどうかを示す真/偽の値。

例:

27,10 ----------> truthy
8,5 ------------> truthy
9,5 ------------> falsy
1a,12 OR 22,12 -> truthy

得点:

これは、バイト単位での最低スコアが勝利します。


回答:


11

ゼリー、4バイト

bSḍḷ

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

使い方

bSḍḷ  Main link. Arguments: n (integer), k (base)

b     Convert n to base k.
 S    Take the sum.
   ḷ  Left; yield n.
  ḍ   Test for divisibility.

OK、ここでFGITWの定義。印象的ですが。これらのことをどのように行いますか?
グリフォン2017

組み込みの基本変換を使用すると、かなり簡単です。
デニス

桁数の合計を取るビルトインに感心しました。それが何かだったことさえ知らなかった。
グリフォン2017

数字の合計を取るための組み込み機能はありません。nをそのベースk桁の配列にb変換し、その合計を取得します。S
デニス

ああなるほど。私はbがnを底kの整数に変換したと思った
グリフォン2017


3

Python 3、73バイト

def f(n,b):
 if b<2:return 1
 s=0;c=n
 while n:s+=n%b;n//=b
 return c%s<1

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

1は真実です。


1
これは、単に連続1のベースに立候補するらしい
グリフォン

@グリフォン完了。
Leaky Nun

追加されたバイトについて申し訳ありません:(
グリフォン

Pythonはこのための言語ではありません。
グリフォン2017

Python 2では-3バイト
notjagan

3

Dyalog APL、20バイト

{⍺=1:0⋄⍵|⍨+/⍺⊥⍣¯1⊢⍵}

オンラインでお試しください! [15ファーストベースの15ファースト番号]

数値を右の引数、底を左の引数とし、0は真です。

どうやって?

⍺⊥⍣¯1⊢⍵- 数字のリストとしてのベース

⍵|⍨- モジュロ...

+/ - 合計


3

パイソン254の 47バイト

n,k=input();m=n;s=0
exec's-=m%k;m/=k;'*n
1>>n%s

時間とメモリの複雑さはO(n)なので、TIOで10 9を試さないでください。

出力は終了コードを介して行われるため、0は真、1は偽です。この出力方法が許容される場合は、プログラムを関数に変換することにより、さらにバイトを節約できます。

終了コードを提案してくれた@ musicman523に感謝します。

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


言語を「Python 2インタープリター」に変更してexit(n%s)、0が真で他が偽である場所を使用できますか?
musicman523 2017

あなたの提案のおかげで、さらに短いものを見つけました。:)
デニス

いいね!ZeroDivisionErrorが発生する可能性があると思いましたが、あなたの道はもっと短いと思います
musicman523

3

Pyth、12 7バイト

!%hQsjF

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

単項が不要になったため、バイト数が少なくなりました。

説明

!%hQsjF
     jF    Fold the input over base conversion (converts given number to given base)
    s      Sum the values
  %hQ       Take the first input modulo that sum
!          Logical not, turning 0s from the modulus into True and all else into False

2

R64 60バイト

pryrパッケージが必要です)

pryr::f({d=pryr::f('if'(n<b,n,n%%b+d(b,n%/%b)));!n%%d(b,n)})

これには二つの引数、取る無名関数であるbn(TIOにある)へと評価を:

function(b,n){
   d=function(b,n)
     if(n<b) n else n%%b + d(b,n%/%b)
   !n%%d(b,n)
}

ここdで、必要な基数の数字の合計を計算します。

ベースが1より大きいことが保証されると、4バイトがドロップされました。

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



2

JavaScript(ES6)、68 67バイト

n=>k=>!(n%eval([...n.toString(k)].map(_=>parseInt(_,k)).join('+')))

のbase- kまたはbase-10の数値を処理する必要があるだけなのでnn常にbase-10の整数であると想定していることに注意してください。

-1バイト、TheLethalCoderのおかげで!

使い方:

!                                    # Convert to true if 0 else false
 (n%                                 # Compute n modulo
    eval(                            # evaluate string
         [...n.toString(k)]          # convert to array of base-k divisors
         .map(_=>parseInt(_,k))      # map lowercase characters to ints
         .join('+')                  # join array as string of characters
    )                                # get the raw remainder, and let ! do its work
 ) 

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


3
サイトへようこそ!:)
James

1
カリー化構文で入力を取り、バイトを保存します。つまりn=>k=>...、次のように呼び出されます(345)(10)
TheLethalCoder

@TheLethalCoderありがとう!更新しました。
Akshat Mahajan 2017


0

Perl 6、40バイト

{$^b>1??$^a%%[+] $a.polymod($b xx*)!!?1}

試して

拡張:

{  # bare block lambda with placeholder parameters 「$a」 and 「$b」

    $^b > 1          # declare 「$b」 and compare against 1

  ??                 # if 「$b > 1」 then:

      $^a            # declare 「$a」
    %%               # is it divisible by
      [+]            # reduce the following with &infix:<+> (sum)
        $a.polymod(
          $b xx *    # infinite list of 「$b」s
        )

  !!                 # if 「$b <= 1」 then:

    ? 1              # Boolify 1 (shorter than True)
}

0

Mathematica、30バイト

#2<2||Tr@IntegerDigits@##∣#&

整数と基数(この順序で)の2つの引数を取り、Trueor を返す純粋な関数False。注意:最初の2つ|は通常のASCII文字ですが、最後の2つははU + 2223です。

#2<2基数1の特殊なケースを扱います。それ以外の場合Tr@IntegerDigits@##は、2番目の引数の基数に書き込まれたときに最初の引数の桁の合計を生成し、...∣#その合計が最初の引数を除算するかどうかをテストします。


0

バッチ、119バイト

@if %2==1 echo 1&exit/b
@set/at=%1,s=0
:l
@if %t% gtr 0 set/as+=t%%%2,t/=%2&goto l
@set/at=%1%%s
@if %t%==0 echo 1

Harshad番号の場合は1を出力します。





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