Henüz kayboldun mu?


31

Göreviniz A130826 tamsayı sırasını uygulamak :

Bir N olduğu en küçük pozitif tam sayı şekildedir bir n , n - bütün bir katı olan 3 ve Bölen iki katı (bir n - n) / 3 verir N inci Flavius tarafından üretilen dizinin ilk farklar terimi Josephus elek.

Kayıp mı oldun? Aslında çok kolay.

Flavius Josephus elek aşağıdaki şekilde bir tam sayı dizisini tanımlar.

  1. Pozitif tamsayı dizisi ile başlayın ve k = 2 olarak ayarlayın .

  2. Her çıkarın k inci başlayarak dizisinin tamsayı k th .

  3. Artırma k adım 2'ye geri dönün ve.

f , n olup , n inci tamsayıdır çıkarıldı geçmez ki (1 endeksli).

Her zamanki gibi - - Eğer σ 0 (k) tam sayı pozitif bölenler sayısını belirtir , k , biz tanımlayabilir bir n en küçük pozitif tam sayı, örneğin edilene 0 ((a n = f - n) / 3) , n + 1 f - n .

Meydan okuma

Pozitif bir tamsayı alan bir program veya fonksiyon yazın n girdi ve baskılar olarak veya döner bir n .

Standart kuralları geçerlidir. En kısa kod kazansın!

Çalıştı örnekler

Pozitif tamsayıların her ikinci elemanını kaldırırsak,

 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 ...

Kalanın her üçüncü öğesini çıkardıktan sonra,

 1  3  7  9 13 15 19 21 25 27 31 33 37 39 ...

Şimdi dördüncü, sonra beşinci, sonra altıncı elementi çıkarmak bizi alıyor

 1  3  7 13 15 19 25 27 31 37 39 ...
 1  3  7 13 19 25 27 31 39 ...
 1  3  7 13 19 27 31 39 ...
 1  3  7 13 19 27 39 ...

Son satır f 1 ila f 7 terimlerini gösterir .

Bu terimlerin ardışık elemanları arasındaki farklar

 2  4  6  6  8 12

Bu ileri farkları 2'ye bölerek ,

 1  2  3  3  4  6 

Bunlar hedef bölen sayısı.

  • 4 birinci tamsayıdır k şekilde σ 0 1 = - (1) (3 / K) . Aslında, σ 0 (1) = 1'dir .
  • 8 ilk tamsayı k şekilde σ 0 = 2 - (2) (3 / K) . Aslında, σ 0 (2) = 2'dir .
  • 15 ilk tam sayı olduğu k şekilde σ 0 3 = - (3) (3 / K) . Aslında, σ 0 (4) = 3'tür .
  • 16 ilk tam sayı olduğu k şekilde σ 0 3 = - (4) (3 / K) . Aslında, σ 0 (4) = 3'tür .
  • 23 ilk tam sayı olduğu k şekilde σ 0 = 4 - (5) / 3 (k) . Aslında, σ 0 (6) = 4'tür .
  • 42 ilk tam sayı olduğu k şekilde σ 0 6 = - (6) / 3 (k) . Aslında, σ 0 (12) = 6'dır .

Test durumları

   n     a(n)

   1        4
   2        8
   3       15
   4       16
   5       23
   6       42
   7       55
   8      200
   9       81
  10       46
  11      119
  12      192
  13      205
  14   196622
  15    12303
  16       88
  17      449
  18      558
  19      127
  20     1748
  21   786453
  22       58
  23     2183
  24     3096
  25     1105
  26   786458
  27 12582939
  28      568
  29     2189
  30     2730

14
OEIS’te anahtar kelime: dilsiz ("önemsiz bir dizi").
orlp

15
Salak? Dünyayı kurtarabilir!
Dennis,

3
Bu pun olsa ...
Mego

Yanıtlar:


7

Jöle, 30 29 27 25 bayt

@Dennis beni bilgilendiren Æd2 bayt ve iki zinciri birleştirmek için 2 bayt daha kaydedildi.

RUð÷‘Ċ×µ/
‘Ç_ÇH0Æd=¥1#×3+

Çevrimiçi deneyin!

Bu muhtemelen Jelly'le yaşadığım en eğlenceli şeydi. I hesaplar ikinci hat, başlamış f n den n OEIS formülü kullanılarak çok güzel.

açıklama

RUð ÷ 'Ċ × µ / F hesaplamak için yardımcı bağlantı n . Tartışma: n
R Numaraları al [1..n]
 U Ters
        / "Sonraki 2 katına kadar yuvarla" ile azaltın:
   Next Bir sonraki sayıya bölün
    'Çoklu atlamayı artırma
     İl Tavan (yuvarlak)
      × Bir sonraki sayıyla çarp

'Ç_ÇH0Æd = ¥ 1 # × 3 + Ana bağlantı. Tartışma: n
'Artış n
 Ç Hesapla F n + 1 
   Ç Hesapla F n
  _ Çıkart
    H 2'ye bölün
     0 1 # 0'dan başlayarak, ilk adayı bulun (a n -n) / 3
                   bu tatmin ediyor ...
      Æd σ 0 ((bir n- n) / 3)
        = = (F n + 1 -F , n ) / 2
            X 3 ile 3 çarpın (a çevirmek için , n , bir içine / 3-n) , n -n
              + A çevirmek n ekle n bir içine -n n

3

Python 2 , 121 119 118 bayt

n=input();r=range(1,4**n);d=s,=r*1,
for k in r:del s[k::k+1];d+=sum(k%j<1for j in r)*2,
print d.index(s[n]-s[n-1])*3+n

Çalışma zamanı , O (4 n ) bellek kullanımı ile kabaca O (16 n ) olmalıdır . Değiştirme ile - hangi düşünüyorum yeterlidir - dramatik bu artıracak, ama keyfi büyük değerleri için çalıştığını ikna olmadım n .4**n5<<n

Çevrimiçi deneyin!

Asimptotik davranış ve n nin üst sınırları

Tanımlar b n olarak (bir n / 3 - n) , yani, en küçük pozitif tam sayı k öyle ki σ 0 (k) = ½ (f , n + 1 - f , n ) .

OEIS sayfa ile ilgili belirtildiği üzere , f , n ~ ¼πn 2 bu yüzden, f , n + 1 f - N ~ ¼π (n + 1) 2 - ¼πn 2 (2n + 1) = ¼π ~ ½πn .

Bu yolla, ½ (f n + 1 - f n ) ~ ¼πn . Gerçek sayısı, bir asal ise p , en küçük pozitif tam sayı p bölenler olan 2 , p-1 , yani B , n ile tahmin edilebilir 2 , c , n , c , n ~ ¼πn .

Bu nedenle b n <4 , n yeterince büyük için tutacaktır n ve verilen 2 ¼πn <2 , n << (2 N ) 2 = 4 , n , hiçbir Karşı örnekler vardır emin değilim.

Nasıl çalışır

n=input();r=range(1,4**n);d=s,=r*1,

Bu, yinelemeli sürecimiz için birkaç referans oluşturur.

  • n kullanıcı girişidir: pozitif bir tamsayı.

  • r , [1, ..., 4 n - 1] listesidir .

  • s , r'nin bir kopyasıdır .

    Listeyi bir kez tekrarlamak r*1sığ bir kopya oluşturur, böylece s'yi değiştirmek r'yi değiştirmez .

  • d başlığın olarak başlatılır (ler) .

    Bu ilk değer önemli değil. Diğerleri ise pozitif sayıcı sayıları bölen tutar.

for k in r:del s[k::k+1];d+=sum(k%j<1for j in r)*2,

Her tamsayı için k den 1'e kadar 4 n - 1 , aşağıdakileri yapın.

  • del s[k::k+1]Her alan (k + 1) inci olarak tamsayı s başlayarak - (k + 1) inci - ve silme gelen dilim bu s .

    Bu, Flavius ​​Josephus eleğinin başlangıç ​​aralığını s cinsinden depolamanın basit bir yoludur . Bu çok daha gerekenden daha hesaplamak n + 1 , ilk açıdan, ancak tek kullanılarak forilmek, her iki güncelleştirmek s ve d bir bayt kaydeder.

  • d+=sum(k%j<1for j in r)*2,sayımları kaç unsurları R bölmek k eşit ve ekler 0 (k) için d .

    Yana d Bir tek başlığın olarak başlatıldı, 0 (k) göstergesi depolanır k .

print d.index(s[n]-s[n-1])*3+n

Bu buluntular, birinci indeks f , n + 1 - f , n de , d , en küçük K şekilde 0 (k) = f , n + 1 - f , n , sonra hesaplar, bir n olarak 3k + 1 ve sonucu basar.


2

Java 8, 336 , 305 , 303 , 287 , 283 279 bayt

Kritixi Lithos sayesinde 57 byte çıkarıldı

golfed

class f{static int g(int s,int N){return s<1?N+1:g(s-1,N+N/s);}static int h(int k){int u=0,t=1,i;for(;u!=(g(k,k)-g(k,k-1))/2;t++)for(i=1,u=0;i<=t;)if(t%i++<1)u++;return 3*t-3+k;}public static void main(String[]a){System.out.print(h(new java.util.Scanner(System.in).nextInt()));}}

Ungolfed

class f {
    static int g(int s,int N){return s < 1 ? N + 1 : g(s - 1, N + N / s);}

    static int h(int k) {
        int u = 0, t = 1, i;
        // get the first number with v divisors
        while(u != (g(k, k) - g(k, k - 1))/2){
            u = 0;
            for (i = 1; i <= t; i++)
                if (t % i < 1) u++;
            t++;
        }
        // 3*(t-1)+k = 3*t+k-3
        return 3 * t + k - 3;
    }

    public static void main(String[] a) {
        System.out.print(h(new java.util.Scanner(System.in).nextInt()));
    }
}

Bence komut satırı argümanlarını ayrıştırmak, intkullanmaktan daha kısa java.util.Scanner. Ancak Tarayıcı kullanıyor olsanız bile System.out.print(h(new java.util.Scanner().nextInt())), önceki satırı yapabilir ve kaldırabilirsiniz
Kritixi Lithos

@KritixiLithos thx, şimdi düzeltiliyor ...
Bobas_Pett

İçinde int h(), olarak değiştirebilirsiniz int v = (g(k,k)-g(k,k-1))/2,u = 0,t = 1;. if(t%i==0)if(t%i<1)
İf

Ek olarak, güçlü operatörleri kullanarak return s==0?N+1:g(s-1,N+N/2)-ish gibi bir şey kullanarak işlevinizi değiştirebilirsiniz
Kritixi Lithos

2
@KritixiLithos lol bu noktada u bunu kendi ayrı çözümünüz olarak
kaydetmelisiniz

1

Mathematica, 130 116 106 103 bayt

3Catch@Do[f=#2⌈#/#2+1⌉&~Fold~Reverse@Range@#&;If[Tr[2+0Divisors@k]==f[#+1]-f@#,Throw@k],{k,∞}]+#&

veya

3Catch@Do[f=#2⌈#/#2+1⌉&~Fold~Reverse@Range@#&;If[2DivisorSum[k,1&]==f[#+1]-f@#,Throw@k],{k,∞}]+#&

@ Pietu1998'in Jelly koduyla neredeyse aynı ...

açıklama

Catch@

Catchher neyse Throw(atılan).

Do[ ... ,{k,∞}]

Sonsuz döngü; kbaşlar 1ve her yinelemeyi arttırır.

f= ...

Atama f:

Reverse@Range@#

Bul {1, 2, ... , n}. Tersine çevir.

#2⌈#/#2+1⌉&

Tavan çıkaran bir işlev (n1 / n2 + 1) * n2

f= ... ~Fold~ ... &

fHer bir çıkışı ilk giriş olarak ve listenin her öğesini ikinci giriş olarak kullanarak yukarıdaki işlevi tekrarlı olarak yukarıdaki iki adımdan oluşan listeye uygulayan bir işlev atayın . İlk "çıkış" (ilk giriş) listenin ilk elemanıdır.

Tr[2+0Divisors@k]==f[#+1]-f@#

Bölenlerin sayısının iki katının kf (n + 1) - f (n) 'ye eşit olup olmadığını kontrol edin .

If[ ... ,Throw@k]

Durum ise True, Throwdeğeridir k. Değilse, döngü devam edin.

3 ... +#&

Çıktıyı 3 ile çarpın ve n ekleyin.

130 bayt sürümü

Catch@Do[s=#+1;a=k-#;If[3∣a&&2DivisorSigma[0,a/3]==Differences[Nest[i=1;Drop[#,++i;;;;i]&,Range[s^2],s]][[#]],Throw@k],{k,∞}]&

1

Perl 6 , 154 149 136 107 bayt

->\n{n+3*first ->\o{([-] ->\m{m??&?BLOCK(m-1).rotor(m+0=>1).flat!!1..*}(n)[n,n-1])/2==grep o%%*,1..o},^Inf}

Ungolfed:

-> \n {                    # Anonymous sub taking argument n
  n + 3 * first -> \o {    # n plus thrice the first integer satisfying:
    (                      #
      [-]                  #
      -> \m {              # Compute nth sieve iteration:
        m                  # If m is nonzero,
          ?? &?BLOCK(m-1).rotor(m+0=>1).flat # then recurse and remove every (m+1)-th element;
          !! 1..*          # the base case is all of the positive integers
      }                    #
      (n)                  # Get the nth sieve
      [n,n-1]              # Get the difference between the nth and (n-1)th elements (via the [-] reduction operator above)
    ) / 2                  # and divide by 2;
    ==                     # We want the number that equals
    grep o %% *, 1..o      # the number of divisors of o.
  }
  ,^Inf
}

1

05AB1E ,35 34 39 bayt

1Qi4ë[N3*¹+NÑg·¹D>‚vyy<LRvy/>îy*}}‚Æ(Q#

Berbat görünüyor, bu yüzden çalışma performansı. Küçük değerler veren giriş için birkaç saniye sürer. 14 gibi sayıları denemeyin; Sonunda sonucu bulur, ancak yaş alır.

açıklama

Ardışık olarak adlandırılan 2 program olarak çalışır. Birincisi hesaplar F , n + 1 - K , n ve ikinci bir tespit , bir n bir kaba kuvvet yaklaşımı kullanarak, kendi tanımı göre.

Fn + 1 - F n , döngü değişmez olmasına rağmen her yineleme için değerlendirilir. Kod zamanını yetersiz kılar, ancak kodu daha kısa yapar.

Çevrimiçi deneyin!


Anladığımdan emin değilim. Neden 65,536 üzerindeki elekleri hesaplayamıyor?
Dennis,

0 ile 65536 ( žHL) arasındaki tüm tamsayıları üretmesi ve daha sonra elek kısıtlamalarına uymayan değerleri filtrelemesi gerçeğinden geliyor . Bence bu programın ilk kısmı tamamen golf oynamak için tamamen farklı bir yaklaşımla yeniden yazılmalıdır.
16'da Osable

Bunu yapmanıza engel olan sınırlamalar (sabit genişlikli tamsayılar gibi) olmadığı sürece, cevapların yeterli zaman ve bellek verilerek herhangi bir girdi için çalışması beklenir.
Dennis,

Bu yüzden başka bir elek algoritması ile geldim. Golf edilebilir olabilir ama 05AB1E'de daha iyi bir şey bulamadım Bununla birlikte, given enough time and memoryçok yavaş çalışan diğer sorularla ilgili doğru cevaplar aldıklarını söylemek neredeyse imkânsız olduğundan, buna karşı bir örnek var . Bu nedenle elek hesaplamasını döngüden ayırdım ve 2 bayta mal oldu.
16'da Osable

Kodunuzu verimli hale getirmenize gerek yok. Golf / yavaş uygulamayı gönderiminiz yapabilir ve daha hızlı / daha uzun olanı not olarak ekleyebilirsiniz. Korkarım ki, bir bayta mal olsa bile dinamik limit konusunda ısrar etmem gerekiyor.
Dennis,
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.