Ist eine Zahl durch jede ihrer Ziffern teilbar?


47

Mein Freund und ich arbeiteten an einem Labor in unserer AP-Informatik-Klasse und beschlossen, Golf als Problem zu codieren, da wir noch die Hälfte der Klasse frei hatten, nachdem wir fertig waren. Hier ist die Frage:

Ist n bei einer gegebenen Zahl n durch jede seiner Ziffern teilbar?

Zum Beispiel bestehen 128 diesen Test - er ist durch 1,2 und 8 teilbar. Alle Zahlen mit einer Null disqualifizieren die Zahl automatisch. Wenn Sie möchten, können Sie auch andere Sprachen verwenden und Lösungen veröffentlichen. Wir sind jedoch am meisten daran interessiert, wie kompakt Leute das Programm in Java erstellen können, da dies die Sprache ist, die wir in der Klasse verwenden. Bisher haben wir beide 51. Hier ist mein aktueller Code:

public boolean dividesSelf(int n){for(int p=n;n%10>0;)n/=p%(n%10)>0?.1:10;return n<1;}
// 51 characters

// Breakdown:
// for(int p=n;         Saves one semicolon to put declaration into for loop
// n%10>0;)             Basic check-for-zero
// n/=                  Pretty simple, discarding one number off of n at a time
// p%(n%10)>0?          If p (the given value) is not divisible by n%10 (the current digit)...
// .1:10;               Divide by .1 (multiply by 10) so it fails the check next iteration. If it is divisible, divide by 10 to truncate the last digit
// return n<1           If the number was fully divisible, every digit would be truncated, and n would be 0. Else, there would still be non-zero digits.

Bedarf

Die Methodensignatur kann beliebig sein. Zählen Sie einfach den Funktionskörper. Stellen Sie jedoch sicher, dass die Methode einen booleschen Wert zurückgibt und nur einen numerischen Parameter (keine Zeichenfolge) übergibt .

Der Code muss in der Lage sein, alle diese Fälle zu übergeben (um den Anweisungen der ursprünglichen Frage gerecht zu werden, zählen nur boolesche wahre und falsche Werte, wenn die Sprache boolesche Werte unterstützt. Wenn und nur wenn Ihre Sprache keine booleschen Variablen enthält) kann false mit 0 und true mit einer beliebigen Ganzzahl ungleich Null (vorzugsweise 1 oder -1) darstellen:

128 -> true
 12 -> true
120 -> false
122 -> true
 13 -> false
 32 -> false
 22 -> true
 42 -> false
212 -> true
213 -> false
162 -> true
204 -> false

Außerdem haben wir keine Leerzeichen gezählt. Sie können dies auch tun, es sei denn, die Leerzeichen sind für die Funktionsweise des Programms von wesentlicher Bedeutung (daher zählen in Java keine Zeilenumbrüche, sondern nur ein Leerzeichen zwischen intund x=1.). Viel Glück !


18
Willkommen bei PPCG! Ein paar Vorschläge: 1. Es ist eine schlechte Idee, funktionierende Leerzeichen nicht zu zählen. Jede in Whitespace geschriebene Antwort gewinnt automatisch. 2. Sollte unser Beitrag ausgedruckt / zurückgeschickt werden trueund falseoder sind die wahrheitsgemäßen / falschen Werte auch in Ordnung? 3. Das javaTag trifft hier nicht wirklich zu, da die Herausforderung selbst nichts mit Java zu tun hat.
Dennis

Okay. Entschuldigung für die Probleme. Um es zu klären, würden Sie den Raum in 'int p = n' als funktional betrachten, weil ich es vorher nicht getan habe. Ich werde die anderen Probleme beheben, auf die Sie hingewiesen haben.
Mathew Kirschbaum

5
Alle für den Code erforderlichen Leerzeichen sind funktionsfähig.
FryAmTheEggman

Okay, danke für die Antwort!
Mathew Kirschbaum

1
@RickyDemer: Da 0 in diesem Fall eine außergewöhnliche Eingabe wäre (es ist die einzige Zahl mit 0Ziffern, die ein Vielfaches von jeder von ihnen ist), stelle ich mir vor, dass die meisten Antworten auf uninteressante Weise nur länger werden würden, um einen Check dafür einzuschließen. Daher gefällt mir das Problem, das sich aus dem Titel ergibt, besser (teilbar durch seine Ziffern, anstatt ein Vielfaches seiner Ziffern zu sein, das 0 ausschließt).
Jeroen Mostert

Antworten:


23

Perl 6, 13

sub golf($_) {
   $_%%.comb.all
}

Verwendet die implizite Variable $_- $_ %% .comb.allentspricht $_ %% all($_.comb). %%ist der Operator "ist teilbar" und gibt combohne zusätzliches Argument eine Liste der Zeichen in einer Zeichenfolge zurück. Wenn das Argument beispielsweise 123 lautet, wird die Funktion ausgewertet

123 %% all(123.comb)

welches ist

123 %% all(1, 2, 3)

Junction-Autothreading macht es

all(123 %% 1, 123 %% 2, 123 %% 3)

welches ist

all(True, False, True)

was im booleschen Kontext falsch ist, weil es eine "all" -Verbindung ist und offensichtlich nicht alle ihre Elemente wahr sind.

Es sollte möglich sein, den Rückgabewert zu erzwingen Boolund die Junction vor Aufrufern zu verbergen, indem die Funktionssignatur erstellt wird sub golf($_ --> Bool()), aber Zwänge in Funktionssignaturen funktionieren in Rakudo noch nicht. Der Rückgabewert ist immer noch richtig wahr oder falsch, es ist einfach nicht Trueoder False.


Wenn Sie möchten, dass es zurückkommt, Boolfügen Sie einfach soden Code voran so$_%%.comb.all.
Brad Gilbert b2gills

21

C # und System.Linq - 26/40

Nach den Regeln, ohne die Methodendeklaration selbst zu zählen.

bool dividesSelf(int i) { 
    return(i+"").All(d=>i%(d-48d)<1);
}

Dies zeigt einmal mehr, dass C # die beste Wahl ist, wenn Java in Betracht gezogen wird ... I kid, I kid!

Leider liefert diese Funktion (und viele andere Antworten) keine korrekten Ergebnisse für negative Eingaben. Wir können das beheben, aber die Lösung verliert viel von ihrem Charme (und wird 46 Zeichen lang):

return(i+"").All(d=>d>48&&i%(d-48)==0||d==45);

Bearbeiten : Ein Charakter wurde mit Tims Vorschlag abgeschabt.

Edit : Mit der Einführung von ausdrucksstarken Mitgliedern in C # 6 können wir dies weiter eingrenzen, indem wir Folgendes ausschneiden return:

bool dividesSelf(int i) =>
    (i+"").All(d=>i%(d-48d)<1);

für insgesamt 26 Zeichen (sollte meiner Meinung =>nach nicht mehr als geschweifte Klammern enthalten sein). Die Version mit negativen Zahlen kann ebenfalls gekürzt werden.


Warum .0? Es ist nichts anderes als ein ganzzahliger Modul erforderlich.
Peter Taylor

3
@PeterTaylor: Es gibt, wenn Sie das kürzeste Programm wollen - i % 0mit ieiner ganzen Zahl gibt ein DivideByZeroException.
Jeroen Mostert

2
Und mit einem Doppel gibt es NaN! Nett!
Peter Taylor

2
48dist dasselbe wie 48.0, aber ein Zeichen weniger (d für double).
Tim S.

1
@StuartLC: Lambdas sind keine Methoden; Ihr Anwendungsbereich ist unterschiedlich, daher denke ich, dass dies die Regeln zu sehr verbiegt. Aber seit C # 6 (dem diese Antwort vorangestellt ist) haben wir ausdrucksstarke Mitglieder, die es uns ermöglichen, die Definition zu verkürzen. Für den negativen Fall können wir nicht verwenden &, gerade weil &nicht kurzgeschlossen wird - Sie erhalten eine Division durch Null-Ausnahme für die %. Wir können das beheben, indem wir es zu einem Double (mit d) machen, aber dann haben wir wieder einen Charakter verloren.
Jeroen Mostert

18

APL ( 13 11)

(Anscheinend zählen die Klammern nicht)

{0∧.=⍵|⍨⍎¨⍕⍵}

Erläuterung:

  • ⍎¨⍕⍵: werte jedes Zeichen in der Stringdarstellung von aus
  • ⍵|⍨: für jeden von denen finden Sie das Modulo davon und
  • 0∧.=: sehen Sie, ob alle diese gleich sind 0

Testfälle:

      N,[.5] {0∧.=⍵|⍨⍎¨⍕⍵} ¨ N←128 12 120 122 13 32 22 42 212 213 162 204
128 12 120 122 13 32 22 42 212 213 162 204
  1  1   0   1  0  0  1  0   1   0   1   0

APL kann X%0? ohne zu werfen?
Optimierer

@Optimizer: ja. 0|Xgibt X.
Marinus

Süss. Auch Ihre Antwort ist 11 Bytes, nicht 13
Optimizer

9
Nur APL würde keinen Fehler auf Modulo von 0 geben, und Absturz bei der Bewertung eines Nicht-Bool als ein Bool;)
FryAmTheEggman

3
Ein Zeichen kürzer mit einem Zug anstelle von dfn:(0∧.=⍎¨∘⍕|⊢)
ngn

14

Python 2: 43 Zeichen

f=lambda n:any(n%(int(d)or.3)for d in`n`)<1

Überprüft, ob die Zahl Reste ungleich Null hat, und gibt die Negation davon aus. Nullstellen werden seltsam gehandhabt: Da die Berechnung %0einen Fehler verursacht, werden Ziffern durch 0ersetzt .3, was aufgrund von Gleitkommaungenauigkeiten immer ein Ergebnis ungleich Null zu liefern scheint.

Der Funktionskörper ist 32 Zeichen.


14

Perl - 27 Bytes

sub dividesSelf{
    $_=pop;s/./!$&||$_%$&/ger<1
}

Die Funktionssignatur wird nicht wie angegeben gezählt.

Beispielnutzung:

use Data::Dump qw(dump);
for $i (128, 12, 120, 122, 13, 32, 22, 42, 212, 213, 162, 204) {
  printf "%3d -> %s\n", $i, dump(dividesSelf $i);
}

Beispielausgabe:

128 -> 1
 12 -> 1
120 -> ""
122 -> 1
 13 -> ""
 32 -> ""
 22 -> 1
 42 -> ""
212 -> 1
213 -> ""
162 -> 1
204 -> ""

Problembeschreibung: "Es zählen nur die booleschen wahren und falschen Werte. Wahrheits- / Falschheitswerte zählen nicht ."

use Data::Dump qw(dump);
dump(1 == 1);
dump(0 == 1);

Ausgänge:

1
""

'Richtig' und 'Falsch' werden als 1und definiert "".

Erratum:
Wie Brad Gilbert zu Recht hervorhebt, definiert Perl true als Skalar, der sowohl die Ganzzahl 1als auch die Zeichenfolge "1"gleichzeitig ist, und false als Skalar, der sowohl die Ganzzahl 0als auch die Zeichenfolge ""gleichzeitig ist.


Dies kann durch den Verzicht auf verkürzt werden $_: pop=~s///ger<1. Ich weiß nicht, ob das OP dem zustimmt 1und ""gültige Ergebnisse liefert. Wenn nicht, kann dies mit zwei weiteren Bytes behoben werden: einfach hinzufügen |0.
HDV

perl -pe'$_=s/./!$&||$_%$&/ger<1|0'ist 26 Bytes einschließlich des Flags |0und -p. Sie müssen keine Funktion verwenden.
hmatt1

1
Tatsächlich sind die Werte True und False eher wie dualvar(1,'1')und dualvar(0,'').
Brad Gilbert b2gills

1
@BradGilbert Das ist interessant. Perlguts sind mir einigermaßen vertraut, aber mir war nicht bewusst, dass wahr und falsch besondere Fälle sind. Tatsächlich handelt es sich um "Triple Scalars", die als SVIV(int), SVNV(double) und SVPV(string) gekennzeichnet sind.
Primo

1
Tatsächlich wird die Variable geändert, wenn Sie zum ersten Mal eine Zeichenfolge als Zahl oder eine Zahl als Zeichenfolge verwenden, um diese zusätzlichen Daten aufzunehmen. Aus diesem Grund erhalten Sie nur eine Warnung, 'abc'wenn Sie diese Nummer zum ersten Mal verwenden (vorausgesetzt, Sie haben sie use warnings;aktiviert).
Brad Gilbert b2gills

13

CJam, 11 10 Bytes

{
    _Ab:df%:+!
}:F;

Dies definiert eine benannte Funktion Fund löscht den Block vom Stapel.

Probieren Sie es online aus.

Testfälle

$ cjam <(echo '{_Ab:df%:+!}:F;[128 12 120 122 13 32 22 42 212 213 162 204]{F}%p')
[1 1 0 1 0 0 1 0 1 0 1 0]

Wie es funktioniert

_      " Copy the integer on the stack.                                          ";
Ab     " Push the array of its digits in base 10.                                ";
:d     " Cast each digit to Double.                                              ";
f%     " Take the integer on the stack modulus each of its digits.               ";
:+     " Add the results.                                                        ";
!      " Push the logical NOT of the sum.                                        ";

Hatte CJam die Funktionen, die Sie für die 10-Byte-Lösung verwendet haben, als die Frage geschrieben wurde?
Lirtosiast

@ ThomasKwa: Ja, das hat es getan. Ich habe den Code in Version 0.6.2 getestet, die im Juli 2014 veröffentlicht wurde.
Dennis,

12

JavaScript ES6, 39 32 28 Bytes

v=>[...""+v].every(x=>v%x<1)

Vielen Dank an core1024 für den Vorschlag zum Ersetzen (""+v).split("")durch [...""+v]und openorclose für den Vorschlag zur Verwendung der everyFunktion.

Die Antwort enthält derzeit kein Bit meines Codes: O

Vorherige Lösung

v=>[...""+v].filter(x=>v%x|!+x)==""

==""Dies ist keine gültige Methode, um zu überprüfen, ob ein Array leer ist, da [""]==""zurückgegeben truewird. Das Array enthält jedoch garantiert nicht leere Zeichenfolgen, sodass es hier funktioniert.

Der Rest ist eine Standard-Kurzschriftkonvertierung in JavaScript.


1
Sie können einige characteras sparen durch den Ersatz (""+v).split("")mit [...""+v].
Core1024

1
Warum nicht die everyMethode anwenden? v=>[...""+v].every(x=>v%x<1);
geöffnet oder geschlossen

@openorclose: Danke. Ich hatte nie die Möglichkeit, es in JS zu verwenden, also hätte ich nie daran gedacht, nach einer solchen Funktion zu suchen.
n̴̖̋h̴̖̋a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́

v=>![...""+v].some(x=>v%x)
l4m2

@ l4m2 Since v%0gibt NaNund zurück NaN == false. In Ihrem Fall können also Zahlen, die 0 enthalten, wie beispielsweise 10, zurückgegeben werden true.
Shieru Asakoto

9

Java 8, 46 Bytes (Methodentext)

Mit Jeroen Mosterts Umwandlung in einen Doppeltrick.

public static boolean dividesSelf(int n) {
    return(""+n).chars().allMatch(x->n%(x-48d)<1);
}

8

Pyth, 12 Bytes

!f|!vT%vzvTz

Dies filtert die Zeichen in der Zeichenfolge dahingehend, dass sie entweder Null ( !vT) sind oder die Eingabe ( %vzvT) nicht teilen , und nimmt dann das logische Nicht der resultierenden Liste auf.

Probieren Sie es hier aus.


Nein, mir geht es gut, wenn eine Funktion nicht verwendet wird. Ich wollte nur jeden, der Funktionen verwendet, darauf hinweisen, dass er die Deklaration und nur den darin enthaltenen Code nicht zählen muss.
Mathew Kirschbaum

8

Ruby, 44 Bytes (Funktionskörper: 37)

Möglicherweise besteht das Potenzial, weiter Golf zu spielen.

f=->n{n.to_s.chars.all?{|x|x>?0&&n%x.hex<1}}

Eingabe durch Funktion übernommen f. Anwendungsbeispiel:

f[128] # => true
f[12]  # => true
f[120] # => false
...

1
Sie können ändern , .to_izu .hex, da mit einem einstelligen Zahlen gleich sind in der Basis 16 und kann sich ändern ==0zu <1.
Histokrat

8

Python - 59 50 49 47 Bytes

f=lambda n:all(c>'0'and 0==n%int(c)for c in`n`)

Ich bin mir sicher, dass es einen schnelleren Weg gibt ... na ja.

Bearbeiten - Danke an FryAmTheEggman für die Golftipps.

Edit 2 - FryAmTheEggman hat dies möglicherweise genauso gut an dieser Stelle geschrieben, hoppla

Bearbeiten Sie 3 - Hände hoch, wenn Sie nicht einmal wussten, dass Genexps eine Sache sind. ...Nur ich?


Oh vielen Dank! Ich vergesse immer wieder all diese Dinge. (Ich wusste auch nicht, dass Sie weniger als Zeichen auf diese Weise können.)
Kasran

Oh, die Logik Spiegeln scheint es auch ein wenig zu verkürzen: f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`]). Und kein Problem :)
FryAmTheEggman

Oh, ich wusste nicht , dass es auch war ein allVerfahren.
Kasran

Würde 1>n%int(c)funktionieren
Sp3000,

3
Warum ein Listenverständnis? Genexp: all(c>'0'and 0==n%int(c)for c in`n`)macht genau dasselbe, mit 2 Zeichen weniger und speichert sogar die Zuordnung der Liste.
Bakuriu

8

Pyth 11

!f%Q|vT.3`Q

Dies kombiniert die Antworten von @ isaacg und @ xnor . Es filtert Ziffern aus der Eingabe heraus, indem es den Wert von überprüft input % (eval(current_digit) or .3). Dann wird geprüft, ob die resultierende Zeichenfolge leer ist oder nicht.

Kam über ein anderes Paar gleich langer Varianten:

!f%Q|T.3jQT
!f|!T%QTjQT

Probieren Sie es online aus.


5

Bash + Coreutils, 44 Bytes

Die vollständige Funktionsdefinition lautet:

f()((`tr 0-9 \10<<<$1``sed "s/./||$1%&/g"<<<$1`))

Ich bin mir nicht sicher, wie ich das bewerten soll, da Shell-Funktionen normalerweise einen einzelnen Satz von {}oder verwenden (), um den Funktionskörper zu enthalten. Ich fand hier, dass ich auch double verwenden könnte (()), um den Funktionskörper zu enthalten, der eine arithmetische Erweiterung verursacht, die ich hier benötige. Im Moment zähle ich also nur ein Paar dieser Klammern - eine weitere Diskussion darüber ist willkommen.

Ausgabe:

$ for i in 128 12 120 122 13 32 22 42 212 213 162 204; do f $i; printf "%d " $?; done
1 1 0 1 0 0 1 0 1 0 1 0 $
$

Äh - mir ist nicht klar, ob Einsen und Nullen akzeptabel sind oder ob ich drucken muss true/ false?
Digitales Trauma

4

J - 14 Zeichen

Der Funktionskörper ist der Teil nach dem =:. Wenn wir die Zeichenanzahl für die gesamte Funktion minimieren möchten, sind das die 15 Zeichen */@(0=,.&.":|]).

f=:0*/@:=,.&.":|]

,.&.":ist der kürzeste Weg in J, um als Zahl in eine Liste seiner Dezimalstellen zu expandieren: konvertieren Sie in eine Zeichenfolge, trennen Sie die Ziffern und konvertieren Sie jede Ziffer zurück in eine Zahl. ,.&.":|]Nimmt die eingegebene Zahl ( ]) modulo ( |) diese Ziffern. 0*/@:=Gibt true zurück, wenn alle Ergebnisse 0 waren, andernfalls false.

   f 162
1
   f every 204 212 213
0 1 0

3

Java - 121 102 97 79 78 Bytes

Ich weiß nur, dass dies später überfüllt sein wird. Naja.

boolean b(int a){int m=10,j,t=1;for(;m<a*10;m*=10){j=10*(a%m)/m;if(j==0||a%j>0)t=0;}return t>0;}

Ich werde wiederkommen.


1
Sie können Ihre Funktion nun beliebig benennen. Ich habe die Regeln geändert, damit Sie nur die Berechnungen innerhalb der eigentlichen Funktion zählen, aber die Funktion muss einen booleschen Typ zurückgeben. Das sind also derzeit 86 Zeichen.
Mathew Kirschbaum

3

Haskell - 100 54 38

f x=all(\y->y>'0'&&x`mod`read[y]<1)$show x

Noch lernen, Kritik geschätzt


Ich hatte einen Kommentar hier, aber ich habe ihn versehentlich irgendwie gelöscht ... Wie auch immer, einige Vorschläge: 1) Lass die lengths fallen, sie sind unnötig. 2) Ersetzen Sie tdurch seine Definition. 3) elem y sist unnötig. 4) /='0'kann anstelle von zum linken Filter verschoben werden elem y s. 5) /='0'Entspricht in diesem Fall, >'0'da jeder Buchstabe eine Ziffer ist. 6) Setzen Sie modBackticks ein, damit es infix wird. 7) Setzen Sie alles in eine einzelne Zeile.
Zgarb

1 und 3 waren von, als ich versuchte, es anders zu machen und Code zu retten. Danke für die Tipps.
globby

1
meine vorschläge: statt verwenden s==filter(...)ssolltest du verwenden all(...)s. Jetzt, da sder Ausdruck nur einmal vorkommt, können Sie ihn durch seine Definition ersetzen und löschen where. auch, anstatt ==0du könntest verwenden <1.
stolzer Haskeller

große Verbesserung gegenüber der ersten Version!
stolzer Haskeller

Ich denke , man kann immer noch verlieren ein Byte , wenn Sie ersetzen all(\y->...)$show xdurch and[...|y<-show x].
Zgarb

2

CJam, 15 Bytes

{_Abf{_g{%}*}:|!}

Dies ist ein Block, der einer Funktion in CJam am nächsten kommt. Ich zähle nur den Körper (dh ich lasse die Klammern weg). Sie können es wie folgt verwenden:

128{_Abf{_g{%}*}:|!}~

Oder wenn Sie eine Reihe von Eingaben testen möchten, können Sie dies tun

[128 12 120 122 13 32 22 42 212 213 162 204]{{_Abf{_g{%}*}:|!}~}%

Der Block hinterlässt 0(falsch) oder 1(wahr) auf dem Stapel, um das Ergebnis anzuzeigen. (CJam hat keinen Booleschen Typ.)

Teste es hier.

Erläuterung:

_               "Duplicate input.";
 Ab             "Get base-10 digits.";
   f{      }    "This maps the block onto the list of digits, supplying the input each time.";
     _g         "Duplicate digit, get signum S (0 or 1).";
       { }*     "Repeat this block S times.";
        %       "Take input modulo digit.";
                "This leaves an array of zeroes for divisible digits, non-zeroes
                 for non-divisible digits, and non-zero junk for zeroes.";
            :|  "Fold OR onto this list. One could also sum the list with :+";
              ! "Logical NOT. Turns 0 into 1, and non-zero values into 0.";

Alternativ auch 15 Bytes

{:XAb{X\_X)?%},!}

Erläuterung

:X              "Store input in X.";
  Ab            "Get base-10 digits.";
    {       },  "Filter this list by the result of the block.";
     X\         "Push another copy of X, swap with digit.";
       _        "Duplicate digit.";
        X)      "Push X+1.";
          ?     "Select digit itself or X+1, depending on whether digit is 0 or not.";
           %    "Take modulo. X%(X+1) will always be nonzero for positive integers.";
              ! "Logical NOT. Turns an empty list into 1 and a non-empty list into 0.";

2

CJam, 15 Bytes

{_Abf{_{%}1?}1b!}

{}ist einer Funktion in CJam am nächsten. Ich zähle nur den Körper der Funktion

Benutze es so:

128{_Abf{_{%}1?}1b!}~

Um entweder 1(wenn die Zahl teilbar ist) oder 0(wenn die Zahl nicht durch ihre Ziffern teilbar ist).

Probieren Sie es hier online aus

Erläuterung

_Ab                "Copy the number and split it to its digits";
   f{      }       "For each digit, run this code block on the number";
     _{%}1?        "If the digit is 0, put 1, otherwise perform number modulus digit";
            1b     "We now have an array of modulus corresponding to each digit. Sum it up";
              !    "Negate the sum. If all digits were divisible, sum of modules will be"
                   "0, thus answer should be 1 and vice versa";

Möglicherweise fehlt mir etwas, aber nachdem ich mich schnell mit CJam befasst habe, scheinen einige Dinge nicht sinnvoll zu sein: Wie werden Abdie Ziffern aufgeteilt? Es scheint es einfach in Basis 10 umzuwandeln. Woher weiß%, dass es an der Zahl und nicht nur an der nächsten Ziffer modifiziert werden muss, da die nächste Ziffer auf dem Stapel anscheinend die nächste sein würde?
Mathew Kirschbaum

Die Beantwortung all Ihrer Fragen wird schwierig sein. Es wäre super einfach zu lernen, wenn man jedes Zeichen nach dem Code setzt. Versuchen Sie es mit128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
Optimizer

1
Antworten auf bestimmte Fragen: Wenn Sie mit der Basis 10 arbeiten, erhalten Sie ein Array von zur Basis 10 konvertierten Zahlen, die in diesem Fall die Ziffern selbst sind. %nimm einfach die letzten zwei zahlen (in diesem fall) und berechne den mod. Die letzten beiden Zahlen hier sind die tatsächliche Zahl und Ziffer (immer)
Optimizer

Okay, danke für den Rat!
Mathew Kirschbaum

2

C89, 43 Bytes

unsigned char d(int n, int c) {
        int a=n%10;return!n||a&&!(c%a)&&d(n/10,c);
}

C89 hat keinen Booleschen Typ. Hoffe das klappt. Ich habe auch einen zweiten Parameter verwendet, um eine Kopie der ursprünglichen Nummer durch den Stapel zu leiten, aber die Definition kann alles sein. Um das richtige Ergebnis zu erhalten, müssen Sie nur die Funktion mit dem gleichen Wert für beide Parameter aufrufen ( d(128, 128)).

BEARBEITEN: Vorgeschlagene Änderungen von einem anonymen Benutzer angewendet



Speziell gegen die Regeln. Ein Parameter.
Edc65

Ja, dieser Beitrag ist eigentlich der Grund, warum ich mich für diese Regel entschieden habe, da es nicht richtig erschien, dass der Benutzer die Vervielfältigung anstelle des Programms vornimmt.
Mathew Kirschbaum

Ich denke, ich muss eine Wrapper-Funktion hinzufügen. Wird durch die Deklaration dieser Funktion die Byteanzahl erhöht?
MarcDefiant

2

C11 - 44 Bytes im Funktionskörper

Eine andere C-Version, nicht rekursiv und ohne Gleitkomma-Ausnahme.

bool digit_multiple(int i)
{
    for(int n=i;i%10&&n%(i%10)<1;i/=10);return!i;
}

Dies funktioniert auch in C ++, Java und den meisten anderen C-ähnlichen Sprachen.

Bearbeitet, um die Verbesserung von primos Kommentar einzuschließen.


1
Eine Version, die in Java kompiliert wird (1.7.0_45-b18): int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;Ein Byte kürzer als der OP-Code.
Primo

2

Julia 32 25 23

Verbessert mit Ziffern

Behebt auch das Problem mit negativen Zahlen

selfDivides(x)=sum(x%digits(x).^1.)==0

Alte Methode

Alle Ziffern teilen sich, wenn die Summe aller Reste 0 ist. Hat wie andere ein Problem mit negativen Zahlen.

selfDivides(x)=sum(x.%(Float64["$x"...]-48))==0

Ausgabe

[selfDivides(x) for x in [128,12,120,122,13,32,22,42,212,213,162,204]]
12-element Array{Any,1}:
  true
  true
 false
  true
 false
 false
  true
 false
  true
 false
  true
 false

Verbesserte Methode behandelt auch BigInt

selfDivides(BigInt(11111111111111111111111111111111111111112))
true

jedoch

selfDivides(BigInt(11111111111111111111111111111111111111113))
false

da

BigInt(11111111111111111111111111111111111111113) %3
1

2

C / C ++, 58 Byte (44 im Hauptteil)

Ruft undefiniertes Verhalten auf (siehe Kommentare)

int d(int i){int j=i;while(i&&!(j%(i%10)))i/=10;return!i;}

trueund false sind 1 und 0, aber Sie können der Signatur ein Zeichen hinzufügen, um a zurückzugeben bool.

Und zum Spaß eine rekursive Version, die kleiner ist, wenn Sie Aufrufe des Formulars zulassen r(128,128)

Edit : Jetzt von den Regeln verboten:

C / C ++, 53 Bytes (33 im Hauptteil)

int r(int i,int j){return!i||!(j%(i%10))&&r(i/10,j);}


2
# 1 stirbt mit einer Gleitkomma-Ausnahme für Zahlen, die eine 0 enthalten, weil j% (i% 10) für i% 10 = 0
SBI

Eine Gleitkomma- Ausnahme? Seltsam. Es funktioniert perfekt auf meinem Compiler, aber Sie haben Recht, es ist undefiniertes Verhalten. Ich bin nicht sicher, wie die allgemeine PCG-Haltung zu compilerabhängigem UB ist.
Etheranger

Was ist "Compiler-abhängiges UB"? Entweder ist es UB oder es ist nicht (und Division durch Null oder eher Modulo Null ist in der Tat UB). UB sollte nicht erlaubt sein, da buchstäblich alles passieren könnte. Wir können davon ausgehen, dass Ihr Programm auf einem Computer ausgeführt wird, der alle um ihn herum in die Luft sprengt und tötet, wenn eine Division durch Null auftritt. Nun, ich bin sicher, Sie möchten, dass wir alle leben ... C hat ein Konzept für implementierungsdefiniertes Verhalten, aber das Teilen durch Null fällt nicht darunter.
Jeroen Mostert

2
@etheranger: Die Division durch 0 wird aus historischen Gründen als Gleitkommaausnahme bezeichnet: stackoverflow.com/questions/16928942/…
n̴̖̋h̴̖̋ã̷͉h̷̭̿d̸̡̅ẗ̵̨́

2
@JeroenMostert: Ich würde sagen, dass über 90% aller C-Antworten auf dieser Website UB aufrufen. Solange es mit einem Compiler auf einem Computer funktioniert , gilt die Antwort als gültig.
Dennis

2

R: 72 67 65

Die Funktion

f<-function(a)!(anyNA(a%%(d=as.double(strsplit(paste0(a),"")[[1]])))|sum(a%%d))

Vielen Dank an @AlexA und @plannapus für die Einsparungen

Testlauf

i=c(128,12,120,122,13,32,22,42,212,213,162,204)
for(a in i){print(f(a))}
[1] TRUE
[1] TRUE
[1] FALSE
[1] TRUE
[1] FALSE
[1] FALSE
[1] TRUE
[1] FALSE
[1] TRUE
[1] FALSE
[1] TRUE
[1] FALSE

Ich zähle derzeit 70 Bytes in Ihrem Funktionskörper, nicht 72. Aber Sie können es mit auf 67 reduzieren d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d)). :)
Alex A.

@AlexA. Vielen Dank. Einer meiner ersten Versuche mit R. wird definitiv
wiederkommen

@ MickyT paste(a)statt toString(a)gibt das gleiche Ergebnis.
Plannapus

@plannapus Danke, kleiner Trick. Muss mich daran erinnern
MickyT

1

GNU Awk: 53 Zeichen

Der gezählte Teil:

for(;++i<=split($1,a,//);)r=r||!a[i]||v%a[i];return!r

Die gesamte Funktion:

function self_divisible(v, i, r)
{
    for (; ++i <= split($1, a, //); )
        r = r || ! a[i] || v % a[i]

    return ! r
}

Da Awk keine booleschen Werte hat, wird 1 für true und 0 für false zurückgegeben.


1

JavaScript (ES6) 30

Funktion mit einem numerischen Parameter. Bei Verwendung von% und Subtraktion muss kein Sonderfall '0' angegeben werden, da 0% 0 in JavaScript NaN ist.

Bearbeiten Gespeichert 1 Zeichen x DocMax

F=n=>[for(d of t=n+'')t-=n%d]&&t==n 

Nur zum Spaß, Missbrauch der Regel, dass die Funktionssignatur nicht gezählt wird, 4

Check=(n,t=n+'',q=[for(d of t)n-=t%d])=>t==n

Test In FireFox / Firebug - Konsole

console.log([128, 12, 120, 122, 13, 32, 22, 42, 212, 213, 162, 204]
.map(x=>+x + ' -> ' + F(x)).join('\n'))

Ausgabe

128 -> true
12 -> true
120 -> false
122 -> true
13 -> false
32 -> false
22 -> true
42 -> false
212 -> true
213 -> false
162 -> true
204 -> false

Ich werde nein sagen, um eine Zeichenfolge einzugeben.
Mathew Kirschbaum

1
Die Firefox-Konsole ist zufrieden mit dem Ersatz von of(t=n+'')mit nur of t=n+''um 1 zu sparen.
DocMax

1

PHP: 85 Bytes (64 Bytes auf dem Körper)

Damit diese Funktion funktioniert, übergeben Sie einfach eine Zeichenfolge oder eine Zahl.

0 wird korrekt false zurückgeben.

Der Code:

function f($n,$i=0){for($n.='';$n[$i]&&$t=!($n%$n[$i++]););return$t&&$i==strlen($n);}

Bitte NICHT DEN 2. PARAMETER EINSTELLEN!

Javascript: 76 Bytes (61 Bytes auf dem Körper)

Dies ist eine Neufassung der vorherigen Funktion.

Zwischen beiden Versionen hat sich nicht viel geändert.

Hier ist der Code:

function f(n){for(i=0,n+='';n[i]/1&&(t=!(n%n[i++])););return t&&i==n.length}

Mehrsprachig: Javascript + PHP 187 217 Bytes (76 84 Bytes ohne Boilerplate):

Warum habe ich es geschafft?

Aus gutem Grund und vielleicht, weil ich kann!

Ignorieren Sie einfach den Fehler in PHP: es funktioniert trotzdem!
Dies wurde behoben, indem 3 Bytes entfernt wurden.

Hier ist das Meisterwerk:

if('\0'=="\0"){function strlen($s){return $s['length'];}}
function toString(){return'';}
function f($n){for($i=0,$n=$n.toString();$n[$i]/1&&($t=!($n%$n[$i++])););return $t&&$i==strlen($n);}

Sie können diesen Code sowohl auf Ihrer Konsole als auch auf einem PHP-Interpreter ausführen!


Alte Version:

if('\0'=="\0"){function strlen($s){return $s['length'];}}
function s($s){return('\0'=="\0")?$s+'':str_replace('','',$s);}
function f($n,$i){for($i=0,$n=s($n);$n[$i]/1&&($t=!($n%$n[$i++])););return $t&&$i==strlen($n);}

msgstr "und übergibt nur einen numerischen Parameter". Ohne dies können Sie ($ x)
auswerten

@ abc667 Entschuldigung, aber ich verstehe es nicht.
Ismael Miguel

1

Oktave, 33 (39 einschließlich Funktionssetup)

Verwenden der Umwandlung von Zahlen in Matrizen:

f=@(a)sum(mod(a./(num2str(a)-48),1))==0

Teilen Sie die Zahl elementweise durch die Matrix X, wobei X durch Konvertieren der Zahl in eine Zeichenfolge und Subtrahieren von 48 gebildet wird, um wieder von ASCII-Werten zu Zahlen zu gelangen. Nehmen Sie Modulo 1, um den Dezimalteil jeder Division zu erhalten, und vergewissern Sie sich, dass alle Null sind (falls NaN aufgrund von / 0 vorhanden ist, ist die Summe NaN und daher nicht Null).

Beispieleingabe über www.octave-online.net:

f=@(a)sum(mod(a./(num2str(a)-48),1))==0
for j=[128,12,120,122,13,32,22,42,212,213,162,204]
f(j)
end

Ausgabe:

ans =  1
ans =  1
ans = 0
ans =  1
ans = 0
ans = 0
ans =  1
ans = 0
ans =  1
ans = 0
ans =  1
ans = 0

Wie können wir das testen?
Ismael Miguel

octave-online.net - Geben Sie die Code-Definition von oben ein und dann (zum Beispiel) f (128). Fügt Ausgabe hinzu
Jørgen

Ich hatte den Compiler gefunden und probiert, bevor ich gefragt habe. Aber es scheint gut zu funktionieren (außer f(123), was durch 1, 2 und 3 teilbar ist). Aber es funktioniert für die bereitgestellten Testfälle.
Ismael Miguel

1

MATLAB - 39 Zeichen

function [b] = dividesSelf(i)
b=all(~mod(i,sscanf(num2str(i),'%1d')))
end

1

BASH - 117 Zeichen

f(){ [[ $1 =~ 0 ]]&& return 0 || r=;n=$1;for((i=0;i<${#n};i++));do r=$(($r+${n}%${n:$i:1}));done;return $(($r==0));}

Tests

for N in 128 12 120 122 13 32 22 42 212 213 162 204; do
  f $N
  echo "${N} ->  $?"
done

128 ->  1
12 ->  1
120 ->  0
122 ->  1
13 ->  0
32 ->  0
22 ->  1
42 ->  0
212 ->  1
213 ->  0
162 ->  1
204 ->  0

1

PHP - 74 71 64 Zeichen

Golf gespielt:

function t($n){while($n>1){if(!($b=$n%10)||($n%$b)){return 0;}$n/=10;}return 1;}

Weniger Golf:

function t($n){
    while($n>1){
        if( !($b=$n%10) || ($n%$b) )
            { return 0; }
        $n/=10;
    }
    return 1;
}

Testergebnisse:

(Code)

$ans = array(128,12,120,122,13,32,22,42,212,213,162,204);
foreach($ans as $a)
{ echo "$a -> ".(t($a)?"True":"False").PHP_EOL; }

(Ausgabe)

128 -> True
12 -> True
120 -> False
122 -> True
13 -> False
32 -> True
22 -> True
42 -> True
212 -> True
213 -> True
162 -> False
204 -> False
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.