質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

5回答

1013閲覧

特殊な並びの数字を出力したい

kirara501

総合スコア8

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2018/03/24 11:01

編集2018/03/24 11:01

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

というように両端に1を置き、左上と右上との数を足すという規則で数を配置したときに、段を指定するとその段の数字を表示するようなシステムをつくりたいです。
例えば4と入力したら「1 3 3 1」出力されるというイメージです。
どうすれば出来るでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ソースコードは分かりませんが、二項定理を調べてみるとヒントがあるかもしれませんね。

投稿2018/03/24 11:41

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

jun68ykt さんの回答の
(i > 0 ? prev[i-1] : 0) + ( i < prev.length ? prev[i] : 0)
の部分をもうすこし単純に書けないかを考えてみました。

つぎのように考えました。
[0, 前の段...]
[姉の段, ... 0]
の配列の要素ごとの和を計算することにする。
さらに、和をとる配列は 他方を reverse すれば得られることも考慮しました。

rrr.rb

ruby

1def base_of_pascals_triangle(n) 2 return [1] if n == 1 3 4 prev = [0] + base_of_pascals_triangle(n - 1) 5 prev.zip(prev.reverse).map(&:sum) 6end 7 8(1..10).each do |x| 9 puts base_of_pascals_triangle(x).to_s 10end

実行例
イメージ説明

追記:

結果の配列が左右対称であることを考慮すれば、計算は 約 1/2 に減らすことができますが、
h が空数か奇数かで処理分岐をすることでコードが長くなってしまう気がしたので、
そのことは取り込んでいません。

追記
数列が左右対称であることをして、足し算の回数を約按分にしてみました。

ruby

1def base_of_pascals_triangle(n) 2 return [1] if n == 1 3 4 prev = [0] + base_of_pascals_triangle(n - 1) 5 left = (0..((n - 1) / 2)).map { |x| prev[x] + prev[x + 1] } 6 left + left[0...(n / 2)].reverse 7end

投稿2018/03/25 11:54

編集2018/03/26 15:50
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jun68ykt

2018/03/25 12:28

なるほど〜。Rubyならではの配列操作を使っていて、こっちのほうが Rubyistな感じです!
guest

0

上の段から順に、そのまま算出すればよいです。
Pythonでのコード例です。このままだと100段くらいだとかなり時間かかりますが。
お手軽にlru_cacheを使ってメモ化してみました。100段でも瞬時に求まります。

Python

1from functools import lru_cache 2 3@lru_cache(maxsize=1000) # サイズは適当に 4def val( row, col): 5 if col <= 0 or col >= row: 6 return 1 7 return val( row-1, col-1) + val(row-1,col) 8 9with open('ret.txt','w') as f: # 見づらいのでファイルに出力 10 for row in range(100): 11 for col in range(row+1): 12 f.write('{:40d}'.format( val( row, col))) # 40桁で足りる 13 f.write('\n')

投稿2018/03/24 11:30

編集2018/03/24 11:53
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考情報

  • 続・パスカルの三角形

http://gamescripting.hatenablog.jp/entry/20060530/1149000099

ruby

1k = 6 2(1..k).inject([1]) { |a, dummy| ([0] + a).zip(a).map { |x, y| y ? x + y : x} } 3=> [1, 5, 10, 10, 5, 1] 4 5k = 10 6(1..k).inject([1]) { |a, dummy| ([0] + a).zip(a).map { |x, y| y ? x + y : x} } 7=> [1, 10, 45, 120, 210, 252, 210, 120, 45, 10, 1]

投稿2018/03/24 23:31

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

再帰を使ってやってみました。

(※以下のコードで、メソッド名 base_of_pascals_triangle は、「パスカルの三角形の底辺」の意)

[ykt68@macbook15]$ ruby -v

ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin17]
[ykt68@macbook15]$ cat tera118837.rb

ruby

1def base_of_pascals_triangle(n) 2 if n == 1 3 [1] 4 else 5 prev = base_of_pascals_triangle(n-1) 6 (0...n).map do |i| 7 (i > 0 ? prev[i-1] : 0) + ( i < prev.length ? prev[i] : 0) 8 end 9 end 10end 11 12puts "#{base_of_pascals_triangle(6)}"

[ykt68@macbook15]$ ruby tera118837.rb

[1, 5, 10, 10, 5, 1]
[ykt68@macbook15]$

投稿2018/03/24 11:41

編集2018/03/25 01:47
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問