Підніміть ціле число x до потужності x, без вбудованих експоненцій


16

Завдання - Заголовок в значній мірі підсумовує його: підняти ціле число x до влади x , де 0<x.

Обмеження:

  • Використання в експоненціаціі, exp(), ln(), а також будь-які інші повноваження , пов'язані з мовою вбудовані модулі, як pow(), x^x, x**xзаборонено.
  • Можна припустити, що дане ціле число відповідає межам мови програмування на ваш вибір.

Тестові приклади:

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

Це , тому виграє найкоротша програма в байтах.


Чи можемо ми прийняти введення як рядок?
Кудлатий

Я змінив це, сподіваючись, що воно буде відновлено. Я видалив правило 3 і замість цього заявив, що це має бути повноцінна програма, як, напевно, планувала ОП
Містер Xcoder

Набагато краще, @ Mr.Xcoder, але я пропоную зняти (або переробити слово) друге обмеження. Чи "функція" не виключає JS від участі? Я б також запропонував, для цілей виклику, що нам потрібно було б впоратися 0і вказати очікуваний результат ( 0або 1або будь-який). Нарешті, обробка негативних цілих чисел буде приємним доповненням до виклику.
Кудлатий

@Shaggy додав js ще в ... обчислював 0 ^ 0 на яблучному калькуляторі, і він повернувся 1. Можливо, 1 повинно бути вибраним значенням, тому що Python також повертається 1для 0^0. Однак Foundation+ Swift повертається 0
містер Xcoder

1
@ Mr.Xcoder, я видалив "обмеження", з яким нам не потрібно звертатися, 0і натомість вказав це 0<xу вхідних даних . Я також зняв обмеження, що код не повинен викидати помилки; це повинно безперечно говорити. Сміливо відкатуйтесь, якщо потрібно.
Кудлатий

Відповіді:


15

APL (Dyalog) , 4 байти

Для x x приймає x як лівий аргумент, а x як правий аргумент.

×/⍴⍨

Спробуйте всі випадки в Інтернеті!

×/ продукт

⍴⍨ арг. копії арг

І ось ось одне, що також обробляє негативні цілі числа:

×/|⍴|*×

Спробуйте всі випадки!

×/ продукт

| абсолютне значення

r епізоди

| абсолютне значення

* під силу

× синум

Вбудована потужність примітиву:

x*y


9

Математика, 16 байт

У цього байта є два рішення:

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

Тут #~Table~#створюється список nкопій n. Тоді Listголову замінюють, 1##&яка множує всі свої аргументи разом.

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

Це просто зберігає вхідні дані в nі потім множить 1від n, nчасу.


1
#~Product~{#}&
алефальфа

1
@alephalpha ах, хороший момент. Це можна опублікувати як окрему відповідь.
Мартін Ендер

5

JavaScript (ES6), 33 28 25 24 байт

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

Спробуй це

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>


Історія

25 байт

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

28 байт

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

33 байти

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

4

Чистий баш, 43

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

Спробуйте в Інтернеті .

Не впевнений, що це занадто згинає правила - я не використовую жодну із перелічених заборонених вбудованих програм, але я використовую базову конверсію.

  • printf 1%0$1dвиводить a з 1наступним n 0s
  • $[b#a]це арифметичне розширення, яке слід розглядати aяк базове bчисло, яке дає необхідний результат. На жаль, база <2 не працює, тому додаткові ?:біти обробляють вхід n = 1.

Максимальний вхід - 15, тому що bash використовує підписані 64-бітні цілі числа (до 2 31 -1).


Така ж проблема, як у мене, це не працює для x = 1. Тим не менш, дуже цікавий підхід.
Максим Михайлов

@MaxLawnboy Дякую за те, що вказав на це - це сумно роздуло мою відповідь. Можливо, я можу придумати ще одну більш коротку версію ...
Digital Trauma

Класні речі. Завжди хотів навчитися баш, але завжди був для цього занадто ледачий =)

4

Аліса , 13 байт

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

Спробуйте в Інтернеті!

Пояснення

/o
\i@/...

Це рамка для програм, які читають і записують десяткові цілі числа і працюють повністю у режимі Кардинала (тому програми для більшості арифметичних задач).

.    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 , 42 байти

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

Спробуйте в Інтернеті!

Пояснення:

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
Ласкаво просимо до PPCG!
Мартін Ендер

1
TIO має MLton зараз. tio.run/nexus/…
Денніс

О, це приголомшливо! Спасибі!
музикант523

3

Желе , 3 байти

ẋ⁸P

Спробуйте в Інтернеті!

Як?

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

Дарн, я хотів це зробити. : P
HyperNeutrino

@Jonathan Allan - це 3 байти чи 3 широкоформатні символи? давайте переглянемо вихідний код шістнадцятковий дамп, будь ласка, щоб прийняти правильне рішення про фактичний код байта. ;-) і внести виправлення

1
@ xakepp35 Jelly використовує SBCS, а посилання байтів у заголовку вказує на нього. Програма з hexdump F7 88 50працює за призначенням.
Денніс

@Dennis дякую за відповідь! я ніколи не міг уявити собі таку мову =)

3

Cubix , 19 байт

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

Спробуйте в Інтернеті!

Крок за кроком

Викладається на куб довжиною сторони 2

    . .
    @ O
I : 1 * s ; p u
! v q W | ( $ .
    . .
    . .
  • I:1 Бере вхід, дублює його і натискає 1. Це встановлює стек з лічильником, множником і результатом.
  • *s; Множить TOS, поміняє результат на попередній та видалить попередній.
  • puПринесіть лічильник предмета до TOS. Твоя черга. Це використовується для зміни смуги руху, але потрібно для гоління байта.
  • |($Це було зроблено, щоб зберегти байт. При попаданні він пропускає декремент. відображає, зменшує лічильник і пропускає неопераційну обгортку навколо куба.
  • !vqWТестуйте лічильник. Якщо правда пропустить переспрямування, поставте лічильник на BOS, поверніть смугу назад на множник. Інакше перенаправлення.
  • |sO@це кінцева послідовність, переспрямована з зустрічного тесту. Проходить повз горизонтальне віддзеркалення, поміняє TOS, приводячи результат до TOS, вимикаючись і зупиняючись.

3

R, 22 байти

читає xзі стдін.

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

створює список xкопій x, а потім обчислює добуток елементів цього списку. Коли x=0, repповертається numeric(0), що є числовим вектором довжини 0, але значення prodдорівнює 1, тож 0^0=1за цим методом, який відповідає вбудованому Е в експоненції, це дуже акуратно.

Спробуйте в Інтернеті!


3

x86_64 машинна мова для Linux, 14 11 10 байт

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

Для того, щоб спробувати його в Інтернеті! , компілювати та запустити наступну програму C.

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 bytes

.DP

Try it online! or Try all examples

.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

Looks like you enjoyed .D. First time I've seen it used.
Magic Octopus Urn

ah, i dont get what is happening here.. seems to be too exotic and no explanation on how that works. =(

@xakepp35 Does that help?
Riley


2

Japt, 4 bytes

ÆUÃ×

Try it online!

Explanation

Æ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 machine code (Linux), 18 bytes

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

It expects a C declaration as follows extern int XpowX(int).

Disassembled

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

Perl 6, 13 bytes

{[*] $_ xx$_}

$_ xx $_ evaluates to a list of $_ copies of $_ ($_ being the argument to the anonymous function), and then [*] reduces that list with multiplication.




1

Röda, 17 bytes

{product([_]*_1)}

Try it online!

It's an anonymous function that takes it's input from the stream.

Explanation:

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

This is my first attempt writing a recursive macro in dc. I am sure it is a sub-optimal solution which can be improved a lot.

dsr1+[lrr1-d1<F*]dsFxp

Try it online!

Edit: Thanks eush77! -4 bytes.


1
Does not work for x=1.
eush77

You can shave off two bytes by replacing lr sequences at the end with two ds at the beginning.
eush77

Actually, you don't need that. Just increment the top of the stack before calling for the first time. This way you will end up with x copies of x on the stack (and 1 of course), and x multiplications thereafter. So the ending can just be plain dsFxp.
eush77

@eush77 I was about to say that removing second lr wouldn't work here. It's my first time golfing in a stack-based language, so it feels very unusual. Thanks for your help!
Maxim Mikhaylov

1

Batch, 58 bytes

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

Only works for single-digit inputs due to 32-bit arithmetic.


1

brainf*ck, 148 bytes

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

Try it online!

No built-ins ;)

How it works

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

In a nutshell, this works by multiplying x (the input) by itself x times. (a.k.a. iterating iterated addition). The net result is x^x.

I/O

The program takes a single ASCII input, and processes it as it's ASCII index minus 48. The minus 48 is to normalize inputs of actual numbers (4 becomes 52 -> 52-48 -> 4). To input a number higher than 9, use the next corrosponging ASCII character (: -> 58-48 -> 10). The program ouputs in a similar fashion.

Test I/O

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

Since there are no printable ASCII characters after an input of 3, it can only print numbers in theory. Though, you can check all inputs do in fact work on visualizers such as this.



1

Python, 32 bytes

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

Try it online!


Welcome to PPCG! You don't need to count the f= part, so you can shorten your submission to 30 bytes.
Steadybox

@Steadybox The f= part does need to be counted, because it's recursive, so it relies upon the function being named f in order to work properly
musicman523

@musicman523 Yes, you are right.
Steadybox

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.