ふらっと C#,C♯,C#(初心者用) Part145

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 1e7b-qjLW)
垢版 |
2019/10/07(月) 20:16:17.93ID:9eyAES450
!extend:checked:vvvvv:1000:512
次スレを立てる時は↑を2行冒頭に書くこと(1行分は消えて表示されない為)

「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者、議論をしたいだけの人は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスや酔っぱらいレスはやめてください
>>980を踏んだ人は新スレを建てて下さい。>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。

■前スレ
ふらっと C#,C♯,C#(初心者用) Part144
https://mevius.5ch.net/test/read.cgi/tech/1563258983/
■関連スレ
C#, C♯, C#相談室 Part95
https://mevius.5ch.net/test/read.cgi/tech/1508168482/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/

■情報源
https://docs.microsoft.com/ja-jp/dotnet/standard/class-libraries
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://docs.microsoft.com/en-us/dotnet/standard/class-libraries
http://referencesource.microsoft.com/
・Insider.NET > .NET TIPS - @IT
https://www.atmarkit.co.jp/ait/subtop/features/dotnet/dotnettips_index.html
・DOBON.NET .NET Tips
https://dobon.net/vb/dotnet/index.html
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2019/11/05(火) 00:37:22.81ID:+pU68px4M
せやな
2019/11/05(火) 01:08:31.06ID:OkDX2sfL0
>>398
誰に対するpublicなのか勘違いしてね?
2019/11/05(火) 05:42:15.86ID:jgE+3/q30
>>398
全部publicつけるように習慣づけとけばいいよ。
2019/11/05(火) 06:23:16.40ID:Qdu0k3JA0
>>398
お前の親が知人にお前のことを紹介するとき、お前の机の中のエロ本やパソコン内のエロ画像フォルダを勝手に公開されたら困るだろ
2019/11/05(火) 06:42:35.89ID:NkD1Ww44H
>>396
lookするだけちゃうの?
2019/11/05(火) 07:41:50.89ID:Dk7Gl9zXM
見て!
2019/11/05(火) 10:36:58.27ID:mW5ea4am0
>>402
この説明したことあるわw
2019/11/05(火) 14:36:36.98ID:5/2Yewwy0
WPF始めたばかりでThumbを使ってドラッグでコントロールを移動をしたかったんだけど
これってそもそも中にラベルやボタンを置けない仕様なのかな…?
とりあえずtemplateを使って無理矢理borderとbuttonを置いてみたけど
今度はborderからはDragStartedもDragDeltaもThumbに届くのに、buttonからは届かない

Thumbってどういう風に使うものなんですかね…
ウインドウのタイトルバー的な感じに置くものなのでしょうか
2019/11/05(火) 14:46:13.23ID:F/FN86RY0
他のUI要素の部品として使われることを想定してるもんだからね
2019/11/05(火) 14:55:03.31ID:5/2Yewwy0
例えばラベルにThumbの機能を持たせようとするとどうしたらいいんだろう?

thumbのテンプレートにラベルを置いたとして、ラベルのテキストやbackgroundプロパティを
tumbのプロパティとして定義することはできるのかな…?
2019/11/05(火) 15:07:10.27ID:F/FN86RY0
Thumbの機能ってのはよく分からんが、「ラベルにThumbの機能を持たせる」のに
Thumbにラベルの機能持たせるとか主客転倒してるように思える
2019/11/05(火) 15:12:25.39ID:F/FN86RY0
基本的にThumbってのは「マウスのドラッグで操作する」ことを表すもので
そのドラッグにどう意味づけするかはThumbではなくてThumbを持っている要素が決めるもの
スクロールバーならドラッグをスクロールとして扱うし
スライダーなら値の増減を表す
2019/11/05(火) 15:29:08.42ID:5/2Yewwy0
もしかして俺の理解がおかしいのかな

普通のウインドウみたいにタイトルバーをドラッグしてコントロールを動かしたい場合って

<dockpanel>
<thumb>
<label>

みたいにするものなのかな、それとも

<dockpanel>
<label>
<thumb>

が正しい?

本当は

<thumb>
<dockpanel>
<label>

みたいにしてdockpanelのボタンとか以外の場所は
ドラッグ移動可能にしたいのだけど…
2019/11/05(火) 15:50:59.23ID:Ai05n3QGM
DTD見ろ
2019/11/05(火) 15:58:11.06ID:F/FN86RY0
正直全然説明が理解できんが
DockPanelをルートとしたウィンドウ内ウィンドウ的なのが存在してて
それのタイトルバー的なのをマウスで掴んで動かしたいってことでいいのか

まあThumbの出番は無いだろうな
2019/11/05(火) 16:02:31.08ID:E+44QmotM
>>413
そういうこと!
なんだけど出番ないのか…どうしたらいいんだ…?
2019/11/05(火) 16:27:06.76ID:F/FN86RY0
ドラッグできる部分をBorderとかで定義して
そいつのMouseLeftButtonDown/MouseMove/MouseLeftButtonUpイベントでDockPanelを動かすコードを書く
2019/11/05(火) 19:01:21.35ID:R3NaIBm20
public class Person
{
string name;
 int age;
public read()
{
// ファイルを読み込んでnameとageに入れる
}}
こんなクラスがあるとします。1クラスに1役割ということでここからPersonクラスとPersonReaderクラスに分けることを考えます。
そのときPersonReaderは以下の2種類ってどちらがベターでしょうか
public class PersonReader
{
private Person person;
public PersonReader(Person person)
{
this.person = person;
}
public read()
{
// ファイルを読み込む処理
 person = 〜
}}

Public class PersonReader
{
public Read(Person person)
{
  // ファイルを読み込む処理
  person = 〜
}}
readに引数無いほうがきれいな気がするんですけど、readerにもオブジェクトの参照持たせるのは不味いような気もします。
よろしくおねがいします
417デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/05(火) 19:19:02.37ID:Ra2VTEEXa
>>416
あんまり教条主義的に考えない方がいいのでは?
特に事情がない限り

// ○○ファイを読み込んでこのインスタンスのフィールドとプロパティーを更新する
public void Load(string path)
{
  ....
}

とか、

// 〇〇ファイルから新しいインスタンスを作成
public static Person FromFile(string path)
{
  ....
}

こんなの方が使いやすいのでは?
2019/11/05(火) 19:19:34.94ID:6X5avhuH0
win32apiをc#から呼ぶのは色々大変です
少し調べたらVanara.PInvokeのnugetがありました
日本語の記事が余り無いようですがどんなもんなんでしょうか?
419デフォルトの名無しさん (ワッチョイ 3a2d-DXXI)
垢版 |
2019/11/05(火) 20:06:06.04ID:HWawPKHc0
>>416
C#を使用している限りでは、このコードでメモリリークの問題は起きないはずです
それでもどうしても心配だというなら弱参照にしてください
2019/11/05(火) 21:59:36.96ID:R3NaIBm20
>>417
あーまぁ今回の例だとそうかもしれないですね。
ただ実際の開発だとxmlを読み込むんですけどちょっと処理が膨大で。読み込む先、今回で言うところのPersonクラスも相当でかいので分けないといかんだろと
2019/11/05(火) 22:21:14.48ID:rzC/SdAh0
>>416
正直どっちも勘弁してって感じ
インスタンス生成の責務をファクトリに割り当てる頻出パターンなので
ファクトリやファクトリメソッドのキーワードでググればいいと思う

ファクトリクラスはusing Personしても参照を持つ必要はない
2019/11/05(火) 22:43:58.63ID:hT1YfL4n0
>>420
personは分解できないの?
そんな巨大ならpersonを分解して
xml読み込んでパースした情報を保持するやつ
パースした情報からpersonの部品を作るやつ
personの部品からpersonを作るやつ
みたいに段階踏むかなぁ
2019/11/05(火) 22:45:42.68ID:hT1YfL4n0
nugetなんて誰でもリリースできるんだから著名じゃないライブラリの良し悪しは中々情報は得にくいだろうね。
頑張って元言語の記事読むしかないんじゃない?
2019/11/05(火) 22:48:54.04ID:dsMkwNKQ0
まじかよ
nugetはどっかの技術検査受けて
認められたのだけがnugetにリリースされてるんだと勝手に思ってた
425デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/05(火) 23:00:27.36ID:Ra2VTEEXa
>>420
どうしても分ける前提なわけね。
まあPersonReader がPersonのインスタンスを持つのは普通に変だよねやっぱり。
どこにも必然性がない。

PersonReader が状態を持つ必要がなければstaticクラスのstaticメソッドでいいはず

どうでもいいけど、

// ファイルを読み込む処理
person = 〜

じゃなくて、例えば

// ファイルを読み込む処理
person.Hoge = 〜;
person.Hage = 〜;
person.Piyo = 〜;
...

だよね多分?
2019/11/05(火) 23:15:11.57ID:Uakp03G7a
最近のVisualStudioなら暮らすライブラリのプロジェクトで[ビルド(B)]-[パッケージ(P)]をクリックするだけで
nuget登録用のnupkgが出来上がるよ
あとはnugetにログインしてWeb上から適当に情報入力して登録すればすぐ反映される
悪意のあるパッケージとかどうやって識別してrejectしてるのか正直不思議
それとも表沙汰になってないだけでnpmみたいな汚染が日常的に起こってるのか

さすがにストアアプリよりははるかにマシだけどNuGetも玉石混合、というかゴミパッケージのほうが多いと思うよ
2019/11/05(火) 23:24:58.96ID:2pF9vl9I0
「玉石混交」な
2019/11/05(火) 23:32:45.78ID:mzMh853Ma
attributeって結構使うもん?
2019/11/05(火) 23:43:07.83ID:UYy2SJn60
>>428
自分で作ることは滅多にないけど、標準で用意されてるのは時々使う
FlagsAttributeやDllImportAttributeなんかは比較的良く使われているのではないだろうか
使わない人は全然使わないだろうけど
2019/11/05(火) 23:52:58.07ID:mzMh853Ma
>>429
初学でASP.NET Coreのソースおっかけたりしても意味わからんくて困っている
2019/11/06(水) 00:06:43.42ID:YY5sm69bM
調べてないけどxmlからデータクラス生成するくらいなんかのライブラリに投げちゃいかんの?
2019/11/06(水) 00:10:22.77ID:YY5sm69bM
と思ったら言語標準の機能で十分行けるな
2019/11/06(水) 00:10:24.55ID:vTr6jChq0
>>430
Attribute自体はプロパティやメソッドに付与して、コンパイラやライブラリに対して追加の情報を与えるだけ
Attributeが具体的に何を意味をするのかは、それぞれのAttributeによる
ASP.NET Coreのソースだったら、Validation関係かな
2019/11/06(水) 00:13:31.71ID:fi/5YPdO0
>>428
自作はenumにラベルつけるのに作るくらいかなぁ
enumの定義値とメニュー上の表示文字列対応させるみたいな感じ
多言語対応とかあるような案件じゃ使えないけど

すでにあるのはちょいちょい使う
TestとかBenchmarkとかは属性ありきだったりするし
2019/11/06(水) 00:59:37.18ID:vTr6jChq0
>>434
enumにラベル付けるのは自分も作ったよ
多言語対応は第2引数にロケール指定出来るようにして多重定義するようにした
2019/11/06(水) 01:07:17.94ID:fi/5YPdO0
>>435
そのやり方だと対応言語増やすときに再ビルド必要になっちゃうよね
enum以外にも定義が必要な語句は多そうだからそういうのは外に出す方を取るかなぁ
まぁケースバイケースだろうけどね
2019/11/06(水) 01:31:17.54ID:vTr6jChq0
>>436
属性ではリソースキーを指定して、文字列リソースを引っ張って来るようにした方が
文字列リソースが分散しなくて良いね
438デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/06(水) 01:36:47.06ID:sSqMDD2ka
属性をキーにするぐらいにあらenumを直接キーにすりゃいいじゃんw
素直に拡張メソッドてToString定義した方が早いよw
2019/11/06(水) 01:41:30.82ID:TfmivfRs0
>>434
それ自作しなくてもDescriptionAttributeが標準であるよ
440デフォルトの名無しさん (アウアウウー Sa2f-jEuW)
垢版 |
2019/11/06(水) 01:41:32.51ID:sSqMDD2ka
拡張メソッドが使える以前はenumと相互に暗黙変換できるクラスを作って
そこに変換メソッドを書いてたけど、あれは実にあほらしい作業だったなあ
2019/11/06(水) 02:20:17.85ID:fi/5YPdO0
>>439
実際にはenumとラベルを相互に変換したり複数対応させたり等々ケースに応じて細かな要件が出てくるからそういう拡張をするときのベースとして使ってる
あとキャッシュしないと遅いから自作側でキャッシュ処理も含めて作ることが多い
descriptionだとその属性自身を機能拡張したいときにしづらくない?
2019/11/06(水) 10:06:07.21ID:ju8QJ8Hj0
BindでEnumToStringConverter作るからそこでやるだろ。そこでリソース文字列を引っ張るようにする
2019/11/07(木) 00:45:40.72ID:9Le1AJukH
チャートエリアとか図解したサイトないですか?
シリーズだかなんやら意味分からん
2019/11/07(木) 18:27:33.71ID:4Y6lEZUW0
C++のライブラリのちょっとした機能使いたくて現状C++でexe作ってそれをprocessで呼び出してる構造なんですけどなんかデメリットあります?
一応ラッパーもあってC#に一元化も出来るんですけどまぁ遅い。それに実行ファイル配るときに一緒にdllわさっと渡さないといけなくて。今はC#とC++のexe2つ渡すだけです
ソースコード別になっちゃって管理がめんどいくらいしか思いつかなかったんですけど、なんかトラブルの種になりそうなことありますか?
2019/11/07(木) 18:36:24.70ID:4Y6lEZUW0
>>421->>422 >>425
参考になりました。ファクトリ周り全然分からなかったので勉強します。
2019/11/07(木) 18:55:13.67ID:5UmAe6Qb0
フォーム上に左1/4が欠けた円を表示させたいです。
FillEllipseで円を書いてFillRectangle背景色で1/4を塗りつぶせばいいや
と思ったら、FillRectangleが隣り合った塗りつぶしたくない図形も塗りつぶしてしまう。
なにかいい方法は無いでしょうか?
2019/11/07(木) 19:05:19.59ID:rg6PQaG0d
>>444
別に現状で不満ないなら良いのでは?
配布するものならexeが複数あるとC++の方のexe起動してうごかねーっていうのがくるかも
あと動かす環境が変わったときに両方のexeの再ビルドが必要になる可能性があるとか
環境まで言い出したらexeかどうかなん些細な話かもしれんが
2019/11/07(木) 19:07:46.68ID:tx6c8EjT0
>>446
FillPieでできない?
2019/11/07(木) 19:09:01.70ID:Cw78xltR0
>>446
DrawPie、FillPieがあるわけだが
2019/11/07(木) 19:19:51.87ID:6XnNaJpnM
dllにでもしたほうがいい気はする
2019/11/07(木) 19:19:52.40ID:5UmAe6Qb0
すいません。
扇形ではなくて、左1/4のところでまっすぐカットしているという意味です。
図形の説明難しいな・・・。
2019/11/07(木) 19:38:40.99ID:Cw78xltR0
よくわからんが、SetClipで描画範囲を指定すればいいんじゃないの
2019/11/07(木) 19:52:29.15ID:tx6c8EjT0
円弧の端と円の中心、もう片方の端と円の中心でそれぞれ線分を引いた形じゃなくて
円弧の端と端を1本の線分でつないだ形?
まあGraphicsPath作ってFillPathすればいいんじゃない
2019/11/07(木) 20:58:33.81ID:YpFFJiGZM
私なら直線分解してポリゴン描画かな😅
455デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/07(木) 21:34:03.21ID:nmFTkuxva
>>446
境界線が不要でただ塗りつぶすだけならこれが一番簡単だね
public void FillSlicedEllipseL(Graphics g,Brush brush, RectangleF rect, double ratio)
{
  var clip = g.Clip;
  var sliceRect = rect; sliceRect.Width *= (float)ratio;
  g.SetClip(sliceRect, CombineMode.Exclude);
  g.FillEllipse(brush, rect);
  g.Clip = clip;
}

必用ならパス作るしかないか
2019/11/07(木) 21:35:04.28ID:debRpYWr0
>>444
Process経由の場合はDLL使ったAPI呼び出しに比べると
マーシャリング/アンマーシャリング、エラーハンドリングが面倒になりがち
現状そこに不満がないなら無理してDLLに変更する必要はないと思う

あと一応バイナリリソースとしてdllやexeをC#のアセンブリに埋め込んで1ファイルにすることも可能
(リソースからexeを取り出して起動したりDLLをロードしたりするための追加コードが必要)
2019/11/07(木) 22:01:55.24ID:cfOynPV20
>>443
NGワードに引っかかってリンク張れない…
「mschart series chartarea」でグーグル画像検索すると沢山表示されるうち2件位は希望の情報だと思うよ
2019/11/07(木) 22:58:10.38ID:YpFFJiGZM
EXEもLoadLibrary出来るのよ。
なので関数をexport出来れば、どちらでも使える
2019/11/07(木) 23:09:00.51ID:5UmAe6Qb0
いろいろありがとうございます。
説明ヘタですいません。

https://ja.wikipedia.org/wiki/%E5%BC%A7_(%E5%B9%BE%E4%BD%95%E5%AD%A6)
の上から2番めの図のABで円の端を切り落とした形状です。
任意の半径をしていするとこの形状が表示できるようにしたいのです。
隅っこがAB直線で欠けた円ですね。
2019/11/07(木) 23:10:57.49ID:5UmAe6Qb0
https://ja.wikipedia.org/wiki/%E5%BC%A7_(%E5%B9%BE%E4%BD%95%E5%AD%A6)

貼り付けたら後ろがハイパーリンクじゃなくなってますが、コピペしていただくとwikiのページが開きます。
2019/11/07(木) 23:18:55.53ID:5UmAe6Qb0
やっかいなのは

欠けた円の半径を任意に変更したいのでGraphicPathで円に接する直線を引くのが難しいこと
欠けた円をたくさん描くので、rectangleやgclipでやると隣の欠けた円にも影響を及ぼすこと

なんですよね。
clipならできるのかなぁ。
2019/11/07(木) 23:22:58.14ID:6/qmKr7m0
単純に描画順で回避すればいいじゃん
463デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/07(木) 23:24:51.97ID:nmFTkuxva
>>461
>>455で何がダメなの?
2019/11/07(木) 23:25:47.22ID:6/qmKr7m0
それもできないなら一度
どっかのピクチャーボックス(wpf?winforms?)に貼り付けて
欠けた円を作ったあとで
それを必要な領域だけくり抜いて持って来ればええよ
2019/11/08(金) 01:03:44.16ID:OPBfzRS70
vs2019でc#フォームアプリを作ろうとするとデフォが.net coreなのね
.net frameworkはやたら下の方に出てくるしこっちもデフォはユーザコントロール用だ
2019/11/08(金) 01:52:25.99ID:u/zQOw3qH
>>457
おおーこれです!
ありがとうございます
2019/11/08(金) 07:02:50.73ID:uJPiJMNYM
Properties.Settings.Default を変数dに入れて
クラス内のpublic変数にしたいんだけど
何かうまい方法はないだろうか

記述が長すぎるから短縮したいんだよね
2019/11/08(金) 10:09:55.65ID:q9/Fdf+e0
>>467
>>100
2019/11/08(金) 10:55:00.38ID:l/9rfM6i0
usingは無理でした
名前空間はPropertiesだけで
Properties.Setting.Default のエイリアスや参照は作れないようです

privateだと参照が作れるんですが
publicにするとDefaultが internal sealedで定義されているため
エラーになっちゃうんですよね…
2019/11/08(金) 11:05:14.26ID:gdoQlzgA0
そりゃそうだろ
internalでいいじゃん

using static hoge.Properties.Settings;
で Default.fuga なんて書き方もできるけど
2019/11/08(金) 11:46:56.06ID:QwZEyG0Sd
publicなgetter setterもったラッパーでも作っちゃえば?
472デフォルトの名無しさん (アウウィフ FFcf-tB+Q)
垢版 |
2019/11/08(金) 13:05:04.27ID:3E1/z7K0F
>>461
これじゃいかんのか
http://20100718seko.blog130.fc弐.com/blog-えんとり-43.html
https://どぼん.net/vb/dotnet/graphics/drawrectangle.html#section7
https://docs.microsoft.com/ja-jp/dotnet/api/system.drawing.graphics.fillellipse
2019/11/08(金) 13:27:02.99ID:GoK8IDZc0
以下のプログラムについて質問お願いいたします。

--- 以下プログラム ---
public static int TwoAdicValuation(ulong x)
  => TwoAdicValuationTable[(x & ~x + 1) % 67];

static readonly int[] TwoAdicValuationTable
  = InitializeTwoAdicValuationTable();
static int[] InitializeTwoAdicValuationTable() {
  var table = new int[67];
  table[0] = -1;
  for (var i = 0; i < 64; i++) {
    table[(1UL << i) % 67] = i;
  }
  return table;
}
--- 以上プログラム ---

上記の TwoAdicValuation メソッドは、
・引数 x がゼロのときは -1 を返す
・それ以外の場合、引数 x が 2 で割れる回数を返す
という動作をするようです。
例えば TwoAdicValuation(2*3*5) は 1,
TwoAdicValuation(2*2*2*17) は 3,
TwoAdicValuation(19) は 0,
TwoAdicValuation(0) は -1 を返します。

しかしプログラムを読んでみても、
何がどうなってそのような動作になっているのかどうしても理解できません。
何かお分かりになることがあれば
どんなことでも構いませんので教えていただけないでしょうか。
どうぞよろしくお願いいたします。
2019/11/08(金) 13:54:06.44ID:bNpOstnB0
Ruby で説明すると、

2進数で、右から連続する、0の数が、2の累乗を表す。
0b は、2進数

0b0101(5) → 奇数

0b0110(6), 0b1010(10) → 2^1

0b0100(4) → 2^2

0b1000(8) → 2^3
475デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/08(金) 13:55:40.06ID:Y8kt1QUVa
>>473
なんか1年ぐらい前にも同じネタがあった気がするんだけど...
コードよく読んでないけど、要するに2進数で見た時に
「値が1の最下位ビットの位置」を求めてるだけだと思うよ。

2進数で2で割ることは右に算術シフトするのと同じなのは分かるよね?
あと、奇数とはbit0が1の数なのも分かるよね?

だから「x が 2 で割れる回数」と「値が1の最下位ビットの位置」は同じになる
476デフォルトの名無しさん (アウアウウー Sacf-FD+t)
垢版 |
2019/11/08(金) 14:03:08.97ID:Y8kt1QUVa
>>475
× 算術シフト
〇 シフト

要するにLSBが1になるまで右シフトを繰り返した、その回数を求めてるんだと思う
知らんけど
2019/11/08(金) 15:02:17.09ID:l/9rfM6i0
なるほど因数分解して2がいくつあるか数えるのね
2019/11/08(金) 15:11:25.53ID:GoK8IDZc0
>>474-477

ありがとうございます。
色々と実験してみた結果、
x & ~x + 1 が、x と 2で割れる回数が同じ、
1UL << i の形の値になることがわかりました。

ただ、どうして x & ~x + 1 と 1UL << i が
結びつくのかまだ理解できておらず、
67 で割った余りを計算する理由も分かっていないので
引き続き考えてみようと思います。

もし他にもヒントがあれば教えていただけると嬉しいです。
よろしくお願いいたします。
2019/11/08(金) 15:35:02.78ID:bNpOstnB0
Ruby で作った!

そんな、67 とか、訳の分からないロジックを解析しても、仕方ないだろ。無視すべしw

def func( num )
return -1 if num == 0
# 2進数の文字列にして、逆転して、左から探す
num.to_s( 2 ).reverse.index( "1" )
end

nums = %w(0 5 10 4 8).map!( &:to_i ) # 数値の配列
p nums.map { |num| func( num ) }

#=> [-1, 0, 1, 2, 3]
2019/11/08(金) 16:37:08.11ID:l/9rfM6i0
なぜC#スレにruby厨が?
2019/11/08(金) 16:48:42.14ID:q9/Fdf+e0
>>473
tableの中身を理解するにはi, table[i], 1UL <<1, (1UL<<1 %67)を0~64の範囲で逐次出力してみる
xとx&(~x +1)の関係を理解するには一旦byteで考えてビット演算を図にして考えてみる
x=1, ~x=254, x&(~x+1)=1
x=2, ~x=253, x&(~x+1)=2
x=3, ~x=252, x&(~x+1)=1
x=4, ~x=251, x&(~x+1)=4
x=5, ~x=250, x&(~x+1)=1
x=6, ~x=249, x&(~x+1)=2
x=7, ~x=248, x&(~x+1)=1
x=8, ~x=247, x&(~x+1)=8

64と67の関係は、16と19, 32と37でも同じ結果が得られそう
ぶっちゃけbrainfuck系のコードなのでビット演算を理解すればあとは忘れていい類だと思う
2019/11/08(金) 16:50:19.91ID:l/9rfM6i0
>>478
わかったわ

x & ~x + 1 は、最下位の1のビットだけ残す計算
ビット反転して1を足すことで、最下位の1まで繰り上がり
他のビットは必ずどちらかが0になるのでandで消える

で、67で割った余りを求める理由は、2^t を67で割った場合
tが0〜63の範囲ならユニークな値になるから
最小サイズの配列のインデックスを返す値として
最も適していたということだな

なかなか面白いプログラムだった
2019/11/08(金) 17:03:13.19ID:N8JdoV2L0
文字列にするとかいう高コストの処理をしないためのアルゴリズムなのに無視すべきとか何言ってんだw
競技プログラムとか触ったこと無いの?
2019/11/08(金) 17:10:37.08ID:n8X47CXXa
>>480
そいつはいろんな所に湧いて出てくる有名人だ。スルー推奨。
2019/11/08(金) 17:10:58.46ID:l/9rfM6i0
>>482を修正

>で、67で割った余りを求める理由は、2^t を67で割った場合

割った余りを求めれば

>tが0〜63の範囲ならユニークな値になるから

tが1〜64の場合だな


かなり洗練されているが読みやすさとしては
仕事で扱うには勘弁してほしいw

ところでまさかこれ課題じゃねーよな?
2019/11/08(金) 18:04:22.31ID:GoK8IDZc0
>>479
ありがとうございます。
Ruby を扱う技術が私には無いので
アイディアだけお借りして C# に翻訳してみたところ、
期待通りに動作いたしました。
ちなみに、他の方から実行速度に関するご指摘があったので
オリジナルと比較してみたところ、私の書いたコードでは
オリジナルよりも 250 倍程度時間がかかってしまうようでした。
とはいえ読みやすさは良いプログラムの重要な条件なので、
場面に応じて使い分けるのが良さそうですね。
2019/11/08(金) 18:04:48.09ID:GoK8IDZc0
>>481-482
大変わかりやすいご説明どうもありがとうございます。

>>481
> xとx&(~x +1)の関係を理解するには一旦byteで考えてビット演算を図にして考えてみる
>>482
> x & ~x + 1 は、最下位の1のビットだけ残す計算

いただいたアドバイスを元に↓のような実験をしてみて理解できたと思います。
00101100 (44)
11010011 (~44)
11010100 (~44 + 1)
00000100 (44 & ~44 + 1)

>>481
tableの中身を理解するにはi, table[i], 1UL <<1, (1UL<<1 %67)を0~64の範囲で逐次出力してみる
>>482
> 67で割った余りを求める理由は、2^t を67で割った場合
> tが0〜63の範囲ならユニークな値になる
なるほど!実験してみて、確かにそうなっていることがわかりました。
40 人のクラスの中で同じ誕生日のペアがいる確率は 90% 近いと
聞いたことがあるので、なんだか不思議な感じがします。

>>481
> 64と67の関係は、16と19, 32と37でも同じ結果が得られそう
すごく興味深いです。私も実験してみたところ、
1 と 2、2 と 3、4 と 5、8 と 11 という感じになったのですがあってますか?
また、「16と19, 32と37」というのをさらっと書いてくださっていますが、
これは実際に調べてくださったのですか?
それとも、きちんと数学を勉強していればすぐに分かることなのでしょうか。。。
2019/11/08(金) 18:05:15.79ID:GoK8IDZc0
>>485
> ところでまさかこれ課題じゃねーよな?
学校の課題というわけではないのですが、
本来は自力で解くべきものだと思います(汗)
ごめんなさい。。。。
2019/11/08(金) 19:01:19.01ID:bNpOstnB0
>>487
限定された範囲で、規則性があるものは、理論的に説明できないだろ。
ちょっとしたトリビア

355 / 113 = 3.141592 92035

円周率と、小数点以下6桁まで一致するとか
2019/11/08(金) 20:36:38.33ID:83cZSp6a0
コレクションの初期化子で複数を同じ値でまとめて指定する方法はないでしょうか?

Pythonの、l=[False]*100みたいなことをやりたいのですが、
var l = new List<bool> { False, False・・(100個分)}ぐらいしか思いつかず・・
2019/11/08(金) 20:40:33.49ID:3NnH1vyN0
>>490
Enumerable.Repeatでググろう
2019/11/08(金) 20:42:51.62ID:3NnH1vyN0
>>487
16、32、64はビット数
ついになる数はそのビット数の次の素数
2019/11/08(金) 20:45:08.81ID:3NnH1vyN0
ruby君はほんとひどいな
自分が軽く触れそうな話題にだけ飛びついてわからない部分は謎理論で適当な回答しかしない
2019/11/08(金) 20:51:12.72ID:GoK8IDZc0
>>492
> ついになる数はそのビット数の次の素数

レスありがとうございます。
私も最初そのように考えたのですが、
16 の対が 17 ではなく 19 なので
そういうわけではないようなのです。

ちなみに 16 の対が 19 になるというのは
>>481 さんが書いてくださっており、
私のほうでも改めて確認しているので、
間違いではないと思います。
2019/11/08(金) 21:38:06.59ID:3NnH1vyN0
>>494
ほんまやね、すまん
ここらへんは整数論の話だから得意な人に聞けば話は早いんじゃないかな?
フェルマーの小定理から決まるのかな?って思うけど俺自身は整数論詳しくないんで解説できないわ
2019/11/08(金) 22:38:41.75ID:GoK8IDZc0
>>495
レスありがとうございます。
フェルマーの小定理について調べてみました。

フェルマーの小定理から分かることとして、p が奇数の素数のとき、
(2^0)%p と (2^(p-1))%p はともに 1 になるようです。

つまり >>482 さんの言葉をお借りするなら、
奇数の素数 p がビット数 n 以下のとき
t が 0〜(n-1) の範囲で変化すると (2^t)%p がユニークにならないため、
ビット数 n の対としてn 以下の奇数の素数は不適切ということになります。

ただ、フェルマーの小定理は p > n のときに (2^t)%p がユニークになることを
保証するものではありませんし、そもそも奇数の素数じゃなくても
ビット数 n の対としてn 以下の数が適切でないのは当たり前な気がするので、
フェルマーの小定理から直ちに欲しい情報が得られるというわけではないようです。

とはいえ、関連しそうな分野が分かっただけでも大きな前進ですので、
もう少し詳しく調べてみようと思います。どうもありがとうございました。
2019/11/08(金) 22:59:25.16ID:EylFl5WNM
ついでにガロア体も調べると、
QRのコード化で楽になるよ:-p
2019/11/08(金) 23:04:00.88ID:83cZSp6a0
>>491
ありがとうございます。下記でうまくいきました。

var l = Enumerable.Repeat(false, 100).ToList();
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況