Alikot serisinin sekizinci basamağını döndür


20

0. TANIMLAR

Bir dizi numaralarının listesi aşağıdadır.
Bir dizi numaralarının listesi toplamıdır. Doğal sayılar
kümesi, "sıfırdan büyük negatif olmayan tamsayıları" içerir. Bir bölen doğal numarası (bu bağlamda) j doğal bir sayıdır i , bu şekilde J ÷ ı da doğal bir sayıdır.

1. ÖNSÖZ

Bu sitede diğer sorular bir çift alikotununLH kavramını, veya doğal numarası bölenler dizisini söz a az olan bir . Dostane sayıların belirlenmesi , alikot toplamı veya alikot serisi olarak adlandırılan bu bölenlerin toplamının hesaplanmasını içerir. Her doğal sayının kendi alikot toplamı vardır, ancak bir sayının alikot toplamının değeri mutlaka bu sayıya özgü değildir. ( Exempli gratia , her asal sayı 1'den alikot toplamına sahiptir.)

2. MEYDAN OKUMA

Doğal sayısı göz önüne alındığında n, geri nalikot toplamlar dizisinin inci rakamı. 1 için seriden başlayarak dizideki ilk birkaç seri şunlardır:

{0, 1, 1, 3, 1, 6, 1, 7, 4, 8, 1, 16, 1, 10, 9, 15, 1, 21, 1, 22, 11, 14, 1, 36, 6, 16, 13}

Birleştirilmiş, bunlar şöyle görünür:

0113161748116110915121122111413661613

Giriş, tercihinize göre sıfır veya tek dizinli olabilir. Çözümler, 10.000'inci basamağı ( 9999veya girişine kadar 10000) döndürebilen programlar veya işlevler olmalıdır . En kısa çalışma çözümü kazanır.

3. TEST DAVALARI

Doğru giriş-çıkış çiftleri aşağıdakileri içermekle birlikte bunlarla sınırlı değildir:

   0 or     1    ->    0
   4 or     5    ->    1
  12 or    13    ->    6
9999 or 10000    ->    7

"Veya" ifadesinden önceki sayı 0 ile işaretlenir; aşağıdaki sayı 1 dizinlidir.
Talep üzerine ilave test durumları sağlanabilir.

4. KAYNAKLAR

OEIS'in bir sayı listesi ve bunların alikot toplamları vardır.


2
Güzel ilk meydan okuma, btw. :)
Martin Ender

1
Dil 10k karakter dizelerini yönetemezse ?? (örneğin korkunç Oracle SQL 4k sınırı ) cevap dil ​​sınırı ise geçerli midir?
Giacomo Garabello

@MartinEnder, teşekkürler! Ve bu bağlantı için teşekkürler; aydınlatıcıydı. Orada, sınırlamalarla dillerde cevapların nasıl ele alınacağını açıklayan bir şey var mı? Hiçbir şey bulamadım, ama bunun orada olmadığı anlamına gelmediğini biliyorum. :)
Joe

Tamamen kalın olabilirim, ama o serideki sayılar nasıl hesaplanıyor?
Tom Carpenter

@TomCarpenter: İlk öğe için, 1'den küçük olan 1'in tüm bölenlerini alın ve birlikte ekleyin. (1, 1'in tek bölenidir, bu nedenle ilk öğe sıfır olur.) İkinci öğe, 2'nin 2'den küçük olan bölücüleri (sadece 1 buna uyar); üçüncü, 3'ün çarpanları (hala sadece 1); ve bunun gibi. 4'ün çarpanları {1, 2} ve 1 + 2 == 3'tür, bu nedenle dördüncü öğe 3'tür. Bunu anlamak da biraz
Joe

Yanıtlar:


6

05AB1E , 14 11 10 bayt

Yaklaşık 15 saniye içinde n = 9999 değerini hesaplayın. Kod:

ÌL€Ñ€¨OJ¹è

Açıklama:

Ì           # Increment implicit input by 2
 L          # Generate the list [1 .. input + 2]
  ۄ        # For each, get the divisors
    ۬      # For each, pop the last one out
      O     # Sum all the arrays in the array
       J    # Join them all together
        ¹è  # Get the nth element

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin! .


6

Mathematica, 51 bayt

Array[##&@@IntegerDigits[Tr@Divisors@#-#]&,#][[#]]&

Bir tamsayı alan ve döndüren ve 1 tabanlı dizinleme kullanan adlandırılmamış bir işlev. Girişi 10000anında işler.

açıklama

Bu, tanımın çok basit bir uygulamasıdır ve ilk nbölen toplamlarının her zaman nth basamağını belirlemek için yeterli olduğu gerçeğinden faydalanır . Her zamanki gibi, golf sahasında Mathematica'nın okuma sırası biraz komik:

Array[...&,#]...&

Bu herkese soldaki değerleri isimsiz fonksiyonunu uygulayarak sonuçlarını tüm içeren bir liste oluşturur igelen 1etmek ndahil.

...Tr@Divisors@#-#...

Başlangıçta bölücülerin hesaplanması i, toplanması Trve çıkarılmasıyla başlıyoruz , iböylece sadece bölücülerin toplamı daha azdır i.

...IntegerDigits[...]...

Bu, sonucu ondalık basamaklarının bir listesine dönüştürür.

##&@@...

Ve bu, "liste" başlığını kaldırır, böylece tüm basamak listeleri otomatik olarak sonuçta birleştirilir Array. Nasıl ##çalıştığı hakkında daha fazla ayrıntı için , bu gönderideki "Bağımsız değişken dizileri" bölümüne bakın .

...[[#]]

Son olarak, nsonuçtan th rakamını seçiyoruz .


4

Brachylog , 40 bayt

:2-I,?:?:1yrc:Im.;0.
:1e:2f+.
>.>0,?:.%0

Bu 1 endekslidir, yaklaşık 0.15 saniye N = 100, 15 saniye sürer N = 1000. Şu anda koşuyorum N = 10000, bittikten sonra çalışma süresini bildireceğim (Tahminim doğru ise, yaklaşık 8 saat sürmelidir)

Düzenleme : Brachylog'daki erken kısıtlamaları yaymayı düzelterek, şimdi (3 bayt daha uzun bir kodda) yaklaşık 2.5dakika sürer , 10000ancak bir out of global stackhata döndürür .

açıklama

  • Ana Tahmin: Input = N

    :2-I,                 I = N - 2
         ?:?:1y           Find the N first valid outputs of predicate 1 with input N
               rc         Reverse and concatenate into a single number
                 :Im.     Output is the Ith digit of that number
                     ;    Or (I strictly less than 0)
                      0.  Output is 0
    
  • Tahmin 1: bölenlerin toplamını hesaplar

    :1e                   Get a number between N and 1
       :2f                Find all valid outputs of predicate 2 with that number as input
          +.              Output is the sum of those outputs
    
  • Tahmin 2: çıktıyı girişin bir böleniyle birleştirir

    >.>0,                 Output is a number between Input and 0
         ?:.%0            Input is divisible by Output
    

1
-GSeçeneği ile daha fazla genel yığın ayırabilirsiniz . Varsayılan yalnızca 128M. Örneğin: swipl -G2G2 GO kullanmak için kullanabilirsiniz.
mat

4

Pyth, 26 21 20 15 bayt

@sm`sf!%dTtUdSh

Çevrimiçi deneyin. Test odası.

0 tabanlı indeksleme kullanır. Program O (n²) şeklindedir ve 2008 makinemde yaklaşık 14 dakikada n = 9999 tamamlar .


Bu karmaşık bölen aramasında ne var? f!%dTr1dçok daha kısa (ama aynı zamanda daha yavaş)
Jakube

@ Jakube whoops, 20 baytlık çözüm için yanlış sürümü değiştirdi.
PurkkaKoodari

f!%TYtUTEskiden sahip olduğum şey bu.
PurkkaKoodari

@ Jakube olarak değiştirdim. Hala n = 9999 için çalışıyor, şimdi 5 dakikadan fazla oldu: \
PurkkaKoodari

4

Jöle, 13 11 10 bayt

@Adnan sayesinde 2 bayt ve @Dennis sayesinde 1 bayt daha.

ÆDṖSDµ€Fị@

Çevrimiçi deneyin!

1 tabanlı indeksleme kullanır. Çevrimiçi 2 saniyenin altında n = 10000 tamamlar .


ÆDṖSDµ€Fị@bir bayt kaydeder.
Dennis

@ Öyleyse bu ilk zincirin tamamına uygulanır mı?
PurkkaKoodari

@ Pietu1998: Evet, kesin olarak: genel olarak, ayrıştırma zamanında uygulanır chain.pop() if chain else chains.pop(). Yeni başlatılan zincir boş, bu nedenle son bitmiş zincir kullanılıyor.
Lynn

3

PHP, 90 bayt

0 endeksli

<?php for(;strlen($s)<=$a=$argv[1];$s.=$n)for($n=0,$j=++$i;--$j;)$i%$j||$n+=$j;echo$s[$a];

Kesinlikle ince ya da hiç akıllıca bir yaklaşımla değil.
Ayrıca, her zamanki gibi, ihmal edilen üç bildirim üretir.


3

J , 34 bayt

{[:;1<@":@(-~>:@#.~/.~&.q:)@+i.@>:

Bu sıfır indekslidir ve bölen toplamlarını hesaplamak için aşağıdaki formülü kullanır.

formül

açıklama

{[:;1<@":@(-~>:@#.~/.~&.q:)@+i.@>:  Input: n
                                >:  Increment n
                             i.@    Create the range [0, 1, ..., n]
    1                       +       Add one to each to get [1, 2, ..., n+1]
          (               )@        For each value
                        q:            Get the prime factors
                   /.~&.              For each group of equal prime factors
                #.~                     Raise the first to the first power, the second
                                        squared and so on, and sum them
             >:@                        Increment that sum
                      &.q:            Reduce the groups using multiplication
           -~                         Subtract the initial value from that sum
       ":@                            Convert each to a string
     <@                               Box each
 [:;                                Unbox each and concatenate the strings
{                                   Select the character from that string at index n
                                    and return it

2

MATL , 16 15 bayt

:"@@q:\~fsV]vG)

Endeksleme 1 tabanlıdır.

Son test durumu çevrimiçi derleyicide zaman aşımına uğrar, ancak çevrimdışı derleyici ile yaklaşık 15 saniye içinde doğru sonucu verir.

Çevrimiçi deneyin!

:         % Take input n. Push [1 2 ... n]
"         % For each k in [1 2 ... n]
  @       %   Push k
  @q:     %   Push [1 2 ... k-1]
  \       %   Modulo. Zero values correspond to divisors
  ~f      %   Indices of zeros. These are the divisors
  s       %   Sum
  V       %   Convert to string
]         % End for each
v         % Concatenate all stack contents vertically
G)        % Take n-th digit. Implicitly display

2

Haskell, 52 bayt

(([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!)

Kullanım örneği: (([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 12-> 6.

Bu tanımın doğrudan bir uygulamasıdır: foreach ntoplamı bölücülerdir ve bir dizeye dönüştürür. Tüm bu dizeleri birleştirin ve istenen dizinden öğeyi seçin. Haskell'in tembellik, sadece gerektiği kadar nsonsuz listeden alır [1..].


1

Python 3,5, 103 93 92 bayt:

R=range;A=lambda f:''.join([str(sum([j for j in R(1,i)if i/j%1==0]))for i in R(1,f+1)])[f-1]

Postada açıklanan yöntemin oldukça basit uygulanması.

Çevrimiçi Deneyin! (Ideone)

Giriş için çevrimiçi derleyicide ayrılan 5 saniye içinde tam 10000olarak bitmez, ancak yaklaşık 8.5 saniye içinde aynı giriş için makinemde biter.


1

Oktav, 71 bayt

Bu sadece Octave. MATLAB'da çalışmaz. 1 indeksli sayılar üzerinde çalışan bir sanal fonksiyon oluşturulur. Muhtemelen biraz daha basitleştirilebilir. Bu akşam bir göz atacağım.

@(x)c((c=num2str(arrayfun(@(n)sum(b(~rem(n,b=(1:n-1)))),1:x)))~=' ')(x)

Burada çevrimiçi deneyebilirsiniz .

Yukarıdaki komutu, ön ekli a=veya herhangi bir şekilde çalıştırın (yalnızca birden çok kez kullanabilmeniz için) ve sonra a(10000)veya her şeyi yapın. 10000. basamağın 7 olduğunu hesaplamak yaklaşık 7 saniye sürer.


1

Java 8, 220 bayt

import java.util.stream.IntStream;
char a(int n){return IntStream.range(1,n+2).map(i->IntStream.range(1,i).filter(k->i%k==0).sum()).mapToObj(Integer::toString).collect(java.util.stream.Collectors.joining("")).charAt(n);}

En azından hızlı. Makinemde 9999 / 10000. elemanın bulunması ortalama 0.3 saniyedir. Belirttiğiniz dizin kadar yalnızca alikot toplamı üretir. Bu, dize çoğu durumda dizininizden biraz daha uzun olacağı anlamına gelir, çünkü bazı alikot toplamları 2 veya daha fazla basamağa sahiptir, ancak çoğunlukla yalnızca ihtiyaç duyduğumuz kadar uzun bir dize üretir.

Kullanımı:

public static void main(String[] args) {
    System.out.println(a(0));
    System.out.println(a(4));
    System.out.println(a(12));
    System.out.println(a(9999));
}

Ungolfed:

public static void main(String[] args) {
    System.out.println(all(0));
    System.out.println(all(4));
    System.out.println(all(12));
    System.out.println(all(9999));
}

static int aliquotSum(int n) {
    return IntStream.range(1, n).filter(k -> n % k == 0).sum();
}

static IntStream sums(int n) {
    return IntStream.range(1, n + 2).map(i -> aliquotSum(i));
}

static String arraycat(IntStream a) {
    return a.mapToObj(Integer::toString).collect(java.util.stream.Collectors.joining(""));
}

static char all(int index) {
    return arraycat(sums(index)).charAt(index);
}
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.