Perkalian Berurutan

12

Tujuan Anda adalah untuk menulis sebuah program yang mengambil input, dan, ketika dirantai bersamaan N, melakukan "multiplikasi berurutan". Apa itu perkalian berurutan, Anda mungkin bertanya? Ini adalah urutan dengan seed yang adidefinisikan sebagai berikut:

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

Jadi, biarkan a = 5. Dengan demikian, f(0) = 5, f(1) = f(0)*(f(0)-1) = 5*4 = 20, dan f(2) = f(1)*(f(1)-1) = 20*19 = 380.

Jika program Anda ABC, maka ABCharus mengambil input adan output f(1). Program ABCABCharus menampilkan f(2), dll. Seri program Anda hanya boleh mengambil input satu kali dan hanya output satu kali.

Ini adalah kode-golf sehingga program terpendek dalam byte menang. Celah standar dilarang.

Seadrus
sumber

Jawaban:

13

Jelly, 3 byte

×’$

Cobalah online!

Bagaimana itu bekerja

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

Mengulang potongan n kali akan mengeksekusinya n kali, menghasilkan output yang diinginkan.

Dennis
sumber
4

Serius, 4 byte

,;D*

Penjelasan:

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

Sama seperti dalam jawaban Dennis's Jelly , mengulangi nwaktu program ini akan menghasilkan nwaktu yang berjalan . Itulah salah satu dari banyak keunggulan bahasa berbasis stack imperatif.

Cobalah online!

Mego
sumber
4

MATL, 3 byte

tq*

Anda dapat mencobanya secara online! Pada dasarnya mirip dengan jawaban Serius dan Jelly. Pertama, duplikat bagian atas tumpukan (dapatkan input pertama kali ketika tumpukan kosong). Mengurangi bagian atas tumpukan dan mengalikan dua elemen untuk memberikan input, atau hasil berikutnya.

David
sumber
4

Python 3, 56 byte

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

Hanya menginginkan solusi tanpa tipu daya keluaran-penulisan. Tidak adanya trailing newline adalah penting.

Sp3000
sumber
Apakah baris pertama semuanya 1 angka?
Seadrus
@Seadrus Tidak, stabilo sintaksis tidak cocok dengan parser Python, yang berhenti mem-parsing angka ketika menyentuh ifdan else.
xnor
Ini akan lebih pendek di Python 2 .
mbomb007
@ mbomb007 Itu tidak akan berhasil, hasil cetak tidak ditangani dengan benar dan Anda mendapatkan hasil tambahan ketika Anda menggabungkan setidaknya sekali.
FryAmTheEggman
Ah, jadi itulah output ekstra itu.
mbomb007
3

CJam, 5 byte

r~_(*

Cobalah online!

Bagaimana itu bekerja

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
sumber
3

pl, 5 byte

_▼•=_

Cobalah online.

Akan menjadi 4 byte jika saya tidak malas dan tidak menerapkan "assign to _" ...

Penjelasan

_▼•=_

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

05AB1E , 3 byte

Kode:

D<*

Penjelasan:

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

Cobalah online!

Adnan
sumber
2

GolfScript, 5 byte

~.(*`

Cobalah online.

De-golf dan berkomentar:

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

Interpreter GolfScript secara otomatis membaca input dan menempatkannya di tumpukan, tetapi sebagai string, bukan sebagai angka. Jadi, kita perlu mengubah input menjadi angka dengan ~, dan menggantinya lagi dengan `. Pada akhirnya, juru bahasa akan secara otomatis mencetak nomor yang diketik pada tumpukan.

(Sekarang, jika tantangannya adalah untuk beralih f(n+1) = f(n)*(-f(n)-1), saya bisa melakukan itu dalam 4 byte dengan ~.~*. Mencari tahu bagaimana dan mengapa itu berhasil dibiarkan sebagai latihan. :)

Ilmari Karonen
sumber
2

JavaScript REPL, 25 20 byte

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

Akan berupaya menghilangkan REPL

Conor O'Brien
sumber
Bagaimana ini menghasilkan output?
Dennis
Di konsol. Saya perlu memperbaikinya.
Conor O'Brien
tidak ada konsol baik-baik saja, saya menganggap bahwa output yang valid untuk js
Seadrus
Oh! Fantastis!!
Conor O'Brien
2
@Seadrus Rupanya sesuai dengan konsensus meta (yang saya tidak sadari adalah suatu hal), lingkungan berbasis REPL baik-baik saja selama ditentukan bahwa itu adalah REPL.
Alex A.
2

Lua, 35 18 Bytes

Itu sesuatu yang bisa dilakukan Lua dengan mudah sekali!

Sunting: Saya telah menemukan banyak hal di Lua sejak saya melakukan ini, jadi saya memperbaruinya :)

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

...berisi argumen baris perintah yang tidak dibongkar, yang akan digunakan adalah nilai pertama dalam kasus ini karena tidak akan diizinkan untuk dikeluarkan, sehingga hanya mencetak n*(n-1).

Katenkyo
sumber
1

Y , 7 byte

jzC:t*!

Coba di sini!

Beginilah cara kerjanya: jmengambil input numerik. zmengaktifkan pencetakan implisit. Cmemulai tautan baru. :menduplikasi nilai pada stack, dan tmenurunkannya, meninggalkan kita [a a-1]. Lalu, kita dapatkan [a*a-a]dari *. !melompati perintah selanjutnya; pada EOF, itu tidak melakukan apa-apa. Ketika dirantai bersama, itu melompati perintah input, dan proses dimulai lagi.

Conor O'Brien
sumber
1

Jolf, 6 byte

Coba di sini!

oj*jwj

Penjelasan

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

𝔼𝕊𝕄𝕚𝕟, 5 karakter / 7 byte

ïׇï;

Try it here (Firefox only).

Haruskah saya benar-benar menjelaskan ini? Oh well, ini dia ...

Penjelasan

Ini pada dasarnya dievaluasi input*=--input;dalam JS.

Mama Fun Roll
sumber
1

Perl, 23 byte

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

Versi alternatif, 10 byte

$_*=~-$_;

Ini membutuhkan -psakelar. Saya tidak yakin apakah itu permainan yang adil dalam pertanyaan .

Dennis
sumber
1

Haskell, 14 11 byte

(*)=<<pred$

Contoh penggunaan

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

Mungkin ini bukan fungsi yang tepat. Jika Anda melakukan nitpicking, Anda dapat menggunakan (*)=<<pred$id(<-ada spasi di bagian akhir) selama 14 byte.

Sunting: @Zgarb menulis ulang fungsi menggunakan fungsi monad dan menyimpan 3 byte. Terima kasih!

nimi
sumber
(*)=<<pred$menghemat 3 byte. Juga, harus dicatat bahwa ini sebenarnya tidak mendefinisikan suatu fungsi, dan nilai input harus ditempatkan langsung setelahnya.
Zgarb
@Zgarb: Terima kasih! Menambahkan idmembuatnya menjadi fungsi yang tepat. Saya sudah mencatat di jawaban saya.
nimi
1

Bash murni (tanpa utilitas), 40

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

TI-Basic, 6 5 byte

Berjalan pada kalkulator TI-83/84

:Ans²-Ans

Program ini berfungsi karena fakta bahwa ekspresi pada baris terakhir program dicetak bukan Doneteks biasa .

Timtech
sumber
1
5 byte::Ans²-Ans
lirtosiast
1

Mathcad, 39 "byte"

masukkan deskripsi gambar di sini

Dari perspektif pengguna, Mathcad secara efektif adalah papan tulis 2D, dengan ekspresi dievaluasi dari kiri ke kanan, atas-ke-bawah. Mathcad tidak mendukung input "teks" konvensional, tetapi malah menggunakan kombinasi teks dan item tombol / toolbar / menu khusus untuk menyisipkan ekspresi, teks, plot, atau komponen. Misalnya, ketik ":" untuk memasukkan operator definisi (ditampilkan di layar sebagai ": ="), "[" untuk memasukkan indeks array, atau "ctl-" "untuk memasukkan operator loop sementara (termasuk placeholder untuk mengendalikan kondisi dan ekspresi satu tubuh). Apa yang Anda lihat pada gambar di atas adalah persis apa yang muncul pada antarmuka pengguna dan sebagai "mengetik" pada.

Untuk tujuan bermain golf, hitungan "byte" adalah jumlah yang setara dengan operasi keyboard yang diperlukan untuk memasukkan ekspresi.

Satu hal yang saya bahkan kurang yakin tentang (dari sudut pandang kesetaraan "byte") adalah bagaimana cara menghitung membuat wilayah baru (misalnya, a: = 5 atau k: = 0..n-1). Saya telah menyamakan setiap perpindahan ke wilayah baru sama dengan baris baru, dan karenanya 1 byte (dalam praktiknya, saya menggunakan mouse untuk mengklik di mana saya ingin wilayah tersebut).

Saya hanya menyertakan pernyataan aktif dan bukan komentar, dan saya sudah memasukkan masing-masing 2 byte untuk input a dan n tetapi tidak nilainya sendiri (5 dan 7 dalam contoh).

Stuart Bruff
sumber
0

Haskell, 72 byte

Tantangan ini tidak bersahabat dengan Haskell .. Namun, berikut ini berfungsi jika input tidak digunakan dan kode dieksekusi dalam GHCI:

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

Penjelasan:

Unary selalu aneh, jadi aplikasi pertama akan dikonversi ke desimal. x*(x-1)selalu sama, jadi jika tidak kembali x*(x-1), di mana xinput. Karena Haskell sangat diketik dan simbol 'khusus' tidak bisa disebut seperti &1, saya percaya bahwa ini adalah satu-satunya cara untuk menyelesaikan ini di Haskell, kecuali satu menggunakan variabel global atau bentuk input yang bahkan lebih aneh.

Michael Klein
sumber
0

C ++ (gcc) , 173/176 byte

Kedua versi memiliki baris baru yang penting di bagian akhir.

Versi makro, 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;

Cobalah online!

Versi templat, 176 byte

Agak lebih 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++;

Cobalah online!

gastropner
sumber
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
mroman
sumber