sharp231
@sharp231

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

JavaScriptで偶数、奇数判定のアルゴリズムを完成させたい#1

解決したいこと

IF文を使って条件分岐を作成しています
例えば、連続で並んだ数字を入力します
StringChallenge(num)2245551と入力をします
1つ目の条件分岐が偶数が連続した際に
偶数の間にアスタリスク「*」を挿入する
2つ目の条件分岐が奇数が連続した際に
奇数の間にダッシュ「-」を挿入します

仮にnumが2245551の場合
出力が2*2*45-5-5-1になります

ゼロは偶数または奇数として数えないです

やりたいことが条件分岐の処理ミスがあるので
数字を入力した際に出力時に文字列で‐と*が挿入できるようにしたいです

よろしくお願いします

発生している問題・エラー

特になし

例)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ

該当するソースコード

function StringChallenge(num) {
  let result = [];
  //要素の取得がない
  for (let i = 0; i < num.length; i++) {
    const oddnumber = num[i]
    const evennumber = num[i + 1]
    //0は無視の条件式
    //if文の書き方にミスがある0の処理ではなく偶数、奇数の処理にしてみます

    //偶数同士に'*'を入れる条件式
    if ((oddnumber % 2 == 0) && (evennumber % 2 == 0)) {
      result += oddnumber + '*';
      return 
    }
    //奇数同士で'-'を入れる条件式
    else if ((evennumber % 2 == 1) && (evennumber % 2 == 1)) {
      result += evennumber + '-';
      return 
    }
    else {
      ;

    }

  }
  // code goes here  
  return num;

}
//奇数の間に-が入る、偶数の間に*が入る
// keep this function call here 
console.log(StringChallenge(readline()));

自分で試したこと

テスト入力すると数字は出力ができるので
条件分岐の処理に問題があります
なので、条件分岐の改善をしていおります

0

4Answer

修正例です。おそらく、文字列や配列の指定の仕方([]の使い方)と、if文の条件の指定の仕方がまだまだ理解ができていないかと思いますので、そちらを復習してはいかがでしょうか。
大筋(今も次も偶数ならば*を足す)はとてもよくできています。

-    const oddnumber = [i];   //これだと配列を代入
-    const evennumber = num + [1 + i]; //文字列 + 配列の不当な演算をしている
+  const number_here = num[i]  //こうやって文字列のi文字目を指定
+  const number_next = num[i+1] 
    //0は無視の条件式
+   //0は偶数だと思いますが、無視して大丈夫ですか?(大丈夫ならいいです!)
    if (oddnumber === 0) {
      continue;
    }
    //偶数同士に'-'を入れる条件式
-    if (oddnumber && oddnumber) {
+    if ((number_here % 2 == 0) && (number_next % 2 == 0)){
+    //&&は条件式同士に使う
      result =  oddnumber + '*';
    }
    //奇数同士で'*'を入れる条件式
-    else if (evennumber && evennumber) {
+    else if ((number_here % 2 == 1) && (number_next % 2 == 1)){
+    //同上
      result = evennumber + '-';

    }
3Like

Comments

  1. @sharp231

    Questioner

    大筋はできていると思っていますが何が抜け落ちているのか全然おもいつきませんでした

  2. 初心者のうちだと難しいですよね。
    こちらで理解できましたか?

  3. @sharp231

    Questioner

    他のサイトを利用して関数や文字列の勉強を再度行い
    私の抜け落ちている部分がわかりました
    それから改善に改善を重ねて*-の出力が可能になりました
    for文があることによって数字がおかしくなっていることに気づけませんでした
    アドバイスをいただいてからループ処理するので数字の改善をしました

  4. よかったです!
    僕はあまり気にしないのでいいですけど、回答をもらった際は「ありがとうございます」と一言いっておかないとメンドウな人に粘着されるので注意してください

  5. @sharp231

    Questioner

    ありがとうございます

1つ目の条件分岐が偶数が連続した際に偶数の間にアスタリスク「*」を挿入する
2つ目の条件分岐が奇数が連続した際に奇数の間にダッシュ「-」を挿入します

ゼロは偶数または奇数として数えないです

仮にnumが「2245551」の場合
出力が「2245-5-5-1」になります

2*2*45-5-5-1じゃなくて?

const results = []
const numbers = "2245551".split("").map(Number)

numbers.forEach((a, index) => {
  results.push(a)

  b = numbers[index + 1]
  if(!b) return 

  const set = [a, b]

  // いずれかが0なら無視
  if(set.some((x) => x === 0)){
    return 
  }
  // 両方偶数なら
  if(set.every((x) => x % 2 == 0)){
    results.push("*")
    return
  }
  // 両方奇数なら
  if(set.every((x) => x % 2 == 1)){
    results.push("-")
    return
  }
})

console.log(results.join("")) // => 2*2*45-5-5-1
1Like

Comments

  1. @sharp231

    Questioner

    内容を改善しました

デバッガは使えるのですよね。であれば質問する前に自分でまずデバッグしましょう。デバッグは問題解決に一番有効な手段で、それが今すぐできるのは質問者さんだけなのです。

それから、現状では期待する動作とどう違うのかを具体的に「発生している問題・エラー」欄に書いてください。

前の質問者さんのスレッドでもお願いしましたが、自分がやりたいことを、具体的に、ここに書いてない事以外は知りえない第三者が読んで分かるように、言語化して質問に書くということが必要ですので、よろしくお願いします。

0Like

Comments

  1. @sharp231

    Questioner

    デバッグは問題解決に一番有効な手段

    デバッグで確認すると数字を入力すると出力はそのまま*と-は挿入されないです
    エラーは出ていないです

  2. 問題となりそうな所にブレークポイントを設定してそこで実行を止めて、そこからステップ実行しながら、期待通りの手順で進んでいるか、変数の値は期待通りかを調べてください。やり方はググれば参考になる記事が見つかるはずなので、自分で調べて勉強してください。 

  3. @sharp231

    Questioner

    ありがとうございます

仮にnumが「2245551」の場合
出力が「2245-5-5-1」になります

最初はこんな問題、現実社会にないと断言してました。きっとアルゴリズム問題なんだろうと?

虫食いのアルゴリズム

function StringChallenge(num) {
  let result = '';
  let x = "+";
 for (let i = 0; i < num.length - 1; i++) {
    results = results + num[i] + x ;
  }
  results = results + num[num.length - 1]
  return results;
}

2+2+4+5+5+5+1 が表示されます。
xの箇所を奇数、偶数判定関数におきかえて。。。。

ゼロは偶数または奇数として数えないです

ナイナイ、きっとアルゴリズム問題?
ちょっと、アルゴリズムに挑戦してにました。偶然の思いつきでした。

奇数、偶数判定アルゴリズム

function StringChallenge(num) {
  let result = "";
  let x = [];
  x[0]="*"; x[1]=""; x[2]="-";
 for (let i = 0; i < num.length - 1; i++) {
    let y = num[i] % 2 + num[i + 1] % 2;
    results = results + num[i] + x[y] ;
  }
  results = results + num[num.length - 1];
  return results;
}

2★2★45-5-5-1 が表示されます。

01は正しく判定されますが 00や02は誤判定されるとおもいます。思いつきはよかったが、詰めが甘かったです。残念!
最小(num[i],num[i+1])が0の時1、1以上の時0なる式があれば完成です。

 let y = num[i] % 2  + num[i + 1] % 2;
 let z = ??????
 results = results + num[i] + x[y+z] ;
 let z = Math.abs(Math.min(num[i], num[i + 1]) % 2 - 1)

まだダメですか! 呑みながらカキコしてます。ギブアップしそうです。ギブアップします。

p.s. この問題はアナログ波形をデジタル波形にするアルゴリズムにありそうです。

0Like

Comments

  1. @sharp231

    Questioner

    コードはわかりましたが
    文章がわからないです

  2. コードが理解できたのは幸いです。文章がわからないのは私は残念で悲しいです。

Your answer might help someone💌