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.


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.

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



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


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!


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

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!



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!


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

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

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.


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.





Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.