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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1427閲覧

JavaScript 特定の文字列をカウントして出力する方法

hi-roto

総合スコア8

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/11/18 16:47

編集2021/11/18 16:48

以下のように特定の文字列をカウントして出力する関数、カウントした文字列を元の文字列に戻す関数を作成しようとしています。
どなたかいい方法を思いつく方がいらっしゃいましたらよろしくお願いします。

javascript

1function countString(str) { 2 //code 3} 4 5function restore(str) { 6 //code 7} 8 9console.log(countString("bbbaacadee")) // "3b2a1c1a1d2e" 10console.log(countString("pppppppppbbzza")) // "9p2b2z1a" 11console.log(restore("3b2a1c1a1d2e")) // "bbbaacadee" 12console.log(restore("9p2b2z1a")) // "pppppppppbbzza"

以下のように関数を作成し、オブジェクトとして、同じ文字列を全てカウントすることはできたのですが、上記のように順次出力させる方法で詰まっています。

javascript

1function countString(str) { 2 let arrayStrings = str.split("") 3 let count = {}; 4 5 for (let i = 0; i < arrayStrings.length; i++) { 6 let a = arrayStrings[i] 7 8 let elm = arrayStrings[i]; 9 count[elm] = (count[elm] || 0) + 1; 10 } 11 return count 12} 13 14

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

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

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

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

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

guest

回答2

0

地道にやればこんなかんじかな。

javascript

1function countString(str) { 2 let b = "" 3 let r = "" 4 for (let i=0;i<str.length;i++) { 5 if (b != "" && str[i] != b[0]) { 6 r += b.length + b[0] + "" 7 b = "" 8 } 9 b += str[i] 10 } 11 r += b.length + b[0] + "" 12 13 return r 14}

--- 追記 ---
参考までにこっちも

javascript

1function restore(str) { 2 let n = "" 3 let r = "" 4 const nums = "0123456789" 5 for (let i=0;i<str.length;i++) { 6 if (nums.includes(str[i])) { 7 n += str[i] + "" 8 } else { 9 r += str[i].repeat(n * 1) 10 n = "" 11 } 12 } 13 return r 14}

投稿2021/11/18 21:28

編集2021/11/19 12:04
takasima20

総合スコア7464

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

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

hi-roto

2021/11/20 02:24

丁寧なご回答ありがとうございます。 参考にさせていただきます!!
guest

0

ベストアンサー

とりま、こんなんでいけるかと。

javascript

1const countString = str => str.replace(/([a-z])\1*/g, (m, p1) => `${m.length}${p1}`); 2 3const restore = str => str.replace(/([0-9]+)([a-z])/g, (_, p1, p2) => p2.repeat(+p1));

テスト:

javascript

1[ 2 'bbbaacadee', 3 'pppppppppbbzza', 4 'abcdefgh', 5 'zzzzz' 6].forEach(text => { 7 const text1 = countString(text); 8 const text2 = restore(text1); 9 console.log(`${text} => ${text1} => ${text2}`, text === text2); 10});

出力結果:

"bbbaacadee => 3b2a1c1a1d2e => bbbaacadee" true

"pppppppppbbzza => 9p2b2z1a => pppppppppbbzza" true
"abcdefgh => 1a1b1c1d1e1f1g1h => abcdefgh" true
"zzzzz => 5z => zzzzz" true

???? サンプル @codepen

追記

質問にある、作成途中のcountStringのコード

javascript

1function countString(str) { 2 let arrayStrings = str.split("") 3 let count = {}; 4 5 for (let i = 0; i < arrayStrings.length; i++) { 6 let a = arrayStrings[i] 7 8 let elm = arrayStrings[i]; 9 count[elm] = (count[elm] || 0) + 1; 10 } 11 return count 12}

についてですが、ここまでで作られるcount オブジェクトを使って、意図しているコード化を行うのは難しいです。
たとえば、"bbbaacadee"という文字列からは、count は以下のようなオブジェクトになります。

{ b: 3, a: 3, c: 1, d :1, e :2 }

ですが、このオブジェクトが持っているのは、各文字が与えられた文字列の中で出現する合計の回数です。なので、たとえば、文字a に対して countオブジェクトから3 という数字が分かっても、この3の意味するところとして、どこかにaが3連続しているのかもしれないし、あるいは、文字列の先頭に1個のaがあり、末尾に2連続のa があるのかもしれません。しかし、"bbbaacadee"でのaの出現場所と各回数を見ると、これらのどちらでもありません。このように、count には、各文字がどこに(それぞれ各)何回という情報が抜け落ちてしまっています。ですので、このcount から、目的とするコード化された文字列(入力がbbbaacadeeならば、3b2a1c1a1d2e)を得るのは難しいです。

先に正規表現とreplaceを使ったコードを挙げましたが、(質問にあるarrayStringsのように、)一文字ずつ読んで処理するforループで目的を達成しようとするなら、countのような文字と総出現回数のマップではなく、何らか別のデータ構造なりアルゴリズムを再考する必要があります。

投稿2021/11/18 19:51

編集2021/11/18 21:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hi-roto

2021/11/19 00:30

ご丁寧にご回答いただきありがとうございましす。 仕事から帰って、再度見直させていただきます。 レビューもいただけたので、こちらの回答をベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問