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.