Berikan urutan geometri


18

Haskell memiliki fitur rapi ini (di mana) Anda dapat memberikannya tiga angka dan dapat menyimpulkan urutan aritmatika dari mereka. Misalnya, [1, 3..27]setara dengan [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27].

Itu keren dan semua kecuali urutan aritmatika cukup terbatas. Selain itu, pfft . Perkalian ada di mana. Bukankah lebih keren jika melakukan urutan geometris seperti [1, 3..27]kembali [1, 3, 9, 27]?

Tantangan

Tulis sebuah program / fungsi yang mengambil tiga bilangan bulat positif a , b , dan c dan output di mana x adalah bilangan bulat terbesar ≤ c yang dapat direpresentasikan sebagai di mana n adalah bilangan bulat positif.[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]b × (b ÷ a)n

Artinya, output harus r , sedemikian rupa sehingga:

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

Spesifikasi

  • Aturan I / O standar berlaku .
  • Celah standar yang dilarang .
  • b akan selalu habis dibagi oleh a .
  • a < bc
  • Tantangan ini bukan tentang menemukan pendekatan terpendek dalam semua bahasa, melainkan tentang menemukan pendekatan terpendek dalam setiap bahasa .
  • Kode Anda akan dinilai dalam byte , biasanya dalam pengkodean UTF-8, kecuali ditentukan lain.
  • Fungsi bawaan (Mathematica mungkin memiliki satu: P) yang menghitung urutan ini diizinkan tetapi termasuk solusi yang tidak bergantung pada bawaan dianjurkan.
  • Penjelasan, bahkan untuk bahasa "praktis", dianjurkan .

Uji kasus

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]

Dalam beberapa format yang lebih baik:

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 No. (lihat test case pertama)
user202729

1
Perhatikan bahwa rumusnya sederhana b ^ n / a ^ n-1 . Mulai dari n = 0
H.PWiz

2
Tentu saja Mathematica memiliki built-in ...
Neil

apakah dapat diterima jika hasilnya bukan bilangan bulat karena kesalahan floating point?
Luis Mendo

@LuisMendo Ya.
totallyhuman

Jawaban:


6

Sekam , 8 byte

~↑≤Ṡ¡o//

Input dalam urutan b, c, a . Cobalah online!

Penjelasan

~↑≤Ṡ¡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.

Aliran kontrol dalam program ini agak sulit untuk diikuti. Pertama, b diumpankan ke paling kanan /, menghasilkan fungsi /byang dibagi dengan b . Berikutnya, ~membagi program yang tersisa menjadi tiga bagian: ~(↑)(≤)(Ṡ¡o//b). Ini feed c untuk dan sebuah untuk Ṡ¡o//b, dan menggabungkan hasilnya dengan . Hasil dari ≤cadalah fungsi yang memeriksa apakah argumennya paling banyak c , dan ↑≤cmengambil awalan terpanjang dari elemen yang dipegang ini.

Tetap menunjukkan bagaimana (Ṡ¡o//b)amengevaluasi daftar tak terbatas yang diinginkan. Bagian dalam tanda kurung dibagi menjadi Ṡ(¡)(o//b). Kemudian feed sebuah ke o//b, feed hasil untuk ¡, dan kemudian memberikan sebuah argumen kedua. Ekspresi (o//b)amemberikan fungsi yang mengambil angka dan membaginya dengan a / b , dan ¡mengulangi fungsi ini pada argumen kedua, yaitu a .

Berikut adalah serangkaian transformasi yang memvisualisasikan penjelasan:

  (~↑≤Ṡ¡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)

Solusi alternatif menggunakan variabel eksplisit dalam urutan a, b, c :

↑≤⁰¡*/⁵²



3

JavaScript (ES6), 41 37 byte

Disimpan 4 byte berkat @Neil

Mengambil input sebagai (b,c)(a).

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

Uji kasus

Berkomentar

(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
Menyusun ulang argumen memberi saya (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])

Cobalah secara Online

Terima kasih kepada Rod dan user202729 untuk membantu saya mengurangi beberapa byte!


1
def + return -> lambda. Kiat-kiat Python.
user202729

1
Anda juga bisa import*.
user202729

1
Anda dapat menggunakan while i<=c:i++(bukan daftar pemahaman + log) untuk menyimpan banyak byte
Rod

@ Rad Bagaimana saya harus menggunakan loop sementara tanpa log? idk berapa lama untuk beralih
Manish Kundu


2

Oktaf , 38 35 byte

@(a,b,c)exp(log(a):log(b/a):log(c))

Cobalah online!

Ternyata pendekatan MATL @ LuisMendo juga menghemat 3 byte dalam Oktaf, meskipun berulang log tiga kali.


2

Perl 6 , 26 24 byte

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

Cobalah online!

Operator urutan Perl 6 ...dapat menyimpulkan deret geometri secara asli.

Perbarui: ... Itu bisa , tetapi dalam situasi ini tidak menyimpulkan itu sedikit lebih pendek.


1

05AB1E , 12 byte

Masukan dalam urutan c,b,a

ÝmI¹Ý<m/ʒ¹›_

Cobalah online!

Penjelasan

Ý              # 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>~)

Cobalah online!

Hanya untuk mendapatkan bola bergulir di MATL. Saya tidak bisa membayangkan tidak ada cara yang kurang jelas untuk menyelesaikan ini.


1
... Tolong, jangan negasi tiga kali lipat.
user202729

2
@ user202729 Saya tidak mengerti bagaimana Anda tidak dapat mengetahui bahwa itu bukan kecelakaan. :)
Sanchises

Maksud Anda, "Saya tidak mengerti bagaimana Anda tidak dapat memperoleh hal yang tidak dilakukan tanpa sengaja": P
HyperNeutrino

@HyperNeutrino No.
Sanchises


1

Haskell, 35 byte

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

Cobalah online!


1
34 byte . (selengkapnya "dalam semangat tantangan", kesalahan floating point yang mengerikan)
user202729

@ user202729: silahkan posting sebagai jawaban yang terpisah (tapi menyimpan byte: exp<$>[...])
Nimi

1

MATL , 12 byte

y/ivZlZ}3$:W

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

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
Ini sangat bagus. Saya sedang berjuang dengan menggunakan kembali adan c(saya memiliki banyak upaya gagal mulai dengan y/i), tetapi menggunakan metode ini, Anda dengan rapi menyatukan semuanya.
Sanchises

1
pendekatan ini sebenarnya 3 byte lebih pendek di Oktaf juga.
Sanchises

0

Perl, 38 byte

Termasuk +3untuk -n( use 5.10.0untuk membuka kunci fitur perl 5.10 gratis)

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

Kemudian jalankan sebagai:

geosequence.pl <<< "1 3 26"


0

Japt , 14 byte

ÆWpX zVpXÉÃf§U

Cobalah


Penjelasan

                    :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

Mengambil input dari pengguna dan output dalam Ans. Saya memecahkan untuk n dalam c = b n / a n-1 , mendapatkan n = 1 + ln (c / b) / ln (b / a). Itu sama dengan n = 1 + log b / a (c / b). Untuk keperluan bermain golf, saya memulai urutan saya di -1 dan mengakhirinya di n-1 daripada 0 sampai 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←⍳⊃⌽⍵}

Cobalah online!

Awalan Dfn. Mengambil input secara berurutan a b c, dan menggunakan ⎕IO←0( I ndex O rigin)

Terima kasih kepada @ErikTheOutgolfer untuk mencukur 6 byte dari ini bahkan sebelum saya mempostingnya.

Bagaimana?

{(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 saat dibongkar,

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

Jalankan dan debug online!

Mengambil input dalam bentuk [b, a, c].

Cukup yakin @recursive memiliki solusi yang lebih baik.

Penjelasan

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

Cobalah online!

Kami membaca tiga angka. Hitung rasio umum dengan angka kedua / pertama. Kemudian kita menjalankan seri sampai kita lebih besar dari batas atas.


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);}

Cobalah online!

Menghitung dan mencetak r_n = b^n/a^(n-1)hingga r_n > c.

Harus dikompilasi -lm!


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

0

APL (Dyalog) , 23 byte ( SBCS )

Ini mengambil argumen ab di kiri dan c di kanan,

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

Cobalah online!

Mungkin ada jalan yang lebih pendek, tapi saya pikir ÷\itu lucu.

Dijelaskan:

{...}Fungsi anonomous ⍺ adalah a b, adalah c. Katakanlaha b c = 2 6 100

⌽⍺Membalikkan :6 2

⍵⍴Ulangi kali:6 2 6 2 6 2 6 2 ...

÷\ Dikurangi berdasarkan pembagian pada awalan: 6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..

⍺,Prepend :2 6 6 3 18 9 54 27 162 81 ...

⊣/⍵2⍴ Dapatkan setiap elemen lainnya (ditambah beberapa pengulangan trailing):

  ⍵2⍴Buat baris, 2dari matriks kolom2 6 6 3 18 9 54 ...

  ⊣/ Dapatkan kolom pertama

⊆⊢ Membagi array menjadi blok di mana

⍵∘≥ lebih besar atau sama dengan semua elemen

Ambil blok pertama seperti itu

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.