Suy ra các chuỗi hình học


18

Haskell có tính năng (trông giống) gọn gàng này, nơi bạn có thể cung cấp cho nó ba số và nó có thể suy ra một chuỗi số học từ chúng. Ví dụ, [1, 3..27]tương đương với [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27].

Điều đó thật tuyệt và tất cả nhưng trình tự số học khá hạn chế. Ngoài ra, pfft . Phép nhân là nơi nó ở. Sẽ không hay hơn nếu nó thực hiện các chuỗi hình học như [1, 3..27]quay trở lại [1, 3, 9, 27]?

Thử thách

Viết chương trình / hàm lấy ba số nguyên dương a , bc và xuất ra trong đó x là số nguyên lớn nhất ≤ c có thể được biểu diễn trong đó n là số nguyên dương.[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]b × (b ÷ a)n

Đó là, đầu ra phải là r , sao cho:

r0 = a
r1 = b
rn = b × (b ÷ a)n-1
rlast = greatest integer ≤ c that can be represented as b × (b ÷ a)n
         where n is a positive integer

Thông số kỹ thuật

  • Quy tắc I / O tiêu chuẩn được áp dụng .
  • Sơ hở chuẩn bị cấm .
  • b sẽ luôn chia hết cho a .
  • a < bc
  • Thách thức này không phải là tìm ra cách tiếp cận ngắn nhất trong tất cả các ngôn ngữ, mà là tìm cách tiếp cận ngắn nhất trong mỗi ngôn ngữ .
  • Mã của bạn sẽ được ghi theo byte , thường là trong mã hóa UTF-8, trừ khi được quy định khác.
  • Các hàm tích hợp (Mathicala có thể có một: P) tính toán chuỗi này được cho phép nhưng bao gồm một giải pháp không dựa vào tích hợp được khuyến khích.
  • Giải thích, ngay cả đối với các ngôn ngữ "thực tế", được khuyến khích .

Các trường hợp thử nghiệm

a   b   c     r

1   2   11    [1, 2, 4, 8]
2   6   100   [2, 6, 18, 54]
3   12  57    [3, 12, 48]
4   20  253   [4, 20, 100]
5   25  625   [5, 25, 125, 625]
6   42  42    [6, 42]

Trong một vài định dạng tốt hơn:

1 2 11
2 6 100
3 12 57
4 20 253
5 25 625
6 42 42

1, 2, 11
2, 6, 100
3, 12, 57
4, 20, 253
5, 25, 625
6, 42, 42

@ Adám số (xem trường hợp thử nghiệm đầu tiên)
user202729

1
Lưu ý rằng công thức chỉ đơn giản là b ^ n / a ^ n-1 . Bắt đầu lúc n = 0
H.PWiz

2
Tất nhiên Mathicala có tích hợp ...
Neil

Có thể chấp nhận được nếu kết quả không chính xác là số nguyên do lỗi dấu phẩy động?
Luis Mendo

@LuisMendo Vâng.
hoàn toàn là

Câu trả lời:


6

Husk , 8 byte

~↑≤Ṡ¡o//

Đầu vào theo thứ tự b, c, a . Hãy thử trực tuyến!

Giải trình

~↑≤Ṡ¡o//  Implicit inputs.
       /  a/b as exact rational number.
     o/   Divide by a/b (so multiply by b/a).
    ¡     Iterate that function
   Ṡ      on a. Result is the infinite list [a, b, b^2/a, b^3/a^2, ..
 ↑        Take elements from it while
~ ≤       they are at most c.

Luồng điều khiển trong chương trình này hơi khó theo dõi. Đầu tiên, b được đưa đến ngoài cùng bên phải /, tạo ra một hàm /bchia cho b . Tiếp theo, ~chia chương trình còn lại thành ba phần : ~(↑)(≤)(Ṡ¡o//b). Đây thức ăn c đến một để Ṡ¡o//b, và máy liên hợp kết quả với . Kết quả của ≤clà một hàm kiểm tra xem đối số của nó có nhiều nhất là c hay không và ↑≤clấy tiền tố dài nhất của các phần tử mà phần tử này giữ.

Nó vẫn còn để hiển thị cách (Ṡ¡o//b)ađánh giá vào danh sách vô hạn mong muốn. Phần trong ngoặc được chia thành Ṡ(¡)(o//b). Sau đó cung cấp một đến o//b, cung cấp kết quả cho ¡, và sau đó đưa ra một đối số thứ hai của nó. Biểu thức (o//b)ađưa ra một hàm lấy một số và chia nó cho a / b¡lặp lại hàm này trên đối số thứ hai của nó, đó là a .

Dưới đây là một loạt các biến đổi trực quan hóa lời giải thích:

  (~↑≤Ṡ¡o//) b c a
= (~↑≤Ṡ¡o/(/b)) c a
= ~(↑)(≤)(Ṡ¡o/(/b)) c a
= ↑(≤c)((Ṡ¡o/(/b)) a)
= ↑(≤c)(Ṡ(¡)(o/(/b)) a)
= ↑(≤c)(¡(o/(/b)a) a)
= ↑(≤c)(¡(/(/ba))a)
Last line in English: takeWhile (atMost c) (iterate (divideBy (divideBy b a)) a)

Giải pháp thay thế sử dụng các biến rõ ràng theo thứ tự a, b, c :

↑≤⁰¡*/⁵²



3

JavaScript (ES6), 41 37 byte

Đã lưu 4 byte nhờ @Neil

Đưa đầu vào là (b,c)(a).

(b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)]

Các trường hợp thử nghiệm

Đã bình luận

(b, c) =>                 // main function taking b and c
  g = a =>                // g = recursive function taking a
    a > c ?               //   if a is greater than c:
      []                  //     stop recursion and return an empty array
    :                     //   else:
      [ a,                //     return an array consisting of a, followed by 
        ...g(             //     the expanded result of a recursive call to g()
          b,              //       with a = b
          b *= b / a      //       and b = b * ratio
        ) ]               //     end of recursive call

1
Sắp xếp lại các đối số cho tôi (b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)].
Neil



2

Python 3, 93 90 74 73 byte

x=lambda a,b,c,i=0,q=[]:a*(b/a)**i>c and q or x(a,b,c,i+1,q+[a*(b/a)**i])

Dùng thử trực tuyến

Cảm ơn Roduser202729 đã giúp tôi giảm khá nhiều byte!


1
def + return -> lambda. Mẹo Python.
dùng202729

1
Ngoài ra bạn có thể import*.
dùng202729

1
bạn có thể sử dụng while i<=c:i++(thay vì liệt kê danh sách + nhật ký) để tiết kiệm rất nhiều byte
Rod

@Rod Tôi nên sử dụng vòng lặp while mà không có nhật ký như thế nào? idk bao lâu để lặp đi lặp lại
Manish Kundu



2

Perl 6 , 26 24 byte

{$^a,$^b,$b²/$a...^*>$^c}
{$^a,*×$^b/$a...^*>$^c}

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

Toán tử trình tự của Perl 6 ...có thể suy ra chuỗi hình học nguyên bản.

Cập nhật: ... Có thể , nhưng trong tình huống này không suy ra thì nó ngắn hơn một chút.


1

05AB1E , 12 byte

Nhập theo thứ tự c,b,a

ÝmI¹Ý<m/ʒ¹›_

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

Giải trình

Ý              # push the range [0 ... c]
 m             # raise b to the power of each
  I            # push a
   ¹Ý          # push the range [0 ... c]
     <         # decrement each
      m        # push a to the power of each
       /       # elementwise division of ranges
        ʒ      # filter, keep only elements that are
         ¹›_   # not greater than c

1

MATL , 17 byte

t:,qtiw^w]x/tb>~)

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

Chỉ để có được quả bóng lăn trong MATL. Tôi không thể tưởng tượng rằng không có cách nào ít giải quyết vấn đề này.


1
... Không có ba phủ định xin vui lòng.
dùng202729

2
@ user202729 tôi không thấy làm thế nào bạn không thể nhận được rằng đó không phải là một tai nạn :).
Sanchises

Ý bạn là "Tôi không thấy cách bạn không thể hiểu rằng điều đó không được thực hiện ngoài ý muốn": P
HyperNeutrino

@HyperNeutrino số
Sanchises


1

Haskell, 35 byte

(a#b)c|a>c=[]|d<-div b a*b=a:(b#d)c

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


1
34 byte . (thêm "trong tinh thần của thử thách", lỗi dấu phẩy động khủng khiếp)
user202729

@ user202729: vui lòng đăng nó dưới dạng câu trả lời riêng (nhưng lưu một byte exp<$>[...]:)
nimi

1

MATL , 12 byte

y/ivZlZ}3$:W

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

y     % Implicitly take two inputs, and duplicate the first onto the top
/     % Divide
i     % Take third input
v     % Vertically concatenate the three numbers into a column vector
Zl    % Binary logarithm, element-wise
Z}    % Split the vector into its three components
3$:   % Three-input range. Arguments are start, step, upper limit
W     % 2 raised to that, element-wise. Implicit display

1
Điều này thực sự tốt đẹp. Tôi đã vật lộn với việc tái sử dụng ac(tôi có nhiều lần thử thất bại bắt đầu y/i), nhưng sử dụng phương pháp này, bạn gọn gàng giữ mọi thứ lại với nhau.
Sanchise

1
Cách tiếp cận này thực sự ngắn hơn 3 byte trong Octave.
Sanchise

0

Perl, 38 byte

Bao gồm +3cho -n( use 5.10.0để mở khóa các tính năng perl 5.10 là miễn phí)

#!/usr/bin/perl -n
use 5.10.0;
/ \d+/;say,$_*=$&/$`until($_+=0)>$'

Sau đó chạy như:

geosequence.pl <<< "1 3 26"


0

Japt , 14 byte

ÆWpX zVpXÉÃf§U

Thử nó


Giải trình

                    :Implicit input of integers U=c, V=a & W=b
Æ         Ã         :Range [0,U) and pass each X through a function
 WpX                :  W to the power of X
     z              :  Floor divide by
      VpXÉ          :  V to the power of X-1
           f§U      :Filter elements less than or equal to U


0

TI-BASIC, 31 byte

Lấy đầu vào từ người dùng và đầu ra trong Ans. Tôi đã giải cho n trong c = b n / a n-1 , nhận n = 1 + ln (c / b) / ln (b / a). Điều đó giống như n = 1 + log b / a (c / b). Với mục đích chơi gôn, tôi bắt đầu trình tự của mình ở -1 và kết thúc ở n-1 thay vì 0 đến n.

Prompt A,B,C
seq(B(B/A)^N,N,-1,logBASE(C/B,B/A

0

APL (Dyalog Unicode) , 38 byte

{(g≤⊃⌽⍵)⊆gf,(⍵[1]*p+1)÷(f←⊃⍵)*p←⍳⊃⌽⍵}

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

Tiền tố Dfn. Đưa đầu vào theo thứ tự a b cvà sử dụng ⎕IO←0( I ndex O rigin)

Cảm ơn @ErikTheOutgolfer đã cạo 6 byte khỏi điều này trước khi tôi đăng nó.

Làm sao?

{(g≤⊃⌽⍵)⊆gf,(⍵[1]*p+1)÷(f←⊃⍵)*p←⍳⊃⌽⍵}  Prefix Dfn. Input  is a vector
                                    ⌽⍵   Reverse ⍵. Yields c b a
                                        Pick the first element (c)
                                        Index. Yields the integers 0..c-1
                                p       Assign to the variable p
                               *         Exponentiate
                         (f←⊃⍵)          Pick the first element of  (a) and assign to f
                                         This yields the vector (a^0, a^1, ..., a^c-1)
                        ÷                Element-wise division
                    p+1)                 The vector 1..c
                   *                     Exponentiate
              (⍵[1]                      Second element (because of IO0) of  (b)
                                         This yields the vector (b^1, b^2, ..., b^c)
            f,                           Prepend f (a). This yields the vector 
                                         (a, b^1/a^0, b^2/a^1, ...)
          g                             Assign the vector to g
                                        Partition. This takes a boolean vector as left
                                         argument and drops falsy elements of the right argument.
     ⊃⌽⍵)                                Pick the last element of  (c)
  (g                                    Check if each element of gc. Yields the boolean
                                         vector that is the left argument for 

0

Stax , 14 byte CP437

ü╞¥ß¥║/,5å╘⌂åº

16 byte khi giải nén,

E~Y/y{;^<}{[*gfm

Chạy và gỡ lỗi trực tuyến!

Đưa đầu vào ở dạng [b, a, c].

Khá chắc chắn @recursive có giải pháp tốt hơn.

Giải trình

E~                              Parse  input, put `c` on input stack
  Y/                            Store `a` in register `y` and calculate `b`/`a`
    y                           Put `y` back to main stack, stack now (from top to bottom): [`a`, `b`/`a`]
     {   }{  gf                 generator
      ;^<                       Condition: if the generated number is smaller than the top of input stack (i.e. `c`)
           [*                   duplicate the second item in main stack and multiply it with the item at the top
                                   i.e. multiply last generated value by `b/a` and generate the value
              m                 Output array, one element on each line

0

Silos , 73 byte

readIO
k=i
readIO
j=i
readIO
r=j/k
a=k
lbla
printInt a
a*r
b=i-a+1
if b a

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

Chúng tôi đọc ba số. Tính tỷ lệ chung theo số thứ hai / số thứ nhất. Sau đó, chúng tôi chạy qua chuỗi cho đến khi chúng tôi lớn hơn giới hạn trên.


0

C (gcc), 82 byte

n;f(a,b,c){float r=0;for(n=0;r<=c;)(r=pow(b,n)/pow(a,n++-1))<=c&&printf("%f ",r);}

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

Tính toán và in r_n = b^n/a^(n-1)cho đến khi r_n > c.

Phải được biên dịch với -lm!


69 byten;f(a,b,c){for(float r=n=0;r=pow(b/a,n++)*a,r<=c&&printf("%f ",r););}
trần nhà

0

APL (Dyalog) , 23 byte ( SBCS )

Điều này có các đối số ab ở bên trái và c ở bên phải,

{⊃(⍵∘≥⊆⊢)⊣/⍵2⍴⍺,÷\⍵⍴⌽⍺}

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

Có khả năng là một cách ngắn hơn, nhưng tôi nghĩ rằng ÷\ là dễ thương.

Giải thích:

{...}Hàm anonomous là a b, c. Hãy cùng nói nàoa b c = 2 6 100

⌽⍺Đảo ngược :6 2

⍵⍴Lặp lại thời gian:6 2 6 2 6 2 6 2 ...

÷\ Giảm bằng cách chia trên các tiền tố: 6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..

⍺,Chuẩn bị :2 6 6 3 18 9 54 27 162 81 ...

⊣/⍵2⍴ Nhận mọi yếu tố khác (cộng với một số lần lặp lại):

  ⍵2⍴Tạo một hàng, 2ma trận cột từ2 6 6 3 18 9 54 ...

  ⊣/ Lấy cột đầu tiên

⊆⊢ Chia mảng thành các khối trong đó

⍵∘≥ lớn hơn hoặc bằng tất cả các yếu tố

Lấy khối đầu tiên như vậy

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.