Exponentiation yerleşik olmadan x tamsayısını x gücüne yükseltin


16

Görev - Başlık hemen hemen o özetliyor: zam bir tamsayı x güç için x , 0<x.

Kısıtlamalar:

  • Üs alma kullanın exp(), ln()ve diğer güçler alakalı dil yerleşik ins gibi pow(), x^x, x**xyasaktır.
  • Verilen tamsayının seçtiğiniz programlama dilinin sınırlarına uyduğunu varsayabilirsiniz.

Test senaryoları:

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

Bu , bu nedenle bayttaki en kısa program kazanır.


Girişi dize olarak kabul edebilir miyiz?
— Shaggy

Yeniden açılacağını umarak bu konuda bir düzenleme yaptım. Kural 3'ü sildim ve bunun yerine OP'nin muhtemelen amaçladığı gibi tam bir program olması gerektiğini söyledim
— Bay Xcoder

Çok daha iyi, @ Mr.Xcoder ama ikinci kısıtlamayı kaldırmanızı (veya yeniden düzenlemenizi) öneririm. "Bir işlev değil", JS'nin katılmasını engelliyor mu? Ayrıca, meydan okuma amacıyla, ele almamız gerektiğini 0ve beklenen çıktının belirtileceğini ( 0ya 1da ya da birini) öneririm . Son olarak, negatif tamsayıları ele almak zorluğa iyi bir katkı olacaktır.
— Shaggy

@Shaggy js'yi geri ekledi ... elma hesap makinesinde 0 ^ 0 hesapladı ve 1 döndürdü. Belki Python da geri döndüğü 1için seçilen değer olmalı 1 0^0. Ancak Foundation+ Swift 0 döndürür
— Bay Xcoder

1
@ Mr.Xcoder, ele almamamız gereken "kısıtlamayı" kaldırdım 0ve bunun yerine girişte belirttik 0<x. Ayrıca kod hataları atmak gerektiğini kısıtlamayı kaldırdı; söylemeye gerek yok. Gerekirse geri dönmekten çekinmeyin.
— Shaggy

Yanıtlar:




9

Mathematica, 16 bayt

Bu bayt sayımında iki çözümüm var:

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

Burada, kopyalarının #~Table~#bir listesini oluşturur . Daha sonra kafa, tüm argümanlarını bir araya getiren ikame ile değiştirilir .nnList1##&

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

Bu basitçe girişi saklar nve daha sonra çarpma 1tarafından n, nbazen.


1
#~Product~{#}&
— alephalpha

1
@ alephalpha ah, iyi bir nokta. Bunu ayrı bir cevap olarak gönderebilirsiniz.
— Martin Ender

5

JavaScript (ES6), 33 28 25 24 bayt

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

Dene

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>


Tarih

25 bayt

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

28 bayt

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

33 bayt

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

4

Saf bash, 43

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

Çevrimiçi deneyin .

Bu kuralların çok fazla bükülüp bükülmediğinden emin değilim - Listelenen yasaklanmış yapıların hiçbirini kullanmıyorum, ancak taban dönüşümünü kullanıyorum.

  • printf 1%0$1dçıktıları ve 1ardından n 0s
  • $[b#a]gerekli sonucu veren abaz bsayı olarak işlem görecek aritmetik bir genişlemedir . Maalesef <2 tabanı çalışmıyor, bu nedenle ekstra ?:bitler n = 1 girişini işliyor.

Maksimum giriş 15'tir, çünkü bash imzalı 64 bitlik tamsayılar kullanır (2 31 -1'e kadar).


Bende aynı sorun, bu x = 1 için işe yaramaz. Yine de, çok ilginç bir yaklaşım.
— Maxim Mikhaylov

@MaxLawnboy Bunu işaret ettiğiniz için teşekkürler - bu ne yazık ki cevabımı şişirdi. Belki başka bir kısa versiyonu bulabilirim ...
— Dijital Travma

Güzel şeyler. Her zaman bash öğrenmek

4

Alice , 13 bayt

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

Çevrimiçi deneyin!

açıklama

/o
\i@/...

Bu, ondalık tam sayıları okuyan ve yazan ve tamamen Kardinal modda çalışan programlar için bir çerçevedir (bu nedenle çoğu aritmetik problem için programlar).

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


3

Jöle , 3 bayt

ẋ⁸P

Çevrimiçi deneyin!

Nasıl?

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

Lanet olsun, bunu yapmak istedim. : P
— HyperNeutrino

@Jonathan Allan 3 bayt mı yoksa 3 geniş karakter mi? gerçek kod bayt boyutu hakkında doğru karar vermek için lütfen kaynak kodu onaltılık dökümü inceleyelim. ;-) ve düzeltmeleri yapın

1
@ xakepp35 Jelly bir SBCS kullanır ve başlıktaki bayt bağlantısı bunu gösterir. Hexdump ile program F7 88 50istendiği gibi çalışır.
— Dennis

@Dennis cevap için teşekkürler! daha önce böyle bir dil hayal bile

3

Cubix , 19 bayt

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

Çevrimiçi deneyin!

Adım adım

Kenar uzunluğu 2 olan bir küpün üzerine genişler

    . .
    @ O
I : 1 * s ; p u
! v q W | ( $ .
    . .
    . .
  • I:1 Girişi alır, çoğaltır ve 1'i iter. Bu, yığını bir sayaç, çarpan ve sonuçla ayarlar.
  • *s; Hizmet Şartını çarpar, sonucu öncekiyle değiştirir ve öncekini kaldırır.
  • puSayaç öğesini Hizmet Şartları'na getirin. Senin sıran. Bu şerit değiştirmek için kullanılır, ancak bir bayt tıraş etmek gerekiyordu.
  • |($Bu bir baytı kurtarmak için yapıldı. Vurulduğunda azalmayı atlar. yansıtır, sayacı azaltır ve küpün etrafına sarılmamış op atlamayı atlar.
  • !vqWSayacı test edin. Eğer doğruluk, yönlendirmeyi atlarsa, sayacı BOS'a koyun, şeridi çarpan üzerine geri değiştirin. Aksi takdirde yeniden yönlendirin.
  • |sO@bu sayaç testinden yönlendirilen son dizidir. Yatay yansıtmanın ötesine geçer, TOS'u sonuç veren TOS, çıkış ve durma ile değiştirir.

3

R, 22 bayt

xstdin'den okur .

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

bir xkopyalar listesi oluşturur x, ardından bu listedeki öğelerin ürününü hesaplar. Ne zaman x=0, sayısal bir uzunluk vektörü olan , ama bunun 1 olduğu repdöndürmeler numeric(0), bu nedenle R'nin yerleşik üsleri ile tutarlı olan bu yöntemle, bu oldukça düzgün.0prod0^0=1

Çevrimiçi deneyin!


3

Linux için x86_64 makine dili, 14 11 10 bayt

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

İçin çevrimiçi deneyin! , derleyin ve aşağıdaki C programını çalıştırın.

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 bayt

.DP

Çevrimiçi deneyin! veya Tüm örnekleri deneyin

.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

Hoşuna gitti gibi görünüyor .D. İlk kez kullanıldığını gördüm.
— Sihirli Ahtapot Urn

ah, burada ne olduğunu anlamıyorum .. çok egzotik görünüyor ve bunun nasıl çalıştığına dair bir açıklama yok. = (

@ xakepp35 Bu yardımcı oluyor mu?
— Riley


2

Japt , 4 bayt

ÆUÃ×

Çevrimiçi deneyin!

açıklama

Æ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

x86 makine kodu (Linux), 18 bayt

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

Aşağıdaki gibi bir C beyanı bekler extern int XpowX(int) .

Demonte

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 bayt

ri_a*:*

Çevrimiçi deneyin!

açıklama

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 bayt

{[*] $_ xx$_}

$_ xx $_$_kopyalarının listesine göre değerlendirir $_($_ anonim işlevin bağımsız değişkeni) ve sonra [*]bu listeyi çarpma ile azaltır.


1

CJam , 6 bayt

ri_m*,

Çevrimiçi deneyin!

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 bayt

{product([_]*_1)}

Çevrimiçi deneyin!

Akıştan girdi alan anonim bir işlevdir.

Açıklama:

{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 bayt

Bu benim dc'de özyinelemeli bir makro yazma ilk denemem. Eminim ki çok geliştirilebilecek en uygun çözümdür.

dsr1+[lrr1-d1<F*]dsFxp

Çevrimiçi deneyin!

Düzenleme: Teşekkürler eush77 ! -4 bayt.


1
İçin çalışmıyor x=1.
— eush77

Sondaki lrdizileri dbaşlangıçta iki s ile değiştirerek iki baytı tıraş edebilirsiniz .
— eush77

Aslında buna ihtiyacınız yok. İlk kez aramadan önce yığının üst kısmını artırın. Bu şekilde yığının (ve tabii ki) xkopyalarını ve daha sonra çarpmalarla sonuçlanacaksınız . Yani son basit olabilir . x1xdsFxp
— eush77

@ eush77 İkincisini kaldırmanın lrburada işe yaramayacağını söylemek üzereydim . Yığına dayalı bir dilde ilk kez golf oynadığım için çok sıradışı geliyor. Yardımın için teşekkürler!
— Maxim Mikhaylov

1

Toplu, 58 bayt

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

Sadece 32 bit aritmetik nedeniyle tek haneli girişler için çalışır.


1

brainf * ck , 148 bayt

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

Çevrimiçi deneyin!

Yerleşik yok;)

Nasıl çalışır

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

Özetle, bu, x(girdi) ile çarpı çarparak çalışır x. (yinelenen ek olarak yineleme). Net sonuç x ^ x şeklindedir.

I / O

Program tek bir ASCII girişi alır ve ASCII dizini eksi 48 olarak işler . Eksi 48 gerçek sayılar girişlerini normalleştirmektir ( 4olur 52-> 52-48-> 4). 9'dan daha büyük bir sayı girmek için, bir sonraki uygun ASCII karakterini kullanın ( :-> 58-48->10 ) kullanın. Program benzer bir şekilde çıkar.

Test G / Ç

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

3 girişinden sonra yazdırılabilir ASCII karakterleri bulunmadığından, yalnızca teoride sayıları yazdırabilir . Gerçi, tüm girişler gibi grafikerliği üzerinde aslında çalışmalarında yapmak kontrol edebilirsiniz bu .



1

Python, 32 bayt

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

Çevrimiçi deneyin!


PPCG'ye Hoşgeldiniz! Parçayı saymanıza gerek yoktur f=, böylece gönderiminizi 30 bayta kısaltabilirsiniz .
— Steadybox

@Steadybox Parçanın f=sayılması gerekir, çünkü özyinelemeli, bu yüzden fdüzgün çalışmak için adlandırılan işleve dayanır
— musicman523

@ musicman523 Evet, haklısın.
— Steadybox

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.