Cyfry


20

Liczba trójkątna to liczba, którą można wyrazić jako sumę kolejnych liczb całkowitych dodatnich, zaczynając od 1. Można je również wyrazić wzorem n(n + 1) / 2, w którym njest pewna liczba całkowita dodatnia.

Liczbowy odpowiednik liczby jest obliczany w następujący sposób:

  1. Podziel liczbę na tablicę jej cyfr, np 613 => [6 1 3]
  2. Dla każdej liczby w tablicy oblicz ntrzecią liczbę trójkątną;[6 1 3] => [21 1 6]
  3. Zsumuj wynikową tablicę; [21 1 6] => 28

Twoim zadaniem jest, biorąc pod uwagę liczbę całkowitą n, kilkakrotnie obliczyć ncyfrowy odpowiednik, aż wynik będzie równy 1, a następnie wypisz wszystkie obliczone wartości. Możesz wyprowadzać wartości w dowolnej kolejności iz opcjonalnym dołączeniem oryginalnego numeru na początku tablicy. To jest więc wygrywa najkrótszy kod.

Przypadki testowe

23 => 9 45 25 18 37 34 16 22 6 21 4 10 1
72 => 31 7 28 39 51 16 22 6 21 4 10 1
55 => 30 6 21 4 10 1
78 => 64 31 7 28 39 51 16 22 6 21 4 10 1
613 => 28 39 51 16 22 6 21 4 10 1
8392 => 90 45 25 18 37 34 16 22 6 21 4 10 1
11111 => 5 15 16 22 6 21 4 10 1
8592025 => 117 30 6 21 4 10 1
999999999 => 405 25 18 37 34 16 22 6 21 4 10 1

1
Czy możemy uwzględnić pierwotny numer jako pierwszy w wynikowej tablicy?
Uriel

1
Skąd wiemy, że zawsze spada do 1?
Po prostu piękna sztuka

5
Załóżmy, że liczba jest większa niż 141i zawiera ncyfry. Wartość maksymalna jego digitangular odpowiednik może mieć to 45n, więc digi-△(x) ≤ 45n < 45(1+log_10(x))i dla x > 141mamy 45(1+log_10(x)) < x, a więc digi-△(x) ≤ x-1za x > 141, a raz mijamy 141granicę, dobrze, my brute wymusić udowodnić poprzez programy.
Simply Beautiful Art

1
Czy mogę mieć końcowe 1 na końcu mojego wyjścia?
Po prostu piękna sztuka

1
Powiązane: Liczby cyfrowe , szukające alternatywnych dowodów, że ta sekwencja ostatecznie trafia do 1.
Po prostu piękna sztuka

Odpowiedzi:


10

Łuska , 6 bajtów

U¡(ṁΣd

Wypróbuj online!

Wyjaśnienie

U¡(ṁΣd
 ¡(       Iterate the following function on the input:
     d       Split the number into digits
   ṁΣ        Map each digit to its triangular number, then sum the results
U         Take the results of iteration until before the first repeated one

7

05AB1E , 6 5 bajtów

Δ=SLO

Wypróbuj online! Edycja: Zapisano 1 bajt dzięki @Emigna. Wyjaśnienie:

Δ       Repeat until value doesn't change
 =      Print current value
  S     Split into characters
   L    Turn each character into range from 1 to N
    O   Sum

Jeśli zastąpi się S, można pominąć jednego O.
Emigna,

@Emigna ... dlaczego w ogóle Ltak się zachowuje?
Neil

Jeśli dobrze pamiętam, był to błąd, który okazał się przydatny i musiał pozostać jako funkcja. Myślę, że była to jedna z pierwszych metod wektoryzacji.
Emigna,

4

J, 20 19 bajtów

(1#.2!1+,.&.":)^:a:

Wypróbuj online!

Wysyła również oryginalny numer.

Wyjaśnienie

(1#.2!1+,.&.":)^:a:
               ^:a:  Apply until input converges, storing all results in an array
(1#.2!1+,.&.":)      Digitangular sum
        ,.&.":         Split to digits
          &.":           Convert to string, apply left function, then undo conversion
        ,.               Ravel items (make array of singleton arrays of items)
                         This ensures that when cast back to integers, the digits are split.
      1+               Add 1 to each
    2!                 Compute (n choose 2) on each (nth triangular number)
 1#.                   Sum (debase 1)

1
[:+/-> 1#.miau!
FrownyFrog,

@FrownyFrog nie jest oryginalną sztuczką, choć z pewnością korzystam z niej, kiedy to pamiętam.
cole

4

APL (Dyalog) , 23 20 17 bajtów

3 bajty zapisane dzięki @ngn

{⍵∪⍨+/∊⍳¨⍎¨⍕⊃⍵}⍣≡

Wypróbuj online!

W jaki sposób?

⍵∪⍨ - dołącz bieżącą tablicę do

+/ - suma

- spłaszczone

⍳¨ - zakresy każdego

⍎¨⍕ - cyfra

⊃⍵ - poprzednia wartość

⍣≡aż do konwergencji. Użycie (union) zapewnia, że ​​po dołączeniu pierwszego 1, następne zostanie wykluczone ze względu na ustawioną unikalność, a tablica się zbiegnie.


Z ciekawości, ile by to trwało, gdyby nie pozwolono ci również wyprowadzić oryginalnej wartości?
caird coinheringaahing

@cairdcoinheringaahing 2 bajty - 1↓(upuść pierwszy)
Uriel

@Uriel Tutaj limit mocy (⍣≡) daje krótsze rozwiązanie niż rekurencja: {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡, ale szkoda, że ​​APL nie ma zwięzłego sposobu na zebranie wszystkich iteracji funkcja do konwergencji: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn

@ngn dzięki! Próbowałem użyć operatora mocy, ale nie myślałem o tym, że zbiega się po 1. Wkrótce się zaktualizuje
Uriel,

@ngn masz pomysł, jak korzystać {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡bez drukowania ostatniego 1?
Uriel

3

Haskell, 51 47 46 bajtów

f 1=[1]
f x=x:f(sum$do d<-show x;[1..read[d]])

Wypróbuj online!

f 1=[1]                     -- if x == 1, return the singleton list [1]
f x=                        -- else
         do d<-show x       --  for each char 'd' in the string representation of x
                            --    (using the list monad)
           [1..read[d]]     --  make a list of [1..d]
                            --    (the list monad concatenates all those lists into a single list)
        sum                 --  sum those numbers
      f                     --  call f on it
    x:                      --  and put x in front of it 

Edycja: @ H.PWiz zapisał bajt. Dzięki!



2

Wolfram Language (Mathematica) , 43 41 bajtów

Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&

Wypróbuj online!

Jak to działa

Wyrażenie to #.(#+1)/2&@IntegerDigits@#daje odpowiednik cyfry #. My Echodane wejściowe używamy oceny zwarcia z, &&aby zatrzymać, jeśli osiągnęliśmy 1, i w przeciwnym razie powrócić na cyfrowym odpowiedniku.


-2 bajty dzięki Martinowi Enderowi za .lewę: nie musimy używać Trsumowania cyfr, jeśli zamienimy mnożenie #(#+1)/2przez iloczyn iloczynu #.(#+1)/2.


2
Dopiero teraz zobaczyłem twoją odpowiedź. Możesz pokonać mój, używając sztuczki skalarnej, aby uniknąć Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender

@MartinEnder Dzięki, to fajna sztuczka. Zastanawiam się, czy istnieją jeszcze bardziej golfistyczne sposoby na „wydrukowanie wszystkich iteracji tej funkcji w drodze do stałego punktu” (w zasadzie ponowne wdrożenie, FixedPointListz wyjątkiem tego, w jaki sposób drukuje ten stały punkt dwukrotnie). Wygląda na to, że powinno to być wcześniej.
Misza Ławrow

2

Wolfram Language (Mathematica) , 49 42 39 bajtów

Podziękowania dla Miszy Ławrow za oszczędność 3 bajtów.

#//.x_:>(y=IntegerDigits@Echo@x).++y/2&

Wypróbuj online! (Z ++yjakiegoś powodu TIO potrzebuje nawiasów wokół . W mojej lokalnej instalacji Mathematica działa bez nich, tak jak powinno).

Drukuje każdą wartość w osobnym wierszu, poprzedzonym >>i zawiera numer początkowy.


Możesz wrócić do pokonania mojej odpowiedzi #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (... może. Z jakiegoś powodu TIO nie lubi tego, ale Mathematica ma się z tym dobrze?)
Misha Lavrov

Ma #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&41 bajtów i działa w TIO. Ale moja kopia Mathematiki nie uważa nawiasów za konieczne.
Misza Ławrow

@MishaLavrov Thanks. Tak, nie mam pojęcia, dlaczego TIO potrzebuje nawiasów, ale składnia w plikach skryptowych bywa nieco niepewna.
Martin Ender

1

Ohm v2 ,  9  7 bajtów

·Ω}#ΣΣu

Wypróbuj online!

Wyjaśnienie

          Implicit input as a string
·Ω        Evaluate until the result has already been seen, pushing intermediate results
  }       Split digits
   #      Range from 0 to N
    ΣΣ    Sum
      u   Convert to string

Nie jest uniepotrzebne?
Nick Clifford

Jest to konieczne, inaczej }nie podzieli cyfr
Cinaski

Hm To może być błąd. Sprawdzę to.
Nick Clifford,

1

Retina , 21 bajtów

;{:G`
.
$*1¶
1
$%`1
1

Wypróbuj online! (Wyniki poszczególnych przypadków nie są dobrze rozdzielone, ale każde wyjście kończy się na 1.)

Drukuje każdy numer w osobnej linii, w kolejności, łącznie z numerem początkowym.

Wyjaśnienie

;{:G`

To tylko niektóre konfiguracje programu. {tworzy pętlę programu, dopóki nie zmieni wyniku (co się zdarza, kiedy do niej dojdziemy 1), :drukuje liczbę przed każdą iteracją i ;zapobiega dwukrotnemu drukowaniu końcowego wyniku na końcu programu. To Gjest po prostu mój zwykły sposób tworzenia sceny bez operacji.

.
$*1¶

Przekształć każdą cyfrę w unarną i umieść ją we własnej linii.

1
$%`1

Oblicz trójkątną liczbę w każdej linii, zastępując każdą 1jej przedrostkiem. Możemy również użyć M!&`1+tutaj, który daje nam wszystkie sufiksy każdej linii.

1

Policz wszystkie 1s, które sumują wszystkie liczby trójkątne i przekształcają wynik z powrotem na dziesiętny.


Czy Retina jest kompletnym językiem Turinga?

@ThePirateBay tak.
Martin Ender

1

Rubin, 60 47 42 bajtów

-13 bajtów autorstwa @JustinMariner

-5 bajtów przez @GB

->x{p x=x.digits.sum{|k|k*-~k/2}while x>1}

Wypróbuj online!


Możesz upuścić tablicę i splat ( [*...]) i zmienić (k+1)na, -~kaby zapisać łącznie 5 bajtów: Wypróbuj online! Dodatkowo możesz zaoszczędzić 8 więcej, przechodząc na anonimową funkcję lambda: Wypróbuj online!
Justin Mariner

Hm, nie mam pojęcia, dlaczego myślałem, że .mapnie mogę brać tablic.
Po prostu piękna sztuka

Możesz użyć „sum {...}” zamiast „map {...}. Sum”, a następnie usuń spację przed „while”
GB


1

Pushy , 24 22 21 17 bajtów

[sL:R{;Svc^#&1=?i

Wypróbuj online!

Wyjaśnienie

[sL:R{;Svc^#&1=?i

[           &1=?i   \ Loop until result == 1:
 s                  \   Split last result into digits
  L:  ;             \   For each digit n:
    R{              \       Push the range (1, n) inclusive
       S            \   Sum the ranges
        vc^         \   Delete all stack items, except the sum
           #        \   Print result


0

R , 70 bajtów

f=function(n)"if"(n-1,c(n,f((d=n%/%10^(nchar(n):0)%%10)%*%(d+1)/2)),n)

Wypróbuj online!

Zwraca również oryginalną wartość.

R , 80 bajtów

function(n){o={}
while(n-1){n=(d=n%/%10^(nchar(n):0)%%10)%*%(d+1)/2
o=c(o,n)}
o}

Wypróbuj online!

Nie zwraca oryginalnej wartości.



0

05AB1E , 20 12 bajtów

Zaoszczędzono 2 bajty dzięki Cairney Coheringaahing

ΔD,þ€iLO}O}}

Wypróbuj online!

Wyjaśnienie

(stara wersja)

Δþ€iD>*;}OD1›iD,}}1,  Main program
Δ                }    Repeat until there is no changes
 þ                    Push digits of the input number
  €i    }             Apply for each digit
    D>*;              Calculate the triangular number for given digit
         O            Sum all numbers
          D1›iD,}     Print if greater than 1
                  1,  Print 1 at the end

0

JavaScript, 61 57 bajtów

f=a=>a-1?([...a+[]].map(b=>a+=b++*b/2,a=0),a)+' '+f(a):''

Wypróbuj online!



0

Węgiel drzewny , 18 bajtów

W⊖Iθ«≔IΣ⭆θΣ…·0κθθ⸿

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

   θ                Input
  I                 Cast to integer
 ⊖                  Decrement
W   «               Loop while not zero
         θ          Current value
        ⭆           Map over characters and concatenate
             0      Literal character 0
              κ     Current character
           …·       Inclusive range
          Σ         Concatenate
       Σ            Sum of digits
      I             Cast to string
     ≔         θ    Assign back to value
                θ   Output latest value
                 ⸿  Move to start of next line


0

k , 19 bajtów

{+/(+/1+!"I"$)'$x}\

Nic dziwnego, że działa podobnie do już opublikowanych rozwiązań APL i J.

               $x    cast x (implicit var of lambda) to string
   (         )'      apply composition (function train) to each character of string
    +/1+!"I"$        cast character to number, create list from 1 to n, sum it
 +/                  sum triangular numbers
{                }\  iterate lambda until result converges, appending each result

0

Galaretka , 7 bajtów

DRFSµÐĿ

Wypróbuj online!

  • DRFSµÐĿ: Pełny program / łącze monadyczne.

  • ÐĿ: Pętla, aż wyniki nie będą już unikalne (jeśli coś innego niż 1 wystąpi dwukrotnie, wówczas dane wejściowe nie mają określonego wyniku, ponieważ nigdy nie osiągną 1).

  • D: Konwertuj z liczb całkowitych na dziesiętne.

  • R: Zakres (1-indeksowany). Wektoryzuje.

  • F: Spłaszcz i S: Suma ( µpo prostu tworzy nowy łańcuch monadyczny)


0

dc, 31 bajtów

[[I~d1+*2/rd0<m+]dsmxpd1<f]dsfx

Funkcja moblicza funkcję cyfrową wejścia;fpowtarza to, aż wynik osiągnie 1.

Zauważ, że używamy podstawki wejściowej do wydobywania cyfr - oznacza to, że będzie działać w dowolnym systemie bazowym, nie tylko dziesiętnym.

Próbny

for i in 23 72 55 78 613 8392 11111 8592025 999999999
    do echo $i '=>' $(dc -e $i'[[I~d1+*2/rd0<m+]dsmxpd1<f]dsfx')
done
23 => 9 45 25 18 37 34 16 22 6 21 4 10 1
72 => 31 7 28 39 51 16 22 6 21 4 10 1
55 => 30 6 21 4 10 1
78 => 64 31 7 28 39 51 16 22 6 21 4 10 1
613 => 28 39 51 16 22 6 21 4 10 1
8392 => 90 45 25 18 37 34 16 22 6 21 4 10 1
11111 => 5 15 16 22 6 21 4 10 1
8592025 => 117 30 6 21 4 10 1
999999999 => 405 25 18 37 34 16 22 6 21 4 10 1


0

Neim , 8 bajtów

ͻ𝐂t𝕕𝐬D÷D

Wyjaśnienie:

ͻ             Start infinite loop
 𝐂            Split top of stack into each of its characters
  t           Push infinite list of triangular numbers
   𝕕          For each of the characters, get the nth element in the above list.
    𝐬          Sum.
     D         Duplicate.
      ÷        If top of stack is equal to 1, break.
       D       Duplicate.
               Implicitly print all elements in the stack, concatenated.

Wypróbuj online!

Sformatowane wyjście


0

D , 140 bajtów

import std.algorithm,std.range,std.conv,std.stdio;void f(T)(T n){n=n.text.map!(u=>u.to!T-48+(u.to!T-48).iota.sum).sum;n.writeln;if(n-1)n.f;}

Wypróbuj online!


0

PHP, 71+1 bytes

for(;1<$n="$s"?:$argn;print$s._)for($i=$s=0;$p--||~$p=$n[$i++];)$s+=$p;

Run as pipe with -nR or try it online. (requires PHP 5.3 or later for the Elvis operator)


What's the Elvis operator?
caird coinheringaahing

@cairdcoinheringaahing A?:B: if A is truthy then A else B
Titus

0

Add++, 32 bytes

D,f,@,EDBFEREss
+?
y:1
W!,$f>x,O

Try it online!

Doesn't output the first value

How it works

D,f,@,   - Create a monadic function, f.
         - Example argument: [613]
      ED - Digits;   STACK = [[6 1 3]]
      BF - Flatten;  STACK = [6 1 3]
      ER - Range;    STACK = [[1 2 3 4 5 6] [1] [1 2 3]]
      Es - Sum each; STACK = [21 1 6]
      s  - Sum;      STACK = [28]

           f calculates n's digitangular counterpart

+?       - Take input;     x = 613; y = 0
y:1      - Set y to 1;     x = 613; y = 1
W!,      - While x != y...
   $f>x, -   Call f;       x =  28; y = 1
   O     -   Print x;

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.