Zwraca n-tą cyfrę sekwencji serii podwielokrotności

20

0. DEFINICJE

Sekwencja znajduje się lista numerów. Seria jest sumą listy numerów. Zbiór liczb naturalnych zawiera wszystkie „nieujemne liczby całkowite większe od zera”. Dzielnik (w tym kontekście) z liczbą naturalną j jest liczbą naturalną, i tak, że j ÷ i jest liczbą naturalną.



1. PREAMBUŁA

Kilka innych pytań na tej stronie wspomina o koncepcji podwielokrotności lub sekwencji dzielników liczby naturalnej a, które są mniejsze niż a . Wyznaczanie polubownych liczb polega na obliczeniu sumy tych dzielników, zwanej sumą alikwotu lub szeregiem alikwotu. Każda liczba naturalna ma własną sumę podwielokrotności, chociaż wartość sumy podwielokrotności liczby niekoniecznie jest unikalna dla tej liczby. ( Exempli gratia , każda liczba pierwsza ma podwielokrotną sumę 1).

2. WYZWANIE

Biorąc pod uwagę liczbę naturalną n, zwróć ntrzecią cyfrę sekwencji sum podwielokrotności. Pierwsze kilka serii w sekwencji, zaczynając od serii dla 1, to:

{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}

Skonsolidowane wyglądają jak:

0113161748116110915121122111413661613

Dane wejściowe mogą być indeksowane od zera lub indeksowane jednokrotnie, zgodnie z własnymi preferencjami. Rozwiązania muszą być programami lub funkcjami zdolnymi do zwrócenia 10 000 cyfry (wejście do 9999lub 10000). Najkrótsze działające rozwiązanie wygrywa.

3. PRZYPADKI TESTOWE

Prawidłowe pary przepływów międzygałęziowych powinny obejmować między innymi następujące elementy:

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

Liczba poprzedzająca „lub” jest indeksowana 0; następujący numer jest indeksowany 1.
Dodatkowe przypadki testowe mogą być dostarczone na żądanie.

4. ODNIESIENIA

OEIS ma listę liczb i ich podwielokrotnych sum.

Joe
źródło
2
Ładne pierwsze wyzwanie, btw. :)
Martin Ender
1
jeśli język nie może zarządzać ciągami znaków 10k? (np . okropny limit Oracle SQL 4k ) czy odpowiedź jest prawidłowa, jeśli jest to limit językowy?
Giacomo Garabello,
@MartinEnder, dzięki! I dzięki za ten link; to było oświecające. Czy jest coś, co wyjaśnia, jak traktować odpowiedzi w językach z ograniczeniami? Nic nie mogłem znaleźć, ale wiem, że to nie znaczy, że jej tam nie ma. :)
Joe
Być może jestem całkowicie gruby, ale jak obliczane są liczby w tej serii?
Tom Carpenter,
@TomCarpenter: W przypadku pierwszego elementu weź wszystkie dzielniki 1 mniejsze niż 1 i dodaj je razem. (1 jest jedynym dzielnikiem 1, więc pierwszy element kończy się na zero.) Drugi element, dzielniki 2, które są mniejsze niż 2 (tylko 1 pasuje do tego); po trzecie, dzielniki 3 (wciąż tylko 1); i tak dalej. Dzielnikami 4 są {1, 2}, a 1 + 2 == 3, więc czwarty element to 3. Zajęło mi to też trochę czasu;)
Joe

Odpowiedzi:

6

05AB1E , 14 11 10 bajtów

Oblicz n = 9999 w około 15 sekund. Kod:

ÌL€Ñ€¨OJ¹è

Wyjaśnienie:

Ì           # 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

Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .

Adnan
źródło
6

Mathematica, 51 bajtów

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

Nienazwana funkcja, która przyjmuje i zwraca liczbę całkowitą oraz korzysta z indeksowania 1. 10000Natychmiastowo obsługuje wprowadzanie .

Wyjaśnienie

Jest to bardzo prosta implementacja definicji, wykorzystująca fakt, że pierwsze nsumy dzielnika są zawsze wystarczające do ustalenia ncyfry th. Jak zwykle kolejność czytania w matematyce golfowej jest nieco zabawna:

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

Generuje to listę ze wszystkimi wynikami zastosowania nienazwanej funkcji po lewej stronie do wszystkich wartości iod 1do nwłącznie.

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

Zaczynamy od obliczenia dzielników i, zsumowania ich Tri odjęcia isię, aby była to tylko suma dzielników mniejszych niż i.

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

To zamienia wynik w listę jego cyfr dziesiętnych.

##&@@...

I to usuwa nagłówek „listy”, dzięki czemu wszystkie listy cyfr są automatycznie łączone w wyniku Array. Aby uzyskać więcej informacji o tym ##, jak działa, zobacz sekcję „Sekwencje argumentów” w tym poście .

...[[#]]

Na koniec wybieramy ncyfrę th z wyniku.

Martin Ender
źródło
4

Brachylog , 40 bajtów

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

Jest to indeks 1, trwa około 0,15 sekundy N = 100, a 15 sekund N = 1000. Aktualnie ubiegam się N = 10000, po zakończeniu raportuję czas działania (jeśli moje oszacowanie jest prawidłowe, powinno to zająć około 8 godzin)

Edycja : poprzez naprawienie przedwczesnej propagacji ograniczeń w Brachylog, teraz (na kodzie o długości 3 bajtów) zajmuje około 2.5minut, 10000ale zwraca out of global stackbłąd.

Wyjaśnienie

  • Główny predykat: 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
    
  • Predykat 1: oblicza sumę dzielników

    :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
    
  • Predykat 2: łączy dane wyjściowe z dzielnikiem danych wejściowych

    >.>0,                 Output is a number between Input and 0
         ?:.%0            Input is divisible by Output
    
Fatalizować
źródło
1
Możesz przydzielić więcej globalnego stosu za pomocą -Gopcji. Domyślnie jest tylko 128M. Możesz użyć na przykład: swipl -G2Gaby użyć 2 GO.
mat
4

Pyth, 26 21 20 15 bajtów

@sm`sf!%dTtUdSh

Wypróbuj online. Zestaw testowy.

Wykorzystuje indeksowanie 0. Program ma wartość O (n²) i kończy się dla n = 9999 w ciągu około 14 minut na mojej maszynie z 2008 roku.

PurkkaKoodari
źródło
O co chodzi z tym skomplikowanym wyszukiwaniem dzielników? f!%dTr1djest znacznie krótszy (ale i wolniejszy)
Jakube
@Jakube ups, zmodyfikował niewłaściwą wersję 20-bajtowego rozwiązania.
PurkkaKoodari,
f!%TYtUTto było to, co miałem.
PurkkaKoodari,
@Jakube Zmieniłem na to. Nadal działa dla n = 9999, minęło już ponad 5 minut: \
PurkkaKoodari
4

Galaretka, 13 11 10 bajtów

2 bajty dzięki @Adnan i 1 więcej dzięki @Dennis.

ÆDṖSDµ€Fị@

Wypróbuj online!

Wykorzystuje indeksowanie 1. Wykonuje dla n = 10000 w niecałe 2 sekundy online.

PurkkaKoodari
źródło
ÆDṖSDµ€Fị@zapisuje bajt.
Dennis
@Dennis, więc czy dotyczy to całego pierwszego łańcucha?
PurkkaKoodari
@ Pietu1998: Tak, dokładnie: ogólnie rzecz biorąc, w czasie analizy jest stosowany do chain.pop() if chain else chains.pop(). Nowo rozpoczęty łańcuch jest pusty, dlatego zamiast niego używany jest ostatni ukończony łańcuch.
Lynn
3

PHP, 90 bajtów

0 zindeksowanych

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

Absolutnie nie subtelny lub w sprytny sposób w ogóle do niego podejść.
Ponadto, jak zwykle, generuje trzy powiadomienia, które są ignorowane.

użytkownik55641
źródło
3

J , 34 bajty

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

Jest on indeksowany do zera i wykorzystuje poniższy wzór do obliczania sum dzielników.

Formuła

Wyjaśnienie

{[:;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
mile
źródło
2

MATL , 16 15 bajtów

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

Indeksowanie jest oparte na 1.

Ostatni przypadek testowy przekroczył limit czasu w kompilatorze online, ale daje prawidłowy wynik w kompilatorze offline, w około 15 sekund.

Wypróbuj online!

:         % 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
Luis Mendo
źródło
2

Haskell, 52 bajty

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

Przykład użycia: (([1..]>>= \n->show$sum[m|m<-[1..n-1],mod n m<1])!!) 12-> 6.

Jest to bezpośrednia implementacja definicji: podziel nsumę na dzielniki i zamień na ciąg. Połącz wszystkie takie ciągi i wybierz element o żądanym indeksie. Lenistwo Haskella bierze tylko tyle ns z nieskończonej listy, [1..]ile potrzeba.

nimi
źródło
1

Python 3.5, 103 93 92 bajty:

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]

Dość prosta implementacja metody opisanej w poście.

Wypróbuj online! (Ideone)

Nie kończy się w ciągu 5 sekund w internetowym kompilatorze na wejście 10000, ale kończy się na moim komputerze dla tego samego wejścia w ciągu około 8,5 sekundy.

R. Kap
źródło
1

Oktawa, 71 bajtów

Ten jest tylko oktawowy. Nie będzie działać w MATLAB. Tworzona jest funkcja wirtualna, która działa na liczbach 1-indeksowanych. Prawdopodobnie można to nieco uprościć. Zobaczymy dziś wieczorem.

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

Możesz spróbować online tutaj .

Po prostu uruchom powyższą komendę, z prefiksem a=lub cokolwiek (tylko po to, abyś mógł użyć jej wiele razy), a następnie zrób a(10000)coś lub cokolwiek innego. Obliczenie, że 10000. cyfra to 7, zajmuje około 7 sekund.

Tom Carpenter
źródło
1

Java 8, 220 bajtów

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

Cóż, przynajmniej szybko. Średnio 0,3 sekundy zajmuje 9999/10000 element na mojej maszynie. Generuje tylko tyle alikwot, ile podałeś określony indeks. Oznacza to, że w większości przypadków łańcuch będzie nieco dłuższy niż indeks, ponieważ niektóre sumy podwielokrotności mają 2 lub więcej cyfr, ale w większości generuje tylko tyle, ile potrzebujemy.

Stosowanie:

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

Nie golfowany:

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);
}
Justin
źródło