Naikkan bilangan bulat x ke daya x, tanpa built-in eksponensial


16

Tugas - Judul ini merangkum cukup banyak: naikkan integer x ke power x , di mana 0<x.

Pembatasan:

  • Gunakan exponentiation, exp(), ln(), dan setiap kekuatan-lain yang terkait bahasa built-in, seperti pow(), x^x, x**xdilarang.
  • Anda dapat mengasumsikan bahwa bilangan bulat yang diberikan sesuai dengan batas bahasa pemrograman pilihan Anda.

Kasus uji:

Input | Output
---------------
2     | 4
3     | 27
5     | 3125
6     | 46656
10    | 10000000000

Ini adalah , jadi program terpendek dalam byte menang.


Bisakah kita menerima input sebagai string?
Shaggy

Saya telah mengedit ini, berharap itu akan dibuka kembali. Saya menghapus aturan 3 dan sebaliknya menyatakan bahwa itu harus menjadi program lengkap, seperti yang mungkin dimaksudkan oleh OP
Tn. Xcoder

Jauh lebih baik, @ Mr.Xcoder tapi saya sarankan menghapus (atau menulis ulang) pembatasan kedua. Apakah "bukan fungsi" mengecualikan JS dari berpartisipasi? Saya juga menyarankan, untuk keperluan tantangan, bahwa kita harus menangani 0dan bahwa output yang diharapkan ditentukan ( 0atau 1atau salah satu). Akhirnya, harus menangani bilangan bulat negatif akan menjadi tambahan yang bagus untuk tantangan.
Shaggy

@Shaggy menambahkan js kembali ... dihitung 0 ^ 0 pada kalkulator apel dan dikembalikan 1. Mungkin 1 harus menjadi nilai yang dipilih, karena Python juga kembali 1untuk 0^0. Namun, Foundation+ Swift mengembalikan 0
Tn. Xcoder

1
@ Mr.Xcoder, saya telah menghapus "pembatasan" yang tidak perlu kami tangani 0dan sebaliknya menetapkannya 0<xdi awal. Saya juga menghapus batasan bahwa kode tidak boleh melempar kesalahan; itu harus pergi tanpa berkata. Silakan kembali jika perlu.
Shaggy

Jawaban:


15

APL (Dyalog) , 4 byte

Untuk x x , ambil x sebagai argumen kiri dan x sebagai argumen kanan.

×/⍴⍨

Coba semua kasing online!

×/ produk dari

⍴⍨ salinan salinan arg

Dan di sini di sini ada yang menangani bilangan bulat negatif juga:

×/|⍴|*×

Coba semua kasing!

×/ produk dari

| nilai mutlak

r epetisi dari

| nilai absolut

* untuk kekuatan

× signum

Primitif Daya bawaan adalah:

x*y


9

Mathematica, 16 byte

Saya punya dua solusi pada hitungan byte ini:

1##&@@#~Table~#&

Di sini, #~Table~#buat daftar nsalinan n. Kemudian Listkepala diganti dengan 1##&yang mengalikan semua argumennya.

Nest[n#&,1,n=#]&

Ini hanya menyimpan input ndan kemudian dikalikan 1dengan n, nkali.


1
#~Product~{#}&
alephalpha

1
@alephpha ah, poin bagus. Anda dapat mempostingnya sebagai jawaban terpisah.
Martin Ender

5

JavaScript (ES6), 33 28 25 24 byte

n=>g=(x=n)=>--x?n*g(x):n

Cobalah

f=
n=>g=(x=n)=>--x?n*g(x):n
o.innerText=f(i.value=3)()
i.oninput=_=>o.innerText=f(+i.value)()
<input id=i min=1 type=number><pre id=o>


Sejarah

25 byte

f=(n,x=n)=>--x?n*f(n,x):n

28 byte

n=>eval(1+("*"+n).repeat(n))

33 byte

n=>eval(Array(n).fill(n).join`*`)

4

Bash murni, 43

echo $[$1<2?1:$[$1<2?2:$1]#`printf 1%0$1d`]

Cobalah online .

Tidak yakin apakah ini terlalu banyak membengkokkan aturan - saya tidak menggunakan salah satu builtin terlarang yang terdaftar, tapi saya menggunakan konversi basis.

  • printf 1%0$1doutput a 1diikuti oleh n 0s
  • $[b#a]adalah ekspansi aritmatika untuk diperlakukan asebagai angka dasar b, yang memberikan hasil yang diperlukan. Sayangnya basis <2 tidak berfungsi, sehingga ?:bit ekstra menangani input n = 1.

Input maksimum adalah 15, karena bash menggunakan integer 64-bit yang telah ditandatangani (hingga 2 31 -1).


Masalah yang sama seperti yang saya miliki, ini tidak berfungsi untuk x = 1. Meskipun demikian, pendekatan yang sangat menarik.
Maxim Mikhaylov

@ MaxLawnboy Terima kasih telah menunjukkan itu - yang sedih membengkak jawaban saya. Mungkin saya bisa mencari tahu versi lain yang lebih pendek ...
Digital Trauma

Hal yang keren. Selalu ingin belajar bash, tetapi selalu terlalu malas untuk itu =)

4

Alice , 13 byte

/o
\i@/.&.t&*

Cobalah online!

Penjelasan

/o
\i@/...

Ini adalah kerangka kerja untuk program yang membaca dan menulis bilangan bulat desimal dan beroperasi sepenuhnya dalam mode Kardinal (jadi program untuk sebagian besar masalah aritmatika).

.    Duplicate n.
&.   Make n copies of n.
t    Decrement the top copy to n-1.
&*   Multiply the top two values on the stack n-1 times, computing n^n.

4

ML standar , 42 byte

fn x=>foldl op*1(List.tabulate(x,fn y=>x))

Cobalah online!

Penjelasan:

fn y => x                 (* An anonymous function that always returns the inputted value *)
List.tabulate(x, fn y=>x) (* Create a list of size x where each item is x *)
foldl op* 1               (* Compute the product of the entire list *)    

1
Selamat datang di PPCG!
Martin Ender

1
TIO memiliki MLton sekarang. tio.run/nexus/…
Dennis

Oh, itu luar biasa! Terima kasih!
musicman523

3

Jelly , 3 byte

ẋ⁸P

Cobalah online!

Bagaimana?

ẋ⁸P - Main link: x             e.g. 4
 ⁸  - link's left argument, x       4
ẋ   - repeat left right times       [4,4,4,4]
  P - product                       256

Sial, aku ingin melakukan ini. : P
HyperNeutrino

@ Jonathan Allan apakah 3 byte, atau 3 karakter lebar? mari kita lihat kode sumber hex dump, tolong, untuk membuat keputusan yang benar pada bytesize kode aktual. ;-) dan lakukan koreksi

1
@ xakepp35 Jelly menggunakan SBCS dan tautan byte di tajuknya. Program dengan hexdump F7 88 50berfungsi sebagaimana dimaksud.
Dennis

@Dennis terima kasih atas balasan! saya tidak pernah bisa membayangkan bahasa seperti itu sebelumnya =)

3

Cubix , 19 byte

..@OI:1*s;pu!vqW|($

Cobalah online!

Selangkah demi selangkah

Mengembang ke kubus dengan panjang sisi 2

    . .
    @ O
I : 1 * s ; p u
! v q W | ( $ .
    . .
    . .
  • I:1 Mengambil input, menduplikat dan mendorong 1. Ini mengatur tumpukan dengan penghitung, pengganda, dan hasil.
  • *s; Lipat gandakan TOS, tukar hasil dengan sebelumnya dan hapus sebelumnya.
  • puBawa item counter ke TOS. Putar balik. Ini digunakan untuk menjadi perubahan jalur, tetapi harus mencukur byte.
  • |($Ini dilakukan untuk menghemat satu byte. Saat dipukul, lompatan decrement. mencerminkan, mengurangi konter dan melompati no op yang membungkus kubus.
  • !vqWUji penghitungnya. Jika benar-benar melewati pengalihan, letakkan penghitung di BOS, ubah jalur kembali ke pengganda. Kalau tidak redirect.
  • |sO@ini adalah urutan akhir yang diarahkan ke dari uji tandingan. Melewati pantulan horizontal, menukar TOS yang membawa hasil ke TOS, ouput dan berhenti.

3

R, 22 byte

dibaca xdari stdin.

prod(rep(x<-scan(),x))

menghasilkan daftar xsalinan x, kemudian menghitung produk dari elemen daftar itu. Kapanx=0 , reppengembalian numeric(0), yang merupakan vektor numerik panjang 0, tetapi prodyang adalah 1, jadi 0^0=1dengan metode ini, yang konsisten dengan eksponensial builtin R, jadi itu cukup rapi.

Cobalah online!


3

bahasa mesin x86_64 untuk Linux, 14 11 10 byte

0:   6a 01                   pushq  $0x1
2:   58                      pop    %rax
3:   89 f9                   mov    %edi,%ecx
5:   f7 ef                   imul   %edi
7:   e2 fc                   loop   5
9:   c3                      retq

Untuk Mencoba secara online! , kompilasi dan jalankan program C berikut.

const char h[]="\x6a\1\x58\x89\xf9\xf7\xef\xe2\xfc\xc3";

int main(){
  for( int i = 1; i < 4; i++ ) {
    printf( "%d %d\n", i, ((int(*)())h)(i) );
  }
}




2

05AB1E , 3 byte

.DP

Cobalah online! atau Coba semua contoh

.D  # pop a,b    push b copies of a 
    # 05AB1E implicitly takes from input if there aren't enough values on the stack
    # For input 5, this gives us the array: [5,5,5,5,5]
  P # Take the product of that array
    # Implicit print

Sepertinya kamu menikmati .D. Pertama kali saya melihatnya digunakan.
Magic Gurita Guci

ah, saya tidak mengerti apa yang terjadi di sini .. sepertinya terlalu eksotis dan tidak ada penjelasan tentang cara kerjanya. = (

@ xakepp35 Apakah itu membantu?
Riley


2

Japt , 4 byte

ÆUÃ×

Cobalah online!

Penjelasan

ÆUÃ×       // implicit: U = input integer
Uo{U} r*1  // ungolfed

Uo{ }      // create array [0, U) and map each value to...
   U       //   the input value
      r*1  // reduce with multiplication, starting at 1          
           // implicit output of result

2

kode mesin x86 (Linux), 18 byte

31 c0 ff c0 31 db 39 df 74 07 0f af c7 ff c3 eb f5 c3

Diharapkan deklarasi C sebagai berikut extern int XpowX(int).

Dibongkar

XpowX:
  # edi : input register
  # ebx : counter
  # eax : result register
  xor  %eax, %eax    # result  = 0
  inc  %eax          # result += 1
  xor  %ebx, %ebx    # counter = 0
  loop:
    cmp  %ebx, %edi  # if (counter == input)
    je   done        #   return result
    imul %edi, %eax  # result  *= input
    inc        %ebx  # counter += 1
    jmp   loop
  done:
    ret


1

CJam , 7 byte

ri_a*:*

Cobalah online!

Penjelasan

ri       e# Read an int from input
  _      e# Duplicate it
   a*    e# Put the copy in the array and repeat it that many times
     :*  e# Take the product of the array

1

Perl 6 , 13 byte

{[*] $_ xx$_}

$_ xx $_mengevaluasi ke daftar $_salinan $_( $_menjadi argumen untuk fungsi anonim), dan kemudian [*]mengurangi daftar itu dengan multiplikasi.


1

CJam , 6 byte

ri_m*,

Cobalah online!

ri       e# Read integer
  _      e# Duplicate
   m*    e# Cartesian power. The first argument is interpreted as a range
     ,   e# Number of elements. Implicitly display


1

Röda , 17 byte

{product([_]*_1)}

Cobalah online!

Ini adalah fungsi anonim yang mengambil input dari aliran.

Penjelasan:

{product([_]*_1)}
{               } /* An anonymous function */
         [_]      /* An array containing the input value */
            *_1   /* repeated times the input value */
 product(      )  /* Product of all values in the array */

1

dc , 24 23 26 22 byte

Ini adalah upaya pertama saya menulis makro rekursif di dc. Saya yakin itu adalah solusi sub-optimal yang dapat ditingkatkan banyak.

dsr1+[lrr1-d1<F*]dsFxp

Cobalah online!

Sunting: Terima kasih eush77 ! -4 byte.


1
Tidak bekerja untuk x=1.
eush77

Anda dapat memotong dua byte dengan mengganti lrurutan di akhir dengan dua ds di awal.
eush77

Sebenarnya, kamu tidak butuh itu. Cukup tambahkan bagian atas tumpukan sebelum memanggil untuk pertama kalinya. Dengan cara ini Anda akan berakhir dengan xsalinan xdi stack (dan 1tentu saja), dan xmultiplikasi sesudahnya. Jadi endingnya bisa jelas dsFxp.
eush77

@ eush77 Saya hampir mengatakan bahwa menghapus kedua lrtidak akan berhasil di sini. Ini pertama kalinya saya bermain golf dalam bahasa berbasis stack, jadi rasanya sangat tidak biasa. Terima kasih atas bantuan Anda!
Maxim Mikhaylov

1

Batch, 58 byte

@set n=1
@for /l %%i in (1,1,%1)do @set/an*=%1
@echo %n%

Hanya berfungsi untuk input satu digit karena aritmatika 32-bit.


1

brainf * ck , 148 byte

,[->+>+<<]>>[-<<+>>]++++++++[<------<------>>-]<[->>+>>+<<<<]>>[-<<+>>]>>-[-<<<<<[>[>+>+<<-]>>[<<+>>-]<<<-]>>[-<<+>>]>>>]<<<++++++++[-<<++++++>>]<<.

Cobalah online!

Tidak ada bawaan;)

Bagaimana itu bekerja

,                                       - get ascii input
[->+>+<<]                               - duplicate input
>>[-<<+>>]                              - shift inputs left to start
++++++++[<------<------>>-]             - convert ascii into input numbers
<[->>+>>+<<<<]                          - get loop intervals (same as input #)
>>[-<<+>>]                              - shift input back again
>>-[-<<<<<[>[>+>+<<-]>>[<<+>>-]<<<-]>>  - iterated addition (multiplication)
[-<<+>>]>>>                             - Shift output back into input
]<<<++++++++[-<<++++++>>]<<.            - convert final output to ascii

Singkatnya, ini bekerja dengan mengalikan x(input) dengan sendirinya xkali. (alias tambahan iterasi berulang). Hasil akhirnya adalah x ^ x.

I / O

Program ini mengambil input ASCII tunggal, dan memprosesnya dengan indeks ASCII minus 48 . Yang minus 48 adalah untuk menormalkan input dari angka aktual ( 4menjadi 52-> 52-48-> 4). Untuk memasukkan angka yang lebih tinggi dari 9, gunakan karakter ASCII yang berkaitan dengan waktu yang tepat ( :-> 58-48-> 10). Program ini berjalan dengan cara yang sama.

Tes I / O

INPUT > PROCESSED INPUT >> OUTPUT > TRANSLATED OUTPUT
1 > 1 >> 1 > 1
2 > 2 >> 4 > 4
3 > 3 >> K > 27

Karena tidak ada karakter ASCII yang dapat dicetak setelah input 3, maka hanya dapat mencetak angka secara teori . Padahal, Anda dapat memeriksa semua input yang benar-benar berfungsi pada visualisator seperti ini .



1

Python, 32 byte

f=lambda g,z=1:z>g or g*f(g,z+1)

Cobalah online!


Selamat datang di PPCG! Anda tidak perlu menghitung f=bagian, sehingga Anda dapat mempersingkat pengiriman hingga 30 byte .
Steadybox

@Steadybox Bagian f=ini perlu dihitung, karena ini bersifat rekursif, jadi itu bergantung pada fungsi yang disebutkan funtuk bekerja dengan baik
musicman523

@ musicman523 Ya, Anda benar.
Steadybox

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.