¿Es un número Harshad?

8

Un número de Harshad es un número que es divisible por la suma de sus dígitos. Obviamente, esto depende de en qué base se escriba el número entero. Los números de Base 10 Harshad son la secuencia A005349 en el OEIS.

Tu tarea:

Escriba un programa o función que determine si un entero dado es un número Harshad en una base dada.

Entrada:

Un entero positivo <10 ^ 9, y una base entre 2 y 36, O, un entero positivo en su base, usando letras minúsculas para los números del 11-36 y una base entre 2 y 36. Solo debe manejar uno de Estas opciones.

Salida:

Un valor verdadero / falso que indica si la primera entrada es un número de Harshad en la base de la segunda entrada.

Ejemplos:

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

Puntuación:

Este es el , gana la puntuación más baja en bytes.

Grifo
fuente

Respuestas:

11

Jalea , 4 bytes

bSḍḷ

Pruébalo en línea!

Cómo 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
fuente
OK, definición de FGITW aquí. Impresionante sin embargo. ¿Cómo haces estas cosas?
Gryphon
Es bastante fácil con una conversión de base incorporada.
Dennis
Simplemente estoy impresionado por el incorporado para tomar la suma de los dígitos. Ni siquiera sabía que era una cosa.
Gryphon
No hay incorporado para tomar la suma de los dígitos. bconvierte n en la matriz de sus dígitos de base k , luego Stoma su suma.
Dennis
Oh ya veo. Pensé que b acababa de convertir n en un entero en la 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

Pruébalo en línea!

1 es verdad, ya sabes.

Monja permeable
fuente
1
Esto parece funcionar continuamente para una base de 1.
Gryphon
@Gryphon hecho.
Leaky Nun
Perdón por los bytes agregados :(
Gryphon
Python no es realmente el lenguaje para esto.
Gryphon
-3 bytes en Python 2.
notjagan
3

Dyalog APL, 20 bytes

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

Pruébalo en línea! [15 primeros números en 15 primeras bases]

Toma el número como argumento derecho y la base como argumento izquierdo, 0 es verdadero.

¿Cómo?

⍺⊥⍣¯1⊢⍵- en base como una lista de dígitos

⍵|⍨- módulo ...

+/ - la suma

Uriel
fuente
3

Python 2 , 54 47 bytes

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

El tiempo y la complejidad de la memoria son O (n) , así que no intente 10 9 en TIO.

La salida es a través del código de salida, por lo que 0 es verdadero, 1 es falso. Si este método de salida termina siendo permitido, se puede guardar un byte adicional al convertir el programa en una función.

¡Gracias a @ musicman523 por sugerir códigos de salida!

Pruébalo en línea!

Dennis
fuente
¿Puedes cambiar el idioma a "intérprete de Python 2" y usar exit(n%s)donde 0 es verdadero y cualquier otra cosa es falsa?
musicman523
Encontré algo aún más corto, gracias a su sugerencia. :)
Dennis
¡Agradable! Pensé que tal vez podrías incurrir en un error ZeroDivisionError, pero creo que tu camino es más corto
musicman523
3

Pyth, 12 7 bytes

!%hQsjF

Pruébalo en línea!

El recuento de bytes ahora es menor ya que ya no se requiere unario.

Explicación

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

R , 64 60 bytes

(requiere el pryrpaquete)

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

Esta es una función anónima que toma dos argumentos by nque se evalúa en (que está en TIO):

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

donde dcalcula la suma de dígitos para la base requerida.

Se descartaron 4 bytes una vez que se garantizó que la base era mayor que 1.

Pruébalo en línea!

Giuseppe
fuente
2

Javascript (ES6), 68 67 bytes

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

Tenga en cuenta que dado que solo estamos obligados a manejar números base- k o base-10 n, supongo que siempre nes un entero base-10.

-1 byte, gracias a TheLethalCoder!

Cómo 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
 ) 

Pruébalo en línea!

Akshat Mahajan
fuente
3
Bienvenido al sitio! :)
James
1
Tome la entrada en la sintaxis de curry para guardar un byte n=>k=>..., es decir , se llamaría como(345)(10)
TheLethalCoder
@TheLethalCoder ¡Gracias! Yo actualice.
Akshat Mahajan
1

Javascript ES6, 62 bytes

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

Perl 6 , 40 bytes

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

Pruébalo

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
fuente
0

Mathematica, 30 bytes

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

Función pura que toma dos argumentos, el entero y la base (en ese orden), y devuelve Trueo False. Cuidado: los primeros dos |s son solo el carácter ASCII normal, mientras que el último es U + 2223.

#2<2trata el caso especial de la base 1. De lo contrario, Tr@IntegerDigits@##produce la suma de los dígitos del primer argumento cuando se escribe en la base del segundo argumento, y ...∣#prueba si esa suma divide el primer argumento.

Greg Martin
fuente
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

Salidas 1 para números Harshad.

Neil
fuente