Faits supplémentaires!

17

En mathématiques, le "fait" factoriel raccourci d'un entier non négatif n , noté n! , est le produit de tous les entiers positifs inférieurs ou égaux à n . Par exemple, 5! est 1 * 2 * 3 * 4 * 5 = 120

La factorielle de 0 est 1 , selon la convention pour un produit vide.


Ce sont les faits habituels auxquels nous sommes habitués. Ajoutons quelques alternatives:

  1. Le factoriel (défini ci-dessus)
  2. La double factorielle: n !! = 1 + 2 + ... + n
  3. La triple factorielle: n !!! = 1 - (2 - (3 - (... - n))) ...)
  4. Le quadruple factoriel: n !!!! = 1 / (2 / (3 ... / n))) ...) . Remarque: Il s'agit d'une division en virgule flottante, pas d'une division entière.

Défi

Prendre une entrée de nombre entier non négatif n , suivie directement par entre 1 et 4 exclamation marques. L'entrée ressemblera (exactement) à ceci: 0! , 5 !! , 132 !!! ou 4 !!!! . Dans ce défi, vous ne pouvez pas assumer un format d'entrée flexible, désolé.

Production

La sortie doit être le résultat, sur n'importe quel format pratique. Le résultat de la quadruple factorielle doit avoir au moins 2 chiffres après la virgule, sauf 0 !!!! = 0 .

Cas de test:

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

La solution la plus courte dans chaque langue l'emporte.

Stewie Griffin
la source
2
La factorielle quadruple peut-elle aussi être une division rationnelle?
Martin Ender
6
La définition de "la double factorielle" est un ajustement ...
Erik the Outgolfer
4
@Erik, c'est un double fait alternatif ;-)
Stewie Griffin
1
@StewieGriffin BTW c'est un peu sournois que 0!-> 1.
Erik the Outgolfer
5
Le titre devrait être Alternative Facts
Digital Trauma

Réponses:

7

JavaScript (ES6), 88 octets

s=>eval(([a,b]=s.split(/\b/),g=k=>+a?k-a?k+'_*+-/'[b.length]+`(${g(k+1)})`:k:+!b[1])(1))

Cas de test

Formaté et commenté

s =>                                // given the input string s,
  eval(                             // evaluate as JS code:
    ( [a, b] = s.split(/\b/),       //   a = integer (as string) / b = '!' string
      g = k =>                      //   g = recursive function taking k as input
        +a ?                        //     if a is not zero:
          k - a ?                   //       if k is not equal to a:
            k + '_*+-/'[b.length] + //         append k and the operation symbol
            `(${g(k + 1)})`         //         append the result of a recursive call
          :                         //       else:
            k                       //         just append k and stop recursion
        :                           //     else:
          +!b[1]                    //       return 1 for multiplication / 0 otherwise
    )(1)                            //   initial call to g() with k = 1
  )                                 // end of eval()
Arnauld
la source
7

Husk , 15 octets

§!ëΠΣF-F/#'!oṫi

Essayez-le en ligne!

Explication

Indexation dans une liste de fonctions: les joies de l'utilisation d'un langage fonctionnel.

§!ëΠΣF-F/#'!oṫi  Implicit input, say x = "6!!!"
              i  Convert to integer (parses the leading sequence of digits): 6
            oṫ   Descending range to 1: y = [6,5,4,3,2,1]
  ë              Four-element list containing the functions
   Π             product,
    Σ            sum,
     F-          left fold with subtraction (gives 0 for empty list), and
       F/        left fold with division (gives 0 for empty list).
 !               1-based index into this list with
         #'!     count of !-characters in input: gives F-
§                Apply to y and print implicitly: -3

J'utilise une gamme décroissante et des plis gauches, depuis -et je /prends leurs arguments dans l'ordre inverse dans Husk.

Zgarb
la source
Indexing into a list of functionsest woah ...
Erik the Outgolfer
Je pensais à Haskell, puis je vois ça ... Semble vraiment être le bon outil pour le travail. +1
allègue
Voici
Leo
6

C # (.NET Core) , 134 130 128 octets

s=>{double e=s.Split('!').Length,n=int.Parse(s.Trim('!')),i=n,r=n;for(;--i>0;)r=e>4?i/r:e>3?i-r:e>2?i+r:i*r;return n<1&e<3?1:r;}

Essayez-le en ligne!

La meilleure partie du golf de code sont les choses que vous apprenez en essayant de résoudre les défis. Dans celui-ci, j'ai appris qu'en C #, vous pouvez couper d'autres caractères en plus des espaces blancs des chaînes.

  • 4 octets économisés grâce à LiefdeWen!
  • 2 octets enregistrés car je n'ai pas besoin de soustraire 1 à s.Split('!').Length, il suffit de fixer les limites dans e>4?i/r:e>3?i-r:e>2?i+r:i*ret n<1&e<3?1:r.
Charlie
la source
1
Vous pouvez faire e net iaussi doubleéviter de le déclarer pour r pour économiser 4 octets.
LiefdeWen
1
@LiefdeWen Ou floatpour enregistrer un autre octet.
Kevin Cruijssen
4

Perl 5 , 62 octets

Code de 61 octets + 1 pour -p.

$_=/^0!$/+eval join(qw{| *( +( -( /(}[s/!//g],1..$_).")"x--$_

Merci à @GB d' avoir signalé une faute de ma part!

Essayez-le en ligne! (ceci utilise -lpour la lisibilité)

Dom Hastings
la source
4
0! devrait être 1 pas 0
GB
@GB Eh bien, cela n'a aucun sens ... Fixé pour +5!
Dom Hastings
4

R , 113 111 octets

function(s){z=strtoi((n=strsplit(s,'!')[[1]])[1])
n=length(n)
`if`(z,Reduce(c('*','+','-','/')[n],1:z,,T),n<2)}

Essayez quelques cas de test!

non golfé:

function(s){
  n <- strsplit(s,"!")[[1]]          # split on "!"
  z <- strtoi(n[1])                  # turn to integer
  n <- length(n)                     # count number of "!"
  FUN <- c(`*`,`+`,`-`,`/`)[[n]]     # select a function
  right <- TRUE                      # Reduce (fold) from the right
  if( z > 0)                         # if z > 0
    Reduce(FUN, 1:z,,right)          # return the value
  else    
    (n < 2)                          # 1 if n = 1, 0 if n > 1
}
Giuseppe
la source
el(strsplit(s,"!")) enregistre 1 octet
bouncyball
4

Python3, 124 130 121 119 octets

À ce stade, je crois que la récursivité est la clé pour économiser davantage d'octets.

s=input()
l=s.count('!')
v=int(s[:-l])+1
print(eval((" *+-/"[l]+"(").join(map(str,range(1,v)))+")"*(v-2)or"0")+(l<2>v))

Essayez les tests sur Try it online!

-9 octets grâce à @ Mr.Xcoder !

-2 octets grâce à @Felipe Nardi Batista !

Yytsi
la source
Échoue pour 6! . Il devrait être de 720.
M. Xcoder
J'ai mis à jour la suite de tests Tio.
M. Xcoder
-3 octets .
M. Xcoder
Oh oui, bien sûr,
je
2
Voici ES6
Erik the Outgolfer
3

Pyth , 34 30 octets

+uv++H@"/*+-"/Q\!G_tUK.vQKq"0!

Essayez-le en ligne!

Explication

+uv++H@"/*+-"/Q\!G_tUK.vQKq"0!"Q    Implicit: append "Q
                                    Implicit: read input to Q
                      .vQ           Evaluate Q as Pyth code. This evaluates the integer,
                                    any !'s are parsed as unary NOT for the next expression
                                    and discarded.
                     K              Save the result to K.
                    U               Get a list [0, 1, ..., K-1].
                   t                Drop the first item to get [1, 2, ..., K-1].
                  _                 Reverse to get [K-1, K-2, ..., 1].
 u                       K          Starting from G = K, for H in [K-1, K-2, ..., 1] do:
             /Q\!                     Count the !'s in Q.
      @"/*+-"                         Get the correct operator.
    +H                                Prepend the current H.
   +             G                    Append the previous value G.
  v                                   Evaluate as Python code.
                          q"0!"Q    See if Q == "0!".
+                                   If so, add 1.
PurkkaKoodari
la source
L'utilisation.U enregistre un octet.
Erik the Outgolfer
2

05AB1E , 27 octets

þL"/*+-"¹'!¢©è".»"ì.VD_нi®Θ

Essayez-le en ligne!

Erik le Outgolfer
la source
Savez-vous pourquoi „.»cela ne fonctionne pas?
Riley
@Riley »fait partie d'une chaîne compressée inachevée, il génère donc des erreurs et, comme d'habitude dans 05AB1E, l'erreur est ignorée.
Erik the Outgolfer
J'essayais de le faire "*+-/"èUaprès avoir utilisé le Lsuivi avec .»Xmais il traite Xcomme une chaîne, pas une commande et .»X.Vest encore plus dérangeant.
Magic Octopus Urn
@MagicOctopusUrn Xn'évalue pas. X.Vsont deux commandes.
Erik the Outgolfer
@EriktheOutgolfer oui, mais j'espérais que ce serait égal avant de traiter le pli. En espérant , ne m'attendant pas :(. Aurait pu jurer qu'il y avait "utiliser une chaîne de caractère unique comme commande dans la chaîne dyadique" ou quelque chose comme ça.
Magic Octopus Urn
2

Rubis , 83 80 79 octets

->s{z=s.count ?!;s<?1?1+1<=>z:eval([*1..w=s.to_i]*(".0"+"_*+-/"[z]+?()+?)*~-w)}

Essayez-le en ligne!

Explication:

->s{
    # Get number of !
    z=s.count ?!

    # Special case: if the number is 0, then output 0 or 1 depending on z
    s<?1?1+1<=>z:

    # Otherwise build the full expression as a string and then evaluate it
    eval([*1..w=s.to_i]*(".0"+"_*+-/"[z]+?()+?)*~-w)
}
GB
la source
2

Java 8, 141 136 134 octets

s->{float q=s.split("!",-1).length,n=new Float(s.split("!")[0]),i=n,r=n;for(;--i>0;r=q<3?i*r:q<4?i+r:q<5?i-r:i/r);return n<1&q<3?1:r;}

-5 octets (141 → 136) grâce à la réponse C # de @CarlosAlejo .

Explication:

Essayez-le ici.

s->{                                // Method with String parameter and float return-type
  float q=s.split("!",-1).length,   //  Amount of exclamation marks + 1
        n=new Float(s.split("!")[0]),
                                    //  The number before the exclamation marks
        i=n,                        //  Index (starting at `n`)
        r=n;                        //  Return sum (starting at `n`)
  for(;--i>0;                       //  Loop from `i-1` down to 1
    r=                              //   Change the result (`r`) to:
      q<3?                          //    If `q` is 2:
       i*r                          //     Multiply
      :q<4?                         //    Else if `q` is 3:
       i+r                          //     Addition
      :q<5?                         //    Else if `q` is 4:
       i-r                          //     Subtraction
      :                             //    Else (if `q` is 5):
       i/r                          //     Division
  );                                //  End of loop
  return n<1&q<3?                   //  Edge case if the input is `0!`:
          1                         //   Then return 1
         :                          //  Else:
          r;                        //   Return the result
}                                   // End of method
Kevin Cruijssen
la source
1
J'ai vu une réponse similaire ailleurs ...: -DI continue d'oublier que floatc'est plus court que double.
Charlie
@CarlosAlejo Oui, j'ai remarqué votre réponse après ma réponse initiale de 141 octets. Passer float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)à la réponse actuelle m'a fait économiser 5 octets. :) J'ai oublié d'ajouter une partie " octets enregistrés grâce à " que j'ai remarquée maintenant .. Désolé.
Kevin Cruijssen
oh, peu importe, je suis content que vous ayez aimé ma réponse. :-)
Charlie
2

Gelée ,  24 23 26  25 octets

+  3  2 octets corrigeant pour corriger après une mauvaise interprétation :(

×
+
_
÷
ṣ”!µḢVRṚȯL©Ị$®ŀ@/

Un programme complet (un lien monadique avec des liens d'assistance référencés par l'emplacement du programme)

Essayez-le en ligne! ou voir une suite de tests .

Comment?

× - Link 1, multiply: number, number

+ - Link 2, add: number, number

_ - Link 1, subtract: number, number

÷ - Link 1, divide: number, number

ṣ”!µḢVRṚȯL©Ị$®ŀ@/ - Main link: list of characters, a
ṣ”!               - split s at '!' characters
   µ              - monadic separation, call that b
    Ḣ             - head - pop and yield the digit list from b, modifying b
     V            - evaluate as Jelly code (get the number, say N)
      R           - range = [1,2,3,...,N]
       Ṛ          - reverse = [N,...,3,2,1]
            $     - last two links as a monad:
         L        -   length of modified b (number of '!' characters)
          ©       -   (copy to register)
           Ị      -   insignificant? (1 when just one '!', 0 when two or more)
        ȯ         - logical or (1 for "0!", 0 for "0!!...", the reversed-range otherwise)
                / - cumulative reduce by:
               @  -  with swapped arguments:
              ŀ   -    dyadic call of link at index:
             ®    -      recall value from register (number of '!' characters)
Jonathan Allan
la source
Échoue pour 0!.
Erik the Outgolfer
Oh, haha ​​- j'avais mal lu votre commentaire sous l'OP - je pensais qu'ils avaient fait 0! défini comme 0, ce qui serait faux.
Jonathan Allan
Tout est réglé maintenant :)
Jonathan Allan
Dommage que TIO soit cassé en ce moment, je ne peux donc pas tester s'il est toujours invalide. :(: P Aussi dommage que vous ne pouvez pas utiliser /. Sur une liste vide D: EDIT: Apparemment valable pour 0!, 0!!, 0!!!et 0!!!!+1.
Erik le Outgolfer
2

Code machine x86_64 à modification automatique, 123 octets

0f b6 0f 31 c0 eb 11 0f be c9 8d 04 80 8d 44 41 d0 0f b6 4f 01 48 ff c7 83 f9 21 75 ea b9 21 21 21 a1 33 0f 0f bc c9 81 c1 ff 07 00 00 c1 e9 03 0f b6 c9 89 ca 09 c2 74 35 55 48 89 e5 c7 45 fc 59 58 5c 5e 8a 4c 0d fc 88 0d 15 00 00 00 f3 0f 2a c8 83 f8 02 5d 7c 1f ff c8 0f 57 c0 f3 0f 2a c0 f3 0f 5e c1 83 f8 01 0f 28 c8 7f eb c3 f3 0f 10 05 03 01 00 00 c3 0f 28 c1 c3

Pourquoi les langages interprétés pourraient-ils exécuter dynamiquement du code avec des evals fantaisistes , mais pas du code machine ordinaire?

Essayez-le avec:

#include <stdio.h>
#include <sys/mman.h>
#include <errno.h>

char ff[] = "\x0f\xb6\x0f\x31\xc0\xeb\x11\x0f\xbe\xc9\x8d\x04\x80\x8d\x44\x41\xd0\x0f\xb6\x4f\x01\x48\xff\xc7\x83\xf9\x21\x75\xea\xb9\x21\x21\x21\xa1\x33\x0f\x0f\xbc\xc9\x81\xc1\xff\x07\x00\x00\xc1\xe9\x03\x0f\xb6\xc9\x89\xca\x09\xc2\x74\x35\x55\x48\x89\xe5\xc7\x45\xfc\x59\x58\x5c\x5e\x8a\x4c\x0d\xfc\x88\x0d\x15\x00\x00\x00\xf3\x0f\x2a\xc8\x83\xf8\x02\x5d\x7c\x1f\xff\xc8\x0f\x57\xc0\xf3\x0f\x2a\xc0\xf3\x0f\x5e\xc1\x83\xf8\x01\x0f\x28\xc8\x7f\xeb\xc3\xf3\x0f\x10\x05\x03\x01\x00\x00\xc3\x0f\x28\xc1\xc3";
int main()
{
    char* page = (char*)((unsigned long)((char*)ff) & (~0xfffLL));
    if (mprotect(page, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC) < 0) {
        perror("mprotect");
        return -1;
    }
    float (*f)(char*) = (float (*)(char*))ff;
    char* testcases[] = { "0!","1!","2!","3!","4!","5!","6!","7!","8!","9!","10!",
                          "0!!","1!!","2!!","3!!","4!!","5!!","6!!","7!!","8!!","9!!","10!!",
                          "0!!!","1!!!","2!!!","3!!!","4!!!","5!!!","6!!!","7!!!","8!!!","9!!!","10!!!",
                          "0!!!!","1!!!!","2!!!!","3!!!!","4!!!!","5!!!!","6!!!!","7!!!!","8!!!!","9!!!!","10!!!!",
                        };
    for (int i = 0; i < 44; i++) {
        printf("%s -> %f\n", testcases[i], f(testcases[i]));
    }
}

Assemblée:

_f:
100000d4f:  0f b6 0f    movzx   ecx, byte ptr [rdi]
100000d52:  31 c0   xor eax, eax
100000d54:  eb 11   jmp 17 <_f+18>
100000d56:  0f be c9    movsx   ecx, cl
100000d59:  8d 04 80    lea eax, [rax + 4*rax]
100000d5c:  8d 44 41 d0     lea eax, [rcx + 2*rax - 48]
100000d60:  0f b6 4f 01     movzx   ecx, byte ptr [rdi + 1]
100000d64:  48 ff c7    inc rdi
100000d67:  83 f9 21    cmp ecx, 33
100000d6a:  75 ea   jne -22 <_f+7>
100000d6c:  b9 21 21 21 a1  mov ecx, 2703302945
100000d71:  33 0f   xor ecx, dword ptr [rdi]
100000d73:  0f bc c9    bsf ecx, ecx
100000d76:  81 c1 ff 07 00 00   add ecx, 2047
100000d7c:  c1 e9 03    shr ecx, 3
100000d7f:  0f b6 c9    movzx   ecx, cl
100000d82:  89 ca   mov edx, ecx
100000d84:  09 c2   or  edx, eax
100000d86:  74 35   je  53 <_f+6E>
100000d88:  55  push    rbp
100000d89:  48 89 e5    mov rbp, rsp
100000d8c:  c7 45 fc 59 58 5c 5e    mov dword ptr [rbp - 4], 1583110233
100000d93:  8a 4c 0d fc     mov cl, byte ptr [rbp + rcx - 4]
100000d97:  88 0d 15 00 00 00   mov byte ptr [rip + 21], cl
100000d9d:  f3 0f 2a c8     cvtsi2ss    xmm1, eax
100000da1:  83 f8 02    cmp eax, 2
100000da4:  5d  pop rbp
100000da5:  7c 1f   jl  31 <_f+77>
100000da7:  ff c8   dec eax
100000da9:  0f 57 c0    xorps   xmm0, xmm0
100000dac:  f3 0f 2a c0     cvtsi2ss    xmm0, eax
100000db0:  f3 0f 5e c1     divss   xmm0, xmm1
100000db4:  83 f8 01    cmp eax, 1
100000db7:  0f 28 c8    movaps  xmm1, xmm0
100000dba:  7f eb   jg  -21 <_f+58>
100000dbc:  c3  ret
100000dbd:  f3 0f 10 05 03 01 00 00     movss   xmm0, dword ptr [rip + 259]
100000dc5:  c3  ret
100000dc6:  0f 28 c1    movaps  xmm0, xmm1
100000dc9:  c3  ret

Des explications seront ajoutées ultérieurement. L'idée de base est de modifier l' divss xmm0, xmm1instruction à0x100000db0 et de la remplacer par unmulss , addss,subss ou divssselon l'opérande fourni. Une petite astuce est également utilisée pour analyser la chaîne d'entrée.

Assemblage généré avec:

float f (char* s)
{
    int x;
    for (x=0; *s != '!'; s++) {
        x=10*x + (*s-'0');
    }
    unsigned char op = (__builtin_ctz(*(unsigned int *)s ^ 0xa1212121)-1) >> 3;
    if (x == 0 && op == 0) {
        return 1;
    }
    unsigned int lookup = 0x5e5c5859;
    unsigned char new_code = ((unsigned char*)&lookup)[op];
    asm("movb %0, 0x15(%%rip)" : : "r" (new_code));
    float sum;
    for (sum = x--; x>0; x--) {
        sum = x / sum;
    }
    return sum;
}
yoann
la source
2

Haskell, 105 102 98 96 octets

0!3=0
x!y=foldr([(*),(+),(-),(/)]!!y)([1,0,0,1]!!y)[1..x]
f s|[(n,b)]<-lex s=read n!(length b-1)

9 octets enregistrés grâce à Zgarb et nimi.

Essayez-le en ligne.

Cristian Lupascu
la source
@Zgarb Vous avez raison. Fixé.
Cristian Lupascu du
Je pense que vous pouvez également laisser tomber les parens read n, et ce f=n'est pas nécessaire selon nos règles .
Zgarb
@Zgarb Encore une fois :). Merci!
Cristian Lupascu
Le retour à une fonction nommée et à l' aide lexenregistre deux octets: f s|[(n,b)]<-lex s=read n!(length b-1).
nimi
@nimi Wow, merci! Je suis tellement nouveau à Haskell que je ne le savais même pas lex. C'est génial! :) Je ne vois pas comment cela permet d'économiser des octets - j'obtiens 99 octets après cela.
Cristian Lupascu
1

Gaia , 26 25 octets

ẋ)@d┅v;l“×+⁻÷”=“ₔ⊢”+e¤ḥ!∨

Essayez-le en ligne!

Explication

ẋ                          Split the input into runs of the same character.
 )                         Get the last one (the !'s).
  @                        Push an input (since there's none left, use the last one).
   d                       Parse as number (ignores the !'s).
    ┅v                     Get the reverse range: [n .. 1]
      ;                    Copy the ! string
       l“×+⁻÷”=            Get its length and index into this string of operators.
               “ₔ⊢”+       Append 'ₔ⊢' to the operator.
                    e      Eval the resulting string, which is "reduce by <operator> with
                            swapped arguments." Reducing an empty list gives 0.
                     ¤     Bring the !'s back to the top.
                      ḥ!   Remove the first character and check if it's empty.
                        ∨  Logical OR; turns 0 from 0! to 1, doesn't change anything else.
Chat d'affaires
la source
1

Gelée , 28 octets

×
+
_
÷
³ċ”!
ḟ”!VRṚ¢ŀ@/¢Ị¤¹?

Essayez-le en ligne!

J'ai eu l'idée de séparer les liens en lignes de la réponse de Jonathan Allan pour -2 octets.

Erik le Outgolfer
la source
1

APL (Dyalog) , 30 octets

Inspiré par la solution de lstefano .

{0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D}

Essayez-le en ligne!

{} Fonction anonyme où l'argument est représenté par :

0:: en cas d'erreur:

  0 retourner zéro

 Essayez maintenant:

  ⍵∩⎕D l'intersection de l'argument et de l'ensemble des chiffres D (supprime les points d'exclamation)

   exécuter cela (le transforme en un nombre)

  ɩ ndices de cela

  ()/ Insérer (APL est associatif à droite, au besoin) la fonction suivante entre les termes:

   ⍵~⎕D l' argument sans D igits (feuilles points d'exclamation)

   compter (c.-à-d. combien de points d'exclamation)

  '×+-⌹'⊃⍨ utilisez-le pour choisir dans la liste des symboles *

   exécuter (transforme le symbole en fonction)


(division matricielle) est utilisé à la place de ÷(division normale) pour provoquer une erreur sur une liste vide

Adam
la source
Que fait ::un dfn?
Zacharý
C'est un garde-erreur . Si à tout moment après la mise en place de la protection contre les erreurs, une erreur avec l'un des nombres (0 = 1… 999, 1000 = 1001…) à gauche de l' ::événement se produit, la valeur à droite de ::est immédiatement renvoyée.
2017
Eh bien, je ne l'ai jamais su, merci!
Zacharý
0

Dyalog APL, au moins 29 caractères

{(⍎i⊃'×+-÷')/⍳⍎⍵↓⍨-i←+/'!'=⍵}

L'expression est PRESQUE correcte. Il passe tous les cas de test SAUF 0!!!!pour lesquels il donne 1au lieu des requis 0et c'est parce qu'en APL la réduction d'un vecteur vide est censée retourner l'élément neutre pour la fonction utilisée pour réduire. Pour le quotient qui est 1. Pour le moment je n'ai pas le temps d'essayer de le réparer mais je vais le laisser ici un jour de pluie.

lstefano
la source
Il pleut: {0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D} essayez-le en ligne!
Adám
Très cool! Cela ne me dérange pas du tout si vous la revendiquez comme votre solution, étant donné que les différences sont plus que les similitudes.
lstefano
Terminé.
Adám
0

Mathematica, 152 octets

(T=ToExpression;If[#=="0!!!!",0,s=T@StringCount[#,"!"];t=T@StringDrop[#,-s];{#!,i~Sum~{i,#},Sum[-i(-1)^i,{i,#}],N@Product[1/i^(-1)^i,{i,#}]}[[s]]&[t]])&
J42161217
la source
0

Javascript, 111 163 octets

s=>([a,b]=s.split(/\b/),c=b.length,a==0&c==1||eval((p=[...Array(+a+1).keys()].slice(1).join(c-1?c-2?c-3?'/(':'-(':'+':'*'))+')'.repeat((p.match(/\(/g)||[]).length)))

Version lisible

s=>([a,b]=s.split(/\b/),c=b.length,a==0&c==1||eval((p=
[...Array(+a+1).keys()].slice(1).join(c-1?c-2?c-3?'/(':'-
(':'+':'*'))+')'.repeat((p.match(/\(/g)||[]).length)))
SuperStormer
la source