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.

Pan Xcoder
źródło

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
H.PWiz
źródło
4

Python 2 , 69 bajtów

To może być prawdopodobnie nieco krótsze.

1-indeksowany

Edycja: -7 bajtów dzięki @ Mr.Xcoder

lambda n:sum(map(int,"".join(map(str,range(1,n*n+1)))[~-n*n/2:][:n]))

Wypróbuj online!

Halvard Hummel
źródło
1
n**2jest n*n.
Pan Xcoder,
69 bajtów . Używając wzoru Gaussa,sum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
Pan Xcoder,
1
@ Mr.Xcoder Myślę, że on ma ...
Erik the Outgolfer
@EriktheOutgolfer Masz rację, mój zły
Pan Xcoder
3

05AB1E , 8 bajtów

nLS¹L£θO

Wypróbuj online!

-1 dzięki Emignie .

1-indeksowanie.

Erik the Outgolfer
źródło
Możesz je usunąć, Sjeśli zastąpisz Jje S.
Emigna
@Emigna duh ....
Erik the Outgolfer
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”)

J42161217
źródło
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
mile
źródło
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!!)
Cristian Lupascu
źródło
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ół :)

Zahiro Mor
źródło
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

NieDzejkob
źródło
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.

Tytus
źródło
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
Zacharý
źródło
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
Chris
źródło
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
Kevin Cruijssen
źródło
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

AndriusZ
źródło
@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
}
Brad Gilbert b2gills
źródło
0

Galareta , 16 bajtów

Ṭ€Ẏ0;œṗ²D€Ẏ$$⁸ịS

Wypróbuj online!

1-indeksowany.

Erik the Outgolfer
źródło
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
dzaima
źródło
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;}
HatsuPointerKun
źródło
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.
Pan Xcoder
źródło
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.

Sasha
źródło
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.

Xcali
źródło
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.

Neil
źródło
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