Summieren Sie die Zeilen des verketteten Dreiecks

16

Betrachten Sie das folgende Dreieck.

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

Wie Sie wahrscheinlich bemerkt haben, hat die erste Zeile die Länge 1, und jede Zeile danach ist 1 Stelle länger als die vorherige und enthält die Ziffern der zusammengesetzten positiven ganzen Zahlen.

Sie erhalten eine ganze Zahl gegeben N . Ihre Aufgabe ist es, die Summe der Ziffern zu finden, die in der N- ten Zeile des obigen Dreiecks liegen.

Regeln

  • Sie können zwischen 0 und 1 Indizierung wählen. Bitte geben Sie dies in Ihrer Antwort an.

  • Es gelten Standardlücken .

  • Sie können Eingaben und Ausgaben nach jedem Standard und in jedem vernünftigen Format vornehmen.

  • Dies ist OEIS A066548 , und diese Sequenz ist das Dreieck selbst (mit der Ausnahme, dass wir keine führenden Nullen entfernen).

  • Das ist , also gewinnt der kürzeste Code in Bytes (in jeder Sprache). Viel Spaß beim Golfen!

Testfälle

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

Beachten Sie, dass die oben genannten Werte 0-indiziert sind. Wenn Sie nach 1-indizierten Testfällen suchen, erhöhen Sie die Eingabe um 1.

Ganz unabhängig davon habe ich kürzlich mein Profilbild geändert, und das hat mich dazu inspiriert, diese Herausforderung zu schreiben.

Mr. Xcoder
quelle

Antworten:

8

Schale , 7 Bytes

1-indiziert

Σ!CNṁdN

Probieren Sie es online!

Erläuterung

    ṁ     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
quelle
4

Python 2 , 69 Bytes

Dies könnte wahrscheinlich etwas kürzer sein.

1-indiziert

Edit: -7 Bytes dank @ Mr.Xcoder

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

Probieren Sie es online!

Halvard Hummel
quelle
1
n**2ist n*n.
Mr. Xcoder
69 Bytes . Nach der Formel von Gaußsum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
Mr. Xcoder
1
@ Mr.Xcoder Ich denke, er tut ...
Erik der Outgolfer
@EriktheOutgolfer Du hast recht, mein böser
Mr. Xcoder
3

05AB1E , 8 Bytes

nLS¹L£θO

Probieren Sie es online!

-1 danke an Emigna .

1-Indizierung.

Erik der Outgolfer
quelle
Sie können Ihre entfernen , Swenn Sie ersetzen Jmit S.
Emigna
@Emigna duh ....
Erik der Outgolfer
2

Mathematica, 96 Bytes

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


Probieren Sie es online! (Um in der Mathematik zu arbeiten, muss "Tr" durch "Total" ersetzt werden)

J42161217
quelle
2

Jelly , 11 Bytes

²RDFṁRS$ṫCS

Probieren Sie es online!

Verwendet 1-basierte Indizierung.

Erläuterung

²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
Meilen
quelle
2

Haskell, 69 64 Bytes

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

Probieren Sie es online aus.

5 Bytes dank Laikoni gespart !

Hier ist die weniger Golf Version:

-- 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
quelle
n%x=sum[read[d]|d<-take n x]:(n+1)%drop n xist einige Bytes kürzer.
Laikoni
@Laikoni Danke! Bearbeitet Ich weiß nicht, warum ich dachte, das splitOnwürde Bytes sparen.
Cristian Lupascu
2

R 119 109 108 93 88 Bytes

Golf beginnen .... 1-indiziert

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

danke @Zachary. Ihre Vermutung ist richtig :) rasiert 1 Byte TNX an @ Andrius und 15 weitere TNX an @ User2390246

@ Giuseppe - TNX für die Strtoi. neu für mich. 5 Bytes runter :)

Zahiro Mor
quelle
2
Ich glaube nicht, dass Sie die brauchen y=, noch die Eltern n*(n-1)/2+1, und der Name der Sprache ist vermutlich nicht [R].
Zacharý
1
Sie können 1 Byte sparen, indem Sie as.integermitas.double
AndriusZ
1
Anstatt x, Verwendung Fwie dies bereits initialisiert auf 0
user2390246
1
Auch 1:n+a-1gibt das gleiche wie a:(a+n-1). In diesem Fall müssen Sie nicht aim Voraus definieren , sondern können es einfach direkt in den forAusdruck einfügen. Auf diese Weise können Sie auch + 1 / -1 ausgleichen.
user2390246
2
79 Bytes . Wird substringanstelle von " substrda" verwendet. Dies ist nur eine Summe über den Indizes des Teilstrings. Außerdem ist es immer gut, einen TIO-Link für Ihre Lösungen einzuschließen :) +1, großartige Arbeit.
Giuseppe
2

Emojicode , 182 Bytes

🐖©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🍉

Definiert eine Methode namens ©, die ein 🚂 annimmt und ein 🚂 zurückgibt. 1-indiziert.

Probieren Sie es online!

Erläuterung:

Hinweis: Viele Emojis machen in Emojicode 0.5 wenig Sinn. Immerhin ist es 0.x. 0.6 behebt das Problem. Wenn Sie dies also lernen möchten (denn wer möchte das nicht?), Empfehle ich, einen Moment zu warten.

Emojicode ist eine objektorientierte Programmiersprache mit Generika, Protokollen, Optionen und Closures. Dieses Programm verwendet jedoch keine Closures und alle Generika und Protokolle können als implizit betrachtet werden.

Das Programm arbeitet nur mit wenigen Typen: 🚂 ist der Integer-Typ und 🔡 ist der String-Typ. Außerdem werden ins in Bedingungen angezeigt, die einen Wert von 👍 (true) oder 👎 (false) annehmen können.

Derzeit gibt es in Emojicode keine Operatoren. Daher werden Additionen, Vergleiche und andere Operationen, die normalerweise Operatoren sind, als Funktionen implementiert, sodass die Ausdrücke die Präfixnotation verwenden . Betreiber sind auch in 0.6 geplant.

🐖©a🚂➡🚂🍇

© nimmt einen 🚂 angerufen aund gibt ein 🚂 zurück.

 🍦l➗✖a➕a 1 2

Deklarieren Sie eine eingefrorene ("Konstante") l, die der a-ten Dreieckszahl entspricht (Formel in Präfixnotation). Dies ist die Länge der zu generierenden Zahlenfolge.

 🍮t🔤🔤

Weisen Sie der Variablen eine leere Zeichenfolge zu t.

 🍮i 0

Zuweisen i = 0.

 🔁▶l🐔t🍇

Während das lgrößer ist als die Länge vont

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Fügen Sie die Textdarstellung von iin Basis 10 an t.

 🍉

Schleife beenden

 🍮s 0

Zuordnen s = 0

 🔂g🔪t➖l a a🍇

Nehmen Sie eine Teilzeichenfolge, die mit der Länge a ( der dreieckigen Zahl) tbeginnt , und iterieren Sie über alle Zeichenl - aa - 1

  🍮➕s 🍺🚂🔡g 10

Konvertieren Sie das Zeichen in eine Zeichenfolge, analysieren Sie die Ganzzahl in der Basis 10, entpacken Sie das optionale Zeichen (es wird nichts zurückgegeben, wenn die Zeichenfolge keine Zahl ist) und fügen Sie es der sVariablen hinzu.

 🍉

Schleife beenden

 🍎s

Kehrt zurück

🍉

Methode beenden.

NieDzejkob
quelle
1

PHP, 66 + 1 Bytes

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

Laufen Sie als Pipe mit -nRoder probieren Sie es online aus .

benötigt PHP 5.4 oder neuer zur Indizierung des Ausdrucks.

Titus
quelle
1

Pyth, 24 Bytes

u+GsH<>jkS+*QQ2/*QhQ2hQ0

Versuchen Sie es hier: http://pyth.herokuapp.com/

Karan Elangovan
quelle
1

APL, 28 26 25 Bytes

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

Verwendet 1-basierte Indizierung

Probieren Sie es online!

Wie?

  • ⍳⍵×⍵, 1 durch den Eingang zum Quadrat
  • ⍕¨verwandle jedes Element in einen String
  • ∊,/, verketten sie zusammen
  • (+/⍳⍵)↑, nimm die Zeilen bis zum Eingang
  • ⍵↑⌽, nimm die gewünschte Reihe
  • ⍎¨verwandle jedes Element in eine Zahl
  • +/, Summe
Zacharý
quelle
1

Clojure v1.8, 154 Bytes

1-indiziert

(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)))))

Probieren Sie es online!

Erläuterung

(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
quelle
1

Java 8, 116 98 Bytes

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-indiziert

-18 Bytes dank @Nevay

Erläuterung:

Probieren Sie es hier aus.

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
quelle
1
98 Bytes 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 Bytes

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

1-indiziert

ungolfed version

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

Probieren Sie es hier aus!

danke an @ Giuseppe für das Speichern von 8 Bytes

AndriusZ
quelle
@ Giuseppe in der Beschreibung wird erwähnt: "Sie erhalten eine ganze Zahl N." und dieses N wird in meiner Lösung verwendet. Oder vielleicht habe ich etwas falsch verstanden.
AndriusZ
Siehe die verknüpfte "any standard mean" in der Beschreibung :)
Giuseppe
@ Giuseppe ändern und verwendet Ihren Vorschlag überstrtoi
AndriusZ
1
97 Bytes mit einer Warnmeldung. Es ist immer gut, einen Link zu TIO in Ihre Beschreibung aufzunehmen, damit andere ihn testen können!
Giuseppe
@ Giuseppe Ich kenne kein R, aber vielleicht würde eine Funktion weniger Bytes verwenden?
NieDzejkob
1

Perl 6 , 44 Bytes

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

Probier es aus

Erweitert:

{
  [+]        # 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
quelle
0

SOGL V0.12 , 15 13 Bytes

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

Probieren Sie es hier aus!
1-indiziert.

Während ich daran arbeitete, behebte ich einen Fehler, der dazu führte, dass Zahlenarrays und dergleichen nicht funktioniertenm fälschlicherweise implizite Eingaben .

Erläuterung:

²              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
quelle
0

C ++, 180 Bytes

-17 Bytes dank Zacharý

Index beginnt um 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
quelle
Das Ändern der letzten Zeile sollte zwei Bytes speichern: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ý
Wenn Sie Eingaben derzeit als 0-indexiert ++n;
annehmen
@ Zacharý Danke.
Übrigens
Welches, mein C ++ - Vorschlag oder meine APL? APL verwendet eine eigene Codepage und wird wahrscheinlich nicht richtig angezeigt, wenn Sie nicht die richtige Schriftart haben.
Zacharý
@ Zacharý Der C ++ - Vorschlag, den Sie in den Kommentar geschrieben haben. Es gibt wie 2 Unicode-Zeichen vor einer Null und Fehler wie "0" identifier is unknownin Visual Studio. Gleiches fürto_string und size. Sie können es sehen, wenn Sie den Code in Notepad ++ kopieren, einfügen und die Codierung in ANSI konvertieren. Sie werden einige ??im Editor sehen
HatsuPointerKun,
0

Pyth ,  15 14  13 Bytes

s<>sMjkS^Q2sU

Probieren Sie es hier aus! oder Schauen Sie sich die Testsuite an.

Alternativen mit 13 Bytes :

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

Wie?

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.
Mr. Xcoder
quelle
0

> <>, 141 + 2 Bytes

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

1-indiziert

+ 2b für -v Flag

Tio.run scheint meine> <> Programme in letzter Zeit nicht wirklich zu mögen ... Sie können sie jedoch auf https://fishlanguage.com überprüfen . Die Eingabe erfolgt im 'Initial Stack'.

Bearbeiten: Es stellt sich heraus, dass tio.run es nicht mag, weil es '[' und ']' anders behandelt als fishlanguage.com. fishlanguage.com kehrt den Stapel um, wenn ein neuer Stapel erstellt oder entfernt wird, tio.run jedoch nicht.

Sasha
quelle
0

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

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

Probieren Sie es online!

Ergebnis ist 1 indiziert.

Wie?

Verketten Sie mehr als genug Ziffern miteinander und überspringen Sie dann die irrelevanten am Anfang (die Länge des Überspringens ist die Summe der ganzen Zahlen von 1 bis n-1). Nehmen Sie die nächsten nZiffern, setzen Sie ein +vor jede und werten Sie diese Gleichung aus.

Xcali
quelle
0

JavaScript (ES6), 78 65 Bytes

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-indiziert. Bearbeiten: 13 Bytes dank @tsh gespeichert.

Neil
quelle
n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
Dienstag,
@tsh Immer noch Golfspieler, um das join`+` am Ende zu setzen ...
Neil