É um número Harshad?

8

Um número Harshad é um número que é divisível pela soma dos seus dígitos. Obviamente, isso depende da base em que o número inteiro está escrito. Os números da Base 10 Harshad são a sequência A005349 no OEIS.

Sua tarefa:

Escreva um programa ou função que determine se um número inteiro é um número Harshad em uma determinada base.

Entrada:

Um número inteiro positivo <10 ^ 9 e uma base entre 2 e 36, OU, um número inteiro positivo em sua base, usando letras minúsculas para os números de 11 a 36 e uma base entre 2 e 36. Você só precisa manipular um dos essas opções.

Resultado:

Um valor verdade / falso indicando se a primeira entrada é um número Harshad na base da segunda entrada.

Exemplos:

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

Pontuação:

Isso é , a menor pontuação em bytes ganha.

Gryphon
fonte

Respostas:

11

Gelatina , 4 bytes

bSḍḷ

Experimente online!

Como funciona

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
fonte
OK, definição de FGITW aqui. Impressionante embora. Como você faz essas coisas?
Gryphon
É bastante fácil com uma conversão básica incorporada.
11117 Dennis
Estou impressionado com o built-in para obter a soma dos dígitos. Nem sabia que isso era uma coisa.
Gryphon
Não há um built-in para obter a soma dos dígitos. bconvertidos n para a matriz de dos seus base- k dígitos, em seguidaS leva a sua soma.
1111 Dennis
Ah eu vejo. Eu pensei que b acabou de converter n em um número inteiro na base k.
Gryphon
3

Python 3 , 73 bytes

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

Experimente online!

1 é verdade, você sabe.

Freira Furada
fonte
1
Este parece estar a correr apenas continuamente por uma base de 1.
Gryphon
@Gryphon done.
Leaky Nun
Desculpe pelos bytes adicionados :(
Gryphon
Python não é realmente a linguagem para isso.
Gryphon
-3 bytes no Python 2.
notjagan
3

Dyalog APL, 20 bytes

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

Experimente online! [15 primeiros números nas 15 primeiras bases]

Pega o número como argumento da direita e a base como argumento da esquerda, 0 é verdade.

Quão?

⍺⊥⍣¯1⊢⍵- na base como uma lista de dígitos

⍵|⍨- módulo ...

+/ - a soma

Uriel
fonte
3

Python 2 , 54 47 bytes

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

O tempo e a complexidade da memória são O (n) , portanto, não tente 10 9 no TIO.

A saída é via código de saída; portanto, 0 é verdade e 1 é falso. Se esse método de saída acabar sendo permitido, um outro byte pode ser salvo ao transformar o programa em uma função.

Obrigado a @ musicman523 por sugerir códigos de saída!

Experimente online!

Dennis
fonte
Você pode alterar o idioma para "interpretador Python 2" e usar exit(n%s)onde 0 é verdadeiro e qualquer outra coisa é falsa?
precisa
Encontrei algo ainda mais curto, graças à sua sugestão. :)
Dennis
Agradável! Eu pensei que talvez você poderia incorrer em uma ZeroDivisionError, mas seu caminho é mais curto eu acredito
musicman523
3

Pitão, 12 7 bytes

!%hQsjF

Experimente online!

A contagem de bytes agora está mais baixa, pois o unário não é mais necessário.

Explicação

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

R , 64 bytes 60

(requer o pryrpacote)

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

Essa é uma função anônima que recebe dois argumentos be navalia como (que está no TIO):

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

Onde d calcula a soma dos dígitos para a base necessária.

Eliminados 4 bytes assim que a base foi garantida como maior que 1.

Experimente online!

Giuseppe
fonte
2

Japonês , 9 bytes

vUsV ¬xnV

Aceita entrada como dois números inteiros.

Experimente online!

Justin Mariner
fonte
2

Javascript (ES6), 68 67 bytes

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

Observe que, como somos obrigados a lidar apenas com números de base- k ou base-10 n, presumo que nseja sempre um número inteiro de base-10.

-1 byte, graças a TheLethalCoder!

Como funciona:

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

Experimente online!

Akshat Mahajan
fonte
3
Bem vindo ao site! :)
James
1
Tirar a entrada em currying sintaxe para salvar um byte ou seja n=>k=>..., seria chamado como(345)(10)
TheLethalCoder
@TheLethalCoder Thanks! Eu atualizei.
Akshat Mahajan
1

Javascript ES6, 62 bytes

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

Perl 6 , 40 bytes

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

Teste-o

Expandido:

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

Mathematica, 30 bytes

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

Função pura usando dois argumentos, o inteiro e a base (nessa ordem) e retornando Trueou False. Cuidado: os dois primeiros |s são apenas o caractere ASCII normal, enquanto o último é U + 2223.

#2<2 lida com o caso especial da base 1. Caso contrário, Tr@IntegerDigits@## produz a soma dos dígitos do primeiro argumento quando escrito na base do segundo argumento e ...∣#testa se essa soma divide o primeiro argumento.

Greg Martin
fonte
0

Lote, 119 bytes

@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

Saídas 1 para números Harshad.

Neil
fonte
0

Python 3 , 45 bytes

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

Experimente online!

Com base nos formatos atualizados para entrada.

notjagan
fonte