プログラミングのお題スレ Part22 (854レス)
前次1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
266
(3): デフォルトの名無しさん [sage] 2024/02/21(水) 13:54:29.89 ID:ve9Dz9D8(1) AAS
>>264
264(1): ◆QZaw55cn4c [] 2024/02/20(火) 20:48:17.02 ID:RtAsHDVN(1) AAS
>>262
私は >>248
だけれども、解法としてはそれしかないと思いますね
私は解答は提出していないが、ざっくりと自分が思いついた方法

まず、以下のような操作を考える
A. 1234という入力に対して1234321を返す
B. 1234という入力に対して12344321を返す
ここで、xという入力に対してA,Bが返す数をA(x),B(x)と表すことにする

次に、与えられた数の桁数で場合分け
(1)与えられた数字の桁数が奇数の場合
例として5桁の数字を考える
N=a*10000+b*1000+c*100+d*10+e*1 (a~eは1桁の自然数, aは0でない)
が与えられたとき、
M=a*100+b*10+c*1
とすると、N=10000の場合を除いて、Nに最も近い回文数は
A(M), A(M+1), A(M-1)
の3つの候補に絞られる(厳密にはA(M)とNとの大小比較からA(M±1)の何れかは明らかに候補にならないので2つを考えれば良い)
N=10000の場合は9999と10001が答え

(2)与えられた数の桁数が偶数の場合
例として6桁の数を考える
(1)と同様に
N=a*100000+b*10000+c*1000+d*100+e*10+f*1
に対して
M=a*100+b*10+c*1
とすると、N=100000の場合を除いて
B(M), B(M+1), B(M-1)
のどれかがNに最も近い回文数(厳密には以下略)
N=100000の場合は99999と100001が答え

十分大きな数に対しては虱潰しに回文判定していくより速く求まる
513: デフォルトの名無しさん [sage] 2025/01/31(金) 00:36:51.89 ID:MBodgIXJ(1) AAS
>>510
510(21): デフォルトの名無しさん [] 2025/01/30(木) 21:27:24.39 ID:te1+SH0T(1) AAS
お題
ソース文字列と検索文字列が入力されます
検索文字列の文字をすべて含むソース文字列の部分文字列のうち
一番短い部分文字列を出力してください

DHBICEJAFG EIC → ICE
FDGJHCBIEA EIC → CBIE
FBHDCIJGEA EIC → CIJGE
JDIBGHCEAF EIC → IBGHCE
JBCIAGDHEF EIC → CIAGDHE
EJFBCAGIHD EIC → EJFBCAGI
IADCGJFBEH EIC → IADCGJFBE
IDFHBJGAEC EIC → IDFHBJGAEC
ruby
外部リンク:ideone.com
528: デフォルトの名無しさん [sage] 2025/02/02(日) 19:41:14.89 ID:NpAQnhYs(1) AAS
リンクリストなら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
}
}
570
(2): デフォルトの名無しさん [] 2025/02/11(火) 20:45:09.89 ID:hMHygfcC(1) AAS
>>561
561(15): デフォルトの名無しさん [] 2025/02/11(火) 10:54:21.93 ID:E5oVpL7o(1/5) AAS
お題
数列が入力されます
ニ番目に小さい数を出力してください

入力:4, 5, 1, 7, 1, 2, 8, 9, 2, 7
出力:2
R
外部リンク:ideone.com

C++
外部リンク:ideone.com

それぞれ3通りの方法で、大きなデータでの実行時間を比較
621
(3): デフォルトの名無しさん [] 2025/02/15(土) 21:06:37.89 ID:rssRTGdz(3/9) AAS
>>561
C++
外部リンク:ideone.com
C#のヌル許容型と同じ挙動のnullable型を自作し、>>593
593(2): デフォルトの名無しさん [] 2025/02/12(水) 22:44:39.40 ID:Qtl/TEf6(2/2) AAS
>>561 571
>>570のC++のf3をint型の最大値を含むデータにも対応させた。

C#にはint?型があるのですっきり書けるが、
外部リンク:ideone.com

C++ではまあまあすっきり書くにはintへのポインタを返すしかないか。
外部リンク:ideone.com
(該当値が複数の位置に存在する場合にそれらのうちのどれへのポインタを返すかについては
こだわらないものとする)
のC#のmin2関数をジェネリック化、
ポインタ参照化して移植した。

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

──
¹ Microsoft C++では100回繰り返しテストが最適化され1回しか実行されない
724: デフォルトの名無しさん [sage] 2025/03/31(月) 05:32:04.89 ID:lZyiUZP+(1) AAS
>>718
718(5): デフォルトの名無しさん [sage] 2025/03/30(日) 01:28:45.68 ID:KrBJAiIU(1) AAS
お題:1〜10までの範囲の乱数生成をn回行ったとき出た値の積が20の倍数になる確率Pnを出力せよ

n=2
2, 10 ... 20
4, 5 ... 20
Pn=???

n=3
2, 5, 2 ... 20
4, 5, 2 ... 40
Pn=???
学校の課題をここに書くなって教わらなかったの?
752: デフォルトの名無しさん [] 2025/04/11(金) 22:44:47.89 ID:4wK2/GRg(1) AAS
>>750
750(3): デフォルトの名無しさん [sage] 2025/04/11(金) 07:38:20.09 ID:oaeJuxMT(1) AAS
>>738 に手を加えて10倍速くしてみた
fn solve(n: usize, limit: usize) -> Vec<usize> {
 let mut answer = Vec::new();
 let mut pnt = generate_primes(n).windows(2).rev().map(|s| (s[1], s[0], 0, 0)).collect::<Vec<_>>();
 let (mut ci, mut cn, mut ct) = (0, n, 1_usize);
 'advance: loop {
  pnt[ci..].iter_mut().for_each(|(_p, _q, n, t)| (*n, *t) = (cn, ct));
  if cn & 1 == 0 && ct.leading_zeros() >= (cn >> 1) as u32 {
   ct <<= cn >> 1; if ct <= limit { answer.push(ct); }
  }
  'back: for (i, (p, q, n, t)) in pnt.iter_mut().enumerate().rev() {
   'again: loop {
    if *n < *p { continue 'back; }
    *n -= *p; *t *= *p;
    if *n ==1 || *t > limit { continue 'back; }
    if *n == 0 { answer.push(*t); continue 'back; }
    if *q > 3 {
     let mut tt = *t * (*n % *q);
     for _ in 0..(*n / *q) { tt *= *q; if tt > limit { continue 'again; } }
    }; break 'again;
   }; (ci, cn, ct) = (i, *n, *t); continue 'advance;
  }; break 'advance;
 }; answer.sort(); answer
}
これはとても速いな。ローカルで実行してみたら、>>738
738(7): デフォルトの名無しさん [sage] 2025/04/08(火) 23:28:40.30 ID:OzdBhfzQ(1/2) AAS
>>712  Rust
fn solve(n: usize, limit: usize) -> Vec<usize> {
 let mut answer = Vec::new();
 let mut pnt = generate_primes(n).iter().skip(1).rev().map(|&p| (p, 0, 0)).collect::<Vec<_>>();
 let (mut ci, mut cn, mut ct) = (0, n, 1_usize);
 'advance: loop {
  pnt[ci..].iter_mut().for_each(|(_p, n, t)| (*n, *t) = (cn, ct));
  if cn & 1 == 0 && ct.leading_zeros() >= (cn >> 1) as u32 {
   ct <<= cn >> 1;
   if ct <= limit { answer.push(ct as usize); }
  }
  for (i, (p, n, t)) in pnt.iter_mut().enumerate().rev() {
   if *n < *p { continue; }
   *n -= *p; *t *= *p;
   if *t > limit { continue; }
   if *n == 1 { continue; }
   if *n == 0 { answer.push(*t as usize); continue; }
   (ci, cn, ct) = (i, *n, *t);
   continue 'advance;
  };
  break;
 }
 answer.sort(); answer
}
のRustプログラムと比較して
2000万以下で16倍、20億以下で55倍の速さだった。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.054s