Podziękowania dla Geobitów w TNB za pomysł
Postu bez dostatecznej szczegółowości niedawno zakładał ciekawą grę:
2 dzieci siedzą przed tablicą cukierków. Każdy kawałek cukierka jest ponumerowany od 1 do x
, przy x
czym całkowita ilość cukierków jest obecna. Występuje dokładnie 1 wystąpienie każdej liczby.
Celem gry jest zjedzenie przez dzieci słodyczy i pomnożenie wartości zjedzonych przez nich cukierków, aby osiągnąć końcowy wynik, przy czym wygrywa wyższy wynik.
Jednak w oryginalnym poście brakowało kluczowych informacji, takich jak sposób wybierania cukierków, więc dzieci w naszej historii zdecydowały, że starsze dziecko pójdzie pierwsze i będzie mogło zjeść do połowy słodyczy, jednak gdy ogłosi koniec swojej tury, nie może zmienić zdania.
Jedno z dzieciaków w tej grze nie lubi słodyczy, więc chce jeść tak mało, jak to możliwe, i raz widział, jak tata pisze kod, i uważa, że może wykorzystać nabyte umiejętności, aby obliczyć, ile słodyczy musi jeść, aby zapewnić sobie zwycięstwo, a jednocześnie jeść jak najmniej.
Wyzwanie
Biorąc pod uwagę całkowitą liczbę cukierków x
, twój program lub funkcja powinna wydać najmniejszą ilość cukierków, jaką musi zjeść, aby zapewnić zwycięstwo n
, nawet jeśli jego przeciwnik zje wszystkie pozostałe cukierki.
Naturalnie większe liczby tworzą większe liczby, więc bez względu na to, ile mu dasz, zje n
najwięcej.
Zasady
x
zawsze będzie dodatnią liczbą całkowitą w zakresie, w0 < x! <= l
któryml
znajduje się górna granica możliwości obsługi liczb w Twoim języku- Gwarantujemy, że dziecko będzie zawsze jeść
n
najwięcej, na przykład dlax = 5
in = 2
będzie jeść4
i5
Przypadki testowe
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]))
Punktacja
Niestety, nasz dzielny zawodnik nie ma nic do pisania kodu, więc musi ułożyć kawałki cukierków w znaki kodu, w wyniku czego twój kod musi być tak mały, jak to możliwe, najmniejszy kod w bajtach wygrywa!
źródło
x = 0
również traktować, ponieważ0! = 1
? (Być możex
powinien być również określony jako dodatnia liczba całkowita?)Odpowiedzi:
Python 3 , 76 bajtów
Wypróbuj online!
Opiera się na tym, że za zjedzenien cukierków, aby wygrać, a całkowita liczba cukierków wynosi x , x!(x−n)!>(x−n)! musi być prawdą, co oznaczax!>((x−n)!)2 .
-1 od Skidsdev
-3-6 z BMO-3 od Sparr
+6 do naprawienia
x = 1
źródło
from math import factorial as F
n*(F(x)>F(x-n)**2)or f(x,n+1)
. Podobniex<2or x*F(x-1)
w przypadku pierwszego, który jest krótszy niż import.import math;F=math.factorial
którymi prawdopodobnie powinienem pójść, znaleźć meta ze wskazówkami w Pythonie, aby wspomnieć ...F=lambda x:x<2or x*F(x-1)
czy trzy bajty są mniejsze?JavaScript (ES6), 53 bajty
Wypróbuj online!
Zakres pracy
Co ciekawe, różnice między produktami dla dzieci są zawsze na tyle duże, że utrata precyzji związana z kodowaniem IEEE 754 nie stanowi problemu.
W rezultacie działa dla0≤n≤170 . Poza tym zarówno mantysa, jak i przepełnienie wykładnika (wydajność + Nieskończoność ) i potrzebowalibyśmy BigInts (+1 bajt).
W jaki sposób?
Niechp będzie produktem cukierkowym drugiego dziecka i niech q będzie naszym własnym produktem cukierkowym.
Zaczynamy odp=n! (wszystkie cukierki dla drugiego dziecka) i q=1 (nic dla nas).
Powtarzamy następujące operacje, ażq≥p :
Wynikiem jest liczba wymaganych iteracji. (Przy każdej iteracji „bierzemy następny najwyższy cukierek od drugiego dziecka”).
Skomentował
Jest to zaimplementowane jako pojedyncza funkcja rekurencyjna, która najpierw obliczan! a następnie wchodzi w pętlę opisaną powyżej.
źródło
Galaretka , 9 bajtów
Wypróbuj online! Lub zobacz pakiet testowy .
W jaki sposób?
źródło
R ,
704138 bajtów-29, ponieważ Dennis zna wszystkie funkcje wewnętrzne
-3 przejście do wejścia scan ()
Wypróbuj online!
Dość prosta implementacja R odpowiedzi Python3 na nedla2004 .
Wydaje mi się, że jest czystsza implementacja obsługi 1 i chciałbym stracić nawiasy klamrowe.Jestem wściekły, że nie wróciłem do tego, które podejście, bardziej wściekłe, że zastosowałem mniej niż, ale jeszcze bardziej wściekłe, że nie wiedziałem, że jest jakaś
cumprod()
funkcja. Świetna optymalizacja Dennisa.źródło
APL (Dyalog Unicode) , 10 bajtów
Wypróbuj online!
Odpowiedź Portu Dennisa . Dzięki, cóż, Dennisowi za to.
W jaki sposób:
Ponieważ ta odpowiedź nie była przeze mnie ściśle udzielona, poniżej zachowam oryginalną odpowiedź.
APL (Dyalog Unicode) ,
14 1211 bajtówWypróbuj online!
Funkcja ukrywania przedrostka. Zasadniczo port Dyalog odpowiedzi Jonathana .
Dzięki ngn i H.PWiz za pomoc na czacie. Dzięki ngn również za uratowanie mi bajtu.
Dzięki Dennisowi za wskazanie, że mój oryginalny kod był nieprawidłowy. Okazuje się, że zaoszczędził mi 2 bajty.
Zastosowania
⎕IO←0
.W jaki sposób:
źródło
+/
się w nawiasach, kompozycje można pominąć:(+/!>×\)⌽∘⍳
Haskell ,
5251 bajtówStosując proste podejście: Sprawdzamy, czy produkt ostatniegon liczby, czyli x !( x - n ) ! jest mniejszy niż iloczyn pierwszego n liczby, a mianowicie ( x - n ) ! i bierze najmniej n dla których to prawda.
Wypróbuj online!
źródło
Galaretka , 7 bajtów
Wypróbuj online!
Jak to działa
źródło
Python 3,
183176149 bytesTry it online!
It's is a lot faster than some other solutions - 0(N) multiplications instead of O(N²) - but I can't manage to reduce code size.
-27 from Jo King
źródło
Clean, 57 bytes
Try it online!
A straight-forward solution.
źródło
05AB1E,
1511 bytesTry it online!
Uses the same approach as my Python submission. Very new to 05AB1E so any tips on code or explaination greatly appreciated.
-4 bytes thanks to Kevin Cruijssen
źródło
1
. If the if-statement is truthy, it will push indexN
to the stack and exit the program (outputting that index implicitly). For input1
the if-statement will be falsey, but it will output its input1
implicitly after that single-iteration loop.!
, now that the stack is empty since we no longer duplicate/triplicate the if-result.1
outputting the input implicitly when the stack is empty. :)Jelly, 14 bytes
Try it online!
Handles 1 correctly.
źródło
Charcoal, 20 bytes
Try it online! Link is to verbose version of code. Explanation:
Product
on an empty list in Charcoal returnsNone
rather than1
, so I have to logicallyOr
it.źródło
PHP, 107 bytes
Try it online!
Uses the samex2>((x−1)!)2 method as others have used.
Uses the factorial function from the PHP submission for this challenge (thanks to @donutdan4114)
źródło
Wolfram Language (Mathematica), 43 bytes
Try it online!
źródło
05AB1E, 7 bytes
Port of Dennis♦' Jelly answer, so make sure to upvote him if you like this answer!
Try it online or verify all test cases.
Explanation:
źródło
Japt
-x
, 7 bytesPort of Dennis' Jelly solution.
Only works in practice up to
n=4
as we get into scientific notation above that.Try it
źródło
C# (.NET Core), 93 bytes
Try it online!
Based off of @Arnauld's javascript answer.
źródło
C (gcc), 68 bytes
Try it online!
Edit: trading bytes against mults, no doing 2*x mults instead of x+n
Edit: moving back to int instead of long through macro. Would fail at 34 with long.
Well I have this in C. Fails at 21.
There is a possible ambiguity as to whether the good kid wants to always win or never lose... what do you think?
źródło
Python 3, 75 bytes
Try it online!
74 bytes version
but this version overflowed for 500...
źródło