Sequentielle Multiplikation

12

Ihr Ziel ist es, ein Programm zu schreiben, das Eingaben entgegennimmt und bei Verkettung Neine "sequentielle Multiplikation" durchführt. Was ist sequentielle Multiplikation? Es ist eine Sequenz mit einem Samen a, der wie folgt definiert ist:

f(0) = a
f(n+1) = f(n)*(f(n)-1)

Also lass a = 5. So f(0) = 5, f(1) = f(0)*(f(0)-1) = 5*4 = 20und f(2) = f(1)*(f(1)-1) = 20*19 = 380.

Wenn dein Programm das war ABC, dann ABCsollte es Input aund Output nehmen f(1). Das Programm ABCABCsollte ausgegeben f(2)werden usw. Ihre Programmreihe sollte nur einmal eingegeben und nur einmal ausgegeben werden.

Dies ist ein Code-Golf, so dass das kürzeste Programm in Bytes gewinnt. Standardlücken sind verboten.

Seadrus
quelle

Antworten:

13

Gelee, 3 Bytes

×’$

Probieren Sie es online!

Wie es funktioniert

×’$    Main link (or part thereof). Argument (initially input): n

 ’     Compute n - 1.
×      Multiply n by (n - 1).
  $    Combine the previous two atoms into a monadic quicklink.

Durch n- maliges Wiederholen des Snippets wird es n- mal ausgeführt, was zur gewünschten Ausgabe führt.

Dennis
quelle
4

Im Ernst, 4 Bytes

,;D*

Erläuterung:

,;D*
,     push input (NOP once input is exhausted)
 ;D   dupe and push n-1
   *  multiply
      (implicit output at EOF)

Genau wie in Dennis ' Jelly-Antwort führt das Wiederholen dieser Programmzeiten zu nLaufzeiten n. Dies ist einer der vielen Vorteile von imperativen Stack-basierten Sprachen.

Probieren Sie es online!

Mego
quelle
4

MATL, 3 Bytes

tq*

Sie können es online ausprobieren! Grundsätzlich ähnlich den Antworten von Seriously und Jelly. Erstens dupliziert es die Oberseite des Stapels (erhält die Eingabe beim ersten Mal, wenn der Stapel leer ist). Dekrementiert den oberen Bereich des Stapels und multipliziert die beiden Elemente, um die nächste Eingabe oder das nächste Ergebnis zu erhalten.

David
quelle
4

Python 3, 56 Bytes

+1if 0else 0
try:n
except:n=int(input())
n*=n-1
print(n)

Wollte nur eine Lösung ohne Überschreiben der Ausgabe. Das Fehlen eines nachgestellten Zeilenumbruchs ist wichtig.

Sp3000
quelle
ist das in der ersten Zeile alle 1 Nummer?
Seadrus
@Seadrus Nein, der Syntax-Highlighter stimmt nicht mit dem Python-Parser überein, der das Parsen der Zahlen beendet, wenn er auf ifund trifft else.
Xnor
Dies wäre in Python 2 kürzer .
mbomb007
@ mbomb007 Das wird nicht ganz funktionieren, der Ausdruck wird nicht ordnungsgemäß verarbeitet und Sie erhalten zusätzliche Ausgabe, wenn Sie mindestens einmal verketten.
FryAmTheEggman
Ah, genau das war diese zusätzliche Ausgabe.
mbomb007
3

CJam, 5 Bytes

r~_(*

Probieren Sie es online!

Wie es funktioniert

r     e# Read a whitespace-separated token from STDIN.
      e# This pushes the input (when called for the first time) or an empty string.
 ~    e# Evaluate.
      e# This turns the input into an integer or discards an empty string.
  _   e# Copy the top of the stack.
   (  e# Decrement.
    * e# Multiply.
Dennis
quelle
3

pl, 5 Bytes

_▼•=_

Probieren Sie es online aus.

Wäre 4 Bytes, wenn ich nicht faul und nicht implementiert "_ zuweisen" gewesen wäre ...

Erläuterung

_▼•=_

_       push _ (input var)
 ▼      decrement last used var (_)
  •     multiply, since it is off by one it auto-adds _ to the arg list
   =_   assign result to _
ein Spaghetto
quelle
2

GolfScript, 5 Bytes

~.(*`

Probieren Sie es online aus.

Entgolft und kommentiert:

~    # Eval the input to turn it from a string into a number.
.    # Duplicate the number.
(    # Decrement one of the copies by one.
*    # Multiply the copies together.
`    # Un-eval the number, turning it back into a string.

Der GolfScript-Interpreter liest die Eingabe automatisch und platziert sie auf dem Stapel, jedoch als Zeichenfolge und nicht als Zahl. Daher müssen wir die Eingabe mit in eine Zahl ~umwandeln und sie anschließend mit erneut verketten `. Am Ende druckt der Interpreter automatisch die auf dem Stapel angegebene Zahl aus.

(Wenn die Herausforderung darin bestanden hätte, es zu wiederholen f(n+1) = f(n)*(-f(n)-1), hätte ich das in 4 Bytes erledigt ~.~*. Es ist eine Übung, herauszufinden, wie und warum das funktioniert. :)

Ilmari Karonen
quelle
2

JavaScript REPL, 25 20 Bytes

a=prompt();
a*=a-1//

Arbeitet daran, eine REPL zu eliminieren

Conor O'Brien
quelle
Wie erzeugt dies eine Ausgabe?
Dennis
In der Konsole. Ich muss das reparieren.
Conor O'Brien
Nein, die Konsole ist in Ordnung, ich denke, dass gültige Ausgabe für js
Seadrus
Oh! Fantastisch!!
Conor O'Brien
2
@Seadrus Offenbar gemäß dem Meta - Konsens (was ich wusste nicht, war ein Ding), ERSATZ-Umgebungen sind in Ordnung, solange es angegeben ist , dass es ein REPL ist.
Alex A.
2

Lua, 35 18 Bytes

Das ist etwas, was Lua ausnahmsweise mal leicht machen kann!

Edit: Ich habe eine Menge Dinge in Lua entdeckt, seit ich das gemacht habe, also aktualisiere ich es :)

print(...*(...-1))

...Enthält das Kommandozeilenargument entpackt, verwendet es in diesem Fall den ersten Wert, da es nicht ausgegeben werden darf, was nur zum Drucken führt n*(n-1).

Katenkyo
quelle
1

Y , 7 Bytes

jzC:t*!

Probieren Sie es hier aus!

So funktioniert es: jNimmt numerische Eingaben an. zAktiviert das implizite Drucken. Cbeginnt einen neuen Link. :dupliziert den Wert auf dem Stapel, tdekrementiert ihn und lässt uns dabei [a a-1]. Dann kommen wir [a*a-a]ab *. !überspringt den nächsten Befehl; Auf EOF macht es nichts. Wenn der Befehl verkettet ist, wird der Eingabebefehl übersprungen und der Vorgang beginnt von vorn.

Conor O'Brien
quelle
1

Jolf, 6 Bytes

Probieren Sie es hier aus!

oj*jwj

Erläuterung

oj*jwj
oj      set j to
  *jwj  j times j-1
        implicit output
Conor O'Brien
quelle
1

𝔼𝕊𝕄𝕚𝕟, 5 Zeichen / 7 Bytes

ïׇï;

Try it here (Firefox only).

Muss ich das wirklich erklären? Na ja, hier geht ...

Erläuterung

Es wird im Grunde input*=--input;in JS ausgewertet .

Mama Fun Roll
quelle
1

Perl, 23 Bytes

l;$_|=<>;$_*=~-$_;print

Alternative Version, 10 Bytes

$_*=~-$_;

Dies erfordert den -pSchalter. Ich bin mir nicht sicher, ob es sich bei einer Frage zum um faires Spiel handelt .

Dennis
quelle
1

Haskell, 14 11 Bytes

(*)=<<pred$

Anwendungsbeispiel

Prelude> (*)=<<pred$5
20
Prelude> (*)=<<pred$(*)=<<pred$5
380
Prelude> (*)=<<pred$(*)=<<pred$(*)=<<pred$5
144020

Vielleicht ist das keine richtige Funktion. Wenn Sie keine Lust haben, können Sie mitmachen(*)=<<pred$id (<- am Ende steht ein Leerzeichen) 14 Bytes .

Edit: @Zgarb hat die Funktion mit der Funktion monad umgeschrieben und 3 Bytes gespeichert. Vielen Dank!

nimi
quelle
(*)=<<pred$Spart 3 Bytes. Es sollte auch beachtet werden, dass dies keine Funktion definiert und der Eingabewert direkt danach platziert werden muss.
Zgarb
@ Zgarb: Danke! Das Hinzufügen idmacht es zu einer richtigen Funktion. Ich habe eine Notiz in meine Antwort eingefügt.
nimi
1

Pure Bash (keine Dienstprogramme), 40

((a=a?a:$1,a*=a-1))
trap 'echo $a' exit
Digitales Trauma
quelle
1

TI-Basic, 6 5 Bytes

Läuft auf TI-83/84-Rechnern

:Ans²-Ans

Dieses Programm funktioniert aufgrund der Tatsache, dass ein Ausdruck in der letzten Zeile eines Programms anstelle des normalen DoneTexts gedruckt wird .

Timtech
quelle
1
5 Bytes::Ans²-Ans
Lirtosiast
1

Mathcad, 39 "Bytes"

Bildbeschreibung hier eingeben

Aus Benutzersicht ist Mathcad praktisch ein 2D-Whiteboard, dessen Ausdrücke von links nach rechts und von oben nach unten ausgewertet werden. Mathcad unterstützt keine herkömmliche Texteingabe, sondern verwendet stattdessen eine Kombination aus Text und Sondertasten / Symbolleisten / Menüelementen, um einen Ausdruck, einen Text, einen Plot oder eine Komponente einzufügen. Geben Sie beispielsweise ":" ein, um den Definitionsoperator (auf dem Bildschirm als ": =" angezeigt), "[", um einen Array-Index einzugeben, oder "ctl-]", um einen while-Schleifenoperator (einschließlich Platzhalter für die Kontrollbedingung und ein Körperausdruck). Was Sie im obigen Bild sehen, ist genau das, was auf der Benutzeroberfläche angezeigt und als "eingegeben" wird.

Für Golfzwecke ist die "Byte" -Zahl die äquivalente Anzahl von Tastaturoperationen, die zur Eingabe eines Ausdrucks erforderlich sind.

Eine Sache, bei der ich noch weniger sicher bin (aus der Sicht der "Byte" -Äquivalenz), ist, wie das Erstellen einer neuen Region gezählt wird (z. B. a: = 5 oder k: = 0..n-1). Ich habe jede Bewegung in eine neue Region als eine neue Zeile und damit als 1 Byte gleichgesetzt (in der Praxis verwende ich die Maus, um dort zu klicken, wo ich die Region haben möchte).

Ich habe nur die aktiven Anweisungen und nicht die Kommentare eingeschlossen und jeweils 2 Bytes für die Eingaben a und n, aber nicht die Werte selbst (5 und 7 im Beispiel).

Stuart Bruff
quelle
0

Haskell, 72 Bytes

Diese Herausforderung ist für Haskell nicht freundlich. Das Folgende funktioniert jedoch, wenn die Eingabe unär ist und der Code in GHCI ausgeführt wird:

(\x->if odd x then let y=until((>x).(10^))(+1)0 in y*(y-1)else x*(x-1))$

Erläuterung:

Unary ist immer ungerade, daher wird die erste Anwendung in eine Dezimalzahl konvertiert. x*(x-1)ist immer gerade, ansonsten wird zurückgegeben x*(x-1), wo xdie Eingabe ist. Da Haskell stark typisiert ist und Sonderzeichen nicht so genannt werden können &1, ist dies meines Erachtens der einzige Weg, dies in Haskell zu vervollständigen, es sei denn, man verwendet globale Variablen oder eine noch seltsamere Eingabeform.

Michael Klein
quelle
0

C ++ (gcc) , 173/176 Bytes

Beide Versionen haben am Ende einen entscheidenden Zeilenumbruch.

Makroversion, 173 Bytes

#ifndef M
#define M(a,b)a##b
#define W(z,x)M(z,x)
#define B int W(m,__LINE__)=x++
#include<iostream>
int x,n;int main(){for(std::cin>>n;x--;)n*=n-1;std::cout<<n;}
#endif
B;

Probieren Sie es online!

Vorlagenversion, 176 Bytes

Etwas mehr C ++ ish:

#ifndef B
#define B template
#include<iostream>
int x,n;B<int N>struct A{static int i;};int main(){for(std::cin>>n;x--;)n*=n-1;std::cout<<n;}
#endif
B<>int A<__LINE__>::i=x++;

Probieren Sie es online!

Gastropner
quelle
0

Burlesque - 5 Bytes

J?d?*

blsq ) 5 J?d?*
20
blsq ) 5 J?d?* J?d?*
380
blsq ) 5 J?d?* J?d?* J?d?*
144020
mroman
quelle