Ist es eine Harshad-Nummer?

8

Eine Harshad-Zahl ist eine Zahl, die durch die Summe ihrer Ziffern teilbar ist. Dies hängt offensichtlich davon ab, in welche Basis die Ganzzahl geschrieben ist. Basis 10 Harshad-Nummern sind die Sequenz A005349 im OEIS.

Deine Aufgabe:

Schreiben Sie ein Programm oder eine Funktion, die bestimmt, ob eine bestimmte Ganzzahl eine Harshad-Zahl in einer bestimmten Basis ist.

Eingang:

Eine positive Ganzzahl <10 ^ 9 und eine Basis zwischen 2 und 36 ODER eine positive Ganzzahl in ihrer Basis, die Kleinbuchstaben für die Zahlen von 11-36 und eine Basis zwischen 2 und 36 verwendet. Sie müssen nur eine von behandeln diese Optionen.

Ausgabe:

Ein Wahrheits- / Falschwert, der angibt, ob die erste Eingabe eine Harshad-Zahl in der Basis der zweiten Eingabe ist.

Beispiele:

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

Wertung:

Dies ist , niedrigste Punktzahl in Bytes gewinnt.

Greif
quelle
eng verwandt
Herr Xcoder

Antworten:

11

Gelee , 4 Bytes

bSḍḷ

Probieren Sie es online aus!

Wie es funktioniert

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
quelle
OK, Definition von FGITW hier. Beeindruckend. Wie machst du diese Dinge?
Gryphon
Mit einer integrierten Basiskonvertierung ist dies ziemlich einfach.
Dennis
Ich bin nur beeindruckt von der eingebauten Summe der Ziffern. Ich wusste nicht einmal, dass das eine Sache ist.
Gryphon
Es ist keine integrierte Funktion zum Zählen der Ziffern vorhanden. bkonvertiert n in das Array seiner Basis- k- Ziffern und Snimmt dann seine Summe.
Dennis
Oh, ich verstehe. Ich dachte, b konvertierte gerade n in eine ganze Zahl in Basis 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

Probieren Sie es online aus!

Ich bin wahr, weißt du?

Undichte Nonne
quelle
1
Dies scheint nur kontinuierlich für eine Basis von 1 zu laufen.
Gryphon
@ Greyon fertig.
Undichte Nonne
Entschuldigung für die hinzugefügten Bytes :(
Gryphon
Python ist nicht wirklich die Sprache dafür.
Gryphon
-3 Bytes in Python 2.
Notjagan
3

Dyalog APL, 20 Bytes

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

Probieren Sie es online aus! [15 erste Zahlen in 15 ersten Basen]

Nimmt die Zahl als rechtes Argument und die Basis als linkes Argument, 0 ist wahr.

Wie?

⍺⊥⍣¯1⊢⍵- in der Basis als Ziffernliste

⍵|⍨- Modulo ...

+/ - die Summe

Uriel
quelle
3

Python 2 , 54 47 Bytes

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

Zeit- und Speicherkomplexität sind O (n) . Versuchen Sie es also nicht mit 10 9 auf TIO.

Die Ausgabe erfolgt über den Exit-Code, also ist 0 wahr, 1 falsch. Wenn diese Ausgabemethode zulässig ist, kann ein weiteres Byte gespeichert werden, indem das Programm in eine Funktion umgewandelt wird.

Vielen Dank an @ musicman523 für den Vorschlag von Exit-Codes!

Probieren Sie es online aus!

Dennis
quelle
Können Sie die Sprache in "Python 2-Interpreter" ändern und verwenden, exit(n%s)wobei 0 wahr und alles andere falsch ist?
musicman523
Ich habe dank Ihres Vorschlags etwas noch kürzeres gefunden. :)
Dennis
Nett! Ich dachte, vielleicht könnten Sie einen ZeroDivisionError verursachen, aber Ihr Weg ist kürzer, glaube ich
musicman523
3

Pyth, 12 7 Bytes

!%hQsjF

Probieren Sie es online aus!

Die Anzahl der Bytes ist jetzt niedriger, da unary nicht mehr benötigt wird.

Erläuterung

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

R , 64 60 Bytes

(erfordert das pryrPaket)

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

Dies ist eine anonyme Funktion, die zwei Argumente akzeptiert bund nFolgendes auswertet (was sich in TIO befindet):

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

Dabei wird ddie Ziffernsumme für die erforderliche Basis berechnet.

4 Bytes wurden gelöscht, sobald garantiert wurde, dass die Basis größer als 1 ist.

Probieren Sie es online aus!

Giuseppe
quelle
2

Javascript (ES6), 68 67 Bytes

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

Beachten Sie, dass wir immer eine Basis-10-Ganzzahl annehmen , da wir nur entweder Basis- k- oder Basis-10-Zahlen verarbeiten müssen .nn

-1 Byte, dank TheLethalCoder!

Wie es funktioniert:

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

Probieren Sie es online aus!

Akshat Mahajan
quelle
3
Willkommen auf der Seite! :)
James
1
Nehmen Sie Eingaben in der Curry-Syntax, um ein Byte zu speichern, dh n=>k=>...würde wie(345)(10)
TheLethalCoder
@ TheLethalCoder Danke! Ich habe aktualisiert.
Akshat Mahajan
1

Javascript ES6, 62 Bytes

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

Perl 6 , 40 Bytes

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

Probier es aus

Erweitert:

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

Mathematica, 30 Bytes

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

Reine Funktion, die zwei Argumente verwendet, die Ganzzahl und die Basis (in dieser Reihenfolge) und Trueoder zurückgibt False. Achtung: Die ersten beiden |s sind nur das normale ASCII-Zeichen, während das letzte U + 2223 ist.

#2<2befasst sich mit dem Sonderfall der Basis 1. Andernfalls Tr@IntegerDigits@##wird die Summe der Ziffern des ersten Arguments erzeugt, wenn es in die Basis des zweiten Arguments geschrieben wird, und es wird ...∣#geprüft, ob diese Summe das erste Argument teilt.

Greg Martin
quelle
0

Stapel, 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

Gibt 1 für Harshad-Nummern aus.

Neil
quelle
0

Python 3 , 45 Bytes

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

Probieren Sie es online aus!

Basierend auf den aktualisierten Formaten für die Eingabe.

notjagan
quelle