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.


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.

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

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


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!


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

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!



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!


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

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

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.


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.





Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.