Zusätzliche Fakten!

17

In der Mathematik ist die faktorielle, verkürzte "Tatsache" einer nicht negativen ganzen Zahl n , die mit n! Bezeichnet wird . ist das Produkt aller positiven ganzen Zahlen kleiner oder gleich n . Zum Beispiel 5! ist 1 * 2 * 3 * 4 * 5 = 120

Die Fakultät von 0 ist 1 gemäß der Konvention für ein leeres Produkt.


Dies sind die regulären Fakten, an die wir gewöhnt sind. Fügen wir einige Alternativen hinzu:

  1. Die Fakultät (oben definiert)
  2. Die doppelte Fakultät: n !! = 1 + 2 + ... + n
  3. Die dreifache Fakultät: n !!! = 1 - (2 - (3 - (... - n))) ...)
  4. Die vierfache Fakultät: n !!!! = 1 / (2 / (3 ... / n))) ...) . Hinweis: Dies ist eine Gleitkommadivision, keine Ganzzahldivision.

Herausforderung

Nehmen Sie eine nicht negative Ganzzahleingabe n , direkt gefolgt von 1 bis 4 Ausrufezeichen. Die Eingabe sieht (genau) so aus: 0! , 5 !! , 132 !!! oder 4 !!!! . Bei dieser Herausforderung können Sie leider kein flexibles Eingabeformat annehmen.

Ausgabe

Die Ausgabe sollte das Ergebnis in jedem geeigneten Format sein. Das Ergebnis der vierfachen Fakultät muss mindestens zwei Nachkommastellen haben, mit Ausnahme von 0 !!!! = 0 .

Testfälle:

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

Die kürzeste Lösung in jeder Sprache gewinnt.

Stewie Griffin
quelle
2
Kann die vierfache Fakultät auch eine rationale Division sein?
Martin Ender
6
"Die doppelte Fakultät" -Definition passt nicht ...
Erik the Outgolfer
4
@ Erik, es ist eine alternative doppelte Tatsache ;-)
Stewie Griffin
1
@StewieGriffin Übrigens ist es ein bisschen hinterhältig, dass 0!-> 1.
Erik der Outgolfer
5
Titel sollte Alternative Facts sein
Digital Trauma

Antworten:

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

Testfälle

Formatiert und kommentiert

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

Schale , 15 Bytes

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

Probieren Sie es online!

Erläuterung

Indizierung in eine Liste von Funktionen: die Freude an der Verwendung einer funktionalen Sprache.

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

Ich benutze einen absteigenden Bereich und linke Falten, da -und /nehme ihre Argumente in umgekehrter Reihenfolge in Husk.

Zgarb
quelle
Indexing into a list of functionsist woah ...
Erik der Outgolfer
Ich habe an Haskell gedacht und dann sehe ich das ... Scheint wirklich das richtige Werkzeug für den Job zu sein. +1
alleks
Dies ist, wofür Husk gemacht wurde: D
Leo
6

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

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

Probieren Sie es online!

Das Beste am Code-Golfen sind die Dinge, die Sie lernen, während Sie versuchen, die Herausforderungen zu lösen. In diesem Beispiel habe ich gelernt, dass Sie in C # neben Leerzeichen auch andere Zeichen aus Zeichenfolgen entfernen können.

  • 4 Bytes gespart dank LiefdeWen!
  • 2 Bytes gespart, da ich nicht 1 abziehen muss s.Split('!').Length, nur die Grenzen in e>4?i/r:e>3?i-r:e>2?i+r:i*rund festlegen n<1&e<3?1:r.
Charlie
quelle
1
Sie können machen e nund iauch doublezu vermeiden, es für r zu deklarieren, um 4 Bytes zu sparen.
LiefdeWen
1
@LiefdeWen Oder floatum ein weiteres Byte zu speichern.
Kevin Cruijssen
4

Perl 5 , 62 Bytes

61 Byte Code + 1 für -p.

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

Vielen Dank an @GB für den Hinweis auf einen Fehler von meiner Seite!

Probieren Sie es online! (dies dient der -lLesbarkeit)

Dom Hastings
quelle
4
0! sollte 1 nicht 0 sein
GB
@GB Nun, das ergibt keinen Sinn ... Behoben für +5!
Dom Hastings
4

R , 113 111 Bytes

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

Probieren Sie einige Testfälle aus!

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
}
Giuseppe
quelle
el(strsplit(s,"!")) speichert 1 Byte
Bouncyball
4

Python3, 124 130 121 119 Bytes

An dieser Stelle glaube ich, dass die Rekursion der Schlüssel zum weiteren Speichern von Bytes ist.

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

Probieren Sie die Testfälle auf Online testen !

-9 Bytes dank @ Mr.Xcoder !

-2 Bytes dank @Felipe Nardi Batista !

Yytsi
quelle
Scheitert für 6! . Es sollte 720 sein.
Mr. Xcoder
Ich habe die Tio-Testsuite aktualisiert.
Mr. Xcoder
-3 Bytes .
Mr. Xcoder
Oh ja, sicher,
ich
2
Siehe ES6
Erik der Outgolfer
3

Pyth , 34 30 Bytes

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

Probieren Sie es online!

Erläuterung

+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
quelle
Mit wird.U ein Byte gespeichert.
Erik der Outgolfer
2

05AB1E , 27 Bytes

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

Probieren Sie es online!

Erik der Outgolfer
quelle
Weißt du warum „.»nicht funktioniert?
Riley
@Riley »ist Teil einer unvollendeten komprimierten Zeichenfolge, daher tritt ein Fehler auf, und wie in 05AB1E üblich wird der Fehler ignoriert.
Erik der Outgolfer
Ich habe versucht, dies zu tun, "*+-/"èUnachdem ich LFollow-up mit verwendet habe, .»Xaber es wird Xals Zeichenfolge behandelt , nicht als Befehl und .»X.Vist sogar noch kniffliger.
Magic Octopus Urn
@MagicOctopusUrn kann Xnicht ausgewertet werden . X.Vsind zwei Befehle.
Erik der Outgolfer
@EriktheOutgolfer ja, aber ich hatte gehofft, dass es evalieren würde, bevor ich die Falte verarbeite. Hoffen , nicht erwarten :(. Hätte schwören können, dass es eine "Zeichenfolge als Befehl in der dyadischen Kette verwenden" oder so etwas gibt.
Magic Octopus Urn
2

Ruby , 83 80 79 Bytes

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

Probieren Sie es online!

Erläuterung:

->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
quelle
2

Java 8, 141 136 134 Bytes

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 Bytes (141 → 136) dank der C # -Antwort von @CarlosAlejo .

Erläuterung:

Probieren Sie es hier aus.

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
quelle
1
Ich habe eine ähnliche Antwort woanders gesehen ...: -DI vergesse immer wieder, dass floatkürzer ist als double.
Charlie
@CarlosAlejo Ja, ich habe Ihre Antwort nach meiner ersten 141-Byte-Antwort bemerkt. Das Umschalten float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)auf die aktuelle Antwort hat mir 5 Bytes gespart. :) Ich habe vergessen, einen Teil " Bytes gespeichert dank " hinzuzufügen, der mir jetzt aufgefallen ist.
Kevin Cruijssen
Oh, vergiss das, ich bin froh, dass dir meine Antwort gefallen hat. :-)
Charlie
2

Jelly ,  24 23 26  25 Bytes

+  3  2-Byte-Patches zur Behebung nach Fehlinterpretation :(

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

Ein vollständiges Programm (eine monadische Verknüpfung mit Hilfsverknüpfungen, auf die nach Programmstandort verwiesen wird)

Probieren Sie es online! oder sehen Sie sich eine Testsuite an .

Wie?

× - 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
quelle
Scheitert für 0!.
Erik der Outgolfer
Oh, haha ​​- ich hatte deinen Kommentar unter dem OP falsch gelesen - ich dachte, sie hätten 0 gemacht! definiert als 0, was falsch wäre.
Jonathan Allan
Alles repariert jetzt :)
Jonathan Allan
Schade, dass TIO momentan defekt ist, so dass ich nicht testen kann, ob es immer noch ungültig ist. :(: P Auch schade , dass Sie nicht verwenden können /. Auf eine leere Liste D: EDIT: Anscheinend gilt für 0!, 0!!, 0!!!und 0!!!!+1.
Erik die Outgolfer
2

Selbstmodifizierender x86_64-Computercode, 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

Warum sollten interpretierte Sprachen in der Lage sein, Code mit ausgefallenen evals, aber nicht einfachem Maschinencode dynamisch auszuführen ?

Probieren Sie es aus mit:

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

Versammlung:

_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

Erklärungen werden später hinzugefügt. Die Grundidee ist es, die modifizieren divss xmm0, xmm1Anweisung an 0x100000db0und ersetzen sie durch eine mulss, addss,subss oder divssnach gelieferten Operanden. Ein kleiner Trick wird auch verwendet, um die Eingabezeichenfolge zu analysieren.

Baugruppe generiert mit:

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
quelle
2

Haskell, 105 102 98 96 Bytes

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 Bytes dank Zgarb und Nimi gespeichert.

Probieren Sie es online aus.

Cristian Lupascu
quelle
@ Zgarb Du hast recht. Fest.
Cristian Lupascu
Ich denke, Sie können die Parens auch fallen lassen read n, und das f=ist nach unseren Regeln unnötig .
Zgarb
@Zgarb Schon wieder richtig :). Vielen Dank!
Cristian Lupascu
Zurückschalten auf eine benannte Funktion und Verwendung lexspeichert zwei Bytes: f s|[(n,b)]<-lex s=read n!(length b-1).
nimi
@ Nimi Wow, danke! Ich bin so neu in Haskell, dass ich nicht einmal davon wusste lex. Das ist großartig! :) Ich verstehe nicht, wie das Bytes spart - danach bekomme ich 99 Bytes.
Cristian Lupascu
1

Gaia , 26-25 Bytes

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

Probieren Sie es online!

Erläuterung

ẋ                          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.
Geschäfts-Katze
quelle
1

Gelee , 28 Bytes

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

Probieren Sie es online!

Ich hatte die Idee, die Links in Zeilen von Jonathan Allans Antwort für -2 Bytes zu trennen .

Erik der Outgolfer
quelle
1

APL (Dyalog) , 30 Bytes

Inspiriert von der Lösung von lstefano .

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

Probieren Sie es online!

{} Anonyme Funktion, bei der das Argument dargestellt wird durch :

0:: Wenn ein Fehler auftritt:

  0 Null zurückgeben

 jetzt versuchen:

  ⍵∩⎕D der Schnittpunkt des Arguments und der Satz von D igits (entfernt Ausrufezeichen)

   führe das aus (verwandelt es in eine Zahl)

  Das weiß ich

  ()/ Fügen Sie die folgende Funktion zwischen den Begriffen ein (APL ist je nach Bedarf rechtsassoziativ):

   ⍵~⎕D Argument ohne D igits (lässt Ausrufezeichen)

   Zählen Sie das zusammen (dh wie viele Ausrufezeichen)

  '×+-⌹'⊃⍨ benutze das, um aus der Liste der Symbole zu wählen *

   Ausführen (verwandelt das Symbol in eine Funktion)


(Matrix Division) wird anstelle von ÷(Normal Division) verwendet, um einen Fehler in einer leeren Liste zu verursachen

Adam
quelle
Was macht ::man in einer DFN?
Zacharý
Es ist ein Fehlerschutz . Wenn zu irgendeinem Zeitpunkt nach dem Einrichten des Fehlerschutzes ein Fehler mit einer der Zahlen (0 = 1… 999, 1000 = 1001…) links von ::auftritt, ::wird sofort der Wert rechts von zurückgegeben.
Adám
Nun, das wusste ich nie, danke!
Zacharý
0

Dyalog APL, mindestens 29 Zeichen

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

Der Ausdruck ist fast richtig. Es besteht alle Testfälle EXCEPT, 0!!!!für die es 1anstelle der erforderlichen gibt, 0und das liegt daran, dass in APL die Reduktion eines leeren Vektors das neutrale Element für die zur Reduktion verwendete Funktion zurückgeben soll. Für den Quotienten, der 1 ist. Im Moment habe ich keine Zeit, ihn zu reparieren, aber ich lasse ihn hier für einen regnerischen Tag.

lstefano
quelle
Es regnet: {0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D} Probieren Sie es online!
Adám
Sehr cool! Es macht mir überhaupt nichts aus, wenn Sie es als Ihre Lösung behaupten, da die Unterschiede mehr sind als die Ähnlichkeiten.
lstefano
Erledigt.
Adám
0

Mathematica, 152 Bytes

(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
quelle
0

Javascript, 111 163 Bytes

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

Lesbare Version

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
quelle