Moltiplicazione sequenziale


12

Il tuo obiettivo è quello di scrivere un programma che accetta un input e, quando incatenato insieme Nvolte, esegue una "moltiplicazione sequenziale". Cos'è la moltiplicazione sequenziale, potresti chiedere? È una sequenza con un seme adefinito così:

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

Quindi, lascia a = 5. Così, f(0) = 5, f(1) = f(0)*(f(0)-1) = 5*4 = 20, e f(2) = f(1)*(f(1)-1) = 20*19 = 380.

Se il tuo programma era ABC, allora ABCdovrebbe prendere input ae output f(1). Il programma ABCABCdovrebbe essere emesso f(2), ecc. Le tue serie di programmi dovrebbero ricevere input solo una volta e solo una volta.

Questo è un code-golf quindi vince il programma più breve in byte. Le scappatoie standard sono vietate.

Risposte:


13

Gelatina, 3 byte

×’$

Provalo online!

Come funziona

×’$    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.

La ripetizione dello snippet n volte lo eseguirà n volte, ottenendo l'output desiderato.


4

Scherzi a parte, 4 byte

,;D*

Spiegazione:

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

Proprio come nella risposta Jelly di Dennis , ripetere i ntempi di questo programma comporterà ntempi di esecuzione . Questo è uno dei molti vantaggi dei linguaggi imperativi basati su stack.

Provalo online!


4

MATL, 3 byte

tq*

Puoi provarlo online! Fondamentalmente simile alle risposte Seriously e Jelly. Innanzitutto, duplica la parte superiore dello stack (input di get la prima volta quando lo stack è vuoto). Riduce la parte superiore dello stack e moltiplica i due elementi per fornire l'input o il risultato successivo.


4

Python 3, 56 byte

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

Volevo solo una soluzione senza ingannare l'output. La mancanza di una nuova riga finale è importante.


quella prima riga è tutta 1 numero?
— Seadrus,

@Seadrus No, l'evidenziatore della sintassi non corrisponde al parser Python, che interrompe l'analisi dei numeri quando colpisce il ife else.
— xnor

Questo sarebbe più breve in Python 2 .
— mbomb007,

@ mbomb007 Non funzionerà del tutto, la stampa non verrà gestita correttamente e otterrai un output extra quando concatenerai almeno una volta.
— FryAmTheEggman,

Ah, ecco cosa era quell'output extra.
— mbomb007,

3

CJam, 5 byte

r~_(*

Provalo online!

Come funziona

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.

3

pl, 5 byte

_▼•=_

Provalo online.

Sarebbe 4 byte se non fossi stato pigro e non implementato "Assegna a _" ...

Spiegazione

_▼•=_

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

2

05AB1E , 3 byte

Codice:

D<*

Spiegazione:

D    # Duplicate top of the stack, or input when empty
 <   # Decrement on top item
  *  # Multiply

Provalo online!


2

GolfScript, 5 byte

~.(*`

Provalo online.

De-golf e commentato:

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

L'interprete GolfScript legge automaticamente l'input e lo posiziona nello stack, ma come una stringa, non come un numero. Pertanto, abbiamo bisogno di trasformare l'input in un numero con ~, e poi di stringerlo nuovamente con `. Alla fine, l'interprete stamperà automaticamente il numero rigoroso nella pila.

(Ora, se la sfida era stata quella di iterare f(n+1) = f(n)*(-f(n)-1), ho potuto ho fatto che in 4 byte con ~.~*. Capire come e perché che le opere è lasciato come esercizio. :)


2

REPL JavaScript, 25 20 byte

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

Lavorerà per eliminare un REPL


Come produce questo output?
— Dennis,

Nella console. Ho bisogno di aggiustarlo.
— Conor O'Brien,

no la console va bene, ritengo che l'output valido per js
— Seadrus,

Oh! Fantastico!!
— Conor O'Brien,

2
@Seadrus Apparentemente secondo il meta consenso (che non avevo capito fosse una cosa), gli ambienti basati su REPL vanno bene fintanto che è specificato che si tratta di un REPL.
— Alex A.

2

Lua, 35 18 byte

È qualcosa che Lua può fare abbastanza facilmente per una volta!

Modifica: ho scoperto molte cose in Lua da quando l'ho fatto, quindi lo sto aggiornando :)

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

...contiene l'argomento della riga di comando decompresso, in linea di principio userà il suo primo valore in questo caso in quanto non sarà permesso di spendere, con conseguente solo stampa n*(n-1).


1

Y , 7 byte

jzC:t*!

Provalo qui!

Funziona così: jaccetta input numerici. zattiva la stampa implicita. Cinizia un nuovo collegamento. :duplica il valore nello stack e lo tdiminuisce, lasciandoci con [a a-1]. Quindi, arriviamo [a*a-a]da *. !salta il comando successivo; su EOF, non fa nulla. Quando incatenato insieme, salta il comando di input e il processo ricomincia.




1

Perl, 23 byte

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

Versione alternativa, 10 byte

$_*=~-$_;

Ciò richiede il -ppassaggio. Non sono sicuro che si tratti di un gioco corretto in una domanda di .


1

Haskell, 14 11 byte

(*)=<<pred$

Esempio di utilizzo

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

Forse questa non è una funzione adeguata. Se stai facendo il nitpicking puoi andare con (*)=<<pred$id(<-s'è uno spazio alla fine) per 14 byte.

Modifica: @Zgarb ha riscritto la funzione usando la funzione monade e salvato 3 byte. Grazie!


(*)=<<pred$salva 3 byte. Inoltre, va notato che questo non definisce effettivamente una funzione e che il valore di input deve essere inserito direttamente dopo di essa.
— Zgarb,

@Zgarb: grazie! L'aggiunta lo idrende una funzione corretta. Ho inserito una nota nella mia risposta.
— nimi,


1

TI-Basic, 6 5 byte

Funziona con calcolatrici TI-83/84

:Ans²-Ans

Questo programma funziona a causa del fatto che un'espressione sull'ultima riga di un programma viene stampata al posto del Donetesto normale .


1
5 byte::Ans²-Ans
— lirtosiast

1

Mathcad, 39 "byte"

inserisci qui la descrizione dell'immagine

Dal punto di vista dell'utente, Mathcad è effettivamente una lavagna 2D, con espressioni valutate da sinistra a destra, dall'alto verso il basso. Mathcad non supporta un input di "testo" convenzionale, ma utilizza invece una combinazione di testo e tasti speciali / barra degli strumenti / voci di menu per inserire un'espressione, testo, trama o componente. Ad esempio, digitare ":" per inserire l'operatore di definizione (mostrato sullo schermo come ": ="), "[" per inserire un indice di array o "ctl-]" per inserire un operatore ciclo while (inclusivo di segnaposto per il condizione di controllo ed espressione di un solo corpo). Quello che vedi nell'immagine sopra è esattamente ciò che appare nell'interfaccia utente e come "digitato" in.

Ai fini del golf, il conteggio dei "byte" è il numero equivalente di operazioni da tastiera richieste per inserire un'espressione.

Una cosa di cui sono ancora meno sicuro (dal punto di vista dell'equivalenza "byte") è come contare la creazione di una nuova regione (ad es. A: = 5 o k: = 0..n-1). Ho identificato ogni spostamento in una nuova regione come uguale a una nuova riga, e quindi 1 byte (in pratica, utilizzo il mouse per fare clic dove voglio la regione).

Ho incluso solo le istruzioni attive e non i commenti e ho incluso 2 byte ciascuno per gli input a e n ma non i valori stessi (5 e 7 nell'esempio).


0

Haskell, 72 byte

Questa sfida non è amichevole con Haskell. Tuttavia, quanto segue funziona se l'input è unario e il codice viene eseguito in GHCI:

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

Spiegazione:

Unario è sempre dispari, quindi la prima applicazione verrà convertita in decimale. x*(x-1)è sempre pari, quindi altrimenti ritorna x*(x-1), dov'è xl'input. Poiché Haskell è fortemente tipizzato e i simboli "speciali" non possono essere chiamati come &1, credo che questo sia praticamente l'unico modo per completarlo in Haskell, a meno che non si utilizzino variabili globali o un modulo di input ancora più strano.


0

C ++ (gcc) , 173/176 byte

Entrambe le versioni hanno una linea cruciale alla fine.

Versione macro, 173 byte

#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;

Provalo online!

Versione modello, 176 byte

Un po 'più di 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++;

Provalo online!


0

Burlesque - 5 byte

J?d?*

blsq ) 5 J?d?*
20
blsq ) 5 J?d?* J?d?*
380
blsq ) 5 J?d?* J?d?* J?d?*
144020
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.