プログラミングのお題スレ Part22

1デフォルトの名無しさん
垢版 |
2023/08/03(木) 13:52:13.20ID:/xW45k0z
プログラミングのお題スレです。

【出題と回答例】
1 名前:デフォルトの名無しさん
 お題:お題本文

2 名前:デフォルトの名無しさん
 >>1 使用言語
 回答本文
 結果がある場合はそれも

【ソースコードが長くなったら】 (オンラインでコードを実行できる)
https://ideone.com/
http://codepad.org/
http://compileonline.com/
http://rextester.com/runcode
https://runnable.com/
https://code.hackerearth.com/
http://melpon.org/wandbox
https://paiza.io/

宿題は宿題スレがあるのでそちらへ。

※前スレ
プログラミングのお題スレ Part21
https://mevius.5ch.net/test/read.cgi/tech/1668333636/
514デフォルトの名無しさん
垢版 |
2025/01/31(金) 13:46:22.55ID:+tPQNmsr
このスレでいいのかわからんのだけど
Rust勉強中なんだがメモリ安全性の恩恵を受けやすいなんかしらかのプログラムを書こうと思ってるんだがなにかいいお題はあるか?
言語処理系は大体作ってるのでそれ以外で頼む
2025/01/31(金) 15:33:43.41ID:b4vq2KMj
う~んこの嫌われムーブはあのおじさんか
このスレでは自重して欲しいな
516デフォルトの名無しさん
垢版 |
2025/01/31(金) 16:14:43.64ID:fZW/Grtl
>>514 へのお題

次の操作ができる循環リンクリストを作成してください

・空のリストへの挿入
・冒頭の挿入
・最後に挿入
・指定された位置への挿入
・最初のノードを削除する
・最後のノードを削除する
・任意の位置からノードを削除する
2025/01/31(金) 21:55:55.86ID:mLWOFznj
>>514
Rustはメモリのデータ競合もデータ参照競合も全てコンパイルエラーにしてくれるから間違えようがないね
他の普通の言語だと実行して問題発生に気付いて調査して頑張ってようやく競合が原因だと判明して間違えていたことがわかるから開発効率の悪さとして差が現れるけど
Rustは実行前にその種のミスのデバッグまで全て終えてしまう感じ
2025/01/31(金) 22:10:00.47ID:4ClqIqkw
普通は問題発生前に気がつく
2025/01/31(金) 22:17:10.46ID:bHXxdIdo
>>510 c
https://ideone.com/MZt32o
2025/01/31(金) 22:38:00.61ID:3jAIz2ps
>>518
グローバル変数を排他制御せずに使ってしまっていたりするミスなどよく見かけるような
一般的にも巨大なコードになったり複数人で共通認識なかったりで見逃しミスは必ず出てくる
そしてタイミング次第によって稀にバグが起こるパターンとか負荷が高くなって起きてバグ発覚とか
2025/01/31(金) 23:44:08.10ID:mLWOFznj
全て自分で出来る気付くミスらない
って自己過信な人がセキュリティホールを招いてるからね
自動的にサポートしてくれる言語を使うのが安全で開発効率もいいよ
2025/02/01(土) 00:00:30.73ID:pgp85i6o
ちゃんとルールを守って運転すれば
事故も起きないし、違反で捕まらない
それと同じ
2025/02/01(土) 00:26:30.15ID:cvjWKAds
>>517
せっかくだからRustで>>516やってきなよ
524519
垢版 |
2025/02/01(土) 17:22:30.12ID:/Ur4AoNp
>>510 c
https://ideone.com/tdT1q2
・若干の高速化
 部分文字列を一文字ずつズラして検証していたのを
n = strcspnで探してn文字スキップへ
2025/02/01(土) 22:42:58.39ID:1BfoGXYb
>>516
横からだがその仕様ならベクタをリングバッファとして使った両端キューで十分だな
多くの実用例でもこの方が速いことが知られている

use std::collections::VecDeque;
// 空のキュー
let mut deque: VecDeque<T> = VecDeque::new();
// 先頭に挿入
deque.push_front(t);
// 最後に挿入
deque.push_back(t);
// 指定位置に挿入
deque.insert(index, t);
// 先頭を削除して得る
let first: Option<T> = deque.pop_front();
// 最後を削除して得る
let last: Option<T> = deque.pop_back();
// 指定位置を削除して得る
let element: Option<T> = deque.pop_back();
2025/02/01(土) 22:57:16.48ID:FwGLv5NU
ズルしてどうするんよ…
2025/02/01(土) 23:00:12.86ID:FwGLv5NU
Rustのメモリ安全性を確認するためにプログラム書きたいんでしょ、だったら循環リストをフルスクラッチするしかないよね
2025/02/02(日) 19:41:14.89ID:NpAQnhYs
リンクリストならindex番目の操作(挿入or切除)は
index番目で分解して操作して合体するだけなのでこれで動くよ

use std::collections::LinkedList;

trait LinkedListExt<T> {
fn insert_at(&mut self, index: usize, value: T);
fn remove_at(&mut self, index: usize) -> Option<T>;
}

impl<T> LinkedListExt<T> for LinkedList<T> {
fn insert_at(&mut self, index: usize, value: T) {
let mut tail = self.split_off(index);
self.push_back(value);
self.append(&mut tail);
}
fn remove_at(&mut self, index: usize) -> Option<T> {
let mut tail = self.split_off(index);
let value = tail.pop_front();
self.append(&mut tail);
value
}
}
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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