Sekwencyjne mnożenie

12

Twoim celem jest napisanie programu, który pobiera dane wejściowe, a gdy razem zostaną połączone razem N, wykonuje „sekwencyjne mnożenie”. Co to jest mnożenie sekwencyjne, możesz zapytać? Jest to sekwencja ze azdefiniowanym w ten sposób ziarnem :

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

Więc pozwól a = 5. Zatem f(0) = 5, f(1) = f(0)*(f(0)-1) = 5*4 = 20oraz f(2) = f(1)*(f(1)-1) = 20*19 = 380.

Jeśli twój program był ABC, to ABCpowinien wziąć dane wejściowe ai wyjściowe f(1). Program ABCABCpowinien generować dane wyjściowe f(2)itp. Serie programów powinny pobierać dane tylko raz, a dane wyjściowe tylko raz.

To jest golf golfowy, więc wygrywa najkrótszy program w bajtach. Standardowe luki są zabronione.

Seadrus
źródło

Odpowiedzi:

13

Galaretka, 3 bajty

×’$

Wypróbuj online!

Jak to działa

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

Powtarzanie fragmentu n razy spowoduje wykonanie go n razy, co da pożądany wynik.

Dennis
źródło
4

Poważnie, 4 bajty

,;D*

Wyjaśnienie:

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

Podobnie jak w odpowiedzi Jelnisa na Jelly , powtórzenie tego programu nspowoduje jego uruchomienie n. To jedna z wielu zalet imperatywnych języków opartych na stosie.

Wypróbuj online!

Mego
źródło
4

MATL, 3 bajty

tq*

Możesz spróbować online! Zasadniczo podobny do odpowiedzi na serio i galaretki. Po pierwsze, duplikuje górę stosu (get otrzymuje dane wejściowe, gdy stos jest pusty). Zmniejsza górę stosu i mnoży dwa elementy, aby uzyskać następny wkład lub wynik.

David
źródło
4

Python 3, 56 bajtów

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

Chciałem tylko rozwiązania bez nadpisywania danych wyjściowych. Ważny jest brak końca nowej linii.

Sp3000
źródło
czy ta pierwsza linia zawiera 1 numer?
Seadrus
@Seadrus Nie, wyróżnienie składni nie pasuje do parsera Pythona, który przestaje analizować liczby, gdy trafi na ifi else.
xnor
Byłoby to krótsze w Pythonie 2 .
mbomb007
@ mbomb007 To nie do końca działa, druk nie jest obsługiwany przez właściwość i zyskujesz dodatkową wydajność, gdy konkatenujesz przynajmniej raz.
FryAmTheEggman
Ach, więc to była ta dodatkowa wydajność.
mbomb007
3

CJam, 5 bajtów

r~_(*

Wypróbuj online!

Jak to działa

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
źródło
3

pl, 5 bajtów

_▼•=_

Wypróbuj online.

Byłby 4 bajty, gdybym nie był leniwy i nie został wdrożony „przypisać do _” ...

Wyjaśnienie

_▼•=_

_       push _ (input var)
 ▼      decrement last used var (_)
  •     multiply, since it is off by one it auto-adds _ to the arg list
   =_   assign result to _
spaghetto
źródło
2

05AB1E , 3 bajty

Kod:

D<*

Wyjaśnienie:

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

Wypróbuj online!

Adnan
źródło
2

GolfScript, 5 bajtów

~.(*`

Wypróbuj online.

Grał w golfa i skomentował:

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

Interpretator GolfScript automatycznie odczytuje dane wejściowe i umieszcza je na stosie, ale jako ciąg, a nie liczbę. Dlatego musimy przekształcić dane wejściowe w liczbę za pomocą ~, a następnie za pomocą `. Na koniec interpreter automatycznie wydrukuje strunowany numer na stosie.

(Teraz, gdyby wyzwanie polegało na iteracji f(n+1) = f(n)*(-f(n)-1), mógłbym to zrobić w 4 bajtach ~.~*. Zrozumienie, jak i dlaczego to działa, pozostawia się jako ćwiczenie. :)

Ilmari Karonen
źródło
2

JavaScript REPL, 25 20 bajtów

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

Będzie pracował nad wyeliminowaniem REPL

Conor O'Brien
źródło
W jaki sposób daje to wynik?
Dennis
W konsoli Muszę to naprawić.
Conor O'Brien
nie, konsola jest w porządku, uważam, że to prawidłowe wyjście dla js
Seadrus
O! Fantastyczny!!
Conor O'Brien
2
@Seadrus Najwyraźniej zgodnie z meta konsensusem (co nie zdawałem sobie sprawy, że to rzecz), środowiska oparte na REPL są w porządku, pod warunkiem, że jest to REPL.
Alex A.
2

Lua, 35 18 bajtów

To coś, co Lua może zrobić dość łatwo choć raz!

Edycja: Odkąd to zrobiłem, odkryłem wiele rzeczy w Lua, więc aktualizuję to :)

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

...zawiera rozpakowany argument wiersza poleceń, co oznacza, że ​​użyje w tym przypadku pierwszej wartości, ponieważ nie będzie można go wydać, co spowoduje jedynie drukowanie n*(n-1).

Katenkyo
źródło
1

Y , 7 bajtów

jzC:t*!

Wypróbuj tutaj!

Tak to działa: jpobiera dane liczbowe. zaktywuje drukowanie niejawne. Crozpoczyna nowy link. :duplikuje wartość na stosie i tzmniejsza ją, pozostawiając nam wartość [a a-1]. Następnie otrzymujemy [a*a-a]od *. !pomija następne polecenie; na EOF nic nie robi. Po połączeniu w łańcuch pomija polecenie wprowadzania i proces rozpoczyna się od nowa.

Conor O'Brien
źródło
1

Jolf, 6 bajtów

Wypróbuj tutaj!

oj*jwj

Wyjaśnienie

oj*jwj
oj      set j to
  *jwj  j times j-1
        implicit output
Conor O'Brien
źródło
1

𝔼𝕊𝕄𝕚𝕟, 5 znaków / 7 bajtów

ïׇï;

Try it here (Firefox only).

Czy naprawdę muszę to wyjaśnić? No cóż, proszę bardzo ...

Wyjaśnienie

Zasadniczo ocenia input*=--input;w JS.

Mama Fun Roll
źródło
1

Perl, 23 bajty

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

Alternatywna wersja, 10 bajtów

$_*=~-$_;

Wymaga to -pprzełącznika. Nie jestem pewien, czy jest to uczciwa gra w kwestii .

Dennis
źródło
1

Haskell, 14 11 bajtów

(*)=<<pred$

Przykład użycia

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

Może to nie jest właściwa funkcja. Jeśli robisz dupki, możesz iść z (*)=<<pred$id(<- na końcu jest spacja) dla 14 bajtów.

Edycja: @Zgarb przepisał funkcję za pomocą funkcji monad i zapisał 3 bajty. Dzięki!

nimi
źródło
(*)=<<pred$oszczędza 3 bajty. Należy również zauważyć, że nie jest to tak naprawdę funkcja, a wartość wejściowa musi być umieszczona bezpośrednio za nią.
Zgarb
@Zgarb: Dzięki! Dodanie idsprawia, że ​​jest to właściwa funkcja. W odpowiedzi umieściłem notatkę.
nimi
1

Pure Bash (bez narzędzi), 40

((a=a?a:$1,a*=a-1))
trap 'echo $a' exit
Cyfrowa trauma
źródło
1

TI-Basic, 6 5 bajtów

Działa na kalkulatorach TI-83/84

:Ans²-Ans

Ten program działa, ponieważ zamiast zwykłego Donetekstu wypisywane jest wyrażenie w ostatnim wierszu programu .

Timtech
źródło
1
5 bajtów::Ans²-Ans
lirtosiast
1

Mathcad, 39 „bajtów”

wprowadź opis zdjęcia tutaj

Z perspektywy użytkownika Mathcad jest tablicą 2D, której wyrażenia są oceniane od lewej do prawej, od góry do dołu. Mathcad nie obsługuje tradycyjnego wprowadzania „tekstu”, ale zamiast tego używa kombinacji tekstu i specjalnych klawiszy / paska narzędzi / elementów menu, aby wstawić wyrażenie, tekst, fabułę lub komponent. Na przykład wpisz „:”, aby wprowadzić operator definicji (pokazany na ekranie jako „: =”), „[”, aby wprowadzić indeks tablicy lub „ctl-]”, aby wprowadzić operator pętli while (w tym symbole zastępcze dla kontrolowanie stanu i ekspresji jednego ciała). To, co widać na powyższym obrazku, jest dokładnie tym, co pojawia się w interfejsie użytkownika i jest „wpisane”.

Na potrzeby gry w golfa liczba „bajtów” jest równoważną liczbą operacji na klawiaturze wymaganych do wprowadzenia wyrażenia.

Jedną rzeczą, o której jestem jeszcze mniej pewny (z punktu widzenia równoważności „bajtowej”) jest to, jak liczyć tworzenie nowego regionu (np. A: = 5 lub k: = 0..n-1). Zrównoważyłem każdy ruch do nowego regionu jako równy nowej linii, a zatem 1 bajt (w praktyce używam myszy, aby kliknąć tam, gdzie chcę region).

Dołączyłem tylko aktywne instrukcje, a nie komentarze, i dołączyłem 2 bajty dla danych wejściowych ai n, ale nie same wartości (5 i 7 w przykładzie).

Stuart Bruff
źródło
0

Haskell, 72 bajty

Wyzwanie to nie jest przyjazne dla Haskell. Jednak następujące działania działają, jeśli dane wejściowe są jednoargumentowe, a kod jest wykonywany w GHCI:

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

Wyjaśnienie:

Unary jest zawsze nieparzysty, więc pierwsza aplikacja zamieni się na dziesiętną. x*(x-1)jest zawsze parzyste, więc w przeciwnym razie zwraca x*(x-1), gdzie xjest wejście. Ponieważ Haskell jest mocno wpisany i nie można nazwać „specjalnymi” symbolami &1, uważam, że jest to właściwie jedyny sposób na ukończenie tego w Haskell, chyba że użyje się zmiennych globalnych lub nawet niepoprawnej formy wprowadzania.

Michael Klein
źródło
0

C ++ (gcc) , 173/176 bajtów

Obie wersje mają na końcu kluczową nową linię.

Wersja makro, 173 bajtów

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

Wypróbuj online!

Wersja szablonu, 176 bajtów

Nieco więcej C ++:

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

Wypróbuj online!

gastropner
źródło
0

Burleska - 5 bajtów

J?d?*

blsq ) 5 J?d?*
20
blsq ) 5 J?d?* J?d?*
380
blsq ) 5 J?d?* J?d?* J?d?*
144020
mroman
źródło