Phép nhân tuần tự


12

Mục tiêu của bạn là viết một chương trình lấy đầu vào và khi kết nối lại với nhau N, thực hiện "phép nhân liên tiếp". Phép nhân liên tiếp là gì, bạn có thể hỏi? Đó là một chuỗi với một hạt giống ađược định nghĩa như sau:

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

Vì vậy, hãy để a = 5. Do đó, f(0) = 5, f(1) = f(0)*(f(0)-1) = 5*4 = 20, và f(2) = f(1)*(f(1)-1) = 20*19 = 380.

Nếu chương trình của bạn là ABC, thì ABCnên lấy đầu vào avà đầu ra f(1). Chương trình ABCABCnên xuất f(2), v.v ... Chuỗi chương trình của bạn chỉ nên nhận đầu vào một lần và chỉ xuất một lần.

Đây là một môn đánh gôn, vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng. Sơ hở tiêu chuẩn bị cấm.

Câu trả lời:


13

Thạch, 3 byte

×’$

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

Lặp lại đoạn trích n lần sẽ thực hiện nó n lần, dẫn đến đầu ra mong muốn.


4

Nghiêm túc, 4 byte

,;D*

Giải trình:

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

Giống như trong câu trả lời Jelly của Dennis , việc lặp lại nthời gian của chương trình này sẽ dẫn đến nthời gian chạy . Đó là một trong nhiều lợi thế của các ngôn ngữ dựa trên ngăn xếp bắt buộc.

Hãy thử trực tuyến!


4

MATL, 3 byte

tq*

Bạn có thể thử trực tuyến! Về cơ bản tương tự như câu trả lời Nghiêm túc và Jelly. Đầu tiên, nó nhân đôi đỉnh của ngăn xếp (nhận đầu vào lần đầu tiên khi ngăn xếp trống). Giảm đỉnh của ngăn xếp và nhân hai phần tử để đưa ra kết quả đầu vào hoặc kết quả tiếp theo.


4

Python 3, 56 byte

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

Chỉ muốn một giải pháp mà không có thủ thuật ghi đè đầu ra. Việc thiếu một dòng mới là rất quan trọng.


Là dòng đầu tiên tất cả 1 số?
Seadrus

@Seadrus Không, cú pháp tô sáng không phù hợp với trình phân tích cú pháp Python, nó dừng phân tích cú pháp các số khi nó chạm ifelse.
xnor

Điều này sẽ ngắn hơn trong Python 2 .
mbomb007

@ mbomb007 Điều đó sẽ không hoạt động tốt, bản in không được xử lý phù hợp và bạn nhận được đầu ra thêm khi bạn ghép ít nhất một lần.
FryAmTheEggman

Ah, vậy đó là những gì đầu ra thêm.
mbomb007

3

CJam, 5 byte

r~_(*

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

_▼•=_

Hãy thử trực tuyến.

Sẽ là 4 byte nếu tôi không lười biếng và không thực hiện "gán cho _" ...

Giải trình

_▼•=_

_       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

~.(*`

Hãy thử trực tuyến.

De-golfed và nhận xét:

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

Trình thông dịch GolfScript tự động đọc đầu vào và đặt nó vào ngăn xếp, nhưng dưới dạng một chuỗi, không phải là một số. Vì vậy, chúng ta cần biến đầu vào thành một số với ~và xâu chuỗi lại sau đó với `. Cuối cùng, trình thông dịch sẽ tự động in ra số được xâu chuỗi trên ngăn xếp.

(Bây giờ, nếu thử thách đã lặp lại f(n+1) = f(n)*(-f(n)-1), tôi có thể thực hiện điều đó trong 4 byte với ~.~*. Tìm hiểu cách thức và lý do tại sao hoạt động đó được để lại như một bài tập. :)


2

JavaScript REPL, 25 20 byte

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

Sẽ loại bỏ REPL


Làm thế nào để sản xuất đầu ra?
Dennis

Trong bảng điều khiển. Tôi cần phải sửa nó.
Conor O'Brien

không có giao diện điều khiển nào ổn, tôi cho rằng đầu ra hợp lệ cho js
Seadrus

Oh! Tuyệt diệu!!
Conor O'Brien

2
@Seadrus Rõ ràng theo sự đồng thuận meta (mà tôi không nhận ra là một điều), các môi trường dựa trên REPL vẫn ổn miễn là nó quy định rằng đó là REPL.
Alex A.

2

Lua, 35 18 byte

Đó là điều mà Lua có thể làm khá dễ dàng trong một lần!

Chỉnh sửa: Tôi đã phát hiện ra rất nhiều điều ở Lua kể từ khi tôi làm điều này, vì vậy tôi đang cập nhật nó :)

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

...chứa đối số dòng lệnh được giải nén, nội tuyến nó sẽ sử dụng giá trị đầu tiên của nó trong trường hợp này vì nó sẽ không được phép chi tiêu, dẫn đến chỉ cần in n*(n-1).


1

Y , 7 byte

jzC:t*!

Hãy thử nó ở đây!

Đây là cách nó hoạt động: jlấy đầu vào số. zkích hoạt in ấn ngầm. Cbắt đầu một liên kết mới :nhân đôi giá trị trên ngăn xếp và tgiảm giá trị, để lại cho chúng ta [a a-1]. Sau đó, chúng tôi nhận được [a*a-a]từ *. !bỏ qua lệnh tiếp theo; trên EOF, nó không làm gì cả. Khi kết nối với nhau, nó bỏ qua lệnh đầu vào và quá trình bắt đầu lại.




1

Perl, 23 byte

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

Phiên bản thay thế, 10 byte

$_*=~-$_;

Điều này đòi hỏi phải -pchuyển đổi. Tôi không chắc liệu đây có phải là trò chơi công bằng trong câu hỏi .


1

Haskell, 14 11 byte

(*)=<<pred$

Ví dụ sử dụng

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

Có lẽ đây không phải là một chức năng thích hợp. Nếu bạn đang nitpicking, bạn có thể đi với (*)=<<pred$id(<-có một khoảng trống ở cuối) cho 14 byte.

Chỉnh sửa: @Zgarb viết lại hàm bằng cách sử dụng hàm đơn nguyên và lưu 3 byte. Cảm ơn!


(*)=<<pred$tiết kiệm 3 byte. Ngoài ra, cần lưu ý rằng điều này không thực sự xác định hàm và giá trị đầu vào phải được đặt trực tiếp sau hàm đó.
Zgarb

@Zgarb: Cảm ơn! Thêm idlàm cho nó một chức năng thích hợp. Tôi đã đặt một ghi chú trong câu trả lời của tôi.
nimi


1

TI-Basic, 6 5 byte

Chạy trên máy tính TI-83/84

:Ans²-Ans

Chương trình này hoạt động do thực tế là một biểu thức trên dòng cuối cùng của chương trình được in thay vì Donevăn bản thông thường .


1
5 byte::Ans²-Ans
lirtosiast

1

Mathcad, 39 "byte"

nhập mô tả hình ảnh ở đây

Từ góc độ người dùng, Mathcad thực sự là một bảng trắng 2D, với các biểu thức được đánh giá từ trái sang phải, từ trên xuống dưới. Mathcad không hỗ trợ đầu vào "văn bản" thông thường mà thay vào đó sử dụng kết hợp văn bản và các phím / thanh công cụ / menu đặc biệt để chèn một biểu thức, văn bản, cốt truyện hoặc thành phần. Ví dụ: nhập ":" để nhập toán tử định nghĩa (hiển thị trên màn hình là ": ="), "[" để nhập chỉ mục mảng hoặc "ctl-]" để nhập toán tử vòng lặp while (bao gồm các trình giữ chỗ cho điều kiện kiểm soát và một biểu hiện cơ thể). Những gì bạn nhìn thấy trong hình trên chính xác là những gì xuất hiện trên giao diện người dùng và được "nhập" vào.

Đối với mục đích chơi gôn, số "byte" là số thao tác bàn phím tương đương cần có để nhập một biểu thức.

Một điều tôi thậm chí còn ít chắc chắn hơn (từ quan điểm tương đương "byte") là cách tính tạo một vùng mới (ví dụ: a: = 5 hoặc k: = 0..n-1). Tôi đã đánh đồng mỗi lần di chuyển đến một khu vực mới bằng với một dòng mới và do đó 1 byte (trong thực tế, tôi sử dụng chuột để nhấp vào nơi tôi muốn khu vực đó).

Tôi chỉ bao gồm các báo cáo hoạt động và không bao gồm các nhận xét và tôi đã bao gồm 2 byte cho mỗi đầu vào a và n nhưng không bao gồm các giá trị (ví dụ 5 và 7 trong ví dụ).


0

Haskell, 72 byte

Thử thách này không thân thiện với Haskell .. Tuy nhiên, các hoạt động sau đây nếu đầu vào không đồng nhất và mã được thực thi trong GHCI:

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

Giải trình:

Unary luôn là số lẻ, vì vậy ứng dụng đầu tiên sẽ chuyển thành số thập phân. x*(x-1)luôn luôn là chẵn, vì vậy nếu không nó trả về x*(x-1), đâu xlà đầu vào. Bởi vì Haskell được gõ mạnh và các ký hiệu 'đặc biệt' không thể được gọi như thế &1, tôi tin rằng đây là cách duy nhất để hoàn thành việc này trong Haskell, trừ khi người ta sử dụng biến toàn cục hoặc dạng đầu vào thậm chí là odder.


0

C ++ (gcc) , 173/176 byte

Cả hai phiên bản đều có một dòng mới quan trọng ở cuối.

Phiên bản 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;

Hãy thử trực tuyến!

Phiên bản mẫu, 176 byte

Một số C ++ nữa là:

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

Hãy thử trực tuyến!


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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.