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

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

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

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

Q&A

解決済

6回答

2616閲覧

暇つぶしにどうぞ

torisan

総合スコア678

Ruby

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

4グッド

3クリップ

投稿2016/09/26 11:48

編集2016/09/27 11:21

#概要
$hrtというサイズ11の配列があります。
それぞれの項目には数値が入り
$hrt[0] と $hrt[10] は0固定です。

やりたい事は
項目が0と0で囲まれた数値の総和が4だった時、以下の処理を行いたいです。

0,1,1,1,1,0 一番右の1の位置を返す
0,1,1,2,0 2の位置を返す
0,1,2,1,0 2の位置を返す
0,2,1,1,0 2の位置を返す
0,2,2,0 スルーして、次を探す
0,1,3,0 1の位置を返す
0,3,1,0 1の位置を返す
0,4,0 4の位置を返す
#例
右の1の位置を返す
[0,1,1,1,1,0,0,0,1,1,0]] # return 4

0,1,4,0は総和が5なので無視。
0,1,2,1,0の場合は2の位置を返す。
[0,0,1,4,0,1,2,1,0,0,0] # return 6

0,2,2,0は無視、0,3,1,0(⇒7)と0,4,0(⇒9)があるが、数値が若い方を生かす
[0,2,2,0,1,0,3,1,0,4,0] # return 7

条件に合う物がない時は-1を返す。
[0,4,4,0,2,2,0,1,1,3,0] # return -1]
#一応出来てはいます
実はソースはもう出来ていて正常に動作はします。
ですが……あまりに『……』な為、
・こうした方がスマートだ
・こういう関数があるよ
・バグあるじゃない!
等の意見を頂きたいのです。
#現状のソース

Ruby

1$hrt = [0,1,1,0,2,0,1,3,0,1,0] #内容は例 2 3def yyyy 4 cnt = 0 5 i = 1 6 while i <= 9 7 if $hrt[i] >= 1 then 8 cnt = 0 9 j = i 10 while i <= 9 11 break if $hrt[i] == 0 12 cnt = cnt + $hrt[i] 13 i = i + 1 14 end 15 if cnt == 4 then 16 i = i - 1 17 if i - j == 3 then #011110 18 elsif i - j == 2 then #01120 01210 02110 19 while $hrt[i] != 2 20 i = i - 1 21 end 22 elsif i - j == 1 then #0130 0310 0220 23 next if $hrt[i] == 2 #0220の場合対象外 24 if $hrt[i] == 3 then 25 i = i - 1 26 end 27 else #040 28 end 29 break 30 end #if cnt == 4 then 31 end #if $hrt[i] >= 1 then 32 i = i + 1 33 end #while i <= 29 34 return -1 if i >= 10 35 return i 36end

時間がある時に暇つぶしにでもどうぞ。
以上、よろしくお願いします。

ーー追記ーー
Rubyのバージョンは1.9.4になります。

htsign, LLman, afroscript, DrqYuto👍を押しています

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

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

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

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

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

torisan

2016/09/27 03:25

明確な回答はありませんが、 可読性を良くする、適した関数を使う、等の課題は含んであると考えています。
kei344

2016/09/27 11:13

コードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
torisan

2016/09/27 11:22

kei344さん こんな感じですかね?ご指摘ありがとうございます。
kei344

2016/09/27 11:24

編集ありがとうございます。
guest

回答6

0

Ruby 2.3系に対応しました。lambda_driverとactivesupportが必要です(2.4.0以上の場合はactivesupportは不要)。gem instnall lambda_driver activesupportでインストールしてから実行してください。

主な変更点: chunkではなくslice_beforeで切るようにしました。lambda_driverで関数合成するようにしました。Enumerable#sumは2.4.0からのため、2.3系についてはactivesupportの実装を使うようにしました。

Ruby

1# frozen_string_literal: true 2require 'lambda_driver' 3require 'active_support/core_ext/enumerable' if RUBY_VERSION < '2.4.0' 4 5def yyyy(hrt) 6 hrt.each_with_index 7 .slice_before(&:first >> :zero?) 8 .find { |a| -> (x) { x.sum == 4 && x != [0, 2, 2] } < a.map(&:first) } 9 &.inject do |r, vi| 10 case vi.first 11 when 1 then vi.last 12 when 2, 4 then break vi.last 13 else r 14 end 15 end || -1 16end 17 18puts yyyy([0,1,1,1,1,0,0,0,1,1,0]) 19puts yyyy([0,0,1,4,0,1,2,1,0,0,0]) 20puts yyyy([0,2,2,0,1,0,3,1,0,4,0]) 21puts yyyy([0,4,4,0,2,2,0,1,1,3,0]) 22puts yyyy([0,1,1,0,2,0,1,3,0,1,0])

バージョン比較の部分は2.10.0とか出たときは対応できないバグがありますが、その前に3.0.0が出ることを期待して…。


【質問のコードのレビュー】

すいません、全く違う作りにしてしまった理由というか、質問のコードについて指摘事項を羅列します。

  • Ruby 1.9.4は既にサポートされていません。バグが原因で動かない場合や脆弱性が発生した場合、誰も助けることはできません。サポートされたRubyのバージョンを使用してください。現在サポートされているのは、2.3系、2.2系、2.1系(ただしセキュリティ修正のみ)です。
  • グローバル変数は、グローバル変数を使わなければ実現できない等のどうしても必要な理由が無い限り、使用しないでください。
  • ループは一方向のみにしてください。添字のiが増えたり減ったりすることはわかりにくく、バグの温床になります。高速なアルゴリズムを実現するなどの目的が無い限り、増える方向、または、減る方向のみに絞ってください。
  • 添字のループはInteger#timesRange#eachを使ってください。whileは数がわからないと言う事情が無い限り、極力避けてください。かといって、代わりにfor inを使うことは避けてください。for ineachとの違いが理解できない限り、使用しないでください。for inで無ければならないことはほとんどありません。
  • 配列を順番に見るときは、Array#eachを使ってください。添字が必要であればArray#each_with_indexを使ってください。
  • i = i + 1i += 1と書いてください。他の部分も、複合代入演算子を使用してください。
  • 同じ行に式が続くので無ければ、thenは不要です。
  • 何もしないelseは不要です。
  • if X == a then ... elsif X == b then ... elsif X == c then ... else ... endと言う形の場合は、case文を使用してください。
  • 単純な添字ループであればiでもかまいませんが、複雑な処理になる場合は、何を意味する物かを示すように変数名を与えてください。jについても同様です。また、cntはカウンタと言うよりも数の和です。totalなどにしたほうがわかりやすいでしょう。
  • 配列の長さが固定でない場合を想定してください。
  • マジックナンバーを使用しないでください。最初にhrt_size = $hrt.sizeなどし、9hrt_size - 210hrt_size - 1などと表現してください。
  • 一つのメソッドにおいて、行数が多く、また、インデントが深すぎです。メソッドの分離を検討してください。

色々書いてしましたが、私が10年以上前に最初に書いていたRubyのコードもこんな物でした。焦らずに、少しずつ慣れていけば良いのですから。

投稿2016/09/26 14:07

編集2016/09/27 12:16
raccy

総合スコア21735

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

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

torisan

2016/09/27 03:21

回答ありがとうございます。 バージョンは1.9.4になります。 記述がありませんでしたね、すみません。
torisan

2016/09/27 12:45

ものすごい量の教示ですね。なんだか申し訳ないです。 >Ruby 1.9.4は~ ちょっと調べてみます。 >グローバル変数は、~ 質問の内容はめちゃくちゃ大きい処理の一部を抜粋して書いています。 ほとんどどこでも使用している変数の為、$付きにしています。 >ループは一方向のみに~ これは正直自分でも思いました、気を付けます。 >添字のループはInteger#timesや~ >配列を順番に見るときは、Array#eachを~ 今はほとんどfor文を使っていますね、どこからどこまで、というのがわかりやすいので。 配列はeachを使うといいと言うのは聞いたことはあるのですが。。 >i = i + 1はi += 1と~ >同じ行に式が続くので無ければ、thenは不要です。 これは私が見やすいのでわざと付けてます。 なんたらかんたら=なんたらかんたら+1 のようにやたら長い時は+=を使いますが。 >何もしないelseは不要です。 普段は付けませんが、今回の場合はこの方が理解しやすいかなと思い付けました。 >if X == a then ... elsif~ これはそうですね。Case文を使うようにします。 >単純な添字ループであればiでも~ 私の癖ですね。i,j,kなどを添え字や位置を表す変数にする事が多いです。 cntは和になっているような……?totalは参考にします。 >配列の長さが固定でない場合を想定~ >マジックナンバーを使用しない~ 直接の質問に関係ないので、できるだけ簡易的に書かせていただきました。 >一つのメソッドにおいて、行数が多く~ メソッドは処理ごとに分けており、元ソースには既に結構な数があります。 これ以上分けると却って見辛くなるような気がして……。 インデントは……endの後ろのコメントが物語ってますね……気を付けます。
guest

0

他の言語でもよさそうなので参加

bash

1#!/bin/sh 2ary=("0 0 2 2 1 0 0 0 3 1 0") 3cc=0; ttl=0; p1=0; p2=0; p3=0; p4=0 4ans=() 5for xx in ${ary[@]} 6do 7 if [ $cc -gt 0 ]; then 8 [ $xx -eq 0 -a $ttl -eq 4 ] && ans+=("$p1 $p2 $p3 $p4") 9 [ $xx -eq 0 ] && ttl=0 && p1=0 && p2=0 && p3=0 && p4=0 10 [ $xx -eq 1 ] && p1=$cc 11 [ $xx -eq 2 ] && p2=$cc 12 [ $xx -eq 3 ] && p3=$cc 13 [ $xx -eq 4 ] && p4=$cc 14 fi 15 (( cc++ )) 16 (( ttl+=xx )) 17done 18[ ${#ans[@]} -eq 0 ] && echo "Ans: -1" && exit 19arr=() 20fa=0 21for xx in $(seq 0 $(( ${#ans[@]} - 1 ))) 22do 23 arr=(${ans[$xx]}) 24 if [ ${arr[0]} -gt 0 -a ${arr[1]} -eq 0 -a ${arr[2]} -eq 0 -a ${fa} -eq 0 ]; then 25 fa=${arr[0]} 26 elif [ ${arr[0]} -gt 0 -a ${arr[1]} -gt 0 -a ${fa} -eq 0 ]; then 27 fa=${arr[1]} 28 elif [ ${arr[0]} -gt 0 -a ${arr[2]} -gt 0 -a ${fa} -eq 0 ]; then 29 fa=${arr[0]} 30 elif [ ${arr[3]} -gt 0 -a ${fa} -eq 0 ]; then 31 fa=${arr[3]} 32 fi 33done 34if [ ${fa} -eq 0 ]; then 35 echo "Ans: -1" 36else 37 echo "Ans: ${fa}" 38fi

投稿2016/09/27 09:57

編集2016/09/27 10:09
A.Ichi

総合スコア4070

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

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

torisan

2016/09/27 12:04

回答ありがとうございます。 Bashという言語そのものを初めて見たので解読に時間がかかりましたが 1~4の最終アドレスを先に保管しておき、後で判定を行う方法ですね。 特徴的で面白い記述だと感じました。
guest

0

ベストアンサー

書かれている仕様を整理したらこんな感じでしょうか。

  • 位置を返す数字の優先度は高い順に4->2->1(4があったら2,1の位置を返すことはない)
  • 3の位置を返すことはない
  • 返す位置は同じ数字のなかで一番右側(最後に現れる位置を返す)
  • 2だけ上の条件の例外(2ゾロ目は無視)

Ruby得意な人ならもう少し綺麗になるかも?

ruby

1def yyyy(hrt) 2 pos = posN = sum = 0 3 for i in 0..hrt.length-1 do 4 n = hrt[i] 5 sum = 5 if posN == 2 and n == 2 6 if [4, 2, 1].include?(n) then 7 if posN <= n then 8 pos = i 9 posN = n 10 end 11 end 12 sum += n 13 if n == 0 then 14 return pos if sum == 4 15 pos = posN = sum = 0 16 end 17 end 18 return -1 19end 20 21puts yyyy([0,1,1,1,1,0]) == 4 ? true : false 22puts yyyy([0,1,1,2,0]) == 3 ? true : false 23puts yyyy([0,1,2,1,0]) == 2 ? true : false 24puts yyyy([0,2,1,1,0]) == 1 ? true : false 25puts yyyy([0,2,2,0]) == -1 ? true : false 26puts yyyy([0,1,3,0]) == 1 ? true : false 27puts yyyy([0,3,1,0]) == 2 ? true : false 28puts yyyy([0,4,0]) == 1 ? true : false 29puts yyyy([0,1,1,1,1,0,0,0,1,1,0]) == 4 ? true : false 30puts yyyy([0,1,4,0]) == -1 ? true : false 31puts yyyy([0,0,1,4,0,1,2,1,0,0,0]) == 6 ? true : false 32puts yyyy([0,2,2,0,1,0,3,1,0,4,0]) == 7 ? true : false 33puts yyyy([0,4,4,0,2,2,0,1,1,3,0]) == -1 ? true : false

投稿2016/09/27 05:39

編集2016/09/27 05:42
kodai

総合スコア759

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

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

torisan

2016/09/27 11:28

回答ありがとうございます。 細かい条件を見事に切り分け、例外的な記述が最小限になっていますね。 3を無視して数字の大きい方を取るという方法は気が付きませんでした。
guest

0

ruby

1class SumNumber 2 3 FAIL = -1 4 SUM = 4 5 6 def initialize 7 @group = [] 8 @counter = 0 9 @position = 0 10 end 11 12 def analyze(target) 13 target.each_with_index do |item, index| 14 divide_group(index) if item == 0 15 grow_group(item) if item != 0 16 return @position if @position > 0 17 end 18 FAIL 19 end 20 21 def grow_group(item) 22 @group << item 23 @group_count += item 24 end 25 26 def divide_group(ind) 27 calc_pos(ind) if @group_count == SUM 28 @group = [] 29 @group_count = 0 30 end 31 32 def calc_pos(ind) 33 pos = search_position(@group) 34 @position = (ind - 1) - pos if pos != FAIL 35 end 36 37 def search_position(pos) 38 return FAIL if (pos[0] == 2) && (pos[1] == 2) 39 return 1 if (pos[1] == 2) || (pos[1] == 3) 40 return 2 if pos[0] == 2 41 0 42 end 43end 44 45target = [0,1,1,1,1,0,0,0,1,1,0] #=> 4 46# target = [0,0,1,4,0,1,2,1,0,0,0] #=> 6 47# target = [0,2,2,0,1,0,3,1,0,4,0] #=> 7 48# target = [0,4,4,0,2,2,0,1,1,3,0] #=> -1 49 50sum_number = SumNumber.new 51puts sum_number.analyze(target)

動作しているなら質問文のコードで問題ないですが、
あえて違うスタイルの提示に意味もあるかと思い、
「手続き的な制御文の入れ子を外す」ことをテーマに、
ほかの部分はなるべくシンプルに書きました。

投稿2016/09/26 22:40

編集2016/09/26 23:07
LLman

総合スコア5592

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

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

torisan

2016/09/27 03:45

回答ありがとうございます。 確かに入れ子になっている部分は自分も気になっていました。 こういう書き方もあるんですね。 あと、数字の1が入っている部分を無視して判定している所が 個人的には気に入りました。
guest

0

暇つぶしにJavaScriptで書きました。

javascript

1class sumFourIndexOf { 2 constructor(array) { 3 this.arr = array 4 this.arrZero = this.createArr(array.length) 5 this.arrZeroIndex = this.createArrayZeroIndex(this.arr) 6 this.arrPairIndex = this.searchFourIndexPair(this.arr, this.arrZeroIndex) 7 this.result = this.getResultIndex(this.arr, this.arrPairIndex) 8 } 9 createArrayZeroIndex(array) { 10 return array.reduce((arr, item, index) => { 11 if (item === 0) { 12 arr.push(index) 13 } 14 return arr 15 }, []) 16 } 17 getSumArray(array, firstIndex, lastIndex) { 18 return array.slice(firstIndex + 1, lastIndex) 19 } 20 isFour(array, firstIndex, lastIndex) { 21 const sumArr = this.getSumArray(array, firstIndex, lastIndex) 22 23 if (sumArr.length === 0 || this.isIgnore(sumArr)) { 24 return false 25 } 26 27 const sum = sumArr.reduce((a, b) => { 28 return a + b; 29 }, 0) 30 31 if (sum === 4) { 32 return [firstIndex, lastIndex] 33 } 34 35 return false 36 } 37 isIgnore(array) { 38 if (array.indexOf(2) < 0) { 39 return false 40 } 41 42 return array.filter((item) => { 43 return item === 2 44 }).length >= 2 45 } 46 searchFourIndexPair(array, arrayZero) { 47 return arrayZero.reduce((before, item, index, arr) => { 48 const result = this.isFour(array, item, arr[index + 1]) 49 if (result) { 50 before.push(result) 51 } 52 return before 53 }, [])[0] || -1 54 } 55 createArr(len) { 56 let arr = []; 57 for (let i = 0; i < len; i++) { 58 arr[i] = 0 59 } 60 return arr 61 } 62 getResultIndex(array, pairIndex) { 63 if (pairIndex === -1) { 64 return -1 65 } 66 const firstIndex = pairIndex[0], 67 lastIndex = pairIndex[1], 68 sumArr = this.getSumArray(array, firstIndex, lastIndex), 69 arrBefore = this.arrZero.slice(0, firstIndex + 1), 70 arrAfter = this.arrZero.slice(lastIndex), 71 arr = arrBefore.concat(sumArr, arrAfter) 72 73 if (arr.indexOf(2) >= 0) { 74 return arr.indexOf(2) 75 } 76 77 if (arr.indexOf(3) >= 0) { 78 return arr.indexOf(1) 79 } 80 81 if (arr.indexOf(4) >= 0) { 82 return arr.indexOf(4) 83 } 84 85 return arr.lastIndexOf(1) 86 } 87} 88 89var test1 = new sumFourIndexOf([0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0]); 90var test2 = new sumFourIndexOf([0, 0, 1, 4, 0, 1, 2, 1, 0, 0, 0]); 91var test3 = new sumFourIndexOf([0, 2, 2, 0, 1, 0, 3, 1, 0, 4, 0]); 92var test4 = new sumFourIndexOf([0, 4, 4, 0, 2, 2, 0, 1, 1, 3, 0]); 93 94console.log(test1.result); // 4 95console.log(test2.result); // 6 96console.log(test3.result); // 7 97console.log(test4.result); // -1

投稿2016/09/26 17:39

編集2016/09/27 04:48
yamato_hikawa

総合スコア2092

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

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

torisan

2016/09/27 03:55

javascriptは専門外ですが、indexOfだけ調べさせていただきました。 恐らく、対象の配列を作成して、2があるか、3があるか、4があるか、と調べていき、それに対応するリターン値をセットするという事ですね。(そのまますぎますか?) 回答ありがとうございました。
guest

0

Javaの暇つぶしです。

Java

1public class isFour { 2 3 static int check(int[] args) { 4 5 if (args.length != 11) { 6 throw new IllegalArgumentException(); 7 } 8 9 for (int i=0, cnt=0, prev=0, pos=-1; i<11; ++i) { 10 int value = args[i]; 11 if (value == 0) { 12 if (cnt == 4) { 13 return pos; 14 } 15 cnt = 0; 16 } else { 17 cnt += (value == 2 && prev == 2) ? 11 : value; 18 pos = (value > 1 || cnt == 1) ? i : pos; 19 } 20 prev = value; 21 } 22 return -1; 23 24 } 25 26 public static void main(String[] args) { 27 System.out.println(check(new int[] {0,0,0,0,0,0,0,0,0,0,0})); 28 System.out.println(check(new int[] {0,1,1,1,1,1,1,1,1,1,0})); 29 System.out.println(check(new int[] {0,2,2,2,2,2,2,2,2,2,0})); 30 System.out.println(check(new int[] {0,3,3,3,3,3,3,3,3,3,0})); 31 System.out.println(check(new int[] {0,4,4,4,4,4,4,4,4,4,0})); 32 System.out.println(check(new int[] {0,1,1,1,1,1,1,1,1,1,0})); 33 System.out.println(check(new int[] {0,2,2,2,2,2,2,2,2,2,0})); 34 System.out.println(check(new int[] {0,3,3,3,3,3,3,3,3,3,0})); 35 System.out.println(check(new int[] {0,2,2,0,2,2,0,2,1,2,0})); 36 System.out.println("---"); 37 System.out.println(check(new int[] {0,1,1,1,1,0,1,3,0,1,0})); 38 System.out.println(check(new int[] {0,2,1,1,0,1,3,0,1,1,0})); 39 System.out.println(check(new int[] {0,1,2,1,0,1,3,0,1,2,0})); 40 System.out.println(check(new int[] {0,1,1,2,0,1,3,0,3,1,0})); 41 System.out.println(check(new int[] {0,2,2,0,1,1,2,0,1,3,0})); 42 System.out.println(check(new int[] {0,2,2,0,1,1,1,0,1,3,0})); 43 System.out.println(check(new int[] {0,2,2,0,1,1,1,0,3,1,0})); 44 System.out.println(check(new int[] {0,2,2,0,1,3,1,1,0,4,0})); 45 } 46}

###バグ修正(追記)
バグを修正しました。仕様をよく読んでいなかったのが原因。

その前に、Bertrand Meyerの「契約による設計」に従い、事前条件チェックをちゃんとやります。

Java

1if (args == null && args.length != 11) { 2 throw new IllegalArgumentException(); 3} 4if (args[0] != 0 || args[10] != 0) { 5 throw new IllegalArgumentException(); 6}

数列の積を使ってパターンを判定するようにしました。

Java

1static int check(int[] args) { 2 3 for (int i=0, cnt=0, prod=1, pos=-1; i<11; ++i) { 4 int value = args[i]; 5 if (value == 0) { 6 if (cnt == 4) { 7 return pos; 8 } 9 cnt = 0; 10 prod = 1; 11 } else { 12 prod *= value; 13 cnt += (value == 2 && prod == 4) ? 11 : value; 14 pos = ((value == 2 || value == 4) || 15 prod == 1 || (prod == 3 && value == 1)) ? i : pos; 16 } 17 } 18 return -1; 19 20}

このコードが良くないのは、強引なやり方をしていてよく分からないことと、仕様変更に弱いことです。

正規表現を使う方が、仕様変更に強い(正規表現だけを変えれば良い)し、わかりやすいと思いましたので、掲載します。

Java

1 2static final String SEQ_PATTERN = 3 "^.*0111(1)0|011(2)0|01(2)10|0(2)110|0(1)30|03(1)0|0(4)0.*$"; 4 5static int check(int[] args) { 6 7 StringBuilder buff = Arrays 8 .stream(args) 9 .collect( 10 StringBuilder::new, 11 (b,v) -> b.append(String.valueOf(v)), 12 (c,d) -> c.append(d) 13 ); 14 String seq = new String(buff); 15 Matcher m = Pattern.compile(SEQ_PATTERN).matcher(seq); 16 if (m.find()) { 17 for (int i=1; i<=m.groupCount(); ++i) { 18 if (m.group(i) != null) { 19 return m.start(i); 20 } 21 } 22 } 23 return -1; 24} 25

正規表現の書き方が悪いとか、ストリームAPIの使い方がよくないと思っています。しかし、仕様変更があってもコードを変更しなくても良いところが気に入っています。

投稿2016/09/26 13:14

編集2016/09/27 09:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

torisan

2016/09/27 03:19

回答ありがとうございます。 Javaはほとんど扱ったことが無いのですが このソースの場合、 0,1,1,1,1,0 -> 左端 0,3,1,0 0,1,3,0 -> 3の位置 になりませんか?見当違いだったらすみません。
退会済みユーザー

退会済みユーザー

2016/09/27 03:54

そですね。仕様の読み違いです。posへの代入条件を直して対応します。それとは別に、汎用性があるのは正規表現かなと思っています。
退会済みユーザー

退会済みユーザー

2016/09/27 03:57

final String SEQ_PATTERN = "^.*0111(1)0|011(2)0|01(2)10|0(2)110|0(1)30|03(1)0|0(4)0.*$"
torisan

2016/09/27 11:10

正規表現での記述は確かにわかりやすいですね。 わざわざ修正ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問