Równość w sumie cyfr


23

Wprowadzenie

Weźmy numer 180. Jest to interesująca liczba, ponieważ suma cyfr tej liczby jest równa:

1 + 8 + 0 = 9

I kwadratowa wersja tego numeru lub:

180² = 32400 > 3 + 2 + 4 + 0 + 0 = 9

Oba są 9 . Suma cyfr numeru pierwotnego i liczby kwadratowej są takie same. Oczywiście można to również znaleźć w OEIS: A058369 .

Zadanie

Biorąc pod uwagę nieujemną liczbę całkowitą n, wypisz nth liczbę dodatnią z tym warunkiem.

Przypadki testowe ( indeksowane od zera )

Input > Output

0 > 1
1 > 9
2 > 10
3 > 18
4 > 19
5 > 45
6 > 46
7 > 55
8 > 90
9 > 99
10 > 100
11 > 145
12 > 180
13 > 189
14 > 190
15 > 198
16 > 199
17 > 289
18 > 351
19 > 361

Dane wejściowe można również indeksować 1, jeśli bardziej Ci to odpowiada.

To jest , więc wygrywanie z najmniejszą ilością bajtów wygrywa!


W przypadku, gdy nikt jeszcze tego nie zauważył, na liście mogą pojawić się tylko liczby równoważne 0 lub 1 (mod 9).
Neil,

@MamaFunRoll Um ... nie. Przepraszam. Liczby z cyfrowymi pierwiastkami 5 mają kwadraty, których cyfrowymi pierwiastkami jest 7.
Neil

@Neil owait nvm
Mama Fun Roll

Napisałem predykat Brachylog, aby ustalić, czy dane wejściowe są terminem tej sekwencji, ale nie mogłem sprawić, by n-ta płyta działała, więc zostawię to w komentarzu:^₂;?{ẹ+}ᵛ
Niepowiązany ciąg

Odpowiedzi:


5

Galaretka, 13 bajtów

,²DS€=/
1dz#Ṫ

Dane wejściowe są indeksowane 1. Wypróbuj online!

Jak to działa

1dz#Ṫ    Main link. Argument: n (index)

1        Set the return value to 1.
   #     Execute ... until ... matches have been found.
 Ç         the helper link
  ³        n
    Ṫ    Extract the last match.


,²DS€=/  Helper link. Argument: k (integer)

,²       Pair k with k².
  D      Convert each to decimal.
   S€    Compute the sum of each list of base 10 digits.
     =/  Reduce by equality.

4

Haskell, 54 bajty

s=sum.map(read.pure).show
([x|x<-[1..],s x==s(x^2)]!!)

Przykład użycia: ([x|x<-[1..],s x==s(x^2)]!!) 17-> 289.

s calculates the digit sum:

                    show     -- turn number into a string
     map(read.pure)          -- turn every character (the digits) in to a
                             -- one element string and convert back to integer
sum                          -- sum those integers

main function:

[x|x<-[1..]            ]     -- make a list of all x starting from 1
           ,s x==s(x^2)      -- where s x == s (x^2)
                        !!   -- pick nth element from that list

4

JavaScript (ES6), 76 73 72 bajty

n=>eval("for(q=s=>eval([...s+''].join`+`),i=1;q(i)!=q(i*i)||n--;i++);i")

Spędziłem 30 minut próbując uruchomić to, dopóki nie zdałem sobie sprawy, że wypisałem niewłaściwą zmienną: |

Jest to indeksowane na zero.


1
Mam nadzieję, że przekształcenie tego w funkcję rekurencyjną znacznie to skróci ...
Mama Fun Roll


4

05AB1E , 10 9 8 bajtów

µNÐn‚1öË

1-indeksowany.

-1 bajt dzięki @Emigna poprzez usunięcie niejawnego ½(wzrost counter_variablepo każdej iteracji) na końcu
-1 bajt dzięki @Grimy usunięcie duplikatu SOza pomocą‚1ö

Wypróbuj online.

Wyjaśnienie:

µ         # Loop while the counter_variable is not equal to the (implicit) input yet:
 NÐ       #  Push the 0-based loop index three times
   n      #  Take the square of this index
          #   i.e. 180 → 32400
         #  Pair it with the index
          #   i.e. 180 and 32400 → [180,32400]
     1ö   #  Convert both numbers from base-1 to base-10, which basically sums the digits
          #   i.e. [180,32400] → [9,9]
       Ë  #  Check if both sums are equal
          #   i.e. [9,9] → 1 (truthy)
          #  (if they are: implicitly increase the counter_variable by 1)
          # (after the loop: implicitly print the top of the stack, which is the remaining
          #  copy of the index from the triplicate we've used)

2
Nie potrzebujesz ½tutaj, ponieważ jest to domniemane
Emigna

1
1: µNDn‚1öË. jest jak, SOale wektoryzuje, co pozwala nam uniknąć powielania kodu.
Grimmy

@Grimy Jeszcze raz dziękuję. Dodałem to również jako wskazówkę do mojego postu Małe wskazówki. :)
Kevin Cruijssen

3

Mathematica, 64 bajty

a=Tr@*IntegerDigits;Nest[NestWhile[#+1&,#+1,a@#!=a[#^2]&]&,1,#]&

Prosta anonimowa funkcja. Zero indeksowane.


3

Pyth, 15 lat

e.fqsjZTsj^Z2TQ

1 bajt dzięki DenkerAffe!

Wypróbuj tutaj lub uruchom pakiet testowy .

Korzysta z opcji 1-indeksowanej.

Naiwna implementacja, za pomocą .fktórej pobierane są pierwsze nliczby pasujące do danego warunku.


Możesz zapisać jeden bajt, usuwając go, hjeśli używasz indeksowania 1, co jest wyraźnie dozwolone.
Denker,

@DenkerAffe Och, dzięki, powinnam przeczytać uważniej: P
FryAmTheEggman

2

MATL , 24 23 bajty

x`@2:^"@V!Us]=?@]NG<]1$

Wykorzystuje dane wejściowe 1.

Wypróbuj online!

x        % take inpout and delete it (gets copied into clipboard G)
`        %   do...while
  @      %   push loop iteration index: candidate number, n
  2:^    %   array [n n^2]
  "      %   for each element of that array 
    @    %     push that element 
    V!U  %     get its digits (to string, transpose, to number)
    Xs   %     compute their sum
  ]      %   end for each
  =      %   are the two sums equal?
  ?      %   if so
    @    %     the candidate number is valid: push it
  ]      %   end if
  NG<    %   is number of elements in stack less than input?
]        % if so, proceed with next iteration. End do...while. 
1$       % specify 1 input for implicit display: only top of stack

1
bardzo miło, że MATL jest wreszcie wymieniony wśród odległych kompilatorów!
Abr001am,

1

Julia, 79 66 bajtów

f(n,x=0,i=1,s=c->sum(digits(c)))=x<n?f(n,x+(s(i)==s(i^2)),i+1):i-1

Jest to funkcja rekurencyjna, która przyjmuje liczbę całkowitą i zwraca liczbę całkowitą. Wykorzystuje indeksowanie 1.

Przechowujemy kilka rzeczy jako argumenty funkcji:

  • n : Dane wejściowe
  • x : Licznik, ile liczb z tym warunkiem znaleźliśmy
  • i : Liczba do sprawdzenia warunku
  • s : Funkcja obliczająca sumę cyfr danych wejściowych

Chociaż xjest mniejszy niż wkład, powtarzamy, zwiększając, xjeśli ispełnia warunek, i zwiększając i. Raz x == nwracamy i, ale musimy odjąć 1, ponieważ zostanie on zwiększony jeden raz zbyt wiele.


1

Wypukłe 0,2, 36 35 bajtów

Convex to nowy język, który rozwijam, oparty w dużej mierze na CJam i Golfscript. Tłumacz i IDE można znaleźć tutaj . Dane wejściowe to liczba całkowita w argumentach wiersza poleceń. Indeksy są oparte na jednym. Wykorzystuje kodowanie CP-1252 .

1\{\__2#¶{s:~:+}%:={\(\)\}{)\}?}h;(

1

Mathematica, 63 60 61 59 bajtów

Select[Range[9^#],Equal@@Tr/@IntegerDigits/@{#,#^2}&][[#]]&

Robiąc to, pojawiła się druga odpowiedź, ale biję je o jeden bajt i publikuję to, zanim ten zostanie zagrany w golfa. Jeden zindeksowany.


Nie można wprowadzić danych >2457. Po prostu zwiększenie twojego Rangenie pomoże, ponieważ A058369[n]/nwydaje się , że nie jest zbieżne.
murphy

Lepszy? filler +
CalculatorFeline

10^# byłoby krótsze niż 2^#*9 . Oczywiście staje się zbyt wolny, gdy n jest większe niż około 6 ...
feersum

Dlaczego nie 9^# ? Fil
CalculatorFeline

Czy masz dowód, że f (n) <= 9 ^ n? (10 jest oczywiste, ponieważ 10 ^ n jest zawsze rozwiązaniem).
feersum

1

Siatkówka, 103 bajty

\d+
$*1 x
{`x+
$.0$*x¶$.0$*a¶$.0$*b
%`b
$_
a+|b+
$.0
\d
$*
+`1¶1
¶
1(.*)¶¶$|¶[^d]+
$1x
}`^ ?x

x

Zdecydowanie do gry w golfa.

Używa nowej funkcji Retina% do kwadratu (dlatego nie działa jeszcze z wersją online).


1

Mathcad, 70 50 bajtów

Mathcad nie ma wbudowanych funkcji konwertujących liczbę na ciąg cyfr, więc funkcja użytkownika d (a) wykonuje to zadanie. Następnie program dokonuje iteracji przez dodatnie liczby całkowite, sprawdzając równość sum, aż zgromadzi n liczb w wektorze v. Program jest oceniany za pomocą operatora =, który wyświetla wektor wyniku. ( Pamiętaj, że cały program wygląda dokładnie tak, jak pokazano poniżej w arkuszu Mathcad )

Zaktualizowany program: Zakłada domyślną inicjalizację od zera i wykorzystuje fakt, że Mathcad zwraca wartość ostatnio ocenianej instrukcji w programie.
Korzysta z kolejności oceny wyrażeń w celu zwiększenia zmiennej a w pierwszym sumowaniu (która jest następnie dostępna do użycia w sumie kwadratowej)

wprowadź opis zdjęcia tutaj

Program oryginalny: zwraca wektor wszystkich liczb do n.

wprowadź opis zdjęcia tutaj



0

Java 8, 113 bajtów

n->{int r=0;for(;n>=0;)if((++r+"").chars().map(c->c-48).sum()==(r*r+"").chars().map(c->c-48).sum())n--;return r;}

0-indeksowane

Wyjaśnienie:

Wypróbuj online.

n->{           // Method with integer as both parameter and return-type
  int r=0;     //  Result-integer, starting at 0
  for(;n>=0;)  //  Loop as long as `n` is zero or positive
    if((++r    //   Increase `r` by 1 first
       +"").chars().map(c->c-48).sum()
               //   And if the sum of its digits
       ==(r*r+"").chars().map(c->c-48).sum())
               //   equals the sum of the digit of its square
      n--;     //    Decrease `n` by 1
  return r;}   //  Return the result


0

TI-BASIC 66 62 bajtów

Ans→N:While X<N:IS>(A,A::A:prgmA:Ans→B:A²:prgmA:If B=Ans:IS>(X,N:End:A
sum(int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans

nAns
n

Funkcja pomocnicza generuje sumę cyfr wartości w Ans.

Przykłady:

3:prgmCDGF1E
             10
5:prgmCDGF1E
             19
8:prgmCDGF1E
             55
10:prgmCDGF1E
             99

Wyjaśnienie:

Ans→N:While X<N:IS>(A,A::A:prgmA:Ans→B:A²:prgmA:If B=Ans:IS>(X,N:End:A ;prgmCDGF1E

Ans→N            ;store the input in N
While X<N        ;loop until the Nth term has been reached
IS>(A,A:         ;add 1 to A
                 ; (Increment A and skip the next statement if A>A)
A                ;leave A in Ans
prgmA            ;call the helper program below
Ans→B            ;store the result of the helper program in B
A²               ;square A and leave the result in Ans
prgmA            ;call the helper program below
                 ; (result is in Ans)
If B=Ans         ;if the two results are equal
IS>(X,N          ;add 1 to X
                 ; (Increment X and skip the next statement if X>N)
End
A                ;leave A in Ans
                 ;implicit print of Ans

sum(int(10fPart(Ans₁₀^(seq(⁻X-1,X,0,log(Ans   ;prgmA

                      seq(⁻X-1,X,0,log(Ans    ;generate a list...
                                              ; using X as the variable,
                                              ; starting at 0,
                                              ; ending at the log of Ans,
                                              ; and evaluating "⁻X-1" for each element
                                              ; (implicit increment of 1)
                   ₁₀^(                       ;raise 10 to the power of each element
                Ans                           ;multiply each element by the input
          fPart(                              ;remove the integer part from each element
        10                                    ;multiply each element by 10
    int(                                      ;round each element to the nearest integer
sum(                                          ;then sum the resulting list

Uwaga: TI-BASIC jest językiem tokenizowanym. Liczba znaków nie jest równa liczbie bajtów.


0

J , 62 bajty

[:{:({.@](>:@[,],[#~(=&(1#."."0@":)*:)@[)}.@])^:(#@]<1+[)^:_&1

Wypróbuj online!

1 indeksowany. J po raz kolejny nie radził sobie dobrze w tych „n-tych” zadaniach z powodu nadmiernej mechaniki księgowości.


0

APL (NARS), 49 znaków, 98 bajtów

r←h w;c
c←r←0
→2×⍳∼=/+/¨(⍎¨⍕)¨r,r×r+←1⋄→2×⍳w>c+←1

1-indeksowany, test:

  h¨⍳20
1 9 10 18 19 45 46 55 90 99 100 145 180 189 190 198 199 289 351 361 

0

MathGolf , 10 bajtów

♪╒gÆ‼Σ²Σ=§

Wypróbuj online!

Wyjaśnienie

ú10n

♪            push 1000
 ╒           range(1,n+1)
  gÆ         filter list using the next 5 operators
    ‼        apply next two commands to TOS
     Σ       sum(list), digit sum(int)
      ²      pop a : push(a*a) (square)
       Σ     sum(list), digit sum(int) (pushes the digit sum of the square)
        =    pop(a, b), push(a==b) (compares the two)
         §   get from array (returns the <input>th item from the filtered list

Może powinienem po prostu stworzyć czat dla MathGolf .. W każdym razie mam pytanie: czy są jakieś wbudowane opcje do zamiany, podziału przez i takie same dla łańcuchów? Mam wrażenie, że kompresja może tutaj zaoszczędzić bajty, ale nie jestem pewien, czy istnieją wbudowane narzędzia, aby to osiągnąć.
Kevin Cruijssen

Istnieje zamknięty czat MathGolf. Próbowałem utrzymać go przy życiu, ale ostatnio byłem zalany pracą i ciągle się zamykałem. Nie chcę zawracać głowy modami za każdym razem. Aby odpowiedzieć na twoje pytanie, MathGolf nie był tak naprawdę przeznaczony do obsługi operacji na łańcuchach, ale zaimplementowałem funkcjonalność do obsługi łańcuchów, aby poradzić sobie z niektórymi podstawowymi wyzwaniami. Jak zauważyłeś, wciąż jest wiele do życzenia. Jeśli coś dodam, prawdopodobnie będzie to coś podobnego do tego, co ma 05AB1E, ale tak naprawdę nie miałem czasu na rozwój MathGolf w ostatnich miesiącach.
maxb
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.