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.

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.


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!


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.


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.


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.

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 _


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. :)


2

JavaScript REPL, 25 20 byte

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

Akan berupaya menghilangkan REPL


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).


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.




1

Perl, 23 byte

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

Versi alternatif, 10 byte

$_*=~-$_;

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


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!


(*)=<<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

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 .


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).


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.


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!


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.