下の例のよう整数のリストが与えられ、重複を一番左の要素から消して、それをreturnする関数を作成しようと思っています。(codewarsのこの問題ですhttps://www.codewars.com/kata/5ba38ba180824a86850000f7/train/c)
特に、重複があったときに重複部分を左端から取り除くという部分がどのようにするか、自分で書いたコードだとその部分をややこしく書いてしまっている感じがするので、良い方法があれば教えていただきたいです。また、それ以外に部分でもコードにおかしなところがあると思うので、それも指摘していただければありがたいです。
solve [3, 4, 4, 3, 6, 3]-- => [4, 6, 3] -- Remove the 3's at indices 0 and 3 -- followed by removing a 4 at index 1 [1, 2, 1, 2, 1, 2, 3] → [1, 2, 3] [1, 1, 4, 5, 1, 2, 1] → [4, 5, 2, 1]
コード
c
1#include <stdlib.h> 2#include <stddef.h> 3 4int* solve(const int* arrin, size_t szin, size_t *szout) { 5 // NB: assign the length of your return array to the provided *szout 6 int i, arsize = (int)szin; 7 int *base = malloc(arsize); 8 *base = *arrin; //arrinがconstなのでbaseにアドレスをコピー 9 10 11 for(i = 1; i < arsize; i++) 12 { 13 int count = 0; 14 if(base[0] == base[i])count++; 15 16 if(count != 0) //重複があれば要素の2番目から先頭に詰める 17 { 18 arsize--; 19 for(int j = 1, k = 0; j < arsize; j++, k++) 20 { 21 base[k] = base[j]; 22 i = 1; 23 24 } 25 } 26 27 28 29 } 30 31 32 *szout = (size_t)arsize; 33 return base; 34} 35 36
エラー(テストコードにconstを付けた結果)
fixture.c:49:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:49:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:59:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:59:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:70:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:70:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ fixture.c:80:29: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ fixture.c:35:34: note: expanded from macro 'ASSERT_ARR_EQ' printf("Expected %i\n", exp); \ ~~ ^~~ fixture.c:80:50: warning: format specifies type 'int' but the argument has type 'size_t' (aka 'unsigned long') [-Wformat] ASSERT_ARR_EQ(expected, exp_len, submission, sub_len); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~ fixture.c:36:36: note: expanded from macro 'ASSERT_ARR_EQ' printf("Submitted %i\n\n", sub); \ ~~ ^~~ 8 warnings generated.
提示されたコードとエラーメッセージでsolveの定義が違うようですが、どちらが正しいのですか?
どこかが違うのか分からなかったのですが、問題としては最初に
int* solve(const int* arrin, size_t szin, size_t *szout)
のように与えられていたので、これで正しいと思います。
文字数の関係で質問文には載せられなかったのですが、https://www.codewars.com/kata/5ba38ba180824a86850000f7/train/c
内のSample Testsを見ていただければ分かるかもしれません。
> どこかが違うのか分からなかったのですが
エラーメッセージには「int* solve(int* arrin, size_t szin, size_t *szout);」と、constなしのものが出力されています。
確かにそうですね。sample testのほうのコードにconstが付いていなかったです。これに関してエラーが出ている感じですかね。sample testnほうに自分でconstをつけたらwarningが減ったので、もしかしたらサイト側のミスかもしれません。ただ、ほかの回答者を見る限り、回答ではconstを付けたままコードを書いているので、constを付けた状態でコードを書きたいと思います。
テスト用コードのほうのプロトタイプ宣言に「int* solve(int* arrin, size_t szin, size_t *szout);」と書いてあるんですよねえ。
Daregadaさん
その部分がサイト側のミスか分からないのですが、テストコードに自分でconstをつけるとエラーが減ったので、関数側ではconstを付けたままコードを作成します。
回答は控えますが自分なら逆順から走査した方がすっきり実装出来そうかなと問題を見て直感しました。(未実装未検証なのであしからず)
mjkさんありがとうございます。その方法も考えてみます。
回答1件
あなたの回答
tips
プレビュー