Geometrik dizileri çıkar


18

Haskell , üç sayı verebileceğiniz ve onlardan bir aritmetik dizi çıkarabileceğiniz bu düzgün (-looking) özelliğe sahiptir. Örneğin [1, 3..27], eşdeğerdir [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27].

Bu harika ve aritmetik sekanslar hariç hepsi oldukça sınırlayıcı. Toplama, pfft . Çarpma olduğu yer. Geri [1, 3..27]dönmek gibi geometrik diziler yapsaydı daha serin olmaz mıydı [1, 3, 9, 27]?

Meydan okuma

Bir yaz programı / fonksiyonu üç pozitif tamsayılar alır , bir , b ve c ve çıkışları burada x en büyük tam sayı ≤ olduğu C olarak temsil edilebilir burada n pozitif bir tamsayıdır.[a, b, b × (b ÷ a), b × (b ÷ a)2, ..., x]b × (b ÷ a)n

Yani, çıktı r olmalıdır , öyle ki:

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

Özellikler

  • Standart I / O kuralları geçerlidir .
  • Standart boşluklar vardır yasak .
  • b daima bölünebilir olacak bir .
  • a < bc
  • Bu zorluk tüm dillerde en kısa yaklaşımı bulmak değil, her dilde en kısa yaklaşımı bulmakla ilgilidir .
  • Kodunuz , aksi belirtilmedikçe, genellikle UTF-8 kodlamasında bayt cinsinden puanlanır .
  • Bu diziyi hesaplayan yerleşik işlevlere (Mathematica'da bir tane olabilir: P) izin verilir, ancak yerleşik bir teknolojiye dayanmayan bir çözüm eklemek teşvik edilir.
  • "Pratik" diller için bile açıklamalar teşvik edilmektedir .

Test senaryoları

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]

Birkaç iyi biçimde:

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. (ilk test senaryosuna bakın)
user202729

1
Formülün b ^ n / a ^ n-1 olduğunu unutmayın . Başlangıç n = 0
H.PWiz

2
Tabii ki Mathematica yerleşik ...
Neil

sonuçların kayan nokta hataları nedeniyle tam olarak tamsayı olmaması kabul edilebilir mi?
Luis Mendo

@LuisMendo Evet.
totallyhuman

Yanıtlar:


6

Kabuk , 8 bayt

~↑≤Ṡ¡o//

Giriş sırası b, c, a şeklindedir . Çevrimiçi deneyin!

açıklama

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

Bu programdaki kontrol akışını takip etmek biraz zor. İlk olarak, B en sağdaki beslenir /bir işlevi üreten /bgöre bunu böler b . Sonra, ~üç bölüme Kalan programı böler: ~(↑)(≤)(Ṡ¡o//b). Bu beslemeleri c için ve bir karşı Ṡ¡o//bbirleştirmektedir ve birlikte sonuçları . Sonuç ≤c, bağımsız değişkeninin en fazla c olup olmadığını kontrol eden ve ↑≤cbunun tutulduğu öğelerin en uzun önekini alan bir işlevdir .

(Ṡ¡o//b)aİstenen sonsuz listenin nasıl değerlendirildiğini göstermek için kalır . Parantez içindeki bölüm ayrılmıştır Ṡ(¡)(o//b). Sonra besleyen bir etmek o//b, sonucu besleyen ¡ve sonra verir bir ikinci argüman için. İfade (o//b)a, bir sayı alan ve onu / b'ye bölerek bir işlev verir ve ¡bu işlevi ikinci bağımsız değişkeni olan a .

İşte açıklamayı görselleştiren bir dizi dönüşüm:

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

A, b, c sırasına göre açık değişkenler kullanan alternatif çözüm :

↑≤⁰¡*/⁵²



3

JavaScript (ES6), 41 37 bayt

@Neil sayesinde 4 bayt kaydedildi

Girişi alır (b,c)(a).

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

Test senaryoları

Yorumlananlar

(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
Argümanları yeniden düzenlemek bana (b,c)=>g=a=>a>c?[]:[a,...g(b,b*=b/a)].
Neil



2

Python 3, 93 90 74 73 bayt

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

Çevrimiçi Deneyin

Rod ve user202729 sayesinde oldukça fazla bayt azaltmama yardımcı oldukları için teşekkürler!


1
def + return -> lambda. Python ipuçları.
user202729

1
Ayrıca yapabilirsiniz import*.
user202729

1
while i<=c:i++çok fazla bayt kaydetmek için (bunun yerine liste kavrama + günlük) kullanabilirsiniz
Çubuk

@ Çubuk while döngüsünü günlük olmadan nasıl kullanmalıyım? idk ne kadar tekrarlamalı
Manish Kundu


2

Oktav , 38 35 bayt

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

Çevrimiçi deneyin!

@ LuisMendo'nun MATL yaklaşımı, logüç kez tekrar etmesine rağmen Octave'de 3 bayt tasarruf sağlıyor .


2

Perl 6 , 26 24 bayt

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

Çevrimiçi deneyin!

Perl 6'nın dizi operatörü ..., geometrik serileri doğal olarak çıkarabilir.

Güncelleme: ... Bu can , ancak bu durumda biraz daha kısadır çıkarım değil.


1

05AB1E , 12 bayt

Sırayla giriş c,b,a

ÝmI¹Ý<m/ʒ¹›_

Çevrimiçi deneyin!

açıklama

Ý              # 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 bayt

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

Çevrimiçi deneyin!

Sadece topu MATL'de yuvarlatmak için. Bunu çözmenin daha az ayrıntılı bir yolu olmadığını hayal edemiyorum.


1
... Üçlü olumsuzlama yok lütfen.
user202729

2
@ user202729 Bunun bir kaza olmadığını nasıl anlayamadığınızı göremiyorum. :)
Sanchises

"İstemeden yapılmadığını nasıl elde edemeyeceğinizi anlamıyorum" demek istemiyorsunuz: P
HyperNeutrino

@HyperNeutrino No
Sanchises



1

MATL , 12 bayt

y/ivZlZ}3$:W

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

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
Bu gerçekten güzel. Yeniden kullanmakla uğraşıyordum ave c(başlayarak birçok başarısız girişimim var y/i), ancak bu yöntemi kullanarak her şeyi düzgün bir şekilde bir arada tutuyorsunuz.
Sanchises

1
bu yaklaşım Octave'de de 3 byte daha kısaydı.
Sanchises

0

Perl, 38 bayt

Dahil +3için -n( use 5.10.0Perl 5.10 özelliklerin kilidini açmak için serbesttir)

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

Ardından şu şekilde çalıştırın:

geosequence.pl <<< "1 3 26"


0

Japt , 14 bayt

ÆWpX zVpXÉÃf§U

Dene


açıklama

                    :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 bayt

Kullanıcıdan girdi alır ve çıktı verir Ans. C = b n / a n-1'de n için çözdüm, n = 1 + ln (c / b) / ln (b / a) elde ettim . Bu, n = 1 + log b / a (c / b) ile aynıdır . Golf amacıyla, dizime -1 ile başlıyorum ve 0 ile n yerine n-1 ile bitiriyorum.

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

0

APL (Dyalog Unicode) , 38 bayt

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

Çevrimiçi deneyin!

Önek Dfn. Girdileri sırayla alır a b cve kullanır ⎕IO←0( I ndex O rigin)

@ErikTheOutgolfer, bunu göndermeden önce 6 bayt tıraş ettiği için teşekkürler.

Nasıl?

{(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 bayt CP437

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

Ambalajdan çıkarıldığında 16 bayt,

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

Çevrimiçi çalıştırın ve hata ayıklayın!

Şeklinde girdi alır [b, a, c].

@Recursive'ın daha iyi çözümlere sahip olduğundan eminiz.

açıklama

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 bayt

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

Çevrimiçi deneyin!

Üç sayıyı okuyoruz. Ortak oranı ikinci sayı / ilk sayı ile hesaplayın. Sonra üst sınırdan daha büyük olana kadar seri boyunca ilerliyoruz.


0

C (gcc), 82 bayt

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

Çevrimiçi deneyin!

r_n = b^n/a^(n-1)Kadar hesaplar ve yazdırırr_n > c .

Derlenmelidir -lm!


69 baytn;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 bayt ( SBCS )

Bu solda ab ve sağda c argümanlarını alır ,

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

Çevrimiçi deneyin!

Muhtemelen daha kısa bir yol var, ama düşündüm ki ÷\ sevimli .

Açıklaması:

{...}Anonomous fonksiyonu ⍺ olduğunu a b, olupc . Diyelimkia b c = 2 6 100

⌽⍺ Ters :6 2

⍵⍴ Tekrar et süreleri:6 2 6 2 6 2 6 2 ...

÷\ Öneklere bölünerek azaltın: 6 (6÷2) (6÷(2÷6)) (6÷(2÷(6÷2))).. = 6 3 18 9 54 ..

⍺, Başına Ekle :2 6 6 3 18 9 54 27 162 81 ...

⊣/⍵2⍴ Diğer tüm öğeleri alın (artı bazı tekrarlar):

  ⍵2⍴Bir yapmak satır, 2sütun matrisi2 6 6 3 18 9 54 ...

  ⊣/ İlk sütunu al

⊆⊢ Diziyi bloklara ayırın.

⍵∘≥ tüm öğelerden büyük veya ona eşit

Bu tür ilk bloğu alın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.