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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

788閲覧

0,1配列内で1が連続でx個登場したタイミングで、ループを停止するようなプログラム

pypypy.bom

総合スコア31

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/04/16 06:49

編集2019/04/16 07:09

#実現したいこと
0と1からなる配列(ここではわかりやすいように1*100行列として)に関して、
この行列内で、指定の個数分以上1が連続した時、forループを停止し、
その1が連続する並びの先頭の1が行列の何番目かを表示するような
アルゴリズムを作成したいです。

#例
1が3個以上連続したとき、その連続する1の先頭を表示
[0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 0 0]

上記の場合 答えは 8

#自力で作成できたもの

python

1A = [1 0 0 1 1 0 1] 2a = 0 3for num in A: 4 a = a + 1 5 if num == 1: 6 print('point: {:d}'.format(a)) 7 break

上記のように配列の先頭から最初に1が登場したタイミングの検出はできましたが、
初心者のため、これを拡張して作っていこうかと考えたのですが、
手が止まってしまいました。

#環境
python3.7

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

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

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

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

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

stdio

2019/04/16 06:57

「アルゴリズムを作成したいです。」と言われましても、試したソース等がないならアドバイス出来ません。
pypypy.bom

2019/04/16 07:04

追加させていただきました。
can110

2019/04/16 07:05

例の答えは8では?
pypypy.bom

2019/04/16 07:08

失礼いたしました。訂正いたします。
guest

回答3

0

文字列にしてre.serach()で先頭を探して見つけます。

Python

1import re 2 3A = [0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0] 4N = 3 # 1の連続数 5 6s = ''.join(map(str,A)) # リスト→文字列 7m = re.search('1'*N,s) 8if m: 9 print(m.start()) # 8

投稿2019/04/16 07:14

編集2019/04/16 07:18
can110

総合スコア38266

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

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

0

ベストアンサー

itertools.groupby を使うと直感的に書けます。

python

1from itertools import groupby 2 3lst = [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0] 4N = 3 # 「N 個以上連続していたら」という条件の値 5 6i = 0 7for k, g in groupby(lst): 8 g = list(g) # list に変換 9 10 if g[0] == 1 and len(g) >= N: 11 # 1がN 個連続して並んでいる場合、最初のインデックスを出力して終了する。 12 print(i) 13 break 14 15 i += len(g)

output

18

itertools.groupby の使い方

python

1from itertools import groupby 2lst = [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0] 3 4for k, g in groupby(lst): 5 print(k, list(g)) 6# 0 [0, 0, 0, 0] 7# 1 [1] 8# 0 [0, 0, 0] 9# 1 [1, 1, 1, 1, 1] 10# 0 [0, 0, 0, 0]

自前で書く場合

python

1lst = [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0] 2N = 3 3 4curr_value = lst[0] 5cnt = 0 6for i, value in enumerate(lst): 7 if value == curr_value: 8 # 前回と同じ値ならカウント +1 9 cnt += 1 10 else: 11 # 前回と異なる値ならカウントを0にする。 12 cnt = 0 13 curr_value = value 14 15 if cnt == N and value == 1: 16 # N個連続 かつ 値が1の場合ループ終了 17 print(i - N) 18 break

投稿2019/04/16 07:07

編集2019/04/16 07:15
tiitoi

総合スコア21956

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

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

pypypy.bom

2019/04/16 07:15

ありがとうございます!! itertoos、初めて知りました! 利用させていただきます!
guest

0

素直にforで書くとこんな感じだと思います。それほど複雑ではないものの、少し条件がややこしいかもしれません。

python

1A = [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0] 2n = 3 3 4cnt = 0 5result = None 6for i, num in enumerate(A): 7 if num == 0 and cnt != 0: # nまで数える前に0が出たらcntを0に 8 cnt = 0 9 if num == 1: # 1なら1加算 10 cnt += 1 11 if cnt >= n: # n以上1が続いたら位置を格納してbreak 12 result = i - n + 1 13 break 14print(result) 15

横着。

python

1>>> l = [0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0] 2>>> s = "".join(map(str, l)) 3>>> s.find("111") 48 5

投稿2019/04/16 07:22

hayataka2049

総合スコア30933

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問