Birleştirilmiş üçgenin satırlarını toplama


16

Aşağıdaki üçgeni düşünün.

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

Muhtemelen fark ettiğiniz gibi, ilk satır 1 uzunluğundadır ve daha sonra her satır bir öncekinden 1 basamak daha uzundur ve birleştirilmiş pozitif tamsayıların rakamlarını içerir.

Size bir tam sayı N verilecektir . Göreviniz yalan basamak toplamı bulmaktır N yukarıdaki üçgenin inci satır.

kurallar

Test Durumları

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

Yukarıdakilerin 0 indekslendiğini unutmayın. 1 endeksli test senaryosu arıyorsanız, girişi 1 arttırın.

Oldukça ilgisiz bir notta, yakın zamanda profil resmimi değiştirdim ve bu bana bu zorluğu yazmam için ilham verdi.

Yanıtlar:


8

Kabuk , 7 bayt

1 endeksli

Σ!CNṁdN

Çevrimiçi deneyin!

açıklama

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

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


Çevrimiçi deneyin! (matematik üzerinde çalışmak için "Tr" yerine "Total" yazılmalıdır)


2

Jöle , 11 bayt

²RDFṁRS$ṫCS

Çevrimiçi deneyin!

1 tabanlı indeksleme kullanır.

açıklama

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

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

Çevrimiçi deneyin.

Laikoni sayesinde 5 bayt kurtardı !

İşte daha az golfçü versiyon:

-- 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 xbazı bayt daha kısadır.
Laikoni

@Laikoni Teşekkürler! Düzenlenen. Neden splitOnbayt kurtardığını düşündüğümü bilmiyorum .
Cristian Lupascu

2

R 119 109 108 93 88 bayt

golf başlıyor .... 1 endeksli

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

teşekkürler @Zachary. varsayımınız doğru :) @Andrius'a 1 bayt tnx ve @ user2390246'ya 15 tnx daha tıraş oldu

@Giuseppe - strtoi için tnx. benim için yeni. 5 bayt düştü :)


2
y=Etrafta ne de parense ihtiyacınız olduğunu sanmıyorum n*(n-1)/2+1ve muhtemelen dilin adı değil [R].
Zacharý

1
as.integerile değiştirerek 1 bayt kaydedebilirsinizas.double
AndriusZ

1
Yerine x, kullanımı Fbu şekilde zaten 0. için başlangıca getirilir
user2390246

1
Ayrıca, 1:n+a-1aynı verir a:(a+n-1). Bu durumda, aönceden tanımlamanız gerekmez , doğrudan forifadeye koyabilirsiniz . Bu aynı zamanda + 1 / -1'i iptal etmenize de olanak tanır.
user2390246

2
79 bayt . substringBunun yerine kullanılır substrçünkü gerçekten bu, alt dize endekslerinin sadece bir toplamıdır. Ayrıca, çözümleriniz için bir TIO bağlantısı eklemek her zaman iyidir :) +1, harika iş.
Giuseppe

2

Emojicode , 182 bayt

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

Called alan ve 🚂 döndüren © adında bir yöntem tanımlar. 1 endeksli.

Çevrimiçi deneyin!

Açıklama:

Not: Emojicode 0.5'te çok fazla emoji seçeneği pek mantıklı değil. Ne de olsa 0.x. 0.6 bunu düzeltir, bu yüzden bunu öğrenmek istiyorsanız (kim istemez), biraz beklemenizi tavsiye ederim.

Emojicode jenerikler, protokoller, opsiyonel ve kapanışları içeren nesne yönelimli bir programlama dilidir, ancak bu program hiçbir kapanma kullanmaz ve tüm jenerikler ve protokoller örtülü olarak kabul edilebilir.

Program sadece birkaç tipte çalışır: 🚂 tamsayı tipidir ve 🔡 dize tipidir. Ek olarak s (true) veya 👎 (false) değerini alabilen koşullarda 👌'ler görünür.

Şu anda Emojicode'da operatör yoktur, bu nedenle normalde operatör olan ekleme, karşılaştırmalar ve diğer işlemler işlev olarak uygulanır ve ifadelerin etkili bir şekilde önek gösterimini kullanmasını sağlar . Operatörler de 0.6'da planlanıyor.

🐖©a🚂➡🚂🍇

© çağrılan bir takes alır ave 🚂 döndürür.

 🍦l➗✖a➕a 1 2

lÜçgen sayıya (önek notasyonundaki formül ) eşit bir dondurulmuş ("sabit") bildirin. Bu, üretmemiz gereken sayı dizesinin uzunluğunu temsil eder.

 🍮t🔤🔤

Değişkene boş bir dize atayın t.

 🍮i 0

Ata i = 0.

 🔁▶l🐔t🍇

lUzunluğundan daha büyük olsa dat

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

İçin i10 tabanındaki metin temsilini ekleyin t.

 🍉

Bitiş döngüsü

 🍮s 0

Atamak s = 0

 🔂g🔪t➖l a a🍇

A uzunluğundan ( üçgen sayısı) tbaşlayarak bir alt dize alın , tüm karakterleri tekrarlayınl - aa - 1

  🍮➕s 🍺🚂🔡g 10

Karakteri dizeye dönüştürün, base-10'da tamsayı ayrıştırın, isteğe bağlı paketini açın (dize bir sayı değilse hiçbirlik döndürülür) ve sdeğişkene ekleyin .

 🍉

Bitiş döngüsü

 🍎s

İadeler

🍉

Bitiş yöntemi.


1

PHP, 66 + 1 bayt

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

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .

ifadeyi indekslemek için PHP 5.4 veya üstü gerekir.



1

APL, 28 26 25 bayt

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

1 tabanlı endeksleme kullanır

Çevrimiçi deneyin!

Nasıl?

  • ⍳⍵×⍵, 1 giriş karesi boyunca
  • ⍕¨, her öğeyi bir dizeye dönüştür
  • ∊,/, bunları bir araya getirin
  • (+/⍳⍵)↑, girişe kadar satırları tut
  • ⍵↑⌽, istediğiniz satırı alın
  • ⍎¨, her öğeyi bir sayıya dönüştür
  • +/, toplam

1

Clojure v1.8, 154 bayt

1 endeksli

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

Çevrimiçi deneyin!

açıklama

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

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 endeksli

@Nevay sayesinde -18 bayt

Açıklama:

Burada deneyin.

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

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

1 endeksli

ungolfed versiyonu

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

Burada deneyin!

8 bayt kazandığı için @Giuseppe sayesinde


@Giuseppe açıklamasında şöyle dedi: "Size bir tamsayı N verilecek." ve bu N benim çözümümde kullanılıyor. Ya da belki bir şeyi yanlış anladım.
AndriusZ

Açıklamasında bağlantılı "herhangi bir standart ortalama" bakın :)
Giuseppe

@Giuseppe değişikliği ve önerinizi kullandıstrtoi
AndriusZ

1
97 bayt , bir uyarı mesajı ile. Diğerlerinin test edebilmesi için açıklamanıza TIO bağlantısı eklemek her zaman iyidir!
Giuseppe

@ Giuseppe Hiç R bilmiyorum, ama belki bir fonksiyon daha az bayt kullanır?
NieDzejkob

1

Perl 6 , 44 bayt

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

Dene

Expanded:

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

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

Buradan Deneyin!
1 endeksli.

Bu konuda çalışırken sayı dizileri üzerinde çalışmayan ve myanlış örtülü girdi aldı bir hata düzeltildi .

Açıklama:

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

Zacharý sayesinde -17 bayt

Endeks 1'den başlıyor

#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;}

Bu son satırı değiştirmek iki bayt tasarruf etmelidir: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ý

Ayrıca, şu anda girişi 0 dizinli olarak alıyorsanız, 1 dizinine dönüştürebilir ve++n;
Eylül'de Zacharý

@ Zacharý Teşekkürler. Btw, kodunuz bazı nedenlerden dolayı görünmez unicode karakter içeriyor
HatsuPointerKun

Hangisi, C ++ önerim veya APL'm? APL kendi kod sayfasını kullanır ve doğru yazı tipine sahip değilseniz muhtemelen doğru görünmez.
Zacharý

@ Zacharý Yoruma yazdığınız C ++ önerisi. Sıfırdan önce 2 tane unicode karakter vardır "0" identifier is unknownve görsel stüdyoda olduğu gibi hata yapar . İçin aynı şey to_stringve size. Kodu notepad ++ içine kopyalayıp yapıştırırsanız ve kodlamayı ANSI'ye dönüştürürseniz ??, editörde bazılarını göreceksiniz
HatsuPointerKun

0

Pyth ,  15 14  13 bayt

s<>sMjkS^Q2sU

Burada deneyin! veya Test paketini kontrol edin.

13 bayt alternatifi:

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

Nasıl?

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 Bayt

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

1-Endeksli

-V bayrağı için + 2b

Tio.run, son zamanlarda programlarımı gerçekten beğenmiyor gibi görünüyor ... Https://fishlanguage.com adresinden hala doğrulanabilir . Giriş 'ilk yığın'a gider.

Düzenleme: '[' ve ']' 'fishlanguage.com' dan farklı şekilde işlediği için tio.run hoşlanmıyor. fishlanguage.com yeni bir yığın oluştururken veya kaldırırken yığını tersine çevirir, ancak tio.run engellemez.


0

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

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

Çevrimiçi deneyin!

Sonuç 1 dizin oluşturuldu.

Nasıl?

Yeterli basamaktan fazlasını birleştirin, ardından başlangıçta alakasız olanları atlayın (atlama uzunluğu 1'den tamsayıların toplamıdır n-1). Sonraki nbasamakları alın, +her birinin önüne a yerleştirin , ardından bu denklemi değerlendirin.


0

JavaScript (ES6), 78 65 bayt

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 endeksli. Düzenleme: @tsh sayesinde 13 bayt kaydedildi.


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

@tsh Sonunda koymak için hala golfçü join`+` ...
Neil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.