Erhöhen Sie die Ganzzahl x, um x zu potenzieren, ohne die integrierten Potenzierungsfunktionen


16

Aufgabe - Der Titel bringt es auf den Punkt: Erhöhe eine ganze Zahl x , um x zu setzen , wo 0<x.

Beschränkungen:

  • Verwenden von Potenzierung exp(), ln()und alle anderen Kräfte bezogene Sprache Einbauten, wie pow(), x^x, x**xist verboten.
  • Sie können davon ausgehen, dass die angegebene Ganzzahl den Grenzen der Programmiersprache Ihrer Wahl entspricht.

Testfälle:

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

Das ist , also gewinnt das kürzeste Programm in Bytes.


Können wir Eingaben als Zeichenfolge akzeptieren?
Shaggy

Ich habe eine Änderung an diesem vorgenommen, in der Hoffnung, dass es wieder geöffnet wird. Ich habe Regel 3 gestrichen und stattdessen angegeben, dass es ein vollständiges Programm sein sollte, wie es das OP wahrscheinlich beabsichtigt hat
Mr. Xcoder

Viel besser, @ Mr.Xcoder, aber ich schlage vor, die zweite Einschränkung zu entfernen (oder neu zu formulieren). Schließt "keine Funktion" JS von der Teilnahme aus? Für die Zwecke der Herausforderung würde ich auch vorschlagen, dass wir damit umgehen müssen 0und dass die erwartete Ausgabe spezifiziert wird ( 0oder 1oder beides). Schließlich wäre der Umgang mit negativen ganzen Zahlen eine schöne Ergänzung der Herausforderung.
Shaggy

@Shaggy fügte js zurück in ... hinzu, berechnete 0 ^ 0 auf dem Apfelrechner und gab 1 zurück. Vielleicht sollte 1 der gewählte Wert sein, da Python auch 1für zurückgibt 0^0. Allerdings Foundation+ Swift liefert 0
Herr Xcoder

1
@ Mr.Xcoder, ich habe die "Einschränkung", die wir nicht behandeln müssen, entfernt 0und stattdessen 0<xim Lead-In angegeben. Ich habe auch die Einschränkung entfernt, dass Code keine Fehler auslösen darf. das sollte selbstverständlich sein. Gerne können Sie bei Bedarf einen Rollback durchführen.
Shaggy

Antworten:


15

APL (Dyalog) , 4 Bytes

Für x x wird x als linkes Argument und x als rechtes Argument verwendet.

×/⍴⍨

Probieren Sie alle Fälle online aus!

×/ Produkt von

⍴⍨ arg kopiert arg

Und hier ist eine, die auch negative ganze Zahlen behandelt:

×/|⍴|*×

Versuche alle Fälle!

×/ das Produkt von

| Absolutwert

r epetitions von

| der absolute Wert

* hoch

× das signum

Das eingebaute Power-Grundelement ist:

x*y


9

Mathematica, 16 Bytes

Bei dieser Anzahl von Bytes habe ich zwei Lösungen:

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

Hier #~Table~#wird eine Liste von nKopien von erstellt n. Dann wird der ListKopf ersetzt, 1##&wodurch alle Argumente miteinander multipliziert werden.

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

Dieser speichert einfach die Eingabe in nund dann vervielfacht 1durch n, nmal.


1
#~Product~{#}&
alephalpha

1
@alephalpha ah, guter Punkt. Sie können dies als separate Antwort posten.
Martin Ender

5

JavaScript (ES6), 33 28 25 24 Byte

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

Versuch es

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>


Geschichte

25 Bytes

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

28 Bytes

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

33 Bytes

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

4

Pure Bash, 43

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

Probieren Sie es online aus .

Ich bin mir nicht sicher, ob dies die Regeln zu sehr verbiegt - ich verwende keines der aufgelisteten verbotenen Buildins, aber ich verwende die Basiskonvertierung.

  • printf 1%0$1dgibt a 1gefolgt von n 0s aus
  • $[b#a]ist eine arithmetische Erweiterung, die aals Basiszahl zu behandeln ist und bdas erforderliche Ergebnis liefert. Leider funktioniert base <2 nicht, daher behandeln die zusätzlichen ?:Bits den Eingang n = 1.

Die maximale Eingabe beträgt 15, da in der Bash vorzeichenbehaftete 64-Bit-Ganzzahlen (bis zu 2 31 -1) verwendet werden.


Das gleiche Problem wie ich, das funktioniert nicht für x = 1. Trotzdem sehr interessanter Ansatz.
Maxim Mikhaylov

@MaxLawnboy Danke für den Hinweis - das hat meine Antwort leider aufgebläht. Vielleicht kann ich eine andere kürzere Version finden ...
Digitales Trauma

Cooles Zeug.

4

Alice , 13 Bytes

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

Probieren Sie es online!

Erläuterung

/o
\i@/...

Dies ist ein Framework für Programme, die Dezimalzahlen lesen und schreiben und vollständig im Kardinalmodus arbeiten (also Programme für die meisten arithmetischen Probleme).

.    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

Gelee , 3 Bytes

ẋ⁸P

Probieren Sie es online!

Wie?

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

Verdammt, ich wollte das machen. : P
HyperNeutrino

@ Jonathan Allan sind es 3 Bytes oder 3 breite Zeichen? Lassen Sie uns den hexadezimalen Speicherauszug des Quellcodes anzeigen, um die richtige Entscheidung über die tatsächliche Größe des Code-Bytes zu treffen. ;-) und die korrekturen machen

1
@ xakepp35 Jelly verwendet ein SBCS und der Byte- Link im Header verweist darauf. Das Programm mit Hexdump F7 88 50funktioniert wie vorgesehen.
Dennis

@ Tennis danke für die Antwort! ich konnte mir so eine sprache noch nie vorstellen =)

3

Cubix , 19 Bytes

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

Probieren Sie es online!

Schritt für Schritt

Erweitert sich auf einen Würfel mit Seitenlänge 2

    . .
    @ O
I : 1 * s ; p u
! v q W | ( $ .
    . .
    . .
  • I:1 Nimmt die Eingabe, dupliziert sie und drückt 1. Dies richtet den Stapel mit einem Zähler, Multiplikator und Ergebnis ein.
  • *s; Multipliziert die TOS, tauscht das Ergebnis mit der vorherigen und entfernt die vorherige.
  • puBring das Gegenstück zum TOS. Wende. Dies war früher ein Spurwechsel, musste aber ein Byte rasieren.
  • |($Dies wurde durchgeführt, um ein Byte zu speichern. Bei einem Treffer wird die Dekrementierung übersprungen. reflektiert, dekrementiert den Zähler und überspringt den No-Op-Wrapping um den Würfel.
  • !vqWTesten Sie den Zähler. Wenn dies der Fall ist, überspringen Sie die Umleitung, setzen Sie den Zähler auf BOS und wechseln Sie die Spur zurück auf den Multiplikator. Ansonsten umleiten.
  • |sO@Dies ist die Endsequenz, die vom Zählertest weitergeleitet wird. Geht an der horizontalen Spiegelung vorbei, tauscht die TOS aus und bringt das Ergebnis zur TOS, Ausgabe und Halt.

3

R, 22 Bytes

liest xaus stdin.

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

generiert eine Liste von xKopien von xund berechnet dann das Produkt der Elemente dieser Liste. Wenn x=0, gibt das repzurück numeric(0), was ein numerischer Längenvektor ist 0, aber der prodvon diesem ist 1, also 0^0=1mit dieser Methode, die mit Rs eingebauter Exponentiation konsistent ist, ist das ziemlich ordentlich.

Probieren Sie es online!


3

x86_64-Maschinensprache für 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

Um es online auszuprobieren! , kompilieren Sie das folgende C-Programm und führen Sie es aus.

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

Probieren Sie es online! oder Probieren Sie alle Beispiele aus

.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

Sieht so aus, als hättest du es genossen .D. Zum ersten Mal habe ich es benutzt gesehen.
Magic Octopus Urn

ah, ich verstehe nicht, was hier passiert .. scheint zu exotisch und keine Erklärung, wie das funktioniert. = (

@ xakepp35 Hilft das?
Riley


2

Japt , 4 Bytes

ÆUÃ×

Probieren Sie es online!

Erläuterung

Æ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-Maschinencode (Linux), 18 Byte

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

Es erwartet eine C-Deklaration wie folgt extern int XpowX(int).

Zerlegt

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 $_wird zu einer Liste von $_Kopien von ausgewertet $_( $_als Argument für die anonyme Funktion) und [*]diese Liste dann durch Multiplikation reduziert.




1

Röda , 17 Bytes

{product([_]*_1)}

Probieren Sie es online!

Es handelt sich um eine anonyme Funktion, deren Eingabe vom Stream stammt.

Erläuterung:

{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 Ich wollte gerade sagen, dass das Entfernen von Sekunden lrhier nicht funktionieren würde. Es ist mein erstes Mal, dass ich in einer Stack-basierten Sprache Golf spiele. Es fühlt sich also sehr ungewöhnlich an. Danke für Ihre Hilfe!
Maxim Mikhaylov

1

Batch, 58 Bytes

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

Funktioniert aufgrund der 32-Bit-Arithmetik nur für einstellige Eingaben.


1

Brainf * ck , 148 Bytes

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

Probieren Sie es online!

Keine eingebauten;)

Wie es funktioniert

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

Kurz gesagt, dies funktioniert durch Multiplizieren x(der Eingabe) mit sich selbst x. (auch bekannt als iterating iterated addition). Das Nettoergebnis ist x ^ x.

I / O

Das Programm nimmt eine einzelne ASCII-Eingabe und verarbeitet sie als ASCII-Index minus 48 . Das Minus 48 dient zum Normalisieren der Eingaben von tatsächlichen Zahlen ( 4wird zu 52-> 52-48-> 4). Verwenden Sie zur Eingabe einer höheren Zahl als 9 das nächste entsprechende ASCII-Zeichen ( :-> 58-48-> 10). Das Programm wird auf ähnliche Weise ausgegeben.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.