Ulteriori fatti!


17

In matematica, il "fatto" fattoriale abbreviato di un numero intero non negativo n , indicato da n! , è il prodotto di tutti gli interi positivi minori o uguali a n . Ad esempio, 5! è 1 * 2 * 3 * 4 * 5 = 120

Il fattoriale di 0 è 1 , secondo la convenzione per un prodotto vuoto.


Questi sono i fatti regolari a cui siamo abituati. Aggiungiamo alcune alternative:

  1. Il fattoriale (definito sopra)
  2. Il doppio fattoriale: n !! = 1 + 2 + ... + n
  3. Il triplo fattoriale: n !!! = 1 - (2 - (3 - (... - n))) ...)
  4. Il quadruplo fattoriale: n !!!! = 1 / (2 / (3 ... / n))) ...) . Nota: questa è una divisione in virgola mobile, non una divisione intera.

Sfida

Prendere un ingresso intero non negativo n , direttamente seguito da tra 1 e 4 esclamativi. L'input apparirà (esattamente) così: 0! , 5 !! , 132 !!! o 4 !!!! . In questa sfida, potresti non assumere un formato di input flessibile, mi dispiace.

Produzione

L'output dovrebbe essere il risultato, in qualsiasi formato conveniente. Il risultato del quadruplo fattoriale deve contenere almeno 2 cifre dopo il punto decimale, tranne 0 !!!! = 0 .

Casi 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

Vince la soluzione più breve in ogni lingua.


2
Il fattoriale quadruplo può anche essere una divisione razionale?
Martin Ender,

6
La definizione di "doppio fattoriale" è in
contrasto

4
@Erik, è un doppio fatto alternativo ;-)
Stewie Griffin

1
@StewieGriffin A proposito, è un po 'subdolo che 0!-> 1.
Erik the Outgolfer

5
Il titolo dovrebbe essere Fatti alternativi
Trauma digitale

Risposte:


7

JavaScript (ES6), 88 byte

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

Casi test

Formattato e commentato

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()

7

Buccia , 15 byte

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

Provalo online!

Spiegazione

Indicizzazione in un elenco di funzioni: le gioie dell'uso di un linguaggio funzionale.

§!ëΠΣ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

Io uso una gamma discendente e pieghe a sinistra, dal momento che -e /prendere i loro argomenti in ordine inverso in buccia.


Indexing into a list of functionsis woah ...
Erik the Outgolfer

Stavo pensando a Haskell, e poi vedo questo ... Veramente sembra essere lo strumento giusto per il lavoro. +1
vicoli

Questo è ciò per cui Husk è stato creato: D
Leone,

6

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

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;}

Provalo online!

La parte migliore del golf del codice sono le cose che impari mentre cerchi di risolvere le sfide. In questo ho imparato che in C # puoi tagliare altri caratteri oltre agli spazi bianchi dalle stringhe.

  • 4 byte salvati grazie a LiefdeWen!
  • 2 byte salvati perché non è necessario sottrarre 1 a s.Split('!').Length, basta correggere i limiti in e>4?i/r:e>3?i-r:e>2?i+r:i*re n<1&e<3?1:r.

1
È possibile effettuare e ne ianche doubleper evitare di dichiararlo per r per salvare 4 byte.
Liefde:

1
@LiefdeWen Oppure floatper salvare un altro byte.
Kevin Cruijssen,


4

R , 113 111 byte

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

Prova alcuni casi di test!

ungolfed:

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
}

el(strsplit(s,"!")) salva 1 byte
bouncyball il

4

Python3, 124 130 121 119 byte

A questo punto, credo che la ricorsione sia la chiave per l'ulteriore salvataggio di byte.

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))

Prova le prove su Provalo online!

-9 byte grazie a @ Mr.Xcoder !

-2 byte grazie a @Felipe Nardi Batista !


Non riesce a 6! . Dovrebbe essere 720.
Mr. Xcoder il

Ho aggiornato la suite di test Tio.
Mr. Xcoder,


Oh sì, certo, non l'ho
notato


3

Pyth , 34 30 byte

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

Provalo online!

Spiegazione

+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.


2

05AB1E , 27 byte

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

Provalo online!


Sai perché „.»non funziona?
Riley,

@Riley »fa parte di una stringa compressa non finita, quindi si risolve in errore e, come di solito in 05AB1E, l'errore viene ignorato.
Erik the Outgolfer,

Stavo cercando di fare "*+-/"èUdopo aver usato il Lfollow-up .»Xma tratta Xcome una stringa, non un comando ed .»X.Vè anche più accattivante.
Magic Octopus Urn,

@MagicOctopusUrn Xnon valuta . X.Vsono due comandi.
Erik the Outgolfer,

@EriktheOutgolfer sì, ma speravo che valesse prima di elaborare il fold. Sperando , non aspettandomi :(. Avrei potuto giurare che c'era un "usa la stringa di un singolo carattere come comando nella catena diadica" o qualcosa del genere.
Magic Octopus Urn

2

Rubino , 83 80 79 byte

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

Provalo online!

Spiegazione:

->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)
}

2

Java 8, 141 136 134 byte

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 byte (141 → 136) grazie alla risposta C # di @CarlosAlejo .

Spiegazione:

Provalo qui.

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

1
Ho visto una risposta simile da qualche altra parte ... MrGreen Continuo a dimenticare che floatè più breve di double.
Charlie,

@CarlosAlejo Sì, ho notato la tua risposta dopo la mia risposta iniziale a 141 byte. Passare float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)alla risposta corrente mi ha salvato 5 byte. :) Ho dimenticato di aggiungere una parte " byte salvati grazie a " che ho notato ora .. Mi dispiace per quello.
Kevin Cruijssen,

oh, non importa, sono contento che ti sia piaciuta la mia risposta. :-)
Charlie

2

Gelatina ,  24 23 26  25 byte

+  3  2 byte rattoppando per risolvere dopo errata interpretazione :(

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

Un programma completo (un collegamento monadico con collegamenti di aiuto a cui fa riferimento la posizione del programma)

Provalo online! o vedere una suite di test .

Come?

× - 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)

Non funziona per 0!.
Erik the Outgolfer,

Oh, haha ​​- avevo letto il tuo commento sotto l'OP sbagliato - pensavo che avessero fatto 0! definito come 0 che sarebbe sbagliato.
Jonathan Allan,

Tutto risolto ora :)
Jonathan Allan il

Peccato che il TIO sia rotto in questo momento, quindi non posso testare se è ancora non valido. :(: P Anche peccato che non è possibile utilizzare /. Su una lista vuota D: EDIT: A quanto pare valida per 0!, 0!!, 0!!!e 0!!!!+1.
Erik l'Outgolfer

2

Codice macchina x86_64 automodificante, 123 byte

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

Perché i linguaggi interpretati sarebbero in grado di eseguire dinamicamente il codice con fantasia eval, ma non un semplice codice macchina?

Provalo con:

#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]));
    }
}

Montaggio:

_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

Le spiegazioni verranno aggiunte in seguito. L'idea di base è quella di modificare divss xmm0, xmm1l'istruzione a 0x100000db0e sostituirlo con un mulss, addss, subsso divsssecondo operando fornito. Un piccolo trucco viene utilizzato anche per analizzare la stringa di input.

Assemblea generata con:

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;
}

2

Haskell, 105 102 98 96 byte

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)

Salvataggio di 9 byte grazie a Zgarb e nimi.

Provalo online.


@Zgarb Hai ragione. Fisso.
Cristian Lupascu,

Penso che puoi anche far cadere le parentesi read n, e f=non è necessario secondo le nostre regole .
Zgarb,

@Zgarb Di nuovo a destra :). Grazie!
Cristian Lupascu,

Ritornando ad una funzione denominata e l'utilizzo lexconsente di risparmiare due byte: f s|[(n,b)]<-lex s=read n!(length b-1).
nimi,

@nimi Wow, grazie! Sono così nuovo in Haskell che non sapevo nemmeno lex. È fantastico! :) Non vedo come ciò salvi i byte, ma dopo ottengo 99 byte.
Cristian Lupascu,

1

Gaia , 26 25 byte

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

Provalo online!

Spiegazione

ẋ                          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.


1

APL (Dyalog) , 30 byte

Ispirato alla soluzione di lstefano .

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

Provalo online!

{... } funzione anonima in cui l'argomento è rappresentato da :

0:: se si verifica un errore:

  0 restituisce zero

 ora prova:

  ⍵∩⎕D l'intersezione dell'argomento e l'insieme di D igits (rimuove i punti esclamativi)

   eseguilo (lo trasforma in un numero)

  ddice di quello

  (... )/ inserire (APL è associativo giusto, se necessario) la seguente funzione tra i termini:

   ⍵~⎕D argomento senza D igits (punti esclamativi foglie)

   calcola questo (cioè quanti punti esclamativi)

  '×+-⌹'⊃⍨ usalo per scegliere dalla lista dei simboli *

   esegui (trasforma il simbolo in una funzione)


(divisione matrice) viene utilizzato anziché ÷(divisione normale) per causare un errore in un elenco vuoto


Cosa fa ::in un dfn?
Zacharý,

È una protezione dagli errori . Se in qualsiasi momento dopo l'impostazione della protezione errori, si verifica un errore con uno dei numeri (0 = 1 ... 999, 1000 = 1001 ...) a sinistra del caso ::, ::viene immediatamente restituito il valore a destra del .
Adám,

Bene, non l'ho mai saputo, grazie!
Zacharý,


0

Dyalog APL, almeno 29 caratteri

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

L'espressione è QUASI corretta. Passa tutti i casi di test TRANNE quello 0!!!!che fornisce 1invece del necessario 0e questo perché in APL la riduzione di un vettore vuoto dovrebbe restituire l'elemento neutro per la funzione utilizzata per ridurre. Per il quoziente che è 1. Al momento non ho tempo di provare a risolverlo ma lo lascerò qui per una giornata piovosa.


Piove: {0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D} provalo online!
Adám,

Molto bello! Non mi dispiace affatto se lo rivendichi come soluzione, dato che le differenze sono più delle somiglianze.
lstefano,



0

Mathematica, 152 byte

(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]])&

0

Javascript, 111 163 byte

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)))

Versione leggibile

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)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.