プログラミングのお題スレ 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/
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
}
}
529デフォルトの名無しさん
垢版 |
2025/02/03(月) 21:15:02.53ID:swo++26S
>>510
R
https://ideone.com/0Hr1lU

C++ (>>524と同じ巨大文字列での繰り返しあり)
https://ideone.com/7fJXjB
2025/02/03(月) 22:57:52.37ID:VF4m0iMh
>>510 c
https://ideone.com/L4xIAy
・f_529 は529さんのパクり
・f_strcspn_chr は strchr してから strcspn すると単純ながら若干の速度向上
531530
垢版 |
2025/02/04(火) 21:13:55.63ID:k8XtEdoq
>>510 c
https://ideone.com/Mar3S7
・f_529direct は出現位置集めるのやめた
 *min = strchr(*min + 1, **min)) でそのまま次へ
532531
垢版 |
2025/02/05(水) 20:39:11.49ID:mFRiRIqM
>>510 c
https://ideone.com/jeAf1a
・デバッグと若干の整理
533532
垢版 |
2025/02/05(水) 23:28:39.35ID:mFRiRIqM
>>510 java
https://ideone.com/EdHfzN
534デフォルトの名無しさん
垢版 |
2025/02/06(木) 22:16:32.16ID:u6r6iDwj
>>510
C++
https://ideone.com/ywT3qw

>>529からの変更点
・sへのtの文字の出現位置を高速取得(1バイト文字のみに対応)
・sにtの同一文字が3回以上連続して出現する場合に最初と最後以外の位置を省略
2025/02/07(金) 19:14:17.64ID:UF6GKvr5
>>500
Wolfram Language

str = "ATGAT"
>> Out[1]= ATGAT

duplicates = str // Characters \
(* { A, T, G, A, T } *) \
// Counts \
(* <| A -> 2, T -> 2, G -> 1 |> *) \
// Select[Function[ 1 < # ]] \
(* <| A -> 2, T -> 2 |> *) \
// Keys \
(* { A, T } *) \
// StringJoin (* "AT" *)
>> Out[2]= AT
2025/02/07(金) 21:12:13.92ID:n3kvQb3T
テス
5379
垢版 |
2025/02/07(金) 21:20:22.98ID:dMuAEB5V
>510 Perl5

https://ideone.com/lceN9R
2025/02/07(金) 22:53:14.41ID:ovhX7KXo
>>510 c
https://ideone.com/uYlPLX
・f_537 は537さんのパクリ
5399
垢版 |
2025/02/07(金) 23:00:25.46ID:dMuAEB5V
>>537
しくった、これ一番短い範囲ではなく間違って一番長い範囲を検出してる。
サンプルデータではたまたま同じ解になるようで、間違いを見落としてしまった。

それから、一番長い(短いにすべきだったが)範囲の検索にわざわざ候補listをsortして[0]番目を
取得しているが無駄だし規模が大きくなると効率よくない

時間あったら直しますわ〜
5409
垢版 |
2025/02/07(金) 23:02:20.43ID:dMuAEB5V
>>538
あーでも527の方式がいまんとこ一番早いんだな、検証thx
5419
垢版 |
2025/02/07(金) 23:04:01.40ID:dMuAEB5V
>>540 527 じゃなくて 537ね。スマソ
542538
垢版 |
2025/02/07(金) 23:08:45.80ID:ovhX7KXo
>>540
>>537さん方式は動的にメモリとらなくていいのがいいよね、清々しくていいよね
あと実行時間の値はまぁアテにはならんので参考程度にw
543デフォルトの名無しさん
垢版 |
2025/02/07(金) 23:41:05.56ID:qBbgMoXu
>>500
PowerShell

"T", "CG", "ATA", "CGGA", "ATGAT", "GTTGCA", "CCCCGGG", "ACTGCGAG ", "ATCAGAATA", "TGCCATGACA" |% {
  "$_ → $(-join ([char[]]$_ | group -case |% {$_.name[$_.count -le 1]}))"
}

[実行結果]
T →
CG →
ATA → A
CGGA → G
ATGAT → AT
GTTGCA → GT
CCCCGGG → CG
ACTGCGAG → ACG
ATCAGAATA → AT
TGCCATGACA → TGCA
5449
垢版 |
2025/02/08(土) 00:22:55.52ID:vma3KbbM
>>510 Perl5、>>537 の修正版

https://ideone.com/klqLux

修正点
>>537では間違って一番長い範囲を検出していたが、一番短い範囲に修正した。(サンプルデータではそれらの解はたまたま一致)
・パターンが3文字であることに依存する定数「2(=3 -1 )」をハードコードしている箇所があったので、パターン文字数次第で処理するように修正
・検出した候補文字列リストのうち一番短い物の検索のためにわざわざ候補リスト全体をsortするのをやめて
 reduceによって長さが一番短い文字列を検索するように修正

List::Utils は言語処理系にデフォルトで付属のコアモジュール、
List::MoreUtils はCPANのオプションノジュールだがideoneのperlにはインスコされていたので使っちゃいましたテヘペロ

なお、候補文字列リストを作らず、ループの最内ifの中で一番短い文字列だけを記録していく様に記述すれば
大規模問題で若干効率が良くなるだろうけど、
まあいいや、もういいや。
5459
垢版 |
2025/02/08(土) 00:26:07.95ID:vma3KbbM
>>544 List::Utils → List::Util ね。スマソ
546デフォルトの名無しさん
垢版 |
2025/02/08(土) 08:27:20.39ID:7bAG/IVE
>>510
Wolfram Language

s = "DHBICEJAFG"
>> Out[1]= DHBICEJAFG
pattern = "EIC"
>> Out[2]= EIC

shortestMatch = \
(* 全通りの部分文字列を生成する *) \
ReplaceList[ Characters[ s ], {___, x__, ___} -> {x} ] \
(* 短い順、先頭に近い順に並べる *) \
// Sort \
(* 検索文字列の文字を全て含むものを選ぶ *) \
// Select[ ContainAll[ Characters[ pattern ] ] ] \
(* 1つ目を文字列として返す *) \
// Extract[ 1 ] // StringJoin
>> Out[3]= ICE
5479
垢版 |
2025/02/08(土) 17:50:15.20ID:HpUe4TZQ
>>510 Perl5、>>544 をもう一回だけ改良

https://ideone.com/YkuK1w

改良点:
・検出された範囲の候補を一通りリストに蓄えて、あとでその中から最短のものを探す方式を止めて、
 範囲を検索するループ内のifでその時点までの最短な範囲の判定と記録を行うようにした。
・CPANモジュールList::MoreUtilsのminmaxを使わない。
・コアモジュールList::Utilはminだけ使う。reduceは使わない。

なんだかPerlのコードらしい感じが減って、ベタな感じのコードになってしまいました
548デフォルトの名無しさん
垢版 |
2025/02/08(土) 19:59:09.70ID:EDI8nVtP
>>510
C++
https://ideone.com/7EHx0H

>>534からの変更点
・minmax_elementを呼び出さずに済むようにして高速化
549デフォルトの名無しさん
垢版 |
2025/02/08(土) 20:02:06.41ID:EDI8nVtP
>>510
C++
https://ideone.com/TluWQi

>>548では検索文字列が短くて高速化されたか分かりにくかったので、長くして529, 534, 548の
実行時間を比較してみると、効果が顕著に現れた。
550 警備員[Lv.19]
垢版 |
2025/02/09(日) 03:18:28.07ID:Y8d2noVo
>>485
Kotlin
https://paiza.io/projects/RtyGxT2PXZScHW6eucI5ng
551 警備員[Lv.19]
垢版 |
2025/02/09(日) 03:56:54.57ID:Y8d2noVo
>>500
Kotlin
https://paiza.io/projects/eipNjg4meAtA7__e3JTRdg
2025/02/09(日) 12:47:59.38ID:uN83pfj6
>>510 c
https://ideone.com/D2AZMK
・両端に着目し、両端のみを更新しつつ調べていく(が、これといってパっとせず)
・f_both_ends はあくまで元の文字列s上を調べていく
・f_both_ends_v2 は「次」「隣」にアクセスしやすくした構造の上を調べていく
・あと実行時間の値ははげしくブレブレなので参考程度にとどめておいてね
553デフォルトの名無しさん
垢版 |
2025/02/09(日) 21:29:55.65ID:do9MXosP
>>485
R
https://ideone.com/wuW5oV
554デフォルトの名無しさん
垢版 |
2025/02/09(日) 21:31:24.58ID:do9MXosP
>>510
C++
https://ideone.com/bwvs06

>>548からの変更点
・データ構造を単純化したら速くなった
555デフォルトの名無しさん
垢版 |
2025/02/09(日) 21:35:08.87ID:do9MXosP
>>510
https://ideone.com/46Tb28
>>549の実行速度比較に554を追加。548は不要な2行を削除した。検索文字列が短いのと長いのの両方をテスト。
556 警備員[Lv.19]
垢版 |
2025/02/10(月) 13:21:24.86ID:g+w4FSG9
>>510
Kotlin

出来たことは出来たが、もっと簡単に出来そうな気がしてきた。

https://paiza.io/projects/RwNXYMH6q3P6v0vx9zbZng
557デフォルトの名無しさん
垢版 |
2025/02/10(月) 21:24:31.20ID:KgR1Tipz
>>485
C# (IEnumerableとして列挙)
https://ideone.com/UBY8bl
558デフォルトの名無しさん
垢版 |
2025/02/11(火) 03:27:04.16ID:FlAqv/ML
動画再生回数、登録者数、評価数、コメント数

上2桁、下2桁に04、13、40、44、71、74など
(+生年月日、IDの数字など)の組み合わせ

業者による忌み数字、不吉数字の嫌がらせ&精神攻撃がキモすぎ
559 警備員[Lv.20]
垢版 |
2025/02/11(火) 05:48:25.27ID:Y4Uu1QjJ
それはお題なのか?それともただの誤爆か?
2025/02/11(火) 06:03:36.08ID:h8gYOd9x
糖質でしょ
忌み数字不吉数字とか意味不明なこと言ってるし,それを業者が特定個人を狙って表示する意味も分からんし
561デフォルトの名無しさん
垢版 |
2025/02/11(火) 10:54:21.93ID:E5oVpL7o
お題
数列が入力されます
ニ番目に小さい数を出力してください

入力:4, 5, 1, 7, 1, 2, 8, 9, 2, 7
出力:2
2025/02/11(火) 11:46:37.94ID:A5/Zs5AB
こんちゃ
質問いいでしょうけ
プルダウン(ポップアップ)をUIとしてだすとして
見えている項目名と、実際にパラミータとして出す値を変えたい時はどうしたらよか
5639
垢版 |
2025/02/11(火) 14:53:15.78ID:mMj2PIa8
>>561 Perl5

$h{$_} = $_ for 4, 5, 1, 7, 1, 2, 8, 9, 2, 7;
@s = sort keys %h;
print "$s[1]\n";


実行結果
~ $ perl 22_561_second.pl
2


Perl5.26以降に付属のList::Utilにはuniq関数があるのでそれを使えば:

use List::Util qw(uniq);
@s = uniq sort 4, 5, 1, 7, 1, 2, 8, 9, 2, 7;
print "$s[1]\n";
564 警備員[Lv.20]
垢版 |
2025/02/11(火) 16:33:48.19ID:Y4Uu1QjJ
>>562
環境や言語やフレームワークを書いて限定しないと色々な環境や言語やフレームワークでの答えが適当に沢山湧いて出て来る可能性あるぞ。
しかも分からない所は適当に解釈してだ。なぜならここはお題スレだから。
2025/02/11(火) 16:37:12.05ID:WPoAkGuN
>>561 ruby
https://ideone.com/OI7hWs

>>561 octave
https://ideone.com/36aKUO

>>561 c
https://ideone.com/eDmlMM
2025/02/11(火) 16:40:21.13ID:gFwXvlnz
>>561
#!ruby
puts $stdin.gets.chomp.split(",").map{|e| e.to_i}.uniq.sort[1]
2025/02/11(火) 17:43:14.68ID:7RexIvi8
>>510 lisp
https://ideone.com/qm4PsV
2025/02/11(火) 17:48:30.95ID:7RexIvi8
>>561 lisp
https://ideone.com/g6m1EK
2025/02/11(火) 18:19:05.70ID:7RexIvi8
>>568
全然だめでした
取りあえずテスト追加済
570デフォルトの名無しさん
垢版 |
2025/02/11(火) 20:45:09.89ID:hMHygfcC
>>561
R
https://ideone.com/3beF1j

C++
https://ideone.com/A8hp2f

それぞれ3通りの方法で、大きなデータでの実行時間を比較
2025/02/11(火) 23:21:03.54ID:Vzh5cLYk
数列が入力されるので
整数の数列だけでなく浮動小数点数の数列にも対応してくださいね

ニ番目に小さい数がない時
例えば同じ数しか存在しない時や数列の長さが1の時には
解がないことを返してくださいね
例えばその時にMAX値が返ってきたら失格ですよ
572565
垢版 |
2025/02/11(火) 23:28:05.14ID:qmej6t15
>>561 ocaml
https://ideone.com/aV59Yd

>>561 java
https://ideone.com/PdgusX
5739
垢版 |
2025/02/11(火) 23:36:31.53ID:yxel6cu3
先に言えよって、感じw
2025/02/11(火) 23:48:25.56ID:E5oVpL7o
>>571は出題者ではないよ
出題者として申し上げるなら>>571は観点がダサい
2025/02/11(火) 23:50:12.69ID:HwVbkmdb
小数対応はともかく
max値を返してしまう人はプログラマ失格かな
あとsortを使ってしまう人は計算量を知らない初心者
2025/02/11(火) 23:53:59.73ID:E5oVpL7o
そういうこだわりはアスペルガーにしか思えないな、どうでも良いじゃないですかそんなこと
2025/02/11(火) 23:56:29.96ID:E5oVpL7o
こだわりは自分の胸のうちに留めていただきたい、他人に求めたら回答の幅を狭めるだけ、多様性のある回答こそ美しい
2025/02/11(火) 23:57:23.71ID:HwVbkmdb
>>576
多くの人はちゃんとnilとかemptyとかNoneなどを返しているよね
プログラマならそこだけは守らなければならない必須事項
2025/02/11(火) 23:59:56.87ID:E5oVpL7o
だからそういう、こうじゃないとダメだという態度がアスペルガー仕草なんだってばよ、君が思うのは勝手だが他人に求めるものじゃない
2025/02/12(水) 00:01:10.34ID:hk2aQo3G
プログラミングはもっと自由なものなんだよ、思ったとおりにかけば良い
5819
垢版 |
2025/02/12(水) 00:03:23.15ID:yw0CaA/O
そういう条件は回答を見て思いついた後から言わず先に書くべきでは?
そうでなければ、与えられた短い文とテストデータから、
処理対象データの範囲や要求仕様を読み手が色々解釈しても仕方ないだろ。
後からいろいろ言って批判なんてでもってのほかだと思うが。
5829
垢版 |
2025/02/12(水) 00:05:30.21ID:yw0CaA/O
出来たもの見て実はこういう条件がありましたってケチつけるのはクソクライアントと一緒だな
2025/02/12(水) 00:13:52.34ID:SJ0T1N6w
ざっと見たけどmax()を返してるのはC++の人だけで他は皆まともだ
普段からまともなコード書いてるかどうかバレてしまうから自由が面白い
2025/02/12(水) 00:18:10.68ID:hk2aQo3G
好きにしたら良いんやで吉田松陰もそんなこと言ってた気がする
2025/02/12(水) 00:20:24.72ID:hk2aQo3G
まともとかバレるとかそういう当て擦りの嫌味ったらしい言い方どこで身につけてきたのあんた、母ちゃんは悲しいよ
586デフォルトの名無しさん
垢版 |
2025/02/12(水) 00:22:24.96ID:Qtl/TEf6
>>583
関数がINT_MAXを返すのはまともなコードだろ。2番目に小さい数はINT_MAXではありえないから、
返り値がINT_MAXの場合は「なし」と表示すれば良いだけ。
5879
垢版 |
2025/02/12(水) 00:28:30.94ID:yw0CaA/O
「データが二個未満の場合にはnilを返す。」とか書いとくべき。
でもそういう細かい条件をちまちま指定した窮屈な課題は、つまんなくて回答を造る意欲が減るんだよな。

シンプルで純な課題に対してどういうエレガントでエッセンシャルな回答があるか考えるのが楽しいのであって、
細かいいろんな条件を守る周辺コードで固めるような作業はつまんないから趣味の世界ではやりたくないな
2025/02/12(水) 00:31:16.47ID:1WuTe288
普段はプログラム載せるだけだけど、みんな意外と饒舌なんだなw
5899
垢版 |
2025/02/12(水) 00:33:57.88ID:yw0CaA/O
ここはある意味、回答のコードでもって語るスレだからな
2025/02/12(水) 00:35:35.77ID:kQv2EDFI
お題にそんな指定ないのに
みんなnilなどを返してるからこのスレの住人たちはセンスいいな
2025/02/12(水) 19:12:16.26ID:FZJ50oR3
>>561 lisp (sbcl)
https://ideone.com/Bct7bC

>>561 lisp (clisp)
https://ideone.com/yqfmzh

clispだと何故かsort版の方が速い
2025/02/12(水) 20:45:54.96ID:JML0DDov
>>561 ruby
https://ideone.com/svMSSw

>>561 sqlite
https://ideone.com/W02Q5r
593デフォルトの名無しさん
垢版 |
2025/02/12(水) 22:44:39.40ID:Qtl/TEf6
>>561, 571
>>570のC++のf3をint型の最大値を含むデータにも対応させた。

C#にはint?型があるのですっきり書けるが、
https://ideone.com/oRhDL1

C++ではまあまあすっきり書くにはintへのポインタを返すしかないか。
https://ideone.com/xYnTSD
(該当値が複数の位置に存在する場合にそれらのうちのどれへのポインタを返すかについては
こだわらないものとする)
2025/02/13(木) 12:04:43.08ID:KGk2Z9bM
お題:ランダムな数列から任意の並んでいる二つの数同士を足して、その二つの数の間に挿入せよ。
その新しい数が一桁ならそのまま挿入し二桁なら桁同士を足してその二桁の間に挿入せよ。

< 123456789 3 4
> 1237456789

(3+4=7)

< 123456789 6 7
> 123456143789

(6+7=13 1+3=4)
2025/02/13(木) 12:31:31.25ID:QhFtS6hw
問題文の記述が下手かよ
2025/02/13(木) 13:27:16.37ID:J5YSE8js
>>594 ruby
a=$stdin.gets.chomp.split(" ")
b=a[1].to_i+a[2].to_i
c=(b<9 ? a[1]+b.to_s+a[2] : a[1]+"#{b/10}#{b/10+b%10}#{b%10}"+a[2])
puts a[0].gsub(a[1]+a[2],c)
5979
垢版 |
2025/02/13(木) 17:35:13.67ID:UAfabByi
>>594 Perl5、見易くするためインデントは全角スペースに置換してあります

for (<DATA>) {
 ($s, $a, $b) = split;
 $c = $a + $b;
 $c = $1 . ($1 + $2) . $2 if $c =~ /(\d)(\d)/;
 $s =~ s/$a$b/$a$c$b/g;
 print "$s\n";
}
__DATA__
123456789 3 4
123456789 6 7
123456789 8 9
3141592653589793238462643383279502884197169399375105820974944 9 7


実行結果
~ $ perl 22_594.pl
1237456789
123456143789
123456781879
3141592653589176793238462643383279502884191767169399375105820917674944
598デフォルトの名無しさん
垢版 |
2025/02/13(木) 20:12:01.16ID:3SfOseF2
>>594
題意が以下の通りだとして、PowerShell (エラーチェックは省略)

 自然数x, i, j (i + 1 = jを満たす) が与えられる。xの上i桁目の数字をx[i]で表す。
 x[i]とx[j]の和をyとして、

 ・yが1桁のとき、yをx[i]とx[j]の間に挿入せよ
 ・yが2桁のとき、y[1]とy[2]の和をy[1]とy[2]の間に挿入してから、yをx[i]とx[j]の間に挿入せよ

function f($x, $i, $j)
{
  $s = [string]$x
  $y = [int][string]$s[$i - 1] + [int][string]$s[$j - 1]
  if ($y -lt 10) {
    $s.insert($i, $y)
  } else {
    $s.insert($i, 11 * $y)
  }
}

(123456789, 3, 4), (123456789, 6, 7) |% {
  "< $($_[0]) $($_[1]) $($_[2])"
  "> $(f $_[0] $_[1] $_[2])", ""
}

[実行結果]
< 123456789 3 4
> 1237456789

< 123456789 6 7
> 123456143789
5999
垢版 |
2025/02/13(木) 20:24:48.49ID:UAfabByi
数学屋さんかいなw
i,jの「3 4」とか「6 7」は桁の位置をしていしているのではなく数値列の中にある数字を指定するんジャマイカ
とオレは解釈したが
600デフォルトの名無しさん
垢版 |
2025/02/13(木) 20:34:25.67ID:3SfOseF2
>>599
そうか。だとすれば、

function f($x, $i, $j)
{
  $s = [string]$x
  $y = $i + $j
  if ($y -ge 10) {$y *= 11}
  $s -replace "$i$j", "$i$y$j"
}

(123456789, 3, 4), (123456789, 6, 7), (123456789, 8, 9), ("3141592653589793238462643383279502884197169399375105820974944", 9, 7) |% {
  "< $($_[0]) $($_[1]) $($_[2])"
  "> $(f $_[0] $_[1] $_[2])", ""
}

[実行結果]
< 123456789 3 4
> 1237456789

< 123456789 6 7
> 123456143789

< 123456789 8 9
> 123456781879

< 3141592653589793238462643383279502884197169399375105820974944 9 7
> 3141592653589176793238462643383279502884191767169399375105820917674944
2025/02/13(木) 20:45:01.39ID:KiG3F5Wd
>>561 c
https://ideone.com/ZyWoVM

>>594 ruby
https://ideone.com/gp9Fvp
6029
垢版 |
2025/02/13(木) 20:52:32.26ID:UAfabByi
なんでこの人はコーデイングするのがこんなに早いんだろう…
2025/02/13(木) 22:58:07.29ID:bC7pFAVH
>>594 Rust

fn f(input: &str, a: u32, b:u32) -> String {
let src = format!("{a}{b}");
let dst = if a + b < 10 {
format!("{a}{x}{b}", x = a + b)
} else {
format!("{a}{x}{y}{z}{b}", x = 1, y = 1 + a + b - 10, z = a + b - 10)
};
use itertools::Itertools;
input.split(&src).join(&dst)
}

fn main() {
assert_eq!(f("123456789", 3, 4), "1237456789");
assert_eq!(f("123456789", 6, 7), "123456143789");
assert_eq!(f("3141592653589793238462643383279502884197169399375105820974944", 9, 7),
"3141592653589176793238462643383279502884191767169399375105820917674944");
}
2025/02/13(木) 23:47:12.83ID:bC7pFAVH
>>561 Rust

fn second_smallest<T: Copy + Ord>(input: &[T]) -> Option<T> {
use std::cmp::Ordering::{Equal, Greater, Less};
input
.iter()
.copied()
.fold(None, |state, t| match state {
Some((_t0, Some(t1))) if t >= t1 => state,
Some((t0, _)) => match Ord::cmp(&t, &t0) {
Less => Some((t, Some(t0))),
Equal => state,
Greater => Some((t0, Some(t))),
},
None => Some((t, None)),
})
.and_then(|(_t0, t1option)| t1option)
}

fn main() {
assert_eq!(second_smallest(&[4, 5, 1, 7, 1, 2, 8, 9, 2, 7, 1]), Some(2));
assert_eq!(second_smallest(&[1, 1, 1]), None);
assert_eq!(second_smallest(&[] as &[i32]), None);
}
2025/02/14(金) 17:55:06.91ID:L6dJMbYJ
わけがわからん
アセンブラじゃあるまいし
2025/02/14(金) 18:42:18.21ID:RXjqXFcF
わからないのはどのへんなんだろう?
・型がジェネリックになっている点
・代入文がないなど関数型プログラミングになっている点
・パターンマッチングが使われている点
いずれも最近は対応している言語が増えてるような
2025/02/14(金) 23:21:45.00ID:bNo2F1oE
可読性の良さから高階関数を使ったメソッドチェーンが一般的になってきたね
マイクロソフトがC#などでLINQ広めたのがきっかけで各言語もその有用性から導入するようになった
2025/02/14(金) 23:42:29.57ID:PVqLPxMJ
お題:ランダムな英文字列が与えられる。隣り合う英文字が同じ大文字だった場合、その間にその大文字の小文字を挿入せよ

In < abcDDefGG
Out > abcDdDefGgG
2025/02/15(土) 00:16:29.67ID:aVKCg5xf
>>608 ruby
while 1
s=DATA.gets.chomp
exit if s==""
t=s.gsub(%r|([A-Z])\1|){$1+$1.downcase+$1}
puts "IN < #{s}\nOUT > #{t}"
end
__END__
abcDDefGG
2025/02/15(土) 00:16:34.18ID:f9ERvXXy
>>594 dart
https://ideone.com/uQxzo1

>>608 ruby
https://ideone.com/pwoRRH
2025/02/15(土) 00:28:45.42ID:/PgyVRU9
>>606
正規表現みたい非人間的な書式はやめようぜっての
612デフォルトの名無しさん
垢版 |
2025/02/15(土) 00:39:27.81ID:rssRTGdz
>>608
PowerShell

function f($s)
{
  -join $(
    foreach ($i in 0..($s.length - 2)) {
      $s[$i]
      if ($s[$i] -ne $s[$i + 1]) {continue}
      if ($s[$i] -lt [char]"A" -or $s[$i] -gt [char]"Z") {continue}
      ([string]$s[$i]).ToLower()
    }
    $s[$i + 1]
  )
}

"abcDDefGG", "abcDDDfGG" |% {"$_ → $(f $_)"}

[実行結果]
abcDDefGG → abcDdDefGgG
abcDDDfGG → abcDdDdDfGgG
2025/02/15(土) 01:01:01.24ID:qzrI3kKZ
>>608 Rust

fn f(input: &str) -> String {
 let mut output = String::new();
 let mut pre_uppercase = None;
 for char in input.chars() {
  if Some(char) == pre_uppercase {
   output.push(char.to_ascii_lowercase());
  }
  output.push(char);
  pre_uppercase = char.is_ascii_uppercase().then_some(char);
 }
 output
}

fn main() {
 assert_eq!(f("abcDDefGG"), "abcDdDefGgG");
 assert_eq!(f("abcDDDfGG"), "abcDdDdDfGgG");
}
2025/02/15(土) 09:21:24.60ID:XILc/8JX
>>608 ruby
https://ideone.com/nHcphN

>>608 dart
https://ideone.com/NxwW8Y
615614
垢版 |
2025/02/15(土) 10:02:25.10ID:UI50KRFJ
>>608 dart
https://ideone.com/2E5Rxy
6169
垢版 |
2025/02/15(土) 10:36:35.12ID:1WENuqRv
>>608 Perl5、肯定先読みと置換の小文字変換

s/([A-Z])(?=\1)/\1\l\1/g, print for <DATA>;
__DATA__
abcDDefGG
abcDDDefGGG


実行結果
C:\Home>perl 22_608_ins_l.pl
abcDdDefGgG
abcDdDdDefGgGgG
6179
垢版 |
2025/02/15(土) 10:39:20.52ID:1WENuqRv
>>611
お断り〜します〜♪
    ハハ
   (゚ω゚)
 ((⊂ノ  ノつ))
   (_⌒ヽ
εニ≡ )ノ`J
2025/02/15(土) 10:40:34.16ID:+yYMeR0h
>>594 >>608 lisp
https://ideone.com/W5gGfD
619615
垢版 |
2025/02/15(土) 13:20:38.24ID:eC3jFbuY
>>608 java
https://ideone.com/YfufZz

>>616
_人人人人人人人人人人人人_
> 置換の小文字変換!? <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄

勉強になりました
620デフォルトの名無しさん
垢版 |
2025/02/15(土) 21:05:44.70ID:rssRTGdz
>>612は文字列長が1文字の場合にバクがあった。PowerShellの0..-1は空(から)ではなく0, -1になるのが
原因 (Rの0:-1も同様)。修正するには、fの最初に if ($s.length -lt 2) {return $s} を挿入する。
621デフォルトの名無しさん
垢版 |
2025/02/15(土) 21:06:37.89ID:rssRTGdz
>>561
C++
https://ideone.com/bQBKIM
C#のヌル許容型と同じ挙動のnullable型を自作し、>>593のC#のmin2関数をジェネリック化、
ポインタ参照化して移植した。

https://ideone.com/p2LNC9
593のC++のmin2関数と実行速度を比較する¹と30%ほど遅い。文字列型や可変長数値型と
違って最大値が存在する固定長数値型では、それを利用するf593の方が良い。

──
¹ Microsoft C++では100回繰り返しテストが最適化され1回しか実行されない
レスを投稿する

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

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