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 int
und x=1
.). Viel Glück !
true
undfalse
oder sind die wahrheitsgemäßen / falschen Werte auch in Ordnung? 3. Dasjava
Tag trifft hier nicht wirklich zu, da die Herausforderung selbst nichts mit Java zu tun hat.0
Ziffern, 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).Antworten:
Perl 6, 13
Verwendet die implizite Variable
$_
-$_ %% .comb.all
entspricht$_ %% all($_.comb)
.%%
ist der Operator "ist teilbar" und gibtcomb
ohne zusätzliches Argument eine Liste der Zeichen in einer Zeichenfolge zurück. Wenn das Argument beispielsweise 123 lautet, wird die Funktion ausgewertetwelches ist
Junction-Autothreading macht es
welches ist
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
Bool
und die Junction vor Aufrufern zu verbergen, indem die Funktionssignatur erstellt wirdsub 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 nichtTrue
oderFalse
.quelle
Bool
fügen Sie einfachso
den Code voranso$_%%.comb.all
.C # und System.Linq - 26/40
Nach den Regeln, ohne die Methodendeklaration selbst zu zählen.
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):
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
: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.quelle
.0
? Es ist nichts anderes als ein ganzzahliger Modul erforderlich.i % 0
miti
einer ganzen Zahl gibt einDivideByZeroException
.48d
ist dasselbe wie48.0
, aber ein Zeichen weniger (d für double).&
, 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 (mitd
) machen, aber dann haben wir wieder einen Charakter verloren.APL (
(Anscheinend zählen die Klammern nicht)1311)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 sind0
Testfälle:
quelle
X%0
? ohne zu werfen?0|X
gibtX
.(0∧.=⍎¨∘⍕|⊢)
Python 2: 43 Zeichen
Überprüft, ob die Zahl Reste ungleich Null hat, und gibt die Negation davon aus. Nullstellen werden seltsam gehandhabt: Da die Berechnung
%0
einen Fehler verursacht, werden Ziffern durch0
ersetzt.3
, was aufgrund von Gleitkommaungenauigkeiten immer ein Ergebnis ungleich Null zu liefern scheint.Der Funktionskörper ist 32 Zeichen.
quelle
Perl - 27 Bytes
Die Funktionssignatur wird nicht wie angegeben gezählt.
Beispielnutzung:
Beispielausgabe:
Problembeschreibung: "Es zählen nur die booleschen wahren und falschen Werte. Wahrheits- / Falschheitswerte zählen nicht ."
Ausgänge:
'Richtig' und 'Falsch' werden als
1
und definiert""
.Erratum:
Wie Brad Gilbert zu Recht hervorhebt, definiert Perl true als Skalar, der sowohl die Ganzzahl
1
als auch die Zeichenfolge"1"
gleichzeitig ist, und false als Skalar, der sowohl die Ganzzahl0
als auch die Zeichenfolge""
gleichzeitig ist.quelle
$_
:pop=~s///ger<1
. Ich weiß nicht, ob das OP dem zustimmt1
und""
gültige Ergebnisse liefert. Wenn nicht, kann dies mit zwei weiteren Bytes behoben werden: einfach hinzufügen|0
.perl -pe'$_=s/./!$&||$_%$&/ger<1|0'
ist 26 Bytes einschließlich des Flags|0
und-p
. Sie müssen keine Funktion verwenden.dualvar(1,'1')
unddualvar(0,'')
.SVIV
(int),SVNV
(double) undSVPV
(string) gekennzeichnet sind.'abc'
wenn Sie diese Nummer zum ersten Mal verwenden (vorausgesetzt, Sie haben sieuse warnings;
aktiviert).CJam,
1110 BytesDies definiert eine benannte Funktion
F
und löscht den Block vom Stapel.Probieren Sie es online aus.
Testfälle
Wie es funktioniert
quelle
JavaScript ES6,
393228 BytesVielen Dank an core1024 für den Vorschlag zum Ersetzen
(""+v).split("")
durch[...""+v]
und openorclose für den Vorschlag zur Verwendung derevery
Funktion.Die Antwort enthält derzeit kein Bit meines Codes: O
Vorherige Lösung
==""
Dies ist keine gültige Methode, um zu überprüfen, ob ein Array leer ist, da[""]==""
zurückgegebentrue
wird. Das Array enthält jedoch garantiert nicht leere Zeichenfolgen, sodass es hier funktioniert.Der Rest ist eine Standard-Kurzschriftkonvertierung in JavaScript.
quelle
(""+v).split("")
mit[...""+v]
.every
Methode anwenden?v=>[...""+v].every(x=>v%x<1)
;v=>![...""+v].some(x=>v%x)
v%0
gibtNaN
und zurückNaN == false
. In Ihrem Fall können also Zahlen, die 0 enthalten, wie beispielsweise10
, zurückgegeben werdentrue
.Java 8, 46 Bytes (Methodentext)
Mit Jeroen Mosterts Umwandlung in einen Doppeltrick.
quelle
Pyth, 12 Bytes
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.
quelle
Ruby, 44 Bytes (Funktionskörper: 37)
Möglicherweise besteht das Potenzial, weiter Golf zu spielen.
Eingabe durch Funktion übernommen
f
. Anwendungsbeispiel:quelle
.to_i
zu.hex
, da mit einem einstelligen Zahlen gleich sind in der Basis 16 und kann sich ändern==0
zu<1
.Python -
59504947 BytesIch 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?
quelle
f=lambda n:all([c>'0'and 0==n%int(c)for c in`n`])
. Und kein Problem :)all
Verfahren.1>n%int(c)
funktionierenall(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.Pyth 11
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:
Probieren Sie es online aus.
quelle
Bash + Coreutils, 44 Bytes
Die vollständige Funktionsdefinition lautet:
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:
quelle
true
/false
?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=,.&.":|])
.,.&.":
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.quelle
Java -
121102977978 BytesIch weiß nur, dass dies später überfüllt sein wird. Naja.
Ich werde wiederkommen.
quelle
Haskell -
1005438Noch lernen, Kritik geschätzt
quelle
length
s fallen, sie sind unnötig. 2) Ersetzen Siet
durch seine Definition. 3)elem y s
ist unnötig. 4)/='0'
kann anstelle von zum linken Filter verschoben werdenelem y s
. 5)/='0'
Entspricht in diesem Fall,>'0'
da jeder Buchstabe eine Ziffer ist. 6) Setzen Siemod
Backticks ein, damit es infix wird. 7) Setzen Sie alles in eine einzelne Zeile.s==filter(...)s
solltest du verwendenall(...)s
. Jetzt, das
der Ausdruck nur einmal vorkommt, können Sie ihn durch seine Definition ersetzen und löschenwhere
. auch, anstatt==0
du könntest verwenden<1
.all(\y->...)$show x
durchand[...|y<-show x]
.CJam, 15 Bytes
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:
Oder wenn Sie eine Reihe von Eingaben testen möchten, können Sie dies tun
Der Block hinterlässt
0
(falsch) oder1
(wahr) auf dem Stapel, um das Ergebnis anzuzeigen. (CJam hat keinen Booleschen Typ.)Teste es hier.
Erläuterung:
Alternativ auch 15 Bytes
Erläuterung
quelle
CJam, 15 Bytes
{}
ist einer Funktion in CJam am nächsten. Ich zähle nur den Körper der FunktionBenutze es so:
Um entweder
1
(wenn die Zahl teilbar ist) oder0
(wenn die Zahl nicht durch ihre Ziffern teilbar ist).Probieren Sie es hier online aus
Erläuterung
quelle
Ab
die 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?128{ed_edAedbedf{ed_ed{ed%ed}1ed?ed}ed1edbed!ed}~
%
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)C89, 43 Bytes
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
quelle
C11 - 44 Bytes im Funktionskörper
Eine andere C-Version, nicht rekursiv und ohne Gleitkomma-Ausnahme.
Dies funktioniert auch in C ++, Java und den meisten anderen C-ähnlichen Sprachen.
Bearbeitet, um die Verbesserung von primos Kommentar einzuschließen.
quelle
int n=i;for(;i%10>0&&n%(i%10)<1;i/=10);return i<1;
Ein Byte kürzer als der OP-Code.Julia
322523Verbessert mit Ziffern
Behebt auch das Problem mit negativen Zahlen
Alte Methode
Alle Ziffern teilen sich, wenn die Summe aller Reste 0 ist. Hat wie andere ein Problem mit negativen Zahlen.
Ausgabe
Verbesserte Methode behandelt auch BigInt
jedoch
da
quelle
C / C ++, 58 Byte (44 im Hauptteil)
Ruft undefiniertes Verhalten auf (siehe Kommentare)
true
undfalse
sind 1 und 0, aber Sie können der Signatur ein Zeichen hinzufügen, um a zurückzugebenbool
.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)
quelle
R:
726765Die Funktion
Vielen Dank an @AlexA und @plannapus für die Einsparungen
Testlauf
quelle
d=as.double(strsplit(toString(a),"")[[1]]);!(anyNA(a%%d)|sum(a%%d))
. :)paste(a)
statttoString(a)
gibt das gleiche Ergebnis.GNU Awk: 53 Zeichen
Der gezählte Teil:
Die gesamte Funktion:
Da Awk keine booleschen Werte hat, wird 1 für true und 0 für false zurückgegeben.
quelle
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
Nur zum Spaß, Missbrauch der Regel, dass die Funktionssignatur nicht gezählt wird, 4
Test In FireFox / Firebug - Konsole
Ausgabe
quelle
of(t=n+'')
mit nurof t=n+''
um 1 zu sparen.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:
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:
Mehrsprachig: Javascript + PHP 187
217Bytes (7684 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:
Sie können diesen Code sowohl auf Ihrer Konsole als auch auf einem PHP-Interpreter ausführen!
Alte Version:
quelle
Oktave, 33 (39 einschließlich Funktionssetup)
Verwenden der Umwandlung von Zahlen in Matrizen:
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:
Ausgabe:
quelle
f(123)
, was durch 1, 2 und 3 teilbar ist). Aber es funktioniert für die bereitgestellten Testfälle.MATLAB - 39 Zeichen
quelle
BASH - 117 Zeichen
Tests
quelle
PHP -
747164 ZeichenGolf gespielt:
Weniger Golf:
Testergebnisse:
(Code)
(Ausgabe)
quelle