連結された三角形の行を合計します


16

次の三角形を考えてください。

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

お気づきのとおり、最初の行の長さは1で、その後の各行は前の行よりも1桁長く、連結された正の整数の桁が含まれています。

整数Nが与えられます。あなたの仕事は、上の三角形のN番目の行にある数字の合計を見つけることです。

ルール

  • 0または1のインデックス作成を選択できます。答えにそれを明記してください。

  • デフォルトの抜け穴が適用されます。

  • 入力を取得し、任意の標準手段によって、適切な形式で出力を提供できます。

  • これはOEIS A066548であり、このシーケンスは三角形自体です(ただし、先行ゼロを削除しないことを除く)。

  • これはなので、バイト単位の最短コード(すべての言語で)が勝ちます。ゴルフをお楽しみください!

テストケース

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

上記のインデックスは0であることに注意してください。1インデックスのテストケースを探している場合は、入力を1増やします。

まったく無関係なことに注意して、最近プロフィール写真を変更しました。それがこのチャレンジを書くきっかけになりました。

回答:



4

Python 2、69バイト

これはおそらくかなり短い可能性があります。

1インデックス付き

編集:@ Mr.Xcoderのおかげで-7バイト

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

オンラインでお試しください!


1
n**2ですn*n
Xcoder氏17

69バイト。、ガウスの式を使用してsum(range(n)) = ~-n*n/2 = (n - 1) * n / 2
ミスターXcoder

1
Mr.Xcoder I @ ...彼が考える
エリックOutgolfer

@EriktheOutgolferあなたは正しい、私の悪い
Mr. Xcoder






2

Haskell、69 64バイト

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

オンラインでお試しください。

Laikoniのおかげで5バイト節約できました

以下はゴルフの少ないバージョンです。

-- 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数バイト短くなっています。
ライコニ

@ライコニありがとう!編集済み。splitOnバイトを節約できると思った理由がわかりません。
クリスチャンルパスク

2

R、119の 109 108 93 88バイト

ゴルフを始めます。

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

@Zacharyに感謝します。あなたの推定は正しいです:)@ Andriusに1バイトtnxを削り、@ user2390246にさらに15tnxを削りました

@Giuseppe-strtoiのtnx。私にとって新しい。5バイト下:)


2
私はあなたが必要とは思わy=ないし、周りの括弧もn*(n-1)/2+1、そしておそらく言語の名前はそうではないでしょう[R]
ザカリー

1
あなたは、変更することで、1つのバイトを保存することができas.integeras.double
AndriusZ

1
むしろx、使用Fこれは既に0に初期化されるよう
user2390246

1
また、1:n+a-1と同じa:(a+n-1)です。その場合、a事前に定義する必要はありませんfor。式にそのまま入力するだけです。また、+ 1 / -1をキャンセルすることもできます。
user2390246

2
79バイトsubstring代わりに使用されるのはsubstr、実際にはこれが部分文字列のインデックスの単なる合計であるためです。また、ソリューションにTIOリンクを含めることは常に良いことです:) +1、すばらしい仕事です。
ジュゼッペ

2

絵文字コード、182バイト

🐖©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を取り、🚂を返す©というメソッドを定義します。1インデックス付き。

オンラインでお試しください!

説明:

注: Emojicode 0.5では、多くの絵文字を選択しても意味がありません。結局、0.xです。0.6はこれを修正するので、もしあなたがこれを学びたいのなら(誰が望んでいないのか)、しばらく待つことをお勧めします。

Emojicodeは、ジェネリック、プロトコル、オプション、およびクロージャーを特徴とするオブジェクト指向プログラミング言語ですが、このプログラムはクロージャーを使用せず、すべてのジェネリックおよびプロトコルは暗黙的と見なすことができます。

プログラムはいくつかのタイプでのみ動作します:🚂は整数タイプで、🔡は文字列タイプです。さらに、条件に👌が表示され、👍(true)または👎(false)のいずれかの値を取ることができます。

現在、Emojicodeには演算子はないため、通常は演算子である加算、比較、およびその他の操作は関数として実装され、効果的に式にプレフィックス表記を使用させます。オペレーターも0.6で計画されています。

🐖©a🚂➡🚂🍇

©は1つのoneを呼び出しa、takes を返します。

 🍦l➗✖a➕a 1 2

a l番目の三角形の数に等しい固定(「定数」)を宣言します(プレフィックス表記の式)。これは、生成する必要がある数字の文字列の長さを表します。

 🍮t🔤🔤

変数に空の文字列を割り当てますt

 🍮i 0

割り当てi = 0ます。

 🔁▶l🐔t🍇

ながらlの長さより大きいt

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

i基数10のテキスト表現をに追加しtます。

 🍉

終了ループ

 🍮s 0

割当 s = 0

 🔂g🔪t➖l a a🍇

長さaの(番目の三角形の数)tから始まる部分文字列を取得し、すべての文字を反復処理しますl - aa - 1

  🍮➕s 🍺🚂🔡g 10

文字を文字列に変換し、10を基数とする整数を解析し、オプションを展開し(文字列が数字でない場合は何も返されません)、s変数に追加します。

 🍉

終了ループ

 🍎s

戻り値

🍉

終了メソッド。




1

APL、28 26 25バイト

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

1ベースのインデックスを使用します

オンラインでお試しください!

どうやって?

  • ⍳⍵×⍵、1から入力の2乗
  • ⍕¨、各要素を文字列に変換します
  • ∊,/、それらを連結します
  • (+/⍳⍵)↑、入力までの行を取得します
  • ⍵↑⌽、目的の行を取得します
  • ⍎¨、各要素を数値に変換します
  • +/、合計

1

Clojure v1.8、154バイト

1インデックス付き

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

オンラインでお試しください!

説明

(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バイト

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インデックス付き

@Nevayのおかげで-18バイト

説明:

ここで試してみてください。

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バイト: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;}
ネベイ

1

R、99105、97のバイト

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

1インデックス付き

無償版

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

ここで試してみてください!

8バイトを節約してくれた@Giuseppeに感謝


説明の@Giuseppeには、「整数Nが与えられます」と記載されています。このNは私のソリューションで使用されています。または多分私は何かを誤解した。
AndriusZ

説明のリンクされた「任意の標準的な平均」を参照してください:)
ジュゼッペ

@Giuseppeの変化とについてのご提案を使用strtoi
AndriusZ

1
97バイト、警告メッセージ付き。説明にTIOへのリンクを含めると、他の人がテストできるようになります。
ジュゼッペ

@Giuseppe私はRを知らないが、おそらく関数はより少ないバイトを使用するだろうか?
NieDzejkob

1

Perl 6、44バイト

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

試して

拡張:

{
  [+]        # 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.1215の 13 バイト

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

ここで試してみてください!
1インデックス付き。

この作業中に、数値配列では動作せず、m暗黙的な入力を誤って取得していたバグを修正しました。

説明:

²              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バイト

ザカリーのおかげで-17バイト

インデックスは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;}

最後の行をこれに変更すると、2バイト節約できます。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ý17年

また、入力を現在0インデックスとして取得している場合は、1インデックスに変換してドロップすることができます++n;
ザカリー

@Zacharýありがとう。ところで、あなたのコードは、いくつかの理由のために目に見えないUnicode文字が含まれている
HatsuPointerKun

私のC ++の提案、またはAPLのどれですか?APLは独自のコードページを使用するため、適切なフォントがない場合はおそらく正しく表示されません。
ザカリー

@Zacharýコメントで書いたC ++の提案。ゼロの前に2つのUnicode文字があり"0" identifier is unknown、Visual Studioのようにエラーが発生します。同じことto_stringsize。あなたはANSIに++メモ帳でコード、および変換エンコーディングをコピー&ペーストする場合は、あなたがいくつか表示されます、それを見ることができる??エディタで
HatsuPointerKun

0

Pyth 15 14  13バイト

s<>sMjkS^Q2sU

ここで試してみてください!またはテストスイートをチェックアウトします。

13バイトの代替:

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

どうやって?

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バイト

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

1インデックス付き

-vフラグの場合は+ 2b

Tio.runは最近、私の> <>プログラムが気に入らないようです... https://fishlanguage.comで確認できます。入力は「初期スタック」に入ります。

編集:tio.runはfishlanguage.comとは異なる方法で「[」と「]」を処理するため、気に入らないことがわかります。fishlanguage.comは、新しいスタックを作成または削除するときにスタックを元に戻しますが、tio.runは元に戻しません。


0

Perl 5、62 + 1(-p)= 63バイト

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

オンラインでお試しください!

結果は1インデックスです。

どうやって?

十分な数以上の数字を連結し、最初に関係のない数字をスキップします(スキップの長さは1からの整数の合計ですn-1)。次のn数字を取得し、+各数字の前にa を配置して、その方程式を評価します。


0

JavaScript(ES6)、78 65バイト

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インデックス付き。編集:@tshのおかげで13バイトを保存しました。


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

置くことはまだgolfier @tsh join`+` 終わりに...
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.