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

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

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

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

Q&A

解決済

4回答

243閲覧

下記for文が何のプログラミング言語で書かれているか知りたい

re97

総合スコア208

アルゴリズム

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

0グッド

0クリップ

投稿2018/03/26 01:39

・オンライン実行環境でいくつか試してみたのですが、エラーになりました
・何の言語で書かれているでしょうか?

A[0] = -1; int j = -1; for (int i = 0; i < S.size(); i++) { while (j >= 0 && S[i] != S[j]) j = A[j]; j++; A[i+1] = j; }

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

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

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

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

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

sazi

2018/03/26 07:24 編集

まったく同じコードですね。見つけられるもんなんですね。 リンクを色々見てみるとC++のようですね。
guest

回答4

0

ベストアンサー

別回答のZuishinさんの「メモ」と言うご指摘に同意です。勝手に補完すればC++としていけます。

C++

1$ cat do01.cpp 2 3#include <vector> 4 5int main() { 6 std::vector<int> A; 7 std::vector<int> S; 8 9 A.push_back(1); 10 S.push_back(1); 11 12 // ここから 13 A[0] = -1; 14 int j = -1; 15 for (int i = 0; i < S.size(); i++) { 16 while (j >= 0 && S[i] != S[j]) j = A[j]; 17 j++; 18 A[i+1] = j; 19 } 20 // ここまで 21 22 return 0; 23} 24 25$ g++ -std=c++11 do01.cpp

コンパイルだけは通ります。断片コードの意図は見出していません。

※追記
コピペ失敗していたので誤記を修正させていただきます。あと、オプション指定で、C++11である必要なかったです。警告出ますが、再度、コンパイル例。

$ g++ --version g++ (GCC) 6.4.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ g++ -Wall do01.cpp do01.cpp: 関数 ‘int main()’ 内: do01.cpp:13:20: 警告: 符号付きと符号無しの整数式の間での比較です [-Wsign-compar ] for (int i = 0; i < S.size(); i++) { ~~^~~~~~~~~~ $

投稿2018/03/26 01:56

編集2018/03/26 02:09
dodox86

総合スコア9183

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

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

re97

2018/03/28 01:42 編集

回答&補完ありがとうございました。実行確認できました。ちなみにですが、このコードでA配列内容をコンソール表示するにはどうすれば良いでしょうか? for ( vector<int>::iterator i=begin(A); i!=end(A); ++i ) { std::cout << i << std::endl; }を追記してみたのですが、うまくいきませんでした
dodox86

2018/03/28 02:01

> ちなみにですが、このコードでA配列内容をコンソール表示するにはどうすれば良いでしょうか? 1. イテレータを使うなら: for (std::vector<int>::iterator it = A.begin(); it != A.end(); ++it) { std::cout << *it << std::endl; } 2. 配列イメージで、インデックスを使うなら: for (int i = 0; i < (int)A.size(); ++i) { std::cout << A[i] << std::endl; } とのようなかんじかと思います。
re97

2018/03/28 02:04 編集

再度の回答ありがとうございました。イテレータを使わなくても普通に配列表示できるのですね。大変参考になりました
dodox86

2018/03/28 02:07

本物の配列ではなく、コード上の見た目でそういう風に見えるだけで、STLでの[]の演算子オーバーロードじゃなかったかなと思います。(今の実装を読んでないので不確か)vectorのイメージだと実装方法でメモリ上で直接的に連続させるようにもできそうですが。
episteme

2018/03/28 02:14

あるいは: for ( auto item : A ) { std::cout << item << std::endl; }
dodox86

2018/03/28 02:19

epistemeさん、ありがとうございます。今はほとんどワンライナーで書けるんじゃないか?と思っていました。(私自身が愚直なので昔からの使い方のまま)
dodox86

2018/03/28 02:36

「ワンライナー」と言うのは我ながらちょっと違うと思った。「1行で書けるレベルで、もっとシンブルにコードを記述」と言う意味でした。自己レス、コメント汚し失礼しました。
episteme

2018/03/28 03:04

ワンライナーがお望みなら: for_each( begin(A), end(A), [](int item) { cout << item << endl; });
dodox86

2018/03/28 03:10

を、をを。。。ラムダ式ですか。C++、キャッチアップしなければ。
guest

0

一部抜粋したC++に見えます。


追記

見えている範囲だけで必ず配列外をアクセスするようになっています。(while文のところ)
何かを攻撃するためのコードでしょうか?

追記2

ショートサーキットを信じて配列外のアクセスしないのであれば、
Sの最初の数字と同じ数字の場所が1で、違う数字が0となる配列Aを作っているっぽいですね。

投稿2018/03/26 01:57

編集2018/03/26 02:45
mkgrei

総合スコア8560

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

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

0

カッコの対応がとれていないので擬似言語でないならメモかなにかでしょう。

###追記

カッコの件は対応していました。
コメントと見誤りました。
しかし変数や関数の定義がされていないので擬似言語かメモでしょう。

投稿2018/03/26 01:45

編集2018/03/26 01:47
Zuishin

総合スコア28656

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

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

0

コードの一部を抜粋しているものと思いますが、メソッドを使用している点から見てc++でしょうか。
コンパイルを通すには、もちろん変数の宣言等は必要です。

投稿2018/03/26 02:21

ttyp03

総合スコア16996

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問