Beschreibung
Chicken McNugget-Zahlen sind Zahlen, die als Summe von 6, 9 oder 20 ausgedrückt werden können - die Anfangsgrößen der berühmten Chicken McNuggets- Schachteln, die von McDonald's verkauft werden. In dieser Summe kann eine Zahl mehrmals vorkommen, so auch 6 + 6 = 12
eine solche Zahl, und die Zahl muss mindestens eine der genannten Größen "enthalten". Die ersten Chicken McNugget-Nummern sind:
6
9
6 + 6 = 12
6 + 9 = 15
9 + 9 = 6 + 6 + 6 = 18
20
6 + 6 + 9 = 21
...
Herausforderung
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die bei einer positiven ganzen Zahl bestimmt, ob diese Zahl auf die beschriebene Weise ausgedrückt werden kann, und daher eine solche Chicken-McNugget-Zahl ist. Es sollte dann basierend auf seiner Entscheidung einen wahren oder falschen Wert ausgeben.
Testfälle
6 -> true
7 -> false
12 -> true
15 -> true
21 -> true
40 -> true
42 -> true
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes und es gelten die Standardlücken!
quelle
Antworten:
Python, 27 Bytes
Probieren Sie es online!
quelle
~
weil Sie die Ausgänge tauschen können.8953174650303
genau die gleiche Länge mit0x82492cb6dbf
(wenn auch weniger lesbar).Python 3 , 24 Bytes
Probieren Sie es online!
Erläuterung
Mit
6
und9
allein kann man alle ganzen Zahlen teilbar machen, durch3
die größer ist als3
, wie in ovs 'Kommentar zur Herausforderung angegeben . Es wird davon ausgegangen, dass man auch machen kann0
. Abschließend kann man machen0,6,9,12,15,...
.Mit einer Instanz
20
kann man machen:20,26,29,32,35,...
.Mit zwei Instanzen
20
kann man machen:40,46,49,52,55,...
.Drei Instanzen sind nie notwendig, z
3 x 20 = 10 x 6
.Beachten Sie, dass die Fälle, in denen no
20
benötigt wird, auch durch 3 teilbar sind. die Fälle, in denen man20
gebraucht wird, lassen einen Rest von2
; In den Fällen, in denen zwei20
benötigt werden, verbleibt ein Rest von1
.Die Anzahl der
20
benötigten kann daher mit berechnet werden(-n)%3
. Dannn-(((-n)%3)*20)
entfernen wir die20
benötigte Anzahl aus der Anzahl. Wir prüfen dann, ob diese Zahl nicht negativ ist, aber nicht3
.quelle
f=lambda n:n%3<1<n-2or n>20and f(n-20)
funktioniert es?f=
jetzt entfernen, da es nicht rekursiv ist.Python 2 , 28 Bytes
Probieren Sie es online!
quelle
(n%3,n/20)
aus Ihrer Ausschlussliste sind{(2, 0), (1, 0), (1, 1)}
. Mit Hilfe-n%3
gab stattdessen eine Ungleichheitn/20>=(-n)%3
. Von da an habe ich eine Weile{3,23,43}
herumgespielt, um die 3 Mod 20 umzukehren, ohne 63,83 zu beeinflussen.Jelly , 11 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Haskell , 36 Bytes
Probieren Sie es online!
Erläuterung
Diese Lösung ist so einfach wie möglich. In der ersten Zeile wird angegeben, dass es sich bei einer Zahl unter 1 um eine McNugget-Zahl handelt, wenn
n==0
. Das heißt, das0
ist eine McNugget-Zahl und nicht alle negativen Zahlen.Die zweite Zeile gibt an, dass es sich bei allen anderen Nummern
n
um eine McNugget-Nummer handelt, wenn es sich bei einer der Nugget-Größen um eine McNugget-Nummer handelt.Dies ist eine ziemlich einfache rekursive Suche.
quelle
Python 3 ,
484642 BytesProbieren Sie es online!
Schalter
True
undFalse
.quelle
True
undFalse
standardmäßigJelly , 11 Bytes
Probieren Sie es online!
Port meiner Python-Antwort , aber leicht modifiziert: subtrahieren
20
bis teilbar durch3
, dann prüfen, ob es gehört,0,6,9,...
indem0
es der Eingabe zugeordnet wird (mithilfe vonor
), und dann prüfen, ob es größer ist als3
.Die einzigen drei Zahlen, die
0
nach Abschluss des ersten Schritts erzeugt werden0
,20
sind oder40
, wobei die erste außerhalb des Bereichs liegt und der Rest größer als ist3
.quelle
Mathematica, 53 Bytes
quelle
FrobeniusSolve
Funktion nutzen.Mathematica, 30 Bytes
Probieren Sie es auf Wolfram Sandbox.
quelle
Mathematica, 20 Bytes
Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt sie zurück
True
oderFalse
als Ausgabe. Logik kopiert von der Antwort von Leaky Nun , mit einigem zusätzlichen Missbrauch vonInequality
.quelle
x86-64-Maschinencode, 22 Byte
Die obigen Bytes definieren eine Funktion im 64-Bit-x86-Maschinencode, die bestimmt, ob der Eingabewert eine Chicken McNugget-Nummer ist. Der einzelne positive Ganzzahlparameter wird im
ECX
Register gemäß der unter Windows verwendeten 64-Bit-Aufrufkonvention von Microsoft übergeben. Das Ergebnis ist ein Boolescher Wert, der imEAX
Register zurückgegeben wird.Ungolfed Assembler-Mnemonik:
Offensichtlich spielt dies eine große Rolle für Anders Kaseorgs Lösung in Python , da es auf einem Bitfeld basiert, das die Werte darstellt, die Chicken McNugget-Zahlen sind. Insbesondere wird jedes Bit in diesem Feld, das einer gültigen Chicken McNugget-Nummer entspricht, auf 1 gesetzt. Alle anderen Bits werden auf 0 gesetzt. (Dies betrachtet 0 als eine gültige Chicken McNugget-Nummer. Wenn Ihnen das nicht gefällt, ist Ihre Präferenz eine Einzelbit-Modifikation entfernt.)
Wir beginnen damit, diesen Wert einfach in ein Register zu laden. Es ist ein 64-Bit-Wert, für dessen Codierung bereits 8 Byte erforderlich sind. Außerdem benötigen wir ein Ein-Byte-REX.W-Präfix, sodass wir tatsächlich einen erheblichen Verschwender-Aufwand in Bezug auf Bytes haben. Dies ist jedoch das Herzstück der Lösung Ich denke, es lohnt sich.
Dann verschieben wir das Feld um den Eingabewert nach rechts. * Schließlich maskieren wir alle außer dem niedrigsten Bit, und das wird unser boolesches Ergebnis.
Da Sie jedoch nicht mehr als die tatsächliche Anzahl von Bits im Wert verschieben können, funktioniert dies nur für Eingaben von 0 bis 63. Um eine höhere Eingabewerte zu unterstützen, legen wir einen Test an der Spitze der Funktion, die Zweige auf den Boden des Eingangswert> = 64. Das einzige , was interessant daran ist , die wir Vorspannung das Bit-Feld konstant
RAX
, und dann Zweig bis auf den Befehl, der das Bit niedrigster Ordnung maskiert, wodurch sichergestellt wird, dass immer 1 zurückgegeben wird.Probieren Sie es online!
(Der dortige C-Funktionsaufruf ist mit einem Attribut versehen, das bewirkt, dass GCC ihn gemäß der von meinem Assemblycode verwendeten Microsoft-Aufrufkonvention aufruft. Wenn TIO MSVC bereitgestellt hätte, wäre dies nicht erforderlich.)
__
* Als Alternative zu einer Verschiebung hätten wir den x86-
BT
Befehl verwenden können, aber das ist 1 Byte länger für die Codierung, also kein Vorteil. Es sei denn, wir mussten eine andere Aufrufkonvention verwenden, die den Eingabewert imECX
Register nicht bequem übergab . Dies wäre ein Problem, da sein Quelloperand für eine dynamische VerschiebungszählungSHR
erforderlich istCL
. Daher würde eine andere Aufrufkonvention erfordern, dass wirMOV
den Eingabewert von jedem Register, an das er übergeben wurde, editierenECX
, was uns 2 Bytes kosten würde. DerBT
Befehl kann ein beliebiges Register als Quelloperand verwenden, und das zu einem Preis von nur 1 Byte. In dieser Situation wäre es also vorzuziehen.BT
Setzt den Wert des entsprechenden Bits in das Übertragsflag (CF), so dass Sie einenSETC
Befehl verwenden würden, um diesen Wert in einem Ganzzahlregister abzurufen,AL
so dass er an den Aufrufer zurückgegeben werden könnte.Alternative Implementierung, 23 Bytes
Hier ist eine alternative Implementierung, die Modulo- und Multiplikationsoperationen verwendet, um zu bestimmen, ob der Eingabewert eine Chicken McNugget-Zahl ist.
Es verwendet die AMD64-Aufrufkonvention von System V , die den Eingabewert im
EDI
Register übergibt . Das Ergebnis ist immer noch ein Boolescher Wert, der in zurückgegeben wirdEAX
.Beachten Sie jedoch, dass dies im Gegensatz zum obigen Code ein inverser Boolescher Wert ist (zur Vereinfachung der Implementierung). Es wird zurückgegeben,
false
wenn der Eingabewert eine Chicken McNugget-Nummer ist odertrue
wenn der Eingabewert keine Chicken McNugget-Nummer ist.Das Hässliche daran ist, dass Eingabewerte> = 43 explizit von einem Vergleichs- und Verzweigungspunkt oben behandelt werden müssen. Es gibt natürlich auch andere Möglichkeiten, die keine Verzweigung erfordern, z. B. den Algorithmus von Caird Coinheringaahing. Die Codierung würde jedoch viel mehr Bytes in Anspruch nehmen. Dies ist also keine vernünftige Lösung. Ich vermisse wahrscheinlich einen Bit-Twiddling-Trick, der dazu führen würde, dass dies eleganter abläuft und weniger Bytes enthält als die obige bitfeldbasierte Lösung (da das Codieren des Bitfelds selbst so viele Bytes erfordert), aber ich habe dies untersucht eine Weile und kann es immer noch nicht sehen.
Na ja, versuchen Sie es online !
quelle
05AB1E,
1716 BytesProbieren Sie es online!
Erläuterung
quelle
…
für die Zeichenfolge (es gibt buitins für 1-, 2- und 3-Zeichen - Strings, wobei'
,„
und…
jeweils). Ich habe das Gefühl, man kann mehr Golf spielen, vielleicht mit einem anderen Ansatz, aber trotzdem ist dies eine schöne erste Antwort. +1 von mir.Åœ
:… ÇIÅœåPOĀ
. Es ist ein völlig anderer Ansatz. Wenn Sie also möchten, dass ich ihn als separate Antwort und nicht als Golf von Ihnen poste, lassen Sie es mich wissen. PS: Ich bin nicht 100% sicher, ob die nicht druckbaren Dateien in der 05AB1E-Codepage zulässig sind . In diesem Fall muss möglicherweise eine andere Codierung verwendet werden, wodurch einige Zeichen stattdessen als jeweils 2 Byte gezählt werden. In diesem FallŽBo21в
kann dies eine Alternative für +1 Byte sein.ŽGç₂в
anstelle der Zeichenfolge auch ein Byte speichern.JavaScript (ES6),
6964 ByteCode-Snippet anzeigen
false
Ansonsten Ausgaben für Chicken McNugget-Nummerntrue
.quelle
n=>~'ABCDEFHIKLNOQRTWXZ]`cfl'.search(String.fromCharCode(n+65))
für 63 BytesJava,
215724 BytesProbieren Sie es online!
Golf gespielt:
Ungolfed:
quelle
26 = 20 + 6
.Python 2 , 51 Bytes
-1 Byte dank @LeakyNun
Probieren Sie es online! Fußzeile druckt alle Nicht-McNugget-Nummern
quelle
n%3
kann nur 0 oder 1 oder 2 sein,n%3==2
ist also äquivalent zun%3>1
.Pyth , 15 Bytes
Probieren Sie es online!
Die Zeichenfolge enthält die Zeichen, die den Codepunkten 6, 9 und 20 entsprechen.
quelle
Haskell,
6456 BytesIch habe keine kleinen Tricks gemacht, aber bei den anderen Antworten könnte es tatsächlich kürzer sein, das
Bits
Modul zu importieren und diese Methoden zu verwenden. Dieser Ansatz prüft viel direkter.quelle
66
nicht64
. Aber Sie können eine Menge Klammern speichern und einenx/=0
Schutz setzen, um einige Bytes zu speichern, siehe hier .Javascript,
927872 Bytes* 14 Bytes gespart dank @Jonasw
Verwendet die Tatsache, dass "alle Ganzzahlen McNugget-Zahlen außer 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 sind , 37 und 43. von @ LeakyNuns Kommentar
quelle
APL (Dyalog) , 19 Bytes
mit
⎕IO←0
Gleicher Algorithmus mit Dennis 'Antwort
Probieren Sie es online!
quelle
Retina , 26 Bytes
Probieren Sie es online!
quelle
Add ++ , 35 Bytes
Probieren Sie es online!
Schau ma, keine while-Schleifen. Oder Streicher. Oder Listen. Oder wirklich alles, was hilft, Bytes zu sparen. Aber hauptsächlich, weil Add ++ nicht weiß, was eines davon ist.
3 Monate später stellte ich fest, dass dies ungültig war und korrigierte es. Irgendwie hat das 13 Bytes gekostet. Dies ist eine Funktion, die ein Argument verwendet und prüft, ob dieses Argument eine Chicken McNugget-Zahl ist oder nicht.
Wie es funktioniert
quelle
Excel, 87 Bytes
Alternativ 92 Bytes:
quelle
PHP, 69 + 1 Bytes
geht mit
1
für eine Chicken McNugget Nummer,0
sonst.Laufen Sie als Pipe mit
-n
oder versuchen Sie es online .quelle
Python 2 , 61 Bytes
Probieren Sie es online!
quelle
chr
.Mathematica, 59 Bytes
quelle
Javascript 37 Bytes
Nimmt eine positive Ganzzahl
n
und gibt sietrue
für Chicken McNugget-Zahlen undfalse
für andere aus.Erläuterung
Die Rekursion in dieser Funktion ist abscheulich und für jede ausreichend große Funktion
n
überschreiten Sie die Grenzwerte für die Aufrufliste. In der folgenden Version werden diese Beschränkungenn
umgangen, indem überprüft wird, ob sie größer sind als die größte Nicht-Chicken-McNugget-Zahl (43 Byte [Bonuspunkte für die größte Nicht-Chicken-McNugget-Zahl?]):Code-Snippet anzeigen
quelle
JavaScript ES5, 46 Byte
Explizite boolesche Antwort, 50 Bytes:
Unbeholfen, aber es erledigt den Job. Gibt
false
oder0
für jeden Wert zurück, der nicht 0, 1, 2, 3, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 22, 23, 25, 28, 31, 34 ist , 37, oder 43, undtrue
,-1
oder1
für alles andere.Explizite Lösung kehrt zurück
true
oderfalse
nur.quelle
Clojure 33 Bytes
Ein guter schneller Versuch:
#(-> %(rem 20)(rem 9)(rem 6)(= 0))
quelle
Pari / GP , 48 Bytes
0
ist falsch. alles andere ist wahr.Probieren Sie es online!
quelle
0.25
.