Ihre Herausforderung besteht darin, eine Funktion oder ein Programm zu erstellen, das "Ja" ausgibt, wenn eine bestimmte Zahl durch 13 teilbar ist, und "Nein" ausgibt, wenn dies nicht der Fall ist.
Regeln:
- Die Nummer 13 darf nirgendwo verwendet werden.
- Auch für 13 gibt es keine Cop-Out-Synonyme (wie bei 15 - 2).
- Bonuspunkte werden für das Nichtverwenden des Moduls vergeben, zusätzlicher Bonus für das Nichtverwenden der Division.
Scoring:
- Ihre Punktzahl wird die Anzahl der Bytes im Code sein (Leerzeichen nicht von Ihrem Bonus multipliziert enthalten).
- Wenn Sie das Modul nicht verwendet haben, beträgt der Bonus 0,90. Wenn Sie die Division nicht verwendet haben, beträgt der Bonus 0,90.
- Wenn Sie auch nicht verwendet haben, ist dieser Bonus 0,80.
- Je niedriger Ihre Punktzahl, desto besser.
Die Eingabe ist immer eine ganze Zahl größer als 0 und kleiner als 2 ^ 32.
Ihre Ausgabe sollte ein einfaches "Ja" oder "Nein" sein.
Erläuterungen:
- Die Verwendung einer Umgehungsmethode zum Generieren der Nummer 13 zur Verwendung ist akzeptabel. Einfache arithmetische Synonyme wie (10 + 3) sind nicht erlaubt.
- Die Funktion oder das Programm muss buchstäblich "Ja" oder "Nein" ausgeben, wenn die angegebene Zahl durch 13 teilbar ist.
- Wie immer werden clevere Lösungen empfohlen, die jedoch nicht erforderlich sind.
quelle
function f(n){return "yes"}
. Dies gibt "Ja" für alle Zahlen zurück, die durch 13 geteilt werden könnenUsing some roundabout method of generating the number 13 for use is acceptable.
Wie stellen Sie fest, was "Kreisverkehr genug" ist?Antworten:
Java (
60,859,2 Punkte )Punktzahl: (76 - 2 Leerzeichen) Zeichen * 0,8 = 59,2
quelle
println
->print
?ASM - 16-Bit-x86 auf der WinXP-Befehlsshell
ausführbar - 55 Bytes * 0,8 = 44
Quelle - 288 Zeichen * 0,8 = 230,4
Die Nummer 13 erscheint nicht einmal in der zusammengestellten .com-Datei.
Mit A86 zusammenbauen.
quelle
The input will always be an integer greater than 0 and less than 2^32
. Sie können 16bitPython 3.x: 54 * 0,8 = 43,2
Es mag ein Cop-Out sein, eine Zeichenkette mit der Länge 13 zu haben, aber hier ist es:
Es funktioniert, indem eine Zeichenfolge mit n Leerzeichen erstellt wird (die Auswahl des Begrenzungszeichens ist willkürlich, ich habe jedoch aus offensichtlichen Gründen Leerzeichen gewählt) und 13-Leerzeichen-Teilzeichenfolgen aufgeteilt werden, bis eine Zeichenfolge mit n% 13 Leerzeichen übrig bleibt.
quelle
print 'yneos'[any((' ' * input()).split(' '))::2]
' '
mit' '*6+' '
zu speichern 5 Zeichen - aber dann fand ich , dass die Räume überhaupt nicht zählen ...GolfScript, 32 Zeichen
Ich wollte etwas anderes als alle anderen ausprobieren, also berechnet meine Lösung die digitale Wurzel der Zahl zur Basis 14 , indem sie die Zahl wiederholt zur Basis 14 konvertiert und die Ziffern summiert, bis das Ergebnis nicht mehr kleiner wird. Dies entspricht im Wesentlichen der Berechnung des Restmoduls 13, mit der Ausnahme, dass das Ergebnis im Bereich von 1 bis 13 anstelle von 0 bis 12 liegt.
Da es schwierig wäre, zu überprüfen, ob die digitale Wurzel gleich 13 ist, ohne die Zahl 13 selbst zu verwenden (oder eine lahme Umgehung wie 12 + 1), erhöhe ich die eingegebene Zahl vor der Schleife um eins und dekrementiere das Ergebnis anschließend. Auf diese Weise ist das Ergebnis für Zahlen, die durch 13 teilbar sind, tatsächlich Null, was viel einfacher zu überprüfen ist.
Hier ist eine kommentierte Version des Programms:
Dieses Programm wird Griff tatsächlich jede nicht negativen Ganzzahleingaben, da GolfScript Bignum-Arithmetik verwendet. Natürlich können extrem große Eingaben zu viel Zeit und / oder Speicher beanspruchen.
Der Code verwendet weder Module noch Divisionen direkt, obwohl er den Basisumwandlungsoperator von GolfScipt verwendet, der mit ziemlicher Sicherheit intern Divisionen und Restbeträge vornimmt. Ich überlasse es GigaWatt, zu entscheiden, ob ich für den Bonus qualifiziert bin oder nicht.
quelle
C 68 × 0,8 = 54,4
Nach 24 Antworten hat sich noch niemand diesen offensichtlichen Algorithmus ausgedacht:
quelle
JavaScript (27.9)
Aktuelle Version (31 Zeichen * 0,90 Bonus = 27,9).
Demo: http://jsfiddle.net/9GQ9m/2/
Edit 1: Verzichten Sie auf den zweiten Bonus, indem Sie das Modul verwenden, um die Punktzahl erheblich zu senken und eine
for
Schleife zu vermeiden . Beseitigen~~
und speichern Sie auch zwei Zeichen (danke@copy
).Ältere Version (48 Zeichen * 0,80 Bonus = 38,4)
quelle
~~
angenommene gültige Eingabe weglassen . sonstprompt()<<1
wird auch funktionieren.BrainFuck
Ergebnis: 200 * 0,8 = 160
Liest von stdin. Wahrscheinlich nicht die cleverste Lösung, aber alles zu bekommen, was in BF funktioniert, ist schön. Es ist jedoch ziemlich kompakt.
quelle
Scala (38 * 0,9 = 34,2)
Ähnlich wie
0xD
(hex) oder015
(oct).ASCII- Wert von
CR
ist 13.quelle
Haskell, 28 × 0,8 = 22,4
quelle
Python:
Z.B
gibt
quelle
20
)f=lambda n:pow(8,n,79)-1 and "no" or "yes"
behebt es, 43 * 0,8 = 34,4C, 54,4 = = 68 ×
8×80 × 8quelle
\r
Gute Verwendung von - Ich dachte, es ist nur gut für die Windows-Unterstützung. Aber warumc>0
wannc
?>0
es nichts Gutes gibt. Aber anstatt zu bemerken, dass Ihre Funktion sie nicht unterstützt, fand ich==
das gut.ECMAScript 6, 25 × 0,9 = 22,5
Ja, es ist eine langweilige Art, 13 zu werden.
quelle
APL ((21-1) × 0,8 = 16)
⎕IO
sollte auf 0 gesetzt werden, damit dies in Dyalog APL ordnungsgemäß funktioniert. Um 13 zu generieren, nehmen wir den Boden (⌊
) des natürlichen Logarithmus (⍟
) von 9 hoch 6 (9*6
). Danach finden wir die GCD (∨
) unserer Eingaben (⎕
) und 13 und testen dann, ob diese gleich 1 sind. Dies wird verwendet, um ([...]
den Vektor der Antworten ).Wenn jemand pedantisch sein möchte, was die Erwähnung von Bytes in der Scoring-Spezifikation betrifft, lautet der Score für die UTF-8-codierte Version davon
(29 - 1) × 0.8 = 22.4
. :)quelle
C 88
Fibonacci-Trick.
quelle
Perl - 44 × 0,8 = 35,2
Den Shebang als ein Byte zählen.
Ich bin ein bisschen spät dran, aber ich dachte, ich würde den Algorithmus teilen, da ihn bis jetzt noch kein anderer Beitrag verwendet hat.
Dies funktioniert unter der Beobachtung, dass, wenn n durch 13 teilbar ist , ⌊ n / 10 ⌋ + n% 10 * 4 auch durch 13 teilbar ist . Die Werte 13 , 26 und 39 wechseln sich ab. Alle anderen Vielfachen von 13 erreichen schließlich einen dieser Werte in nicht mehr als log 10 n Iterationen.
In anderen Basen
Zugegeben,
chop
ist ein bisschen ein Cop-out. Bei einer Basis 10-Darstellung entspricht diesdivmod
. Der Algorithmus funktioniert aber auch in anderen Basen einwandfrei, zum Beispiel in Basis 4 oder 8.Python-artiger Pseudocode des obigen Algorithmus (Basis 10):
In Basis 2:
In Basis 4:
In Basis 8:
etc. Jede Basis kleiner als 13 funktioniert genauso gut.
quelle
Javascript: 59 * 0,8 = 47,2 (?)
Geige :
Einschließlich der Verbesserung von Mellamokb (57 * 0,8 = 45,6):
quelle
return n-c?'no':'yes'
zweiten Semikolon ändern und dieses weglassen.prompt
für die Eingabe undalert
Ausgabe, der das Programm interaktiv macht und einige Zeichen spart.Perl: (51-4 Stellen) * 0,9 = 42,3
quelle
Perl (19,8)
21 Bytes * .9
Hinweis: Mein erstes Perl-Programm überhaupt. Schwach getippt ist wohl gut fürs Golfen.
quelle
in C (K & R): 47 · 0,8 = 37,6
EDIT1: okay entfernte alle Abhängigkeiten von externen Funktionen, das oben genannte arbeitet, solange Sie diese Zeile auf die 13. Zeile der Datei setzen! :) Wenn
__LINE__
es in Ordnung ist, durch "Sagen" ersetzt zu werden,0xd
können weitere 5 Zeichen gespeichert werden (Punktzahl: 33,6).quelle
J - 22,4 = 28 · 0,8
Basierend auf der cleveren zyklischen Methode von mxmul .
Beispiele:
quelle
JavaScript (108 minus 0 für Leerzeichen) => 108, x 0,8 (kein Modul, keine Division) = 86,4
b=b=>{a=z,a=a+"";return+a.slice(0,-1)+4*+a.slice(-1)};z=prompt();for(i=99;i--;)z=b();alert(b()-z?"no":"yes")
Diese Methode verwendet den folgenden Algorithmus: 1. Nehmen Sie die letzte Ziffer, multiplizieren Sie sie mit vier und addieren Sie sie zum Rest der abgeschnittenen Zahl. 2. Wiederholen Sie Schritt 1 für 99 Iterationen ... 3. Testen Sie ihn noch einmal mit Schritt 1. Wenn die resultierende Zahl selbst ist, haben Sie ein Vielfaches von 13 gefunden.
Vorheriges Update entfernt
var
und Umkehrlogik bei der Warnung zum Entfernen weiterer Zeichen unter Verwendung einer subtraktionsfalschen Bedingung.Technisch gesehen ist das Endergebnis, dass Sie schließlich eine zweistellige Zahl wie 13, 26 oder 39 erreichen, die bei erneutem Durchlaufen von Schritt 1 13, 26 oder 39 ergibt. Das Testen auf die gleiche Iteration 100 bestätigt also die Teilbarkeit.
quelle
Cheddar, 20 Bytes (nicht konkurrierend)
Die Punktzahl beträgt 20 * 0,9 = 18
Eine klare Antwort.
quelle
Common Lisp (71 Bytes * 0,8) = 56,8
Eigentlich eine einfache Rekursion.
(defun w(x)(if(> x 14)(w(- x 13))(if(> 14 x 12)(print'yes)(print'no))))
Ungolfed:
quelle
Rubin (
5048 * 0,9 = 43,2)Intelligente Verwendung
eval
quelle
D 56 Zeichen, 80 Bonus = 44,8
Dies könnte ein Cop-Out mit 1/13 gewesen sein, und ein Double kann jede 32-Bit-Zahl genau speichern
edit: Dies funktioniert durch Multiplizieren mit 1/13 und Überprüfen des Bruchteils, wenn dieser von 0 abweicht (wobei Rundungsfehler berücksichtigt werden), oder mit anderen Worten, indem der Bruchteil von i / 13 überprüft wird
quelle
Python 2.7
(20 - 1 Leerzeichen) * 0,9 (keine Unterteilung) = 17,1
ja / nein statt wahr / falsch: 31 * 0,9 (keine Division) = 27,9
nutzt Python
int
, um andere Basen von Strings in Basis-10-Ganzzahlen umzuwandeln. Sie können in beiden Versionen sehen, dass sie eine unterschiedliche (aber gleiche Zeichenlänge) Basis verwendenBearbeiten: 1 Zeichen speichern in Ja / Nein-Version
edit2: noch 2 chars rasiert!
edit3: danke nochmal an kommentare! noch mehr Zeichen, die durch die Verwendung von Pythons eingebauten Oktaldarstellungen (
015
==13
...) anstelle der Basisübersetzung von int abgeschnitten wurdenquelle
print['no','yes'][input()%int('d',14)==0
14-1
oder definiert26/2
. Ich habe mir gerade die kreative Freiheit genommen, 13Perl, 95 · 0,8 = 76
Die Zeilenumbrüche wurden zur Verdeutlichung hinzugefügt. Ich hätte diese Antwort wahrscheinlich viel kürzer machen können, aber ich bin der Meinung, dass diese Antwort eine einzigartige Methode darstellt, um das Problem anzugehen.
quelle
Python - Punktzahl 27.9
(31 Zeichen * 0,90) - verzichtet auf einen Bonus für kürzeren Code.
ältere Version: (47 Zeichen * 0,80) - Vollständige Abzocke von Mellamokbs Javascript-Antwort, jedoch in Python.
ältere Version: (60 Zeichen * 0,80)
ältere Version: (105 Zeichen * 0,80)
quelle
(1,10,9,12,3,4)
würde 1 Zeichen speichern, aber nicht auf einen Wert unter 13 aufgelöst werden.In Q:
quelle
Rechte lineare Grammatik - ∞ Punkte
Abhängig davon, wie Sie es ausführen, wird "Ja" oder "Nein" ausgegeben.
Kein ernsthafter Eintrag, nur ein bisschen Spaß;)
BEARBEITEN: Vielleicht sollte ich ein bisschen erklären.
EIN Grammatik ist eine Reihe von Regeln (Produktionen), die eine Sprache definieren . Eine Sprache kann als alle möglichen Folgen eines Alphabets betrachtet werden, die den Regeln ihrer Grammatik entsprechen.
Hier ist das Alphabet die Menge aller Dezimalstellen. Nach den Regeln der Grammatik müssen alle Zeichenfolgen Dezimalzahlen bilden, die durch 13 teilbar sind.
Wir können die obige Grammatik verwenden, um zu testen, ob eine Zeichenfolge zu unserer Sprache gehört.
Die Regeln der Grammatik enthalten terminale Symbole (die Elemente in der Sprache sind) sowie nicht terminale Symbole, die rekursiv ersetzt werden.
An einem Beispiel lässt sich leichter erklären, was los ist:
Nehmen wir zum Beispiel an, dass die Zeichenfolge, die wir testen, 71955 ist.
Es gibt immer ein Startsymbol (das nicht endständig ist), in der obigen Grammatik ist dies 'S'. Zu diesem Zeitpunkt haben wir keine Zeichen aus unserer Zeichenfolge gelesen:
Nun lesen wir das erste Symbol in unserer Zeichenkette, das '7' ist, und suchen dann in der Grammatik nach einer Regel, die in unserem aktuellen Muster links neben dem '->' ein beliebiges Non-Terminal enthält hat unser Symbol auf der rechten Seite des "->". Zum Glück gibt es eine (S-> 7G), daher ersetzen wir die nicht-terminalen Symbole in unserem aktuellen Muster durch die rechte Seite der neuen Regel:
Jetzt haben wir das nicht-terminale 'G' in unserem Muster und das nächste zu lesende Symbol ist '1'. Deshalb suchen wir in unserer Grammatik nach einer Regel, die mit 'G-> 1 "beginnt. Wir finden, dass es eine gibt (G-> 1F), also ersetzen wir das Nicht-Terminal durch das RHS unserer neuen Regel:
Wiederholen Sie diesen Vorgang:
Nächste Regel: F-> 9D
Nächste Regel: D-> 5F
Nächste Regel: F-> 5S
Zu diesem Zeitpunkt haben wir keine Symbole mehr in unserer Zeichenfolge, aber wir haben ein anderes nicht-terminales Symbol darin. Wir sehen aus der ersten Regel in der Grammatik, dass wir 'S' durch die leere Zeichenkette (ε) ersetzen können: S-> ε
Auf diese Weise erhalten wir das aktuelle Muster: 71955ε, was 71955 entspricht.
Wir haben alle Symbole in unserer Zeichenfolge gelesen und das Muster enthält keine nicht-terminalen Symbole. Dies bedeutet, dass die Zeichenfolge zur Sprache gehört und daher 71955 tatsächlich durch 13 teilbar ist.
Dh das Ziel ist, pattern = string zu haben. Wenn Sie keine nicht-terminalen Symbole mehr haben, nachdem Sie alle Symbole in Ihrer Zeichenfolge gelesen haben, gehört die Zeichenfolge nicht zur Sprache. Wenn Ihre Zeichenfolge noch mehr zu lesende Symbole enthält, die Grammatik jedoch keine Regeln enthält, nach denen Sie fortfahren können, gehört die Zeichenfolge nicht zur Sprache.
quelle