Dank an Geobits in TNB für die Idee
Ein Post ohne ausreichende Details hat kürzlich ein interessantes Spiel aufgestellt:
2 Kinder sitzen vor einer Reihe von Süßigkeiten. Jedes Bonbonstück ist mit 1 bis 1 nummeriert x
, x
wobei die Gesamtmenge der vorhandenen Bonbons angegeben ist. Es gibt genau 1 Vorkommen von jeder Zahl.
Das Ziel des Spiels ist es, dass die Kinder Süßigkeiten essen und die Werte der Süßigkeiten, die sie gegessen haben, multiplizieren, um zu einer endgültigen Punktzahl zu gelangen, wobei die höhere Punktzahl gewinnt.
In der ursprünglichen Veröffentlichung fehlten jedoch wichtige Informationen wie die Auswahl der Süßigkeiten, sodass die Kinder in unserer Geschichte entschieden haben, dass das ältere Kind zuerst gehen und bis zur Hälfte der Süßigkeiten essen kann. er kann seine Meinung nicht ändern.
Eines der Kinder in diesem Spiel mag keine Süßigkeiten, deshalb möchte er so wenig wie möglich essen, und er hat einmal seinem Vater beim Schreiben von Code zugesehen. Er kann die daraus gewonnenen Fähigkeiten nutzen, um herauszufinden, wie viel Süßigkeiten vorhanden sind Er muss essen, um den Sieg zu sichern, während er immer noch so wenig wie möglich isst.
Die Herausforderung
Angesichts der Gesamtzahl der Süßigkeiten x
sollte Ihr Programm oder Ihre Funktion die kleinste Menge Süßigkeiten ausgeben, die er essen muss, um den Sieg zu sichern.n
, auch wenn sein Gegner alle verbleibenden Süßigkeiten isst.
Natürlich machen größere Zahlen größere Zahlen. Egal, wie viel du ihm gibst, er wird das essen n
größten Zahlen.
Die Regeln
x
wird immer eine positive ganze Zahl in dem Bereich sein,0 < x! <= l
in deml
die Obergrenze der Funktionen zur Verarbeitung von Zahlen in Ihrer Sprache liegt- Es ist garantiert, dass das Kind immer die
n
größten Mengen isst , zum Beispiel fürx = 5
undn = 2
, er wird essen4
und5
Testfälle
x = 1
n = 1
(1 > 0)
x = 2
n = 1
(2 > 1)
x = 4
n = 2
(3 * 4 == 12 > 1 * 2 == 2)
x = 5
n = 2
(4 * 5 == 20 > 1 * 2 * 3 == 6)
x = 100
n = 42
(product([59..100]) > product([1..58]))
x = 500
n = 220
(product([281..500]) > product([1..280]))
Wertung
Leider hat unser tapferer Kandidat nichts, womit er seinen Code schreiben kann, also muss er die Bonbonstücke in die Zeichen des Codes einordnen. Daher muss Ihr Code so klein wie möglich sein, der kleinste Code in Bytes gewinnt!
quelle
x = 0
auch gehandhabt werden0! = 1
? (x
Antworten:
Python 3 , 76 Bytes
Probieren Sie es online!
Verlässt sich auf die Tatsache, dass für das Essenn Süßigkeiten noch gewinnen und die Gesamtzahl der Süßigkeiten x , x !( x - n ) !> ( x - n ) ! muss wahr sein, wasxbedeutet! >((x-n)!)2x!>((x−n)!)2 .
-1 von Skidsdev
-3-6 von BMO-3 von Sparr
+6 zu beheben
x = 1
quelle
from math import factorial as F
n*(F(x)>F(x-n)**2)or f(x,n+1)
. Ähnliches giltx<2or x*F(x-1)
für die erste, die kürzer als der Import ist.import math;F=math.factorial
denen ich wahrscheinlich gehen sollte, um die Python-Tipps Meta zu erwähnen ...F=lambda x:x<2or x*F(x-1)
sind drei Bytes weniger?JavaScript (ES6), 53 Byte
Probieren Sie es online!
Arbeitsbereich
Interessanterweise sind die Unterschiede zwischen den Produkten der Kinder immer so groß, dass der mit der IEEE 754-Codierung verbundene Genauigkeitsverlust kein Problem darstellt.
Infolgedessen funktioniert es für0 ≤ n ≤ 170 . Darüber hinaus laufen sowohl die Mantisse als auch der Exponent über (was + Infinity ergibt ), und wir benötigen BigInts (+1 Byte).
Wie?
Seip das Süßigkeitenprodukt des anderen Kindes und sei q unser eigenes Süßigkeitenprodukt.
Wir beginnen mitp = n ! (alle Süßigkeiten für das andere Kind) und q= 1 (nichts für uns).
Wir wiederholen die folgenden Operationen bisq≥ p :
Das Ergebnis ist die Anzahl der erforderlichen Iterationen. (Bei jeder Iteration nehmen wir dem anderen Kind die nächsthöhere Süßigkeit.)
Kommentiert
Dies wird als einzelne rekursive Funktion implementiert, die zuerstn ! berechnet ! und betritt dann die oben beschriebene Schleife.
quelle
Gelee , 9 Bytes
Probieren Sie es online! Oder sehen Sie sich die Testsuite an .
Wie?
quelle
R ,
704138 Bytes-29 weil Dennis alle internen Funktionen kennt
-3 Umschalten auf die Eingabe scan ()
Probieren Sie es online!
Ziemlich einfache R-Implementierung der Python3- Antwort von nedla2004 .
Ich habe das Gefühl, dass es eine sauberere Implementierung des 1-Handlings gibt, und ich möchte die geschweiften Klammern verlieren.Ich bin wütend, dass ich nicht zurückgegangen bin, um welchen Ansatz es sich handelt, und noch wütender, dass ich nicht wusste, dass es eine
cumprod()
Funktion gibt. Tolle Optimierung von Dennis.quelle
APL (Dyalog Unicode) , 10 Bytes
Probieren Sie es online!
Port of Dennis 'Antwort . Danke an Dennis dafür.
Wie:
Da diese Antwort nicht von mir stammt, behalte ich meine ursprüngliche Antwort unten.
APL (Dyalog Unicode) ,
14 1211 BytesProbieren Sie es online!
Präfix implizite Funktion. Grundsätzlich eine Dyalog-Portierung von Jonathans Antwort .
Danke an ngn und H.PWiz für die Hilfe im Chat. Danke an ngn, dass du mir auch ein Byte gespart hast.
Vielen Dank an Dennis für den Hinweis, dass mein ursprünglicher Code falsch war. Es stellte sich heraus, dass mir 2 Bytes gespart wurden.
Verwendet
⎕IO←0
.Wie:
quelle
+/
innerhalb der Klammern steht, können die Kompositionen weggelassen werden:(+/!>×\)⌽∘⍳
Haskell ,
5251 BytesMit dem einfachen Ansatz: Wir prüfen, ob das Produkt der letztenn Zahlen, das ist x !( x - n ) ! ist weniger als das Produkt des ersten n Zahlen, nämlich ( x - n ) ! und nimmt am wenigsten n für die dies wahr ist.
Probieren Sie es online!
quelle
Gelee , 7 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Python 3 ,
183176149 BytesProbieren Sie es online!
Es ist viel schneller als einige andere Lösungen - 0 (N) Multiplikationen anstelle von O (N²) - aber ich kann es nicht schaffen, die Codegröße zu reduzieren.
-27 von Jo King
quelle
Sauber , 57 Bytes
Probieren Sie es online!
Eine einfache Lösung.
quelle
05AB1E ,
1511 BytesProbieren Sie es online!
Verwendet den gleichen Ansatz wie meine Python- Übermittlung. In 05AB1E sehr neu, daher sind alle Tipps zu Code oder Erklärungen sehr willkommen.
-4 Bytes dank Kevin Cruijssen
quelle
1
. Wenn die if-Anweisung wahr ist, wird der IndexN
auf den Stack verschoben und das Programm verlassen (wobei dieser Index implizit ausgegeben wird ). Bei der Eingabe ist1
die if-Anweisung falsch, gibt ihre Eingabe jedoch1
implizit nach dieser Einzeliterationsschleife aus .!
, da der Stapel jetzt leer ist, da wir das if-Ergebnis nicht mehr duplizieren / verdreifachen.1
die implizite Ausgabe der Eingabe im Testfall behoben wurde wenn der Stapel leer ist. :)Jelly , 14 Bytes
Probieren Sie es online!
Behandelt 1 richtig.
quelle
Holzkohle , 20 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Product
auf einer leeren Liste in Charcoal kehrtNone
eher als1
, also muss ich es logischOr
machen.quelle
PHP , 107 Bytes
Probieren Sie es online!
Verwendet das gleichex2> ( ( x - 1 ) ! )2 Methode, wie andere verwendet haben.
Verwendet die Fakultätsfunktion aus der PHP- Übermittlung für diese Herausforderung (danke an @ donutdan4114)
quelle
Wolfram Language (Mathematica) , 43 Byte
Probieren Sie es online!
quelle
05AB1E , 7 Bytes
Port of Dennis ♦ 'Jelly antworte , also stelle sicher, dass du ihn positiv bewertest, wenn dir diese Antwort gefällt!
Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Japt
-x
, 7 BytesPort von Dennis 'Jelly-Lösung.
Funktioniert in der Praxis nur bis zu
n=4
dem Punkt, an dem wir uns darüber mit wissenschaftlicher Notation befassen.Versuch es
quelle
C # (.NET Core) , 93 Byte
Probieren Sie es online!
Basierend auf der JavaScript-Antwort von @ Arnauld.
quelle
C (gcc) , 68 Bytes
Probieren Sie es online!
Edit: tausche Bytes gegen Mults, mache keine 2 * x Mults anstelle von x + n
Bearbeiten: Zurück zu int anstelle von long through macro. Würde bei 34 mit lang ausfallen.
Nun, ich habe dies in C. Scheitert am 21.
Es gibt eine mögliche Unklarheit, ob das gute Kind immer gewinnen oder nie verlieren will ... was denkst du?
quelle
Python 3 , 75 Bytes
Probieren Sie es online!
74-Byte-Version
aber diese Version lief für 500 über ...
quelle