Có phải là số Harshad?


8

Số Harshad là một số chia hết cho tổng các chữ số của nó. Điều này rõ ràng phụ thuộc vào cơ sở mà số nguyên được viết vào. Số 10 Harshad cơ sở là dãy A005349 trong OEIS.

Nhiệm vụ của bạn:

Viết chương trình hoặc hàm xác định xem một số nguyên đã cho có phải là số Harshad trong một cơ sở đã cho hay không.

Đầu vào:

Một số nguyên dương <10 ^ 9 và một cơ sở nằm giữa 2 và 36, OR, một số nguyên dương trong cơ sở của nó, sử dụng các chữ cái viết thường cho các số từ 11-36 và một cơ sở từ 2 đến 36. Bạn chỉ phải xử lý một trong số những lựa chọn này.

Đầu ra:

Giá trị trung thực / giả mạo cho biết liệu đầu vào đầu tiên có phải là số Harshad trong cơ sở của đầu vào thứ hai hay không.

Ví dụ:

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

Ghi điểm:

Đây là , điểm thấp nhất tính bằng byte thắng.


Câu trả lời:


11

Thạch , 4 byte

bSḍḷ

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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, định nghĩa của FGITW ngay tại đây. Mặc dù ấn tượng. Làm thế nào để bạn làm những điều này?
Gryphon

Nó khá dễ dàng với một chuyển đổi cơ sở tích hợp.
Dennis

Tôi chỉ ấn tượng bởi tích hợp để lấy tổng các chữ số. Thậm chí không biết đó là một điều.
Gryphon

Không có tích hợp để lấy tổng các chữ số. bcải n vào mảng của cơ sở- nó k chữ số, sau đó Sphải mất tiền của nó.
Dennis

Ồ, tôi hiểu rồi. Tôi nghĩ b chỉ chuyển đổi n thành một số nguyên trong cơ sở k.
Gryphon



3

APL Dyalog, 20 byte

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

Hãy thử trực tuyến! [15 số đầu tiên trong 15 căn cứ đầu tiên]

Lấy số làm đối số bên phải và cơ sở làm đối số bên trái, 0 là trung thực.

Làm sao?

⍺⊥⍣¯1⊢⍵- trong cơ sở như một danh sách các chữ số

⍵|⍨- modulo ...

+/ - Tổng


3

Python 2 , 54 47 byte

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

Độ phức tạp của thời gian và bộ nhớ là O (n) , vì vậy đừng thử 10 9 trên TIO.

Đầu ra là thông qua mã thoát, vì vậy 0 là trung thực, 1 là sai. Nếu phương thức đầu ra này được cho phép, một byte nữa có thể được lưu bằng cách biến chương trình thành hàm.

Cảm ơn @ musicman523 đã đề xuất mã thoát!

Hãy thử trực tuyến!


Bạn có thể thay đổi ngôn ngữ thành "Trình thông dịch Python 2" và sử dụng exit(n%s)trong đó 0 là trung thực và bất cứ điều gì khác là sai?
sĩ523

Tìm thấy một cái gì đó thậm chí ngắn hơn, nhờ gợi ý của bạn. :)
Dennis

Đẹp! Tôi nghĩ có lẽ bạn có thể phải chịu ZeroDivisionError, nhưng cách của bạn ngắn hơn tôi tin
nhạcman523

3

Bình thường, 12 7 byte

!%hQsjF

Hãy thử trực tuyến!

Số lượng byte bây giờ thấp hơn vì unary không còn cần thiết.

Giải trình

!%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

(yêu cầu pryr gói)

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

Đây là một hàm ẩn danh có hai đối số bn ước tính (trên TIO):

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

Ở đâu d tính tổng các chữ số cho cơ sở cần thiết.

Giảm 4 byte khi cơ sở được đảm bảo lớn hơn 1.

Hãy thử trực tuyến!



2

Javascript (ES6), 68 67 byte

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

Lưu ý rằng kể từ khi chúng tôi được yêu cầu duy nhất để xử lý hoặc cơ sở- k hay cơ số 10 số cho n, tôi giả sử nlà một cơ số 10 số nguyên luôn.

-1 byte, nhờ TheLethalCoder!

Làm thế nào nó hoạt động:

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

Hãy thử trực tuyến!


3
Chào mừng đến với trang web! :)
James

1
Lấy đầu vào theo cú pháp currying để lưu một byte tức là n=>k=>..., sẽ được gọi như(345)(10)
TheLethalCoder

@TheLethalCoder Cảm ơn! Tôi đã cập nhật.
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}

Kiểm tra nó

Mở rộng:

{  # 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

Toán học, 30 byte

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

Hàm thuần túy lấy hai đối số, số nguyên và cơ sở (theo thứ tự đó) và trả về Truehoặc False. Cẩn thận: hai |s đầu tiên chỉ là ký tự ASCII bình thường, trong khi cuối cùng là U + 2223.

#2<2xử lý trường hợp đặc biệt của cơ sở 1. Mặt khác, Tr@IntegerDigits@##tạo tổng các chữ số của đối số thứ nhất khi được viết trong cơ sở của đối số thứ hai và ...∣#kiểm tra xem tổng đó có phân chia đối số thứ nhất hay không.


0

Mẻ, 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

Đầu ra 1 cho số Harshad.





Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.