Apakah ini Nomor Harshad?

8

Angka Harshad adalah angka yang dapat dibagi dengan jumlah digitnya. Ini jelas tergantung pada basis apa bilangan bulat ditulis. Basis 10 Nomor Harshad adalah urutan A005349 dalam OEIS.

Tugas Anda:

Tulis program atau fungsi yang menentukan apakah bilangan bulat yang diberikan adalah angka Harshad di basis yang diberikan.

Memasukkan:

Integer positif <10 ^ 9, dan basis antara 2 dan 36, OR, integer positif di dasarnya, menggunakan huruf kecil untuk angka dari 11-36 dan basis antara 2 dan 36. Anda hanya perlu menangani salah satu dari opsi ini.

Keluaran:

Nilai kebenaran / kepalsuan yang menunjukkan apakah input pertama adalah nomor Harshad di dasar input kedua.

Contoh:

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

Mencetak:

Ini adalah , skor terendah dalam byte yang menang.

Gryphon
sumber
terkait erat
Tn. Xcoder

Jawaban:

11

Jelly , 4 byte

bSḍḷ

Cobalah online!

Bagaimana itu bekerja

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

b     Convert n to base k.
 S    Take the sum.
   ḷ  Left; yield n.
  ḍ   Test for divisibility.
Dennis
sumber
OK, definisi FGITW di sini. Meskipun mengesankan. Bagaimana Anda melakukan hal-hal ini?
Gryphon
Ini cukup mudah dengan built-in konversi basis.
Dennis
Saya hanya terkesan dengan built-in untuk mengambil jumlah digit. Bahkan tidak tahu itu adalah suatu hal.
Gryphon
Tidak ada built-in untuk mengambil jumlah digit. bbertobat n ke dalam array dari basis-nya k digit, maka Sdibutuhkan jumlah nya.
Dennis
Oh begitu. Saya pikir b baru saja dikonversi n menjadi bilangan bulat di basis k.
Gryphon
10

Python 2 , 46 byte

lambda n,b:n%sum(n/b**i%b for i in range(n))<1

Cobalah online!

Tidak
sumber
3

Python 3 , 73 byte

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

Cobalah online!

Saya benar, Anda tahu.

Biarawati Bocor
sumber
1
Ini sepertinya hanya terus berjalan untuk basis 1.
Gryphon
@Gryphon selesai.
Leaky Nun
Maaf tentang byte yang ditambahkan :(
Gryphon
Python sebenarnya bukan bahasa untuk ini.
Gryphon
-3 byte dalam Python 2.
notjagan
3

Dyalog APL, 20 byte

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

Cobalah online! [15 angka pertama dalam 15 basis pertama]

Membawa angka sebagai argumen kanan dan basis sebagai argumen kiri, 0 adalah benar.

Bagaimana?

⍺⊥⍣¯1⊢⍵- di dasar sebagai daftar angka

⍵|⍨- modulo ...

+/ - jumlah

Uriel
sumber
3

Python 2 , 54 47 byte

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

Kompleksitas waktu dan memori adalah O (n) , jadi jangan coba 10 9 pada TIO.

Output melalui kode keluar, jadi 0 benar, 1 salah. Jika metode keluaran ini diizinkan, byte lebih lanjut dapat disimpan dengan mengubah program menjadi suatu fungsi.

Terima kasih kepada @ musicman523 karena menyarankan kode keluar!

Cobalah online!

Dennis
sumber
Bisakah Anda mengubah bahasa menjadi "penerjemah Python 2" dan menggunakan di exit(n%s)mana 0 benar dan yang lainnya salah?
musicman523
Menemukan sesuatu yang lebih pendek, terima kasih atas saran Anda. :)
Dennis
Bagus! Saya pikir mungkin Anda bisa mengalami ZeroDivisionError, tetapi cara Anda lebih pendek saya percaya
musicman523
3

Pyth, 12 7 byte

!%hQsjF

Cobalah online!

Hitungan byte sekarang lebih rendah karena unary tidak lagi diperlukan.

Penjelasan

!%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
notjagan
sumber
2

R , 64 60 byte

(membutuhkan pryrpaket)

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

Ini adalah fungsi anonim yang mengambil dua argumen, bdan nyang mengevaluasi ke (yang ada di TIO):

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

di mana dmenghitung jumlah digit untuk basis yang diperlukan.

Turun 4 byte setelah basis dijamin lebih besar dari 1.

Cobalah online!

Giuseppe
sumber
2

Japt , 9 byte

vUsV ¬xnV

Mengambil input sebagai dua bilangan bulat.

Cobalah online!

Justin Mariner
sumber
2

Javascript (ES6), 68 67 byte

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

Perhatikan bahwa karena kita hanya diharuskan untuk menangani nomor basis- k atau basis-10 untuk n, saya berasumsi nadalah bilangan bulat basis-10.

-1 byte, terima kasih kepada TheLethalCoder!

Bagaimana itu bekerja:

!                                    # 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
 ) 

Cobalah online!

Akshat Mahajan
sumber
3
Selamat datang di situs ini! :)
James
1
Ambil input dalam sintaks currying untuk menyimpan byte yaitu n=>k=>..., akan dipanggil seperti(345)(10)
TheLethalCoder
@TheLethalCoder Terima kasih! Saya memperbarui.
Akshat Mahajan
1

Javascript ES6, 62 byte

n=>b=>!(n%[...n.toString(b)].reduce((x,y)=>x+parseInt(x,b),0))
HP Williams
sumber
0

Perl 6 , 40 byte

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

Menguji

Diperluas:

{  # 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)
}
Brad Gilbert b2gills
sumber
0

Mathematica, 30 byte

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

Fungsi murni mengambil dua argumen, integer dan basis (dalam urutan itu), dan mengembalikan Trueatau False. Hati-hati: dua yang pertama |hanya karakter ASCII yang normal, sedangkan yang terakhir adalah U + 2223.

#2<2berurusan dengan kasus khusus basis 1. Jika tidak, Tr@IntegerDigits@##menghasilkan jumlah digit dari argumen pertama ketika ditulis dalam basis argumen kedua, dan ...∣#menguji apakah jumlah itu membagi argumen pertama.

Greg Martin
sumber
0

Batch, 119 byte

@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

Output 1 untuk nomor Harshad.

Neil
sumber
0

Python 3 , 45 byte

lambda n,b:int(n,b)%sum(int(i,b)for i in n)<1

Cobalah online!

Berdasarkan format yang diperbarui untuk input.

notjagan
sumber
0

Java (OpenJDK 8) , 54 byte

n->b->{int s=0,c=n;for(;c>0;c/=b)s+=c%b;return n%s<1;}

Cobalah online!

Olivier Grégoire
sumber
Tampil sebagai kari, TIO sebagai non-kari.
Olivier Grégoire