Zsumuj rzędy konkatenowanego trójkąta


16

Rozważ następujący trójkąt.

1
23
456
7891
01112
131415
1617181
92021222
324252627
2829303132
33343536373
839404142434
4454647484950
51525354555657
585960616263646
5666768697071727
37475767778798081

Jak zapewne zauważyłeś, pierwszy rząd ma długość 1, a następnie każdy rząd jest o 1 cyfrę dłuższy niż do poprzedniego i zawiera cyfry dodatnich liczb całkowitych połą czonych.

Będziesz mieć liczbę całkowitą N . Twoim zadaniem jest znaleźć sumę cyfr, które leżą w N- tym rzędzie powyższego trójkąta.

Zasady

Przypadki testowe

Input  |  Output

0  |  1
1  |  5
2  |  15
3  |  25
4  |  5
5  |  15
6  |  25
7  |  20
8  |  33
9  |  33
10 |  43
11 |  46
12 |  64

Zauważ, że powyższe są indeksowane 0. Jeśli szukasz 1-indeksowanych przypadków testowych, zwiększ dane wejściowe o 1.

Z całkiem niezwiązanej uwagi ostatnio zmieniłem swoje zdjęcie profilowe, co zainspirowało mnie do napisania tego wyzwania.

Odpowiedzi:


8

Łuska , 7 bajtów

1-indeksowany

Σ!CNṁdN

Wypróbuj online!

Wyjaśnienie

    ṁ     Map then concatenate
     d    Integer digits
      N   Over the natural numbers
  CN      Cut into lists of lengths corresponding to the natural numbers
 !        Index it
Σ         Sum





2

Mathematica, 96 bajtów

(d=Flatten[IntegerDigits/@Range[#^2]];Last@Table[Tr@Take[d,{i(i+1)/2+1,(i+1)(i+2)/2}],{i,0,#}])&  


Wypróbuj online! (aby pracować nad matematyką, „Tr” należy zastąpić „Total”)


2

Galaretka , 11 bajtów

²RDFṁRS$ṫCS

Wypróbuj online!

Wykorzystuje indeksowanie 1.

Wyjaśnienie

²RDFṁRS$ṫCS  Input: n
²            Square
 R           Range, [1, n^2]
  D          Decimal digits
   F         Flatten
    ṁ        Reshape to
       $     Monadic chain
     R         Range, [1, n]
      S        Sum
        ṫ    Tail
         C   Complement, 1-n
          S  Sum

2

Haskell, 69 64 bajtów

n%x=sum[read[d]|d<-take n x]:(n+1)%drop n x
f=(1%(show=<<[1..])!!)

Wypróbuj online.

Zaoszczędź 5 bajtów dzięki Laikoni !

Oto wersja mniej golfowa:

-- continuous stream of digits representing
-- the concatenation of positive integers in
-- order: 1234567891011...
digitstream = show=<<[1..]

-- sequence that yields the rows of the triangle
triangle n xs |(a,b)<-splitAt n xs=a:triangle(n+1)b

digitSum xs = sum[read[d]|d<-xs]

-- sequence that sums up the digits in each row
rowSumSequence = map digitSum (triangle 1 digitstream)

-- the final function that just shows the value 
-- at a given index
g=(rowSumSequence!!)

n%x=sum[read[d]|d<-take n x]:(n+1)%drop n xjest o kilka bajtów krótszy.
Laikoni

@Laikoni Thanks! Edytowane. Nie wiem, dlaczego myślałem, splitOnże zaoszczędzi bajty.
Cristian Lupascu,

2

R, 119 109 108 93 88 bajtów

zaczynam grać w golfa ... 1-indeksowany

function(n){for(i in 1:n+n*(n-1)/2){F=F+strtoi(substr(paste(1:n^2,collapse=""),i,i))};F}

dzięki @Zachary. twoje domniemanie jest prawidłowe :) ogoliłem 1 bajt TNX na @Andrius i 15 kolejnych TNF na @ user2390246

@Giuseppe - tnx dla strtoi. nowy dla mnie. 5 bajtów w dół :)


2
Nie sądzę, żebyś potrzebował y=, ani parenów n*(n-1)/2+1, a nazwa języka prawdopodobnie nie jest [R].
Zacharý

1
możesz zapisać 1 bajt, zmieniając za as.integerpomocąas.double
AndriusZ

1
Zamiast tego xużyj, Fponieważ jest on już zainicjowany na 0.
user2390246

1
Ponadto 1:n+a-1daje to samo, co a:(a+n-1). W takim przypadku nie musisz definiować az góry, możesz po prostu umieścić to prosto w forwyrażeniu. Umożliwi to również anulowanie + 1 / -1.
user2390246

2
79 bajtów . Używany substringzamiast, substrponieważ tak naprawdę jest to tylko suma nad wskaźnikami podłańcucha. Ponadto zawsze warto dołączyć link TIO do swoich rozwiązań :) +1, świetna robota.
Giuseppe,

2

Emojicode , 182 bajty

🐖©a🚂➡🚂🍇🍦l➗✖a➕a 1 2🍮t🔤🔤🍮i 0🔁▶l🐔t🍇🍮➕i 1🍮t🍪t🔡i 10🍪🍉🍮s 0🔂g🔪t➖l a a🍇🍮➕s 🍺🚂🔡g 10🍉🍎s🍉

Definiuje metodę o nazwie ©, która przyjmuje 🚂 i ​​zwraca 🚂. 1-indeksowany.

Wypróbuj online!

Wyjaśnienie:

Uwaga: duży wybór emotikonów nie ma większego sensu w Emojicode 0.5. W końcu to 0.x. 0.6 to naprawi, więc jeśli chcesz się tego nauczyć (bo kto by tego nie chciał), polecam chwilę poczekać.

Emojicode jest zorientowanym obiektowo językiem programowania obejmującym elementy generyczne, protokoły, opcje i zamknięcia, ale ten program nie używa zamknięć, a wszystkie rodzaje ogólne i protokoły można uznać za niejawne.

Program działa tylko na kilku typach: 🚂 jest typem całkowitym, a 🔡 jest typem ciągu. Dodatkowo 👌 pojawiają się w warunkach, które mogą przyjmować wartość 👍 (prawda) lub 👎 (fałsz).

Obecnie w Emojicode nie ma żadnych operatorów, więc dodawanie, porównywanie i inne operacje, które normalnie są operatorami, są implementowane jako funkcje, dzięki czemu wyrażenia używają notacji z prefiksem . Operatorzy są również planowani w wersji 0.6.

🐖©a🚂➡🚂🍇

© bierze jeden 🚂 ai zwraca 🚂.

 🍦l➗✖a➕a 1 2

Zadeklaruj zamrożoną („stałą”) lrówną a-tej liczbie trójkątnej (wzór w notacji przedrostka). To reprezentuje długość ciągu liczb, które musimy wygenerować.

 🍮t🔤🔤

Przypisz pusty ciąg do zmiennej t .

 🍮i 0

Przydzielać i = 0 .

 🔁▶l🐔t🍇

Podczas gdy ljest większa niż długośćt

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Dołącz reprezentację tekstową iw podstawie 10 dot .

 🍉

Koniec pętli

 🍮s 0

Przydzielać s = 0

 🔂g🔪t➖l a a🍇

Weź podłańcuch tzaczynając od l - a(a - 1 th liczba trójkątna) długości a, iteruj po wszystkich znakach

  🍮➕s 🍺🚂🔡g 10

Konwertuj znak na ciąg, analizuj liczbę całkowitą w bazie-10, rozpakuj opcjonalne (nic nie jest zwracane, jeśli ciąg nie jest liczbą) i dodaj do s zmiennej.

 🍉

Koniec pętli

 🍎s

Zwroty

🍉

Metoda końcowa


1

PHP, 66 + 1 bajtów

for($p=($n=$argn)*-~$n/2;$n--;)$r+=join(range(1,$p))[--$p];echo$r;

Uruchom jako potok za pomocą -nRlub spróbuj online .

wymaga PHP w wersji 5.4 lub nowszej do indeksowania wyrażenia.



1

APL, 28 26 25 bajtów

{+/⍎¨⍵↑⌽(+/⍳⍵)↑∊,/⍕¨⍳⍵×⍵}

Wykorzystuje indeksowanie 1

Wypróbuj online!

W jaki sposób?

  • ⍳⍵×⍵, 1 przez wejście do kwadratu
  • ⍕¨, zamień każdy element w ciąg
  • ∊,/, połącz je razem
  • (+/⍳⍵)↑, chwyć wiersze do wejścia
  • ⍵↑⌽, chwyć żądany rząd
  • ⍎¨, zamień każdy element na liczbę
  • +/, suma

1

Clojure v1.8, 154 bajtów

1-indeksowany

(fn[n](loop[i 1 s(clojure.string/join""(take(* n n)(iterate inc 1)))](if(= i n)(apply +(map #(Character/digit % 10)(take n s)))(recur(inc i)(subs s i)))))

Wypróbuj online!

Wyjaśnienie

(take(* n n)(iterate inc 1))  Take the first N*N numbers
(clojure.string/join""...)    Combine them into a string
(loop[i 1 ...](if(= i n)...)  Loop N times
(apply +(map #(Character/digit % 10)(take n s)))  Take N characters from the string, convert to integers and add them
(recur(inc i)(subs s i))      Increment iterator, remove i characters from string

1

Java 8, 116 98 bajtów

n->{String t="";int r=0,i=0;for(;i++<n*n;t+=i);for(i=0;i<n;r+=t.charAt(i+++~-n*n/2)-48);return r;}

1-indeksowany

-18 bajtów dzięki @Nevay

Wyjaśnienie:

Wypróbuj tutaj.

n->{                             // Method with integer as both parameter and return-type
  String t="";                   //  Triangle-String
  int r=0,                       //  Result-integer
      i=0;                       //  Index-integer
  for(;i++<n*n;                  //  Loop (1) from 0 to `n^2` (exclusive)
    t+=i                         //   And append String `t` with all the numbers
  );                             //  End of loop (1)
  for(i=0;i<n;                   //  Loop (2) from 0 to `n` (exclusive)
    r+=t.charAt(i+++~-n*n/2)-48  //   And raise the sum `r` by the digits
  );                             //  End of loop (2)
  return r;                      //  Return the resulting sum of digits
}                                // End of method

1
98 bajtów: n->{String r="";int i=0,x=0;for(;x++<n*n;r+=x);for(x=0;x<n;)i+=r.charAt(x+++~-n*n/2)-48;return i;}.
Nevay

1

R, 99 , 105 , 97 bajtów

a=diag(N<-scan());a[upper.tri(a,T)]=strtoi(strsplit(paste(1:N^2,collapse=""),"")[[1]]);sum(a[,N])

1-indeksowany

wersja bez golfa

a <- diag(N<-scan())
a[upper.tri(a, diag=TRUE)] <- strtoi(strsplit(paste(1:N^2, 
                                                  collapse=""),
                                            "")[[1]])
sum(a[,N])

Wypróbuj tutaj!

dzięki @Giuseppe za zapisanie 8 bajtów


@Giuseppe w opisie wspomniano: „Otrzymasz liczbę całkowitą N.” i ten N jest używany w moim rozwiązaniu. A może coś źle zrozumiałem.
AndriusZ

Zobacz powiązany „dowolny standardowy środek” w opisie :)
Giuseppe,

@Giuseppe zmienił i wykorzystał twoją sugestię dotyczącąstrtoi
AndriusZ

1
97 bajtów , z komunikatem ostrzegawczym. W opisie zawsze dobrze jest umieścić link do TIO, aby inni mogli go przetestować!
Giuseppe,

@Giuseppe Nie wiem nie R, ale może funkcja użyłaby mniej bajtów?
NieDzejkob,

1

Perl 6 , 44 bajtów

{[+] (1..*).flatmap(*.comb).rotor(1..*)[$_]}

Sprawdź to

Rozszerzony:

{
  [+]        # reduce the result of the following using &infix«+»

  ( 1 .. * ) # infinite range starting at 1

  .flatmap(  # map, then flatten
    *.comb   # split into digits (100 ⇒ 1,0,0)
  )

  .rotor(    # break the sequence into pieces
    1 .. *   # start with 1 value, then 2 values, then 3, etc.
  )\

  [$_]       # index into that infinite sequence
}


0

SOGL V0.12 , 15 13 bajtów

²Δr∑.δ∑⌡kmčr∑

Wypróbuj tutaj!
1-indeksowany.

Podczas pracy nad tym naprawiłem błąd, który popełnił nie działał na tablicach liczb i że mniepoprawnie pobierał dane niejawne.

Wyjaśnienie:

²              square the input
 Δ             get a range from 1 to that
  r∑           join as a string
    .δ         create a range 0 - input-1
      ∑        sum that
       ⌡       that many times do
        k        remove the 1st character of the joined string
         m     mold to the length of the input
          č    chop into characters
           r∑  convert to numbers and sum

0

C ++, 180 bajtów

-17 bajtów dzięki Zacharýowi

Indeks zaczyna się od 1

#include<string>
int s(int n){std::string t;int i=0,p=0;for(;i<=n;)p+=i++;for(i=0;t.size()<p;t+=std::to_string(++i));t=t.substr(0,p).substr(p-n);i=0;for(auto&a:t)i+=a-48;return i;}

Zmiana ostatniej linii na to powinna zaoszczędzić dwa bajty:int s(int n){++n;std::string t;int i=0,p=0;for(;i<=n;)p+=i++;for(i=0;t.size()<p;t+=std::to_string(++i));t=t.substr(0,p);t=t.substr(t.size()-n);i=0;for(auto&a:t)i+=a-48;return i;}
Zacharý

Ponadto, jeśli obecnie ++n;
pobierasz

@ Zacharý Thanks. Btw, z jakiegoś powodu twój kod zawiera niewidoczny znak Unicode
HatsuPointerKun

Który, moja sugestia C ++ lub moja APL? APL używa własnej strony kodowej i prawdopodobnie nie pojawi się poprawnie, jeśli nie masz odpowiedniej czcionki.
Zacharý

@ Zacharý Sugestia C ++ napisana w komentarzu. Przed zerem są 2 znaki Unicode, co powoduje błędy jak "0" identifier is unknownw studio wizualnym. To samo dotyczy to_stringi size. Możesz to zobaczyć, jeśli skopiujesz i wkleisz kod w notatniku ++ i przekonwertujesz kodowanie na ANSI, zobaczysz niektóre ??w edytorze
HatsuPointerKun

0

Pyth ,  15 14  13 bajtów

s<>sMjkS^Q2sU

Wypróbuj tutaj! lub Sprawdź zestaw testowy.

13 bajtów alternatywnych:

ssM<>jkS^Q2sU
ssM<>jkS*QQsU
s<>sMjkS^Q2sU

W jaki sposób?

s<>sMjkS^Q2sU    Full program. Q means input.

       S^Q2      The range [1, Q^2].
     jk          Join as a String.
   sM            Convert each character to integer.
  >              All the elements of the above, but the first Q*(Q-1)/2.
 <               All the element of the above but the last Q.
s                Sum.
                 Output implicitly.

0

> <>, 141 + 2 bajtów

::1+* 2,01\
@}})?/:0$\>$:@{{:
:%a:/?(1:< ,a-]{+1[4
  /~/     \+1~\
1:<]{+1[+4@:-1\?(
{1-}>{:}1(?\@1-@+
    \0}~{{\\n;
@:{{:<-1~$\!?)}}
     ~

1-indeksowane

+ 2b dla flagi -v

Wygląda na to, że Tio.run ostatnio nie lubi moich programów> <> ... Nadal można to sprawdzić na https://fishlanguage.com . Wejście przechodzi w „początkowy stos”.

Edycja: Okazuje się, że tio.run nie lubi, ponieważ obsługuje „[” i „]” inaczej niż fishlanguage.com. fishlanguage.com odwraca stos podczas tworzenia lub usuwania nowego stosu, ale tio.run tego nie robi.


0

Perl 5 , 62 + 1 (-p) = 63 bajty

$_=eval(substr((join'',1..$_*$_),($_**2-$_)/2,$_)=~s/./+$&/gr)

Wypróbuj online!

Wynik jest zindeksowany 1.

W jaki sposób?

Połącz razem więcej niż wystarczającą liczbę cyfr, a następnie pomiń te niepotrzebne na początku (długość pominięcia to suma liczb całkowitych od 1 do n-1). Weź kolejne ncyfry, umieść +przed każdym z nich, a następnie oceń to równanie.


0

JavaScript (ES6), 78 65 bajtów

f=
n=>eval([...(g=n=>n?g(n-1)+n:``)(n*n).substr(n*~-n/2,n)].join`+`)
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

1-indeksowany. Edycja: Zapisano 13 bajtów dzięki @tsh.


n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
tsh

@tsh Wciąż golfier join`+` na końcu ...
Neil
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.