三角形を数えます!


28

私たちは「二乗」という用語に使用されているn個の計算を意味するように、N 2を。また、「立方体」nという用語は、n 3を意味します。そうは言っても、なぜ私たちも数字を三角形にできないのでしょうか?

数字を三角形にする方法は?

  • まず、数字を選びましょう53716

  • 以下に示すように、辺の長さが数字の桁数に等しい平行四辺形に配置し、2つの辺を斜めに配置します。

        53716
       53716
      53716
     53716
    53716
    
  • さて、それをΔにしたいですね これを行うには、直角三角形に収まらない辺をトリミングします。

        5
       53
      537
     5371
    53716
    
  • この例では、各行の合計を取得し[5, 8, 15, 16, 22]ます:

        5-> 5
       53-> 8
      537-> 15
     5371-> 16
    53716-> 22
    
  • リストを合計して[5, 8, 15, 16, 22]、結果をにし66ます。これはこの数字の三角形です!

仕様とルール

  • 入力は、負でない整数nn≥0、n∈Z)になります。

  • 入力を受け取り、許可された手段で出力を提供できます

  • 入力は、整数、整数の文字列表現、または数字のリストとしてフォーマットできます。

  • デフォルトの抜け穴は許可されていません。

  • これはなので、バイト単位の最短コードが勝ちです!

その他のテストケース

入力->出力

0-> 0
1-> 1
12-> 4
123-> 10
999-> 54 
100000-> 6
654321-> 91

インスピレーション。説明をお勧めします!


本当に645321 -> 91よろしいですか?
ロッド

@ロッド申し訳ありません、あなたは正しいです。の645321代わりに書いた654321
氏Xcoder

1
入力を数字のリストとして取得できますか?
完全に人間

@totallyhumanはい、2番目の仕様を参照してください。
ミスターXcoder

1
興味深い挑戦。私に触発されてよかった!
グリフォン-モニカの復活

回答:




12

脳フラック65、50、 36のバイト

([])({<{}>{<({}[()])>[]}{}<([])>}{})

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

何度も修正した後、私はこの答えをとても誇りに思っています。私はこのアルゴリズムが好きで、ブレインフラックでどれだけうまく表現できるかを考えています。

ほとんどのバイトカウントは、入力での0の処理に由来します。実際、入力に0がないと仮定できれば、20バイトの非常に短い回答になります。

({{<({}[()])>[]}{}})

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

しかし、残念ながら、brain-flakはエッジケースの不適切な処理で悪名高いです。

説明

まず、私の観察:

入力の長さがn桁の場合、最初の数字が三角形にn回表示され、2番目の数字がn-1回表示されます。Brain-flakに何桁の入力が残っているかを計算するのは非常に簡単なので、これを活用できます。

[]

そのため、コードの仕組みは次のとおりです。

# Push the size of the input (to account for 0's)
([])

# Push...
(

    # While True
    {

        # Pop the stack height (evaluates to 0)
        <{}>

        # For each digit *D*...

        # While true
        {

            # Decrement the counter (the current digit we're evaluating), 
            # but evaluate to 0
            <({}[()])>

            # Evaluate the number of digits left in the input
            []

        # Endwhile
        }

        # This whole block evaluates to D * len(remaining_digits), but 
        # without affecting the stack

        # Since we looped D times, D is now 0 and there is one less digit.
        # Pop D (now 0)
        {}

        # Push the stack height (again, evaluating it as 0)
        <([])>

    # End while
    }

    # Pop a 0 off (handles edge case of 0)
    {}

# end push
)






7

Japt7 6 4バイト

å+ x

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

説明

å+ x    Implicit: input = digit list
å+      Cumulative reduce by addition. Gives the sum of each prefix.
   x    Sum.

古いソリューション:

å+ ¬¬x

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

説明

å+ ¬¬x   Implicit: input = string
å+       Cumulative reduce by concatenation. Gives the list of prefixes.
   ¬     Join into a single string of digits.
    ¬    Split back into digits.
     x   Sum.
         Implicit: output result of last expression

うん または、1分以内に質問を読んでコードを書き、投稿しましたか?!
ジョナサンアラン

@JonathanAllanこれはサンドボックス化されていません。思っているよりずっと簡単です。
氏Xcoder

1
ええと、まあ私もそれが要した時間での質問を読んカント
ジョナサン・アラン

@JonathanAllanサンドボックスの読み取りはありません。質問が投稿された直後にキャッチされ、ほぼ即座にアルゴリズムを見つけました。
ETHproductions

質問を読むのに4分ほどかかったので、速読/速読のために+1しました:)
ジョナサンアラン

7

Brain-Flak、28バイト

(([]){[{}]({}<>{})<>([])}{})

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

ゼロをサポートする必要がない場合は14バイト(サポートします)

({({}<>{})<>})

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

DJMcMayhemには、ここでチェックすべきクールな答えがあります。残念ながら彼にとって、私は彼に彼自身の言語で勝たせようとしていませんでした:P

どのように機能しますか?

簡単なバージョンから始めましょう。

({({}<>{})<>})

ここでの主なアクションは({}<>{})<>で、左スタックの一番上を取得し、右スタックの一番上に追加します。この操作をループすることで、現在のスタックを合計し(ゼロに達するまで)、合計をスタック外に置きます。それはかなり平凡なことです。興味深い部分は、これらすべての実行の結果を結果としてまとめることです。これにより、目的の値が計算されます。どうして?例を見てみましょう123。最初のグラブでは1しか取得されないため、値は1です

1

次のグラブでは、1と2を返します

1
1+2

最後の実行では、3つすべてが一緒になっています

1
1+2
1+2+3

三角形が見えますか?すべての実行の合計は、リストの「三角形」です。


わかりましたが、今はゼロで動作するために必要です。ここでは、DJMcMayhemと同じトリックに加えて、いくつかの派手なフットワークを使用しました。ゼロに達するまでループする代わりに、スタックが空になるまでループします。

([])({<{}>({}<>{})<><([])>}{})

次に、このヒントを使用し、本当にあなた以外の人が書いたものを使用せずに、さらに2バイトをゴルフしました。

(([]){[{}]({}<>{})<>([])}{})

そして、それがあります。より短い解決策があった場合、私は驚きますが、それからまた奇妙なことが起こりました。


Unfortunately for him I wasn't about to let him win at his own language :P私はあなたから何も期待していません。:D
DJMcMayhem

6

JavaScript(ES6)、28バイト

a=>a.map(d=>t+=c+=d,t=c=0)|t

入力を数字のリストとして受け取ります。


5

Python 3、37バイト

f=lambda n:len(n)and sum(n)+f(n[:-1])

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


5
...なぜダウン票ですか?
ビジネス猫

私はあなたが変えることができると思うlensum、私は何も役立つと信じていませんが、同様。
ETHproductions

@ETHproductionsええ。私は事実を利用することができ期待していたsum([])のに方法があるかもしれません... 0であるが、何も非常に一緒に来ていなかった
ビジネス猫

そうでない場合、私はあなたに私の改善を与えたでしょう。
ジョナサンアラン

@JonathanAllan心配無用:P
ビジネスキャット

5

C#(.NET Core)、59バイト

using System.Linq;N=>N.Reverse().Select((d,i)=>i*d+d).Sum()

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

他のC#回答とは大幅に異なります。入力は数字のリストです。TIOリンクに含まれるすべてのテストケース。

入力を先頭に0を付けた逆方向の数字リストとして許可する場合、大量のバイトを保存できます。


良いアイデア!C#での激しいコードゴルフ。
グルゼゴルツプワフスキ

いい解決策!しかし、入力numberは数字のリストではなく、負ではないように指定されていませんか?
イアンH.

@IanH。ルール2:許可された手段で入力を行い、出力を提供できます。形式に関しては、入力を整数、整数の文字列表現、または数字のリストとして受け取ることができます。
カミルドラカリ


4

J、7バイト

[:+/+/\

オンラインでお試しください!などの数字のリストを取得しf 6 5 4 3 2 1ます。

説明

[:+/+/\    (for explanation, input = 6 5 4 3 2 1)
      \    over the prefixes of the input:
     /         reduce:
    +              addition (summation)
           this gives is the cumulative sum of the input:  6 11 15 18 20 21
[:         apply to the result:
  +/           summation
           this gives the desired result:   90

元の問題にもう少し当てはまるのは、入力の平坦化された()プレフィックス[:+/@,]/+/)である "sum" ,]\)です。


4

Vim60 59 32キーストローク

@CowsQuackの再帰マクロとhトリックのヒントに感謝します。これにより、27バイト節約できました。

qqYp$xh@qq@qVHJ:s/./&+/g⏎
C<C-r>=<C-r>"0⏎

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

未ゴルフ/説明

これにより、説明したように三角形が構築されます(左揃えにするだけです)。

qq       q    " record the macro q:
  Yp          "   duplicate the line
    $x        "   remove last character
      h       "   move to the left (this is solely that the recursive macro calls stop)
       @q     "   run the macro recursively
          @q  " run the macro

バッファは次のようになります。

53716
5371
537
53
5

すべての行を1つに結合し、そこから評価可能な式を作成します。

VH             " mark everything
  J            " join into one line
   :s/./&+/g⏎  " insert a + between all the characters

"レジスタは現在、以下の文字列(ノート不足している0)を含んでいます。

5+3+7+1+6+ +5+3+7+1+ +5+3+7+ +5+3+ +5+ +

したがって、ゼロを追加して評価するだけです。

 C                " delete line and store in " register
  <C-r>=       ⏎  " insert the evaluated expression from
        <C-r>"    " register "
              0   " append the missing 0

inside vim


代替コマンドでは&なく(完全一致)を使用できます\1
Kritixi Lithos

1
qqYp$xq:exe"norm".col('.')."@q"⏎になることができqqYp$xh@qq@qます。この再帰的なマクロは、行に1文字があると中断エラーに遭遇し、その後停止します。
クリチキシリソス

したがって、置換はになり:s/./&+/gます。に:%j⏎なることもできV{Jます。そして、DiなることができますC(私はあなたのVimの答えの別の1つでこれについてすでにコメントしています)。オンラインでお試しください!
クリティキシリソス


3

Bash + GNUユーティリティ、32 24

tac|nl -s*|paste -sd+|bc

STDINから読み取った入力。

更新:入力は数字のリストとして与えられるかもしれません。入力リストは改行区切りです。

オンラインで試す

説明

tac                       # reverse digit list
   |nl -s*                # prefix line numbers; separate with "*" operator
          |paste -sd+     # join lines onto one line, separated with "+" operator
                     |bc  # arithmetically evaluate

3

APL、4バイト

+/+\

これは、入力を数字のリストとして受け取ります。例:

      (+/+\) 5 3 7 1 6
66

説明

+/    sum of
  +\  partial sums of input

3

タクシー、1478バイト

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[a]Switch to plan "b" if no one is waiting.Pickup a passenger going to The Babelfishery.Go to Zoom Zoom:n 1 l 3 r.1 is waiting at Starchild Numerology.Go to Starchild Numerology:w 4 l 2 r.Pickup a passenger going to Addition Alley.Go to Addition Alley:w 1 r 3 r 1 r 1 r.Pickup a passenger going to Addition Alley.Go to The Babelfishery:n 1 r 1 r.Go to Chop Suey:n 6 r 1 l.Switch to plan "a".[b]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to Cyclone.[c]Go to Zoom Zoom:n 1 l 1 r.Go to Cyclone:w.Pickup a passenger going to The Underground.Pickup a passenger going to Multiplication Station.Go to The Babelfishery:s 1 l 2 r 1 r.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:n 1 r 2 l.Pickup a passenger going to Addition Alley.Go to The Underground:n 2 l 1 r.Switch to plan "d" if no one is waiting.Pickup a passenger going to Cyclone.Go to Addition Alley:n 3 l 1 l.Switch to plan "c".[d]Go to Addition Alley:n 3 l 1 l.[e]Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n 1 l 1 r.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Switch to plan "f" if no one is waiting.Switch to plan "e".[f]Go to Zoom Zoom:n 1 l 1 r.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

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

ゴルフをしていない:

[ Pickup stdin and split into digits ]
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
[a]
[ Count the digits ]
Switch to plan "b" if no one is waiting.
Pickup a passenger going to The Babelfishery.
Go to Zoom Zoom: north 1st left 3rd right.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology: west 4th left 2nd right.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: west 1st right 3rd right 1st right 1st right.
Pickup a passenger going to Addition Alley.
Go to The Babelfishery: north 1st right 1st right.
Go to Chop Suey: north 6th right 1st left.
Switch to plan "a".
[b]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to Cyclone.
[c]
[ Multiply each digits by Len(stdin)-Position(digit) ]
Go to Zoom Zoom: north 1st left 1st right.
Go to Cyclone: west.
Pickup a passenger going to The Underground.
Pickup a passenger going to Multiplication Station.
Go to The Babelfishery: south 1st left 2nd right 1st right.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: north 1st right 2nd left.
Pickup a passenger going to Addition Alley.
Go to The Underground: north 2nd left 1st right.
Switch to plan "d" if no one is waiting.
Pickup a passenger going to Cyclone.
Go to Addition Alley: north 3rd left 1st left.
Switch to plan "c".
[d]
Go to Addition Alley: north 3rd left 1st left.
[e]
[ Sum all the products ]
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north 1st left 1st right.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Switch to plan "f" if no one is waiting.
Switch to plan "e".
[f]
[ Output the results ]
Go to Zoom Zoom: north 1st left 1st right.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

3

Perl 5、19 + 1(-p)= 20バイト

s/./$\+=$p+=$&/ge}{

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

どうやって?

$ \は累積合計を保持し、$ pは現在の行の数字の合計を保持します。平行四辺形の各行は、前の行に番号の次の数字が追加されたものです。したがって、前の行と新しい数字の合計です。これはすべての数字を反復処理し、合計を計算します。実際の置換は無関係です。実際のループを作成せずに数字を反復処理するための手段にすぎません。最後に、-pオプションによって暗黙的に$ \が出力されます。



2

ゼリー 5  4 バイト

Ṛæ.J

10進数のリストを取得し、リストが表す数値の三角形を返す単項リンク。

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

どうやって?

Ṛæ.J - Link: list of numbers (the decimal digits), d   e.g. [9,4,5,0]
Ṛ    - reverse d                                            [0,5,4,9]
   J - range(length(d))                                     [1,2,3,4]
 æ.  - dot-product            (0*1 + 5*2 + 4*3 + 9*4 = 58)  58

削除してもまだ機能すると思っていました。残念
...-ETHproductions

@ETHproductions ...そしてまだ役立つ組み込み機能があります!
ジョナサンアラン

...大丈夫、すごい
...-ETHproductions

@ETHproductions ooopsはそれを逆にする必要がありました> _ <
ジョナサンアラン

2

網膜、13バイト

.
$`$&
.
$*
1

オンラインでお試しください!リンクにはテストケースが含まれます。説明:最初の段階で元の番号のすべてのプレフィックスが生成され、2番目の段階で各桁が単項に変換され、3番目の段階で合計が取得されます。


2

Mathematica、49バイト

Tr@Array[Tr@s[[;;#]]&,Length[s=IntegerDigits@#]]&

入力を数字のリストとして取得できます。#.Range[Length@#,1,-1]&
-alephalpha

@alephalphaのソリューションの改善:#.Range[Tr[1^#],1,-1]&
JungHwan Min

Tr@*Accumulate
-alephalpha


2

Java 8、53バイト

許容可能な入力タイプごとにラムダを実装しました。それらはそれぞれ、数字の桁を反復処理し、それぞれの適切な倍数をアキュムレーターに追加します。

入力としての整数(53バイト)

ラムダIntegerInteger

n->{int s=0,i=1;for(;n>0;n/=10)s+=n%10*i++;return s;}

入力としての文字列表現(72バイト)

ラムダStringInteger

s->{int l=s.length(),n=0;for(int b:s.getBytes())n+=(b-48)*l--;return n;}

入力としての数字配列(54バイト)

からint[](数字の、最大の場所の値が最初)へのラムダInteger

a->{int l=a.length,s=0;for(int n:a)s+=n*l--;return s;}
  • オリビエ・グレゴワールのおかげで-7バイト

1
a-> {int l = a.length、s = 0; for(int n:a)s + = n * l-; return s;}配列バージョンの場合は54バイト。
オリヴィエグレゴワール

2

Pyt9 6 バイト

ąĐŁř↔·

説明:

                 Implicit input
ą                Convert to array of digits
 Đ               Duplicate digit array
   Łř↔           Create a new array [len(array),len(array)-1,...,1]
      ·          Dot product with digit array
                 Implicit output

2

Python 3、94 58 54バイト

かなりのバイトを節約してくれたXcoder氏に感謝します!

lambda n:sum(int(v)*(len(n)-i)for i,v in enumerate(n))

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

入力を文字列として受け取ります。単純に各桁に加算する必要のある回数を掛けて、その合計を返します。


最初の答えはいいですが、不要な空白を削除し、すべての変数/関数名を1バイト長にして、提出物を真剣な候補にしてください。69バイト
Mr. Xcoder


@ Mr.Xcoderありがとう。そのことを心に留めておきます。
マニッシュクン

1
常にで呼び出されるとは限りません0。場合p必見は常に0、あなたは交換する必要がありますpp=0は、lambda宣言内の。ただし、54バイトpを取得するために完全に削除することができます
コヒーリングコアリング


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