Somma le file del triangolo concatenato


16

Considera il seguente triangolo.

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

Come probabilmente avrai notato, la prima riga è di lunghezza 1, e ogni riga successiva è di 1 cifra più lunga rispetto alla precedente e contiene le cifre degli interi positivi concatenati.

Ti verrà dato un intero N . Il tuo compito è di trovare la somma delle cifre che si trovano sulla N fila del triangolo sopra.

Regole

  • Puoi scegliere 0 o 1 indicizzazione. Si prega di specificarlo nella risposta.

  • Si applicano scappatoie predefinite .

  • Puoi prendere input e fornire output con qualsiasi media standard e in qualsiasi formato ragionevole.

  • Questo è OEIS A066548 e questa sequenza è il triangolo stesso (tranne per il fatto che non rimuoviamo gli zeri iniziali).

  • Questo è , quindi vince il codice più breve in byte (in ogni lingua). Divertiti a giocare a golf!

Casi test

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

Si noti che quanto sopra è indicizzato 0. Se stai cercando casi di test con 1 indice, incrementa l'input di 1.

Su una nota abbastanza indipendente, di recente ho cambiato la mia foto del profilo e questo mi ha ispirato a scrivere questa sfida.

Risposte:


8

Buccia , 7 byte

1-indicizzato

Σ!CNṁdN

Provalo online!

Spiegazione

    ṁ     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 byte

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


Provalo online! (per lavorare sulla matematica "Tr" deve essere sostituito con "Totale")


2

Gelatina , 11 byte

²RDFṁRS$ṫCS

Provalo online!

Utilizza l'indicizzazione basata su 1.

Spiegazione

²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 byte

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

Provalo online.

5 byte salvati grazie a Laikoni !

Ecco la versione meno giocata:

-- 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 xè più breve di alcuni byte.
Laikoni,

@Laikoni Grazie! Modificato. Non so perché pensassi che splitOnavrebbe risparmiato byte.
Cristian Lupascu,

2

R, 119 109 108 93 88 byte

iniziando a golf .... 1-indicizzato

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

grazie @Zachary. la tua presunzione è corretta :) rasato 1 byte tnx su @Andrius e altri 15 tnx su @ user2390246

@Giuseppe - tnx per lo strtoi. nuovo per me. 5 byte in giù :)


2
Non penso che tu abbia bisogno del y=, né delle parentesi in giro n*(n-1)/2+1, e presumibilmente il nome della lingua non lo è [R].
Zacharý,

1
puoi salvare 1 byte cambiando as.integerconas.double
AndriusZ

1
Invece di x, usa Fcome è già inizializzato a 0.
user2390246

1
Inoltre, 1:n+a-1dà lo stesso di a:(a+n-1). In tal caso, non è necessario definire ain anticipo, puoi semplicemente metterlo direttamente fornell'espressione. Ciò consentirà anche di annullare un + 1 / -1.
user2390246

2
79 byte . Utilizzato al substringposto di substrpoiché in realtà questa è solo una somma sugli indici della sottostringa. Inoltre, è sempre bene includere un link TIO per le tue soluzioni :) +1, ottimo lavoro.
Giuseppe,

2

Emojicode , 182 byte

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

Definisce un metodo chiamato © che accetta 🚂 e restituisce 🚂. 1-indicizzati.

Provalo online!

Spiegazione:

Nota: molta scelta delle emoji non ha molto senso in Emojicode 0.5. È 0.x, dopo tutto. 0.6 risolverà questo, quindi se vuoi imparare questo (perché chi non vorrebbe), ti consiglio di aspettare un momento.

Emojicode è un linguaggio di programmazione orientato agli oggetti con generici, protocolli, optionals e chiusure, ma questo programma non utilizza chiusure e tutti i generici e protocolli possono essere considerati impliciti.

Il programma funziona solo su alcuni tipi: 🚂 è il tipo intero e 🔡 è il tipo di stringa. Inoltre, appaiono in condizioni, che possono assumere un valore di 👍 (vero) o 👎 (falso).

Attualmente non ci sono operatori in Emojicode, quindi addizioni, comparazioni e altre operazioni che normalmente sono operatori vengono implementate come funzioni, facendo sì che le espressioni utilizzino la notazione con prefisso . Gli operatori sono inoltre previsti in 0.6.

🐖©a🚂➡🚂🍇

© prende un 🚂 chiamato ae restituisce un 🚂.

 🍦l➗✖a➕a 1 2

Dichiarare un congelato ("costante") luguale all'a-esimo numero triangolare (formula nella notazione del prefisso). Ciò rappresenta la lunghezza della stringa di numeri che dobbiamo generare.

 🍮t🔤🔤

Assegna una stringa vuota alla variabile t.

 🍮i 0

Assegna i = 0.

 🔁▶l🐔t🍇

Mentre il lè maggiore della lunghezza dit

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

Aggiungi la rappresentazione testuale di iin base 10 a t.

 🍉

End loop

 🍮s 0

Assegnare s = 0

 🔂g🔪t➖l a a🍇

Prendi una sottostringa che tparte da l - a( a - 1th numero triangolare) di lunghezza a, ripeti su tutti i caratteri

  🍮➕s 🍺🚂🔡g 10

Converti il ​​carattere in stringa, analizza il numero intero in base-10, scartare il facoltativo (viene restituito il nulla se la stringa non è un numero) e aggiungi alla svariabile.

 🍉

End loop

 🍎s

Ritorna

🍉

Metodo finale


1

PHP, 66 + 1 byte

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

Esegui come pipe -nRo provalo online .

richiede PHP 5.4 o successivo per indicizzare l'espressione.



1

APL, 28 26 25 byte

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

Utilizza l'indicizzazione basata su 1

Provalo online!

Come?

  • ⍳⍵×⍵, 1 attraverso l'ingresso al quadrato
  • ⍕¨, trasforma ogni elemento in una stringa
  • ∊,/, concatenali insieme
  • (+/⍳⍵)↑, prendi le righe fino all'input
  • ⍵↑⌽, prendi la riga desiderata
  • ⍎¨, trasforma ogni elemento in un numero
  • +/, somma

1

Clojure v1.8, 154 byte

1-indicizzato

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

Provalo online!

Spiegazione

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

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

-18 byte grazie a @Nevay

Spiegazione:

Provalo qui.

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 byte: 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 byte

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

1-indicizzato

versione non golfata

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

Provalo qui!

grazie a @Giuseppe per aver salvato 8 byte


@Giuseppe nella descrizione è menzionato: "Ti verrà dato un numero intero N." e questa N è usata nella mia soluzione. O forse ho frainteso qualcosa.
AndriusZ,

Vedi il link "qualsiasi media standard" nella descrizione :)
Giuseppe,

@Giuseppe cambia e usa il tuo suggerimento sustrtoi
AndriusZ,

1
97 byte , con un messaggio di avviso. È sempre bene includere un collegamento a TIO nella descrizione in modo che altri possano provarlo!
Giuseppe,

@Giuseppe Non conosco nessuna R, ma forse una funzione userebbe meno byte?
NieDzejkob,

1

Perl 6 , 44 byte

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

Provalo

Allargato:

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

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

Provalo qui!
1-indicizzati.

Mentre lavoravo su questo, ho risolto un bug che non funzionava su array di numeri e che mprendeva erroneamente input impliciti.

Spiegazione:

²              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 byte

-17 byte grazie a Zacharý

L'indice inizia da 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;}

La modifica dell'ultima riga su questa dovrebbe salvare due byte: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ý,

Inoltre, se stai attualmente inserendo un input come 0-index, puoi convertirlo in 1-index e rilasciare il++n;
Zacharý

@ Zacharý Grazie. A proposito, il tuo codice contiene un carattere unicode invisibile per alcuni motivi
HatsuPointerKun

Quale, il mio suggerimento C ++ o il mio APL? APL utilizza la propria tabella codici e probabilmente non verrà visualizzato correttamente se non si dispone del carattere giusto.
Zacharý

@ Zacharý Il suggerimento C ++ che hai scritto nel commento. Ci sono 2 caratteri unicode prima di uno zero, facendo errori come "0" identifier is unknownin Visual Studio. Stessa cosa per to_stringe size. Puoi vederlo se copi e incolli il codice in notepad ++ e converti la codifica in ANSI, ne vedrai alcuni?? nell'editor
HatsuPointerKun

0

Pyth ,  15 14  13 byte

s<>sMjkS^Q2sU

Provalo qui! oppure Dai un'occhiata alla suite di test.

13 byte di alternative:

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

Come?

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 byte

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

1-indicizzato

+ 2b per -v flag

Tio.run non sembra davvero apprezzare i miei programmi <> di recente ... Tuttavia, può ancora essere verificato su https://fishlanguage.com . L'ingresso va nello "stack iniziale".

Modifica: A tio.run non piace perché gestisce '[' e ']' in modo diverso da fishlanguage.com. fishlanguage.com inverte lo stack durante la creazione o la rimozione di un nuovo stack, ma tio.run no.


0

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

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

Provalo online!

Il risultato è 1 indicizzato.

Come?

Concatena insieme più cifre sufficienti, quindi salta quelle irrilevanti all'inizio (la lunghezza del salto è la somma di numeri interi da 1 a n-1). Prendi le ncifre successive , posiziona una +davanti a ciascuna, quindi valuta quell'equazione.


0

JavaScript (ES6), 78 65 byte

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-indicizzati. Modifica: salvato 13 byte grazie a @tsh.


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

@tsh Ancora golfista per mettere join`+` alla fine ...
Neil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.