W matematyce czynnikowy, skrócony „fakt” nieujemnej liczby całkowitej n , oznaczony przez n! , jest iloczynem wszystkich liczb całkowitych dodatnich mniejszych lub równych n . Na przykład 5! jest 1 * 2 * 3 * 4 * 5 = 120
Silnia 0 wynosi 1 , zgodnie z konwencją dla pustego produktu.
To są zwykłe fakty, do których jesteśmy przyzwyczajeni. Dodajmy kilka alternatyw:
- Silnia (zdefiniowana powyżej)
- Podwójna silnia: n !! = 1 + 2 + ... + n
- Potrójne silnia: n !!! = 1 - (2 - (3 - (... - n))) ...)
- Czterokrotna silnia: n !!!! = 1 / (2 / (3 ... / n))) ...) . Uwaga: Jest to podział zmiennoprzecinkowy, a nie podział całkowity.
Wyzwanie
Weź nieujemną liczbę całkowitą wejściową n , bezpośrednio po niej od 1 do 4 wykrzykników. Dane wejściowe będą wyglądały (dokładnie) w ten sposób: 0! , 5 !! , 132 !!! lub 4 !!!! . Niestety, w tym wyzwaniu nie możesz założyć elastycznego formatu wejściowego.
Wynik
Wynik powinien być wynikiem w dowolnym dogodnym formacie. Wynik poczwórnej silni musi mieć co najmniej 2 cyfry po przecinku, z wyjątkiem 0 !!!! = 0 .
Przypadki testowe:
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
---
0!! = 0
1!! = 1
2!! = 3
3!! = 6
4!! = 10
5!! = 15
6!! = 21
7!! = 28
8!! = 36
9!! = 45
10!! = 55
---
0!!! = 0
1!!! = 1
2!!! = -1
3!!! = 2
4!!! = -2
5!!! = 3
6!!! = -3
7!!! = 4
8!!! = -4
9!!! = 5
10!!! = -5
---
0!!!! = 0
1!!!! = 1
2!!!! = 0.5
3!!!! = 1.5
4!!!! = 0.375
5!!!! = 1.875
6!!!! = 0.3125
7!!!! = 2.1875
8!!!! = 0.27344
9!!!! = 2.4609
10!!!! = 0.24609
Najkrótsze rozwiązanie w każdym języku wygrywa.
0!
->1
.Odpowiedzi:
JavaScript (ES6), 88 bajtów
Przypadki testowe
Pokaż fragment kodu
Sformatowane i skomentowane
źródło
Łuska , 15 bajtów
Wypróbuj online!
Wyjaśnienie
Indeksowanie do listy funkcji: radości z używania funkcjonalnego języka.
Używam zakresu malejącego i lewych pasów, ponieważ
-
i/
biorę ich argumenty w odwrotnej kolejności w Husk.źródło
Indexing into a list of functions
jest woah ...C # (.NET Core) ,
134 130128 bajtówWypróbuj online!
Najlepszą częścią gry w golfa kodowego są rzeczy, których uczysz się podczas rozwiązywania problemów. W tym nauczyłem się, że w C # możesz przycinać inne znaki oprócz białych znaków z ciągów.
s.Split('!').Length
, po prostu napraw ograniczenia we>4?i/r:e>3?i-r:e>2?i+r:i*r
in<1&e<3?1:r
.źródło
e
n
ai
takżedouble
uniknąć deklarowania, aby r zapisał 4 bajty.float
aby zapisać kolejny bajt.Perl 5 , 62 bajty
Kod 61 bajtów + 1 dla
-p
.Dzięki @GB za zwrócenie uwagi na moją stronę!
Wypróbuj online! (wykorzystuje to
-l
dla czytelności)źródło
R ,
113111 bajtówWypróbuj kilka przypadków testowych!
bez golfa:
źródło
el(strsplit(s,"!"))
zapisuje 1 bajtPython3,
124130121119 bytesAt this point, I believe that recursion is the key to further byte saving.
Try the testcases on Try it online!
-9 bytes thanks to @Mr.Xcoder!
-2 bytes thanks to @Felipe Nardi Batista!
źródło
Pyth,
3430 bytesTry it online!
Explanation
źródło
.U
saves a byte.05AB1E, 27 bytes
Try it online!
źródło
„.»
doesn't work?»
is part of an unfinished compressed string, so it errors out and, as usually in 05AB1E, the error is ignored."*+-/"èU
then after usingL
follow up with.»X
but it treatsX
as a string, not a command and.»X.V
is even wonkier.X
doesn't eval.X.V
are two commands.Ruby,
83 8079 bytesTry it online!
Explanation:
źródło
Java 8,
141136134 bytes-5 bytes (141 → 136) thanks to @CarlosAlejo's C# answer.
Explanation:
Try it here.
źródło
float
is shorter thandouble
.float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)
to the current answer saved me 5 bytes. :) Forgot to add a "bytes saved thanks to" part I noticed now.. Sorry about that.Jelly,
24 23 2625 bytes+
32 bytes patching up to fix after misinterpretation :(A full program (a monadic link with helper links referenced by program location)
Try it online! or see a test suite.
How?
źródło
0!
./
on an empty list. D: EDIT: Apparently valid for0!
,0!!
,0!!!
and0!!!!
. +1Self-modifying x86_64 machine code, 123 bytes
Why would interpreted languages be able to dynamically run code with fancy
eval
s, but not plain machine code?Try it with:
Assembly:
Explanations will be added later. The basic idea is to modify the
divss xmm0, xmm1
instruction at0x100000db0
and replace it with amulss
,addss
,subss
ordivss
according to supplied operand. A small trick is also used to parse the input string.Assembly generated with:
źródło
Haskell,
105 102 9896 bytesSaved 9 bytes thanks to Zgarb and nimi.
Try it online.
źródło
read n
, andf=
is unnecessary as per our rules.lex
saves two bytes:f s|[(n,b)]<-lex s=read n!(length b-1)
.lex
. That's awesome! :) I don't see how that saves bytes though - I get 99 bytes after this.Gaia,
2625 bytesTry it online!
Explanation
źródło
Jelly, 28 bytes
Try it online!
Got the idea of separating the links into lines from Jonathan Allan's answer for -2 bytes.
źródło
APL (Dyalog), 30 bytes
Inspired by lstefano's solution.
Try it online!
{
…}
anonymous function where the argument is represented by⍵
:0::
if any error happens:0
return zero⋄
now try:⍵∩⎕D
the intersection of the argument and the set of Digits (removes exclamation points)⍎
execute that (turns it into a number)⍳
ɩndices of that(
…)/
insert (APL is right associative, as needed) the following function between terms:⍵~⎕D
argument without Digits (leaves exclamation points)≢
tally that (i.e. how many exclamation points)'×+-⌹'⊃⍨
use that to pick from the list of symbols*⍎
execute (turns the symbol into a function)⌹
(matrix division) is used instead of÷
(normal division) to cause an error on an empty listźródło
::
do in a dfn?::
happens, then the value to the right of the::
is immediately returned.Perl 5, 96 bytes
Try it online!
źródło
Dyalog APL, at least 29 chars
The expression is ALMOST correct. It passes all the test cases EXCEPT
0!!!!
for which it gives1
instead of the required0
and that's because in APL the reduction of an empty vector is supposed to return the neutral element for the function used to reduce. For the quotient that's 1. At the moment I don't have time to try and fix it but I'll leave it here for a rainy day.źródło
{0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D}
Try it online!05AB1E,
2524 bytesTry it online!
źródło
Mathematica, 152 bytes
źródło
Javascript,
111163 bytesReadable Version
źródło