Fakta tambahan!

17

Dalam matematika, faktorial, disingkat "fakta" dari bilangan bulat n -negatif , dilambangkan dengan n! , adalah produk dari semua bilangan bulat positif kurang dari atau sama dengan n . Misalnya, 5! adalah 1 * 2 * 3 * 4 * 5 = 120

Faktorial dari 0 adalah 1 , menurut konvensi untuk produk kosong.


Ini adalah fakta biasa yang biasa kita alami. Mari kita tambahkan beberapa alternatif:

  1. Faktorial (didefinisikan di atas)
  2. Faktorial ganda: n !! = 1 + 2 + ... + n
  3. Tiga faktor: n !!! = 1 - (2 - (3 - (... - n))) ...)
  4. Faktor empat kali lipat: n !!!! = 1 / (2 / (3 ... / n))) ...) . Catatan: Ini adalah divisi floating point, bukan divisi integer.

Tantangan

Mengambil masukan bilangan bulat non-negatif n , langsung diikuti oleh antara 1 dan 4 tanda seru. Input akan terlihat (persis) seperti ini: 0! , 5 !! , 132 !!! atau 4 !!!! . Dalam tantangan ini, Anda mungkin tidak menganggap format input yang fleksibel, maaf.

Keluaran

Hasilnya harus berupa hasil, pada format apa pun yang nyaman. Hasil faktorial empat kali lipat harus memiliki minimal 2 digit setelah titik desimal, kecuali 0 !!!! = 0 .

Kasus uji:

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

Solusi terpendek di setiap bahasa menang.

Stewie Griffin
sumber
2
Bisakah faktorial empat kali lipat juga menjadi pembagian yang rasional?
Martin Ender
6
Definisi "The double factorial" tidak cocok ...
Erik the Outgolfer
4
@Erik, ini fakta ganda alternatif ;-)
Stewie Griffin
1
@StewieGriffin BTW itu agak licik bahwa 0!-> 1.
Erik the Outgolfer
5
Judul harus Fakta Alternatif
Trauma Digital

Jawaban:

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

Uji kasus

Diformat dan dikomentari

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

Sekam , 15 byte

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

Cobalah online!

Penjelasan

Pengindeksan ke dalam daftar fungsi: kesenangan menggunakan bahasa fungsional.

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

Saya menggunakan rentang menurun dan lipatan kiri, karena -dan /mengambil argumen mereka dalam urutan terbalik di Sekam.

Zgarb
sumber
Indexing into a list of functionsis woah ...
Erik the Outgolfer
Saya sedang memikirkan Haskell, dan kemudian saya melihat ini ... Tampaknya benar-benar menjadi alat yang tepat untuk pekerjaan itu. +1
alleks
Inilah yang dibuat oleh Husk: D
Leo
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;}

Cobalah online!

Bagian terbaik dari kode golf adalah hal-hal yang Anda pelajari sambil mencoba menyelesaikan tantangan. Dalam yang ini saya telah belajar bahwa di C # Anda dapat memotong karakter lain selain spasi putih dari string.

  • 4 byte disimpan berkat LiefdeWen!
  • 2 byte disimpan karena saya tidak perlu mengurangi 1 s.Split('!').Length, cukup perbaiki batas dalam e>4?i/r:e>3?i-r:e>2?i+r:i*rdan n<1&e<3?1:r.
Charlie
sumber
1
Anda dapat membuat e ndan ijuga doubleuntuk menghindari menyatakannya untuk r untuk menyimpan 4 byte.
LiefdeWen
1
@ LiefdeWen Atau floatuntuk menyimpan byte lain.
Kevin Cruijssen
4

Perl 5 , 62 byte

61 byte kode +1 untuk -p .

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

Terima kasih kepada @GB karena telah menunjukkan kesalahan saya!

Cobalah online! (ini digunakan -luntuk keterbacaan)

Dom Hastings
sumber
4
0! seharusnya 1 bukan 0
GB
@ GB Yah itu tidak masuk akal ... Tetap untuk +5!
Dom Hastings
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)}

Coba beberapa test case!

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
sumber
el(strsplit(s,"!")) menghemat 1 byte
bouncyball
4

Python3, 124 130 121 119 byte

Pada titik ini, saya percaya rekursi adalah kunci untuk penghematan byte lebih lanjut.

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

Coba testcases di Coba online!

-9 byte terima kasih kepada @ Mr.Xcoder !

-2 byte berkat @Felipe Nardi Batista !

Yytsi
sumber
Gagal untuk 6! . Seharusnya 720.
Tn. Xcoder
Saya memperbarui test suite Tio.
Tn. Xcoder
-3 byte .
Tn. Xcoder
Oh ya, tentu saja, tidak
melihatnya
2
Lihatlah ES6
Erik the Outgolfer
3

Pyth , 34 30 byte

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

Cobalah online!

Penjelasan

+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
sumber
Menggunakan.U menghemat satu byte.
Erik the Outgolfer
2

05AB1E , 27 byte

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

Cobalah online!

Erik the Outgolfer
sumber
Tahukah Anda mengapa „.»tidak berhasil?
Riley
@Riley »adalah bagian dari string terkompresi yang belum selesai, sehingga kesalahan keluar dan, seperti biasanya di 05AB1E, kesalahan diabaikan.
Erik the Outgolfer
Saya coba lakukan "*+-/"èUsetelah menggunakan Ltindak lanjut .»Xtetapi memperlakukannya Xsebagai string, bukan perintah dan .»X.Vbahkan lebih menang.
Magic Octopus Mm
@MagicOctopusUrn Xtidak eval. X.Vdua perintah.
Erik the Outgolfer
@EriktheOutgolfer ya, tapi saya berharap itu akan eval sebelum memproses flip.Berharap , tidak mengharapkan :(. Bisa bersumpah ada "menggunakan String karakter tunggal sebagai perintah dalam rantai diad" atau sesuatu.
Magic Octopus Mm
2

Ruby , 83 80 79 byte

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

Cobalah online!

Penjelasan:

->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
sumber
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) berkat jawaban C # dari @CarlosAlejo .

Penjelasan:

Coba di sini.

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
sumber
1
Saya telah melihat jawaban yang sama di tempat lain ...: -DI keep lupa bahwa floatlebih pendek dari double.
Charlie
@CarlosAlejo Ya, saya perhatikan jawaban Anda setelah jawaban 141 byte awal saya. Mengubah float q=s.length()-(s=s.replace("!","")).length(),n=new Float(s)ke jawaban saat ini menyelamatkan saya 5 byte. :) Lupa menambahkan " byte yang disimpan berkat " bagian yang saya perhatikan sekarang .. Maaf tentang itu.
Kevin Cruijssen
oh, tidak apa-apa, aku senang kamu menyukai jawabanku. :-)
Charlie
2

Jelly ,  24 23 26  25 byte

+  3  2 byte ditambal untuk diperbaiki setelah salah tafsir :(

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

Program lengkap (tautan monadik dengan tautan pembantu yang dirujuk oleh lokasi program)

Cobalah online! atau lihat a test suite .

Bagaimana?

× - 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
sumber
Gagal untuk 0!.
Erik the Outgolfer
Oh, haha ​​- Saya telah membaca komentar Anda di bawah OP salah - saya pikir mereka telah membuat 0! didefinisikan sebagai 0 yang akan salah.
Jonathan Allan
Semua sudah diperbaiki sekarang :)
Jonathan Allan
Sayang sekali TIO rusak sekarang sehingga saya tidak bisa menguji apakah masih salah. :(: P Juga terlalu buruk bahwa Anda tidak dapat menggunakan /. Pada daftar kosong D: EDIT: Ternyata berlaku untuk 0!, 0!!, 0!!!dan 0!!!!1.
Erik yang Outgolfer
2

Memodifikasi sendiri kode mesin x86_64, 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

Mengapa bahasa yang ditafsirkan dapat menjalankan kode secara dinamis dengan mewah eval s , tetapi bukan kode mesin biasa?

Cobalah dengan:

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

Majelis:

_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

Penjelasan akan ditambahkan nanti. Ide dasarnya adalah memodifikasi divss xmm0, xmm1instruksi di 0x100000db0dan menggantinya dengan mulss,addss , subssataudivss sesuai dengan operan disediakan. Trik kecil juga digunakan untuk melewatkan string input.

Majelis dihasilkan dengan:

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

Disimpan 9 byte berkat Zgarb dan nimi.

Cobalah online.

Cristian Lupascu
sumber
@ Zgarb Anda benar. Tetap.
Cristian Lupascu
Saya pikir Anda juga dapat meninggalkan parens di sekitar read n, dan f=tidak perlu sesuai aturan kami .
Zgarb
@ Zgarb Benar lagi :). Terima kasih!
Cristian Lupascu
Beralih kembali ke fungsi bernama dan menggunakan lexmenghemat dua byte: f s|[(n,b)]<-lex s=read n!(length b-1).
nimi
@nimi Wow, terima kasih! Saya sangat baru di Haskell sehingga saya tidak tahu lex. Itu luar biasa! :) Saya tidak melihat bagaimana cara menghemat byte - saya mendapatkan 99 byte setelah ini.
Cristian Lupascu
1

Gaia , 26 25 byte

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

Cobalah online!

Penjelasan

ẋ                          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.
Kucing Bisnis
sumber
1

Jelly , 28 byte

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

Cobalah online!

Mendapat ide untuk memisahkan tautan menjadi beberapa baris dari jawaban Jonathan Allan untuk -2 byte.

Erik the Outgolfer
sumber
1

APL (Dyalog) , 30 byte

Terinspirasi oleh solusi lstefano .

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

Cobalah online!

{... } fungsi anonim di mana argumen diwakili oleh :

0:: jika terjadi kesalahan:

  0 mengembalikan nol

 sekarang coba:

  ⍵∩⎕D persimpangan argumen dan himpunan D igit (menghilangkan tanda seru)

   jalankan itu (mengubahnya menjadi angka)

  d temukan itu

  (... )/ masukkan (APL asosiatif benar, sesuai kebutuhan) fungsi berikut antar istilah:

   ⍵~⎕D argumen tanpa D igits (meninggalkan tanda seru)

   tally itu (yaitu berapa banyak tanda seru)

  '×+-⌹'⊃⍨ gunakan itu untuk memilih dari daftar simbol *

   mengeksekusi (mengubah simbol menjadi fungsi)


(pembagian matriks) digunakan sebagai ganti ÷(pembagian normal) untuk menyebabkan kesalahan pada daftar kosong

Adm
sumber
Apa yang ::dilakukan di dfn?
Zacharý
Itu adalah penjaga kesalahan . Jika pada suatu titik setelah penjaga kesalahan diatur, kesalahan dengan salah satu angka (0 = 1 ... 999, 1000 = 1001 ...) di sebelah kiri ::terjadi, maka nilai di sebelah kanan ::segera dikembalikan.
Adám
Yah, saya tidak pernah tahu tentang itu, terima kasih!
Zacharý
0

Perl 5 , 96 byte

s/(\d+)//;@a=1..$1;$"=qw|* + -( /(|[$l=-1+length];$_=$1?"@a".($l>1?')'x($1-1):''):$l?0:1;$_=eval

Cobalah online!

Xcali
sumber
0

Dyalog APL, setidaknya 29 karakter

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

Ungkapannya HAMPIR benar. Ini melewati semua kasus uji KECUALI 0!!!!yang ia berikan 1bukan yang diperlukan 0dan itu karena dalam APL pengurangan vektor kosong seharusnya mengembalikan elemen netral untuk fungsi yang digunakan untuk mengurangi. Untuk hasil bagi itu adalah 1. Saat ini saya tidak punya waktu untuk mencoba dan memperbaikinya tetapi saya akan meninggalkannya di sini untuk hari hujan.

lstefano
sumber
Hujan: {0::0⋄(⍎'×+-⌹'⊃⍨≢⍵~⎕D)/⍳⍎⍵∩⎕D} Coba online!
Adám
Sangat keren! Saya tidak keberatan sama sekali jika Anda mengklaimnya sebagai solusi Anda, mengingat perbedaannya lebih dari kesamaan.
lstefano
Selesai
Adám
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]])&
J42161217
sumber
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)))

Versi yang Dapat Dibaca

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
sumber