Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions 01-15/5.Zigzag Conversion/1.1.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#if __has_include("../debug.hpp")
#include "../debug.hpp"
#endif
// ここまでローカルでのデバッグ用なので気にしないでください --------------------

#include <bits/stdc++.h>

using namespace std;

// <時間>
// 8分
// <疑問・不安点(・個人的な感想、違う意見があれば教えてほしいもの)>
// 1.2の方に書く

// なお以下で出てくるコメントはプロダクト版にも書くつもりのコメント
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;

vector<string> rows(numRows);
int direction = 1, row = 0;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

row の値を i と numRows に関する計算式で求めることはできますか? direction を足していく方法とどちらがシンプルですか?

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

やってみます!
少々お待ちください…

for (int i = 0; i < s.size(); ++i) {
rows[row] += s[i];
if (direction == 1) {
if (row == numRows - 1) {
direction = -1;
}
} else {
if (row == 0) {
direction = 1;
}
}
row += direction;
}
return reduce(rows.begin(), rows.end());
}
};
60 changes: 60 additions & 0 deletions 01-15/5.Zigzag Conversion/1.2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#if __has_include("../debug.hpp")
#include "../debug.hpp"
#endif
// ここまでローカルでのデバッグ用なので気にしないでください --------------------

#include <bits/stdc++.h>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C++に詳しくないんですが, Macでコンパイル使用しようとしたらnot foundと出たので環境依存なものだったりするんでしょうか, production codeではどういう扱いなんでしょうか, 少し調べてみたところ<bits/stdc++.h>はいろんなファイルをincludeしていてコンパイル時間と実行ファイルの重さが増える気がしました。

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

レビューありがとうございます!
はい、おっしゃる通りで、その認識は合っています。なのでプロダクト環境では使わないつもりです。
(using namespace std;も同様です。なお、leedcode上だとインクルード文は書かなくても使えるようです)。
申し訳ないのですが、Macにはそれがないのでここにインクルードしていただけると…。


using namespace std;
Comment on lines +6 to +8
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

練習では include は真面目に書いたほうがいいと思います。

コードを書くのは知的な行為ではないので、できるかできないかではなくてするかしないかだと思っています。

using namespace std; は、使うこともあるのでまだいいんですが、.h でやると悲惨なことになります。そういう意味で必ずできるものではないが、.h を練習で書くことはなさそうなので、大半のコードはこれなしで書いたほうがいいように思いますね。

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

C++割と得意なんで許してください…、では駄目ですか?笑
(C++er初心者ぐらいではあるつもり。いや初心者ですが)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

自己評価が高すぎるように感じます。謙虚になられることをおすすめいたします。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

いや、まあ、好きにすればいいんですが、逆の話として、小西さんは6時間かからずに60問書き上げた、といっています。そうならば、そもそもこの練習をする必要はないです。

寿司職人として寿司の握り方を覚える際に、髪の毛触っていてもいいですか、と同じ話だと思っています。
客の前では触らないようにできるので、練習のときには触っていてもいいじゃないですか。

Copy link
Copy Markdown
Owner Author

@philip82148 philip82148 Nov 23, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

すみません。
ただ、誤解のないように説明しておきたいのですが、僕が「割と得意」と思っているのはC++の言語仕様自体です。コーディングそのものではありません。だからこそこうやってレビューを受けたいと思っています。
そして、「割と得意」というのは、「C++が専門ではない人も含めた全体」の中でという意味です。「普段C++を触っている人」の中ではありません。(流石にC++の言語仕様の大きさ知ってて一年しか触ってないのに「普段触ってる人の中」で得意だなんて思ってません)
まあ、ここの比較対象は伝わらなくても、リンクを引用することで絶対的な評価を伝えたつもりだったのですが。
引用先の文面はこんな感じでそこまでレベルの高いつもりはありません…(ただincludeすべきヘッダは知っていると思われるレベル)。

C++初心者とは作りたいものを不格好でも作れ(なんでもいいんです、少しでも自分で動かしてみたいと思うものが作れれば)、またcpprefjpなどを使い分からないことを調べることができ、コンパイル時定数の存在を知っていて、rvalue reference、template特殊化、簡単なSFINAEを使ったConceptのようなコードが理解でき書ける程度の状態である

僕もgitのコマンドをエイリアスでたたくかフルで叩くかの違いだとは思っていますが、何か新しい発見があるかもしれませんし、Mac環境の人がレビューしずらいと思いますので、これからはちゃんとincludeしたいと思いますmm
お騒がせしてすみませんmm

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここからは私の解釈ですが、自分の悪いところを認めて、相手に誤解を認めさせて、あいこにして解決するというコミュニケーションを取ってきていて、それで報酬系が回っているので、そのパターンにしようとしたのではないかと推測しています。

『決してC++出来る自慢ではない』という発言が出てきたのも、噛み合っていない印象を持っています。私が話していたのは「調べる動作がされていない」というのは「自慢や自己評価が高いことは驕っているので悪い」ということではないです。人間としての性格の問題ではなくて、専門家の取る基本的な行動をしているかについての話です。なので、これも突然自分の性格の話にすり替えられたように感じます。

ここで伝えたかったことは、だいたいこれくらい噛み合っていないと思っているので、なにか書き始める前に、なにが書かれているのかをこれくらい分析する習慣をつけたほうがいいということです。

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

私は京都の家なので基本的に直截には話しません。柔らかく表現しますし、無駄と思えばどれほど違和感があっても流します。
今回ははっきりと表現したのは、この練習の目的が専門家の感覚の共有であり、その背景として「専門家のぶれの範囲内で認識ができていれば専門家の仲間と扱われる」という理由があります。
今回の話でいうと、『「割と得意」の比較対象は、すでに説明したとおり、C++を触っていない人を含めた全体の中』であるというのは、理解したうえで返事をしています。
このように元の発言の意図の説明で、おそらく私の話を理解できていないと分かります。

なるほどです。すみません、これは僕がちゃんと小田さんの説明(正確には僕の説明を小田さんが信じたこと)を信じ切れていなかったのが原因でした。
こんなに反発が返ってくるのは僕が冗談で言ったということが伝わっていなかったからだと思っていたのですが、そういうわけではないようですね。
伝わった上でおっしゃっているなら納得です。「専門家のぶれの範囲内」の冗談ではなかったということですね。

その上で、知っていることについて『それがとても悪い』『マイナスからのスタート』と判断しています。
つまり、この文章の趣旨は「現状、知識がないほうがまだまし」であるのに対して「誤解させた、得意といっても大して得意ではないという自己認識」という応答です。

これもよく分かっていませんでした。

『決してC++出来る自慢ではない』という発言が出てきたのも、噛み合っていない印象を持っています。
これも突然自分の性格の話にすり替えられたように感じます。

すみません、これは意図的です。この話は僕にとっては反感を買うことを言ってしまったから、相手がそうなった理由を考えて、そうではないと伝えることが大事だと思っていましたので。
それは僕の勘違いだったようですが。

ここからは私の解釈ですが、自分の悪いところを認めて、相手に誤解を認めさせて、あいこにして解決するというコミュニケーションを取ってきていて、それで報酬系が回っているので、そのパターンにしようとしたのではないかと推測しています。
もう少しいうと、内容を理解せずにキーワード単位で反応してずれた話をして、相手も面倒になるという状況を見かけます。

そういう訳ではありません。僕は僕目線から(僕自身は客観的になり得ないのでこの言い方になります)間違っていることはそう伝え、自分が間違っているところは認めています。
文章故の弊害だと思っているところはあるのですが、このような誤解されるのは二行目の分も含めてもったいないと思うので、努力はするつもりです。
(僕も変わっていて一般の人と考え方は違いますが、(少なくとも自分では)プライドはないつもりですし、出来るだけ間違いを指摘してもらって修正したいなと思っていますよ)
(後ついでに言うと小田さんのことは好きですので、いつだって僕は喧嘩してるわけではありません笑)

Copy link
Copy Markdown
Owner Author

@philip82148 philip82148 Nov 26, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(以下、一般の人と違う僕の考え(真意)を少し書いておきます。ただ単に僕の真意を伝える目的であって、伝わる(共感が得られる)話かは自分で怪しいと思っているので…、伝わらなかったら無視してもらって大丈夫です。ちょっとこれを話すのは小田さんが「追加しないでおくつもりだった」とおっしゃったように僕も過度かなと思ったのですが、同じような話がこれから先も起こらないとは限らない(努力はします…)ので一応書いてみます。
(僕は色々言って指摘回避をしているのではなく、指摘を受けたいと思っているということの裏付けになればと思っています)

  • 前CSZAPで言いましたがアリストテレスのエトス>パトス>ロゴス理論(説得において、大事なのはエトス(相手が思っている自分の人柄等・相手に対する信用等)>パトス(感情)>ロゴス(論理)であること)を信じている僕はこの考えから以下の二つの考えがあります。

①会話において論理はあまり関係ないこと。(もちろんCSにおける議論では論理は最重要視しています。ですがそれ以外ではそうとは限りません。僕の勘違いでしたが、この話もそうだと思っていたので、冗談の話をするアプローチ(感情)の選択を取りました)

②会話は誰が喋るかによって、その結果はいかようにも変わること。つまり相手のことを理解していない状態ではうまく行く話もうまく行かないということです。これは文章による会話には限界があると僕が思っているという話で、僕自身の印象も会ってみたら違うものがあると思っているという話です(僕が指摘回避をしているという誤解等について言っています)。
(別の話をすれば、Xで言い合いをした相手が実はニートだったとなったら、不毛な時間を過ごしたなとなるだろうという話でもあります(本人が何者、どのような考えの持ち主であるかはその話の重みを左右するということ)(ちなみにこれは譬えですので僕はSNSでレスバする人間ではありません笑))

  • さらにもう一つ、マインドセットによって同じものを見ても抱く感想が違うということから、目に見えるもの以外に感想や意見を決定づけるファクターがあると信じています

マインドセットとは、「ある靴を履かない国に、靴会社の営業マンAとBが派遣されたら、それぞれの上司に、Aは『この国は靴を履かないので、靴は売れません!』と報告し、Bは『靴の良さを宣伝して売れば、市場はがら空きなので大儲けできます!』と報告した」というやつです。経験や性格によって形成さる考え方の「癖」のことです。

まあ要は、人間はどうやっても客観視は出来ないという話で、それが「アリストテレスのエトス>パトス>ロゴス理論」の補強にもなっていますし(どんなに論理的な話であれエトスやパトスが説得力を左右する)、先ほどまで、僕にとっては、小田さんの話の中身より、小田さんが僕の話を信じてくれたかの方が僕にとっては大事だったという話です(疑ってすみません)。これを僕が言うのは正当化しているように聞こえるかもしれませんが、「伝わった上でおっしゃっているなら納得です。」という話になるのはそういうことです)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

冗談で言った

これは冗談でも自慢でも、あまりプロフェッショナルとしての評価は変わりがないでしょう。

私も一番の問題点をここまで掴みそこねていた気がするのですが、関係のない話をして「コメントを故意に無視した」ことが一番の問題です。レビューの場においてエンジニアリングの目的に繋がってしているコメントなのだから、なんらかのエンジニアリングの目的に繋がる反応が求められます。「自分がどのような分類であるか」はエンジニアリングの目的に関係がなく、それ以外には従う気がないくらいしか内容がありません。(だから、「冗談はさておき、〜〜でしょうか。」などがついていたら、だいぶましです。)これくらい目的に繋がらない行動は面接だと一発レッドカードでると思いますね。

仕事のかなりの部分がコミュニケーションコストなので、「コミュニケーションコストを無駄に発生させる」と思われることもマイナスです。実際に仕事の場でこれをやると、後回しや放置をされることも少なくないでしょう。

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ただ、この危機感が伝わっている気があまりしません。

自分の行動や考えがエンジニアリングの目的に関係しているかを常に内省し、「受け取る人の立場に立つのがエンジニアリングの本質」ということを強く意識し、これから外れたらイエローカードからレッドカードと理解する、くらいしかアドバイスを思いつかないので、気長に考えてください。


// <時間>
// 8分
// <疑問・不安点(・個人的な感想、違う意見があれば教えてほしいもの)>
// - 他の人のを見ていて1.1の25行目のif文が要らないことに気づいたので
// それを消したもの。
// - 言われた通り、ジグザグに並べた。先頭から順に追加すべきインデックスを
// 計算することも考えたが素直に書いた方が可読性は良いだろうと考えこうした。
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

はい。素直に書いたほうがいいと思いますね。

// - 前にそうやってこの問題を解いたことがあり、SolutionOldのところに
// その回答を載せた。一応この方が速度は速い。
// - row == numRows - 1かrow >= numRows - 1か
// - 細かい話だが28行目を空けるか否か
// (自分はフェーズを分ける意味で改行を使いがち)

// なお以下で出てくるコメントはプロダクト版にも書くつもりのコメント
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;

vector<string> rows(numRows);
int direction = 1, row = 0;
for (int i = 0; i < s.size(); ++i) {
rows[row] += s[i];
if (row == numRows - 1) {
direction = -1;
} else if (row == 0) {
direction = 1;
}
row += direction;
}
return reduce(rows.begin(), rows.end());
}
};

class SolutionOld {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;
string retval;
for (int row = 0; row < numRows; ++row) {
for (int i = row; i - row * 2 < static_cast<int>(s.size());
i += numRows * 2 - 2) {
if (row > 0 && row < numRows - 1) {
if (i - row * 2 > 0) retval += s[i - row * 2];
}
if (i < s.size()) retval += s[i];
}
Comment on lines +50 to +56
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここ、もうちょっと読みやすくできないですかね。
i がこの行だけからは分からないので、offset という名前にして、あと、row 減らしたほうが見やすくないでしょうか。

for (int offset = 0; offset < s.size() + row; offset += numRows * 2 - 2) {
  if (0 < row && row < numRows - 1 && 0 < offset - row) {
    retval += s[offset - row];
  }
  if (offset + row < s.size()) {
    retval += s[offset + row];
  }
}

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

すみません、ありがとうございます。
言っておくべきでしたが、こちらは個人的に昔解いたやつを張っただけだったのであまりレビューしてもらうつもりはなかったです。
ですが、とても参考になりました。ありがとうございます。

}
return retval;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

retvalよりも良い名前を考えてみるといいかもです。discordで他の人のコードを読んでみるのがおすすめです

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

あ、すみませんこれは前書いたコードだったんですね

}
};