プログラミングのお題スレ Part22 (788レス)
プログラミングのお題スレ Part22 http://mevius.5ch.net/test/read.cgi/tech/1691038333/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
1: デフォルトの名無しさん [] 2023/08/03(木) 13:52:13.20 ID:/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/ http://mevius.5ch.net/test/read.cgi/tech/1691038333/1
662: デフォルトの名無しさん [sage] 2025/02/28(金) 23:07:16.17 ID:SRu+xdWw よく見たらみんな絶対値をとったりbigintを使ったりしてるな http://mevius.5ch.net/test/read.cgi/tech/1691038333/662
663: デフォルトの名無しさん [] 2025/03/01(土) 20:18:20.34 ID:H8RpZRUP >>656 PowerShellのBigIntなら、 $b = @(0) 1..8 |% {$b += $b |% {$_ + 1}} function bit_count([BigInt]$n) { ($b[[BigInt]::Abs($n).ToByteArray()] | measure -sum).Sum } 65535, 15, 6, 1, 0, -1, -6, -15, -65535, [BigInt]::Pow(123, 45) |% { "$_ → $(bit_count $_)" } [実行結果] 65535 → 16 15 → 4 6 → 2 1 → 1 0 → 0 -1 → 1 -6 → 2 -15 → 4 -65535 → 16 11110408185131956285910790587176451918559153212268021823629073199866111001242743283966127048043 → 159 http://mevius.5ch.net/test/read.cgi/tech/1691038333/663
664: デフォルトの名無しさん [] 2025/03/01(土) 20:19:24.06 ID:H8RpZRUP お題:1からnまでの自然数のビット単位での総排他的論理和1 ⊕ 2 ⊕ 3 ⊕ … ⊕ nを求める 関数を作り、n = 123456789, 12345678901234567890のときの値を表示せよ。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/664
665: デフォルトの名無しさん [] 2025/03/01(土) 21:19:28.22 ID:5VrbV50/ A003815かな http://mevius.5ch.net/test/read.cgi/tech/1691038333/665
666: デフォルトの名無しさん [sage] 2025/03/01(土) 21:32:49.43 ID:UfbLQAky 数学の試験で中間式を省いて解答だけ書くタイプw http://mevius.5ch.net/test/read.cgi/tech/1691038333/666
667: デフォルトの名無しさん [] 2025/03/01(土) 23:41:19.76 ID:+HRoh0yF まあ数列の問題ならOEISを見てみるよな http://mevius.5ch.net/test/read.cgi/tech/1691038333/667
668: デフォルトの名無しさん [sage] 2025/03/02(日) 01:21:29.93 ID:xdmIFouH >> 664 Rust fn f(n: u64) -> u64 { // f(n) = 1⊕2⊕3⊕...⊕n とすると (2k)⊕(2k+1)=1 であるから 1⊕1=0 より // f(4k+1) = (4k+1)⊕(4k)⊕(4k-1)⊕(4k-2)⊕f(4k-3) = f(4(k-1)+1) = ... = f(1) = 1 // f(4k+3) = (4k+3)⊕(4k+2)⊕f(4k+1) = 0 // f(4k) = (4k)⊕f(4k-1) = 4k // f(4k+2) = (4k+2)⊕f(4k+1) = (4k+2)⊕1 = 4k+3 match n % 4 { 0 => n, 1 => 1, 2 => n + 1, 3 => 0, _ => unreachable!(), } } fn main() { for n in [123456789, 12345678901234567890] { println!("f({n}) = {fn}", fn = f(n)); } } 出力 f(123456789) = 1 f(12345678901234567890) = 12345678901234567891 http://mevius.5ch.net/test/read.cgi/tech/1691038333/668
669: デフォルトの名無しさん [] 2025/03/11(火) 21:18:30.26 ID:Qmk3F8/1 >>656 PowerShellでもPopCountがいつの間にか使えるようになっていた。Version 7.5.0で動作確認。 function bit_count($n) { [BigInt]::PopCount([BigInt]::Abs($n)) } 65535, 15, 6, 1, 0, -1, -6, -15, -65535, [BigInt]::Pow(123, 45) |% { "$_ → $(bit_count $_)" } 実行結果は>>663と同じ。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/669
670: デフォルトの名無しさん [] 2025/03/13(木) 20:35:03.45 ID:QP/8WHEA お題:数列が入力される。元の数列に逆順にした数列を減算したときの値を出力せよ In < 12345 OUt > -41976 (12345 - 54321) http://mevius.5ch.net/test/read.cgi/tech/1691038333/670
671: デフォルトの名無しさん [] 2025/03/13(木) 21:13:53.77 ID:SRpNsp20 >>670 PowerShell function f([BigInt]$n) { $c = [char[]][string]$n $n - [BigInt]-join $c[-1..-$c.length] } 12345, [BigInt]::Pow(12, 34) |% {"$_ → $(f $_)"} [実行結果] 12345 → -41976 4922235242952026704037113243122008064 → 314233029528909439273950854852378624 http://mevius.5ch.net/test/read.cgi/tech/1691038333/671
672: デフォルトの名無しさん [sage] 2025/03/14(金) 02:10:51.25 ID:wjeVVi0w >>671 12の34乗は合っているけどその後の差がおかしくない? 4922235242952026704037113243122008064 から 4608002213423117304076202592425322294 を引いて 314233029528909399960910650696685770 が正解のところ 314233029528909439273950854852378624 となっているよ 正解は1の位が「4 - 4 = 0」になるはずだよね >>670 Rust 逆文字列を生成する版 use num::BigInt; fn odai(input: &str) -> Option<String> { let rev_input: String = input.chars().rev().collect(); let x: BigInt = input.parse().ok()?; let y: BigInt = rev_input.parse().ok()?; Some((x - y).to_string()) } fn main() { assert_eq!(odai("12345"), Some("-41976".to_string())); assert_eq!(odai("4922235242952026704037113243122008064"), Some("314233029528909399960910650696685770".to_string())); } http://mevius.5ch.net/test/read.cgi/tech/1691038333/672
673: デフォルトの名無しさん [sage] 2025/03/14(金) 02:30:00.58 ID:wjeVVi0w >>670 Rust 逆文字列を生成しない&整数ジェネリック版 use num::{BigInt, CheckedAdd, CheckedMul, CheckedSub, FromPrimitive}; fn chars_to_integer<X>(input: impl Iterator<Item = char>) -> Option<X> where X: FromPrimitive + CheckedMul + CheckedAdd, { let (zero, ten) = (X::from_u32(0).unwrap(), X::from_u32(10).unwrap()); input .map(|c| X::from_u32(c.to_digit(10)?)) .try_fold(zero, |acc, x| acc.checked_mul(&ten)?.checked_add(&x?)) } fn odai<X>(input: &str) -> Option<X> where X: FromPrimitive + CheckedMul + CheckedAdd + CheckedSub, { let x = chars_to_integer::<X>(input.chars())?; let y = chars_to_integer::<X>(input.chars().rev())?; x.checked_sub(&y) } fn main() { assert_eq!(odai::<i64>("12345"), Some(-41976)); assert_eq!(odai::<BigInt>("4922235242952026704037113243122008064"), Some("314233029528909399960910650696685770".parse::<BigInt>().unwrap())); } http://mevius.5ch.net/test/read.cgi/tech/1691038333/673
674: デフォルトの名無しさん [] 2025/03/14(金) 20:19:17.17 ID:Imul3vYR >>672 確かに間違っていた。PowerShellの旧ヴァージョンでは [BigInt]文字列 と書くだけで 文字列をBigInt型に正確に変換できるから>>671のプログラムでも正しい結果が得られるが、 新ヴァージョンではdouble経由での変換に仕様変更されたようで誤差が生じてしまうから [BigInt]::Parse(文字列) と書かなければならなくなった。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/674
675: デフォルトの名無しさん [] 2025/03/14(金) 21:36:16.55 ID:pC/XkvI4 数列の長さは指定されていない。 10 INPUT "0-9";I 20 PRINT "0" 30 END http://mevius.5ch.net/test/read.cgi/tech/1691038333/675
676: デフォルトの名無しさん [sage] 2025/03/15(土) 19:04:58.28 ID:GCbQqql0 >>673 これらのwhere~は何という名称ですか? > where X: FromPrimitive + CheckedMul + CheckedAdd, > where X: FromPrimitive + CheckedMul + CheckedAdd + CheckedSub, http://mevius.5ch.net/test/read.cgi/tech/1691038333/676
677: 9 [sage] 2025/03/16(日) 00:12:31.12 ID:8GU62dKf >>670 Perl5 use bigint; print $_ - reverse($_), "\n" for 12345, 4922235242952026704037113243122008064; 実行結果 $ perl 22_670_reverse_minus_biginit.pl -41976 314233029528909399960910650696685770 http://mevius.5ch.net/test/read.cgi/tech/1691038333/677
678: 警備員[Lv.23] [] 2025/03/16(日) 17:25:01.96 ID:wlGuyFJ7 >>670 Kotlin 文字列にしてひっくり返しているだけの何の捻りもないプログラム https://paiza.io/projects/VBq2l9lhzmUxVo6xAMuAHg http://mevius.5ch.net/test/read.cgi/tech/1691038333/678
679: デフォルトの名無しさん [] 2025/03/16(日) 22:59:41.54 ID:wtk+s/+W >>670 PowerShellでジェネリック化(もどき?) 途中式や結果が入力値の型で表せない場合は$nullを返す。 function f($n) { $T = $n.GetType() $s = [string]$n try { $n - $T::Parse(-join $s[-1..-$s.Length]) -as $T } catch { $null } } 12345, [BigInt]::Pow(12, 34), [byte]12, [sbyte]12, [sbyte]123, -123 |% { "[$($_.GetType())]$_ → $(f $_)" } -- 実行結果 -- [int]12345 → -41976 [bigint]4922235242952026704037113243122008064 → 314233029528909399960910650696685770 [byte]12 → [sbyte]12 → -9 [sbyte]123 → [int]-123 → http://mevius.5ch.net/test/read.cgi/tech/1691038333/679
680: デフォルトの名無しさん [] 2025/03/16(日) 23:01:39.52 ID:6JX6mCC/ お題:36桁以下の負でない整数で16進表記が10進表記の部分文字列であるものをすべて求めて下さい。 (例) ・1の16進表記1は10進表記1の部分文字列です ・123の16進表記7Bは10進表記123の部分文字列ではありません ・357440の16進表記57440は10進表記357440の部分文字列です ※遅い言語では15桁以下で解いても構いません http://mevius.5ch.net/test/read.cgi/tech/1691038333/680
681: デフォルトの名無しさん [sage] 2025/03/16(日) 23:59:39.36 ID:qWmLE6LP >>676 where句だよ 型Xのトレイト境界を宣言してる http://mevius.5ch.net/test/read.cgi/tech/1691038333/681
682: 9 [sage] 2025/03/18(火) 16:05:22.66 ID:GYPHuJM6 >>680 Perl5、ナイーブな処理方式だと時間がかかり過ぎで最後まで解けないおそれがあるが、なかなかほかに回答者が現れないし、 出現傾向を見るだけでも…と思って、16進数の桁にa-fの現れる値をskipするナイーブな処理方法で。 $m = sprintf '%x', 9 x 15; # 10進で15桁まで print $m . ' '. hex($m)."\n"; $m =~ s/[a-f]/9/g; print "1 .. 0x$m\n"; print "".localtime."\n"; for (1 .. $m) { $d = hex($_); if (0 <= index($d, $_)) { $n++; print "$d, 0x$_\n"; } } print "".localtime."\n"; print "$n count found"; http://mevius.5ch.net/test/read.cgi/tech/1691038333/682
683: 9 [sage] 2025/03/18(火) 16:07:07.28 ID:GYPHuJM6 >>682 実行結果 (改行数を減らすため適度につなげてます) $ perl 22_680_hex_substr_1.pl 38d7ea4c67fff 999999999999999 1 .. 0x3897994967999 Tue Mar 18 09:15:31 2025 1, 0x1 2, 0x2 3, 0x3 4, 0x4 5, 0x5 6, 0x6 7, 0x7 8, 0x8 9, 0x9 357440, 0x57440 357441, 0x57441 357442, 0x57442 357443, 0x57443 357444, 0x57444 357445, 0x57445 357446, 0x57446 357447, 0x57447 357448, 0x57448 357449, 0x57449 1079653, 0x107965 1081713, 0x108171 1122966, 0x112296 1123079, 0x112307 1123080, 0x112308 2246166, 0x224616 3369253, 0x336925 3371313, 0x337131 3412566, 0x341256 4494393, 0x449439 4494400, 0x449440 4535653, 0x453565 5658739, 0x565873 5658740, 0x565874 5660793, 0x566079 5660800, 0x566080 5702166, 0x570216 6783879, 0x678387 6783880, 0x678388 6784000, 0x678400 6825253, 0x682525 7948339, 0x794833 7948340, 0x794834 7950393, 0x795039 7950400, 0x795040 2182104640, 0x82104640 2182104641, 0x82104641 2182104642, 0x82104642 2182104643, 0x82104643 2182104644, 0x82104644 2182104645, 0x82104645 2182104646, 0x82104646 2182104647, 0x82104647 2182104648, 0x82104648 2182104649, 0x82104649 1263629042727, 0x12636290427 1307655353654, 0x13076553536 2573583194436, 0x25735831944 2617616245848, 0x26176162458 3330782168640, 0x30782168640 3330782168641, 0x30782168641 3330782168642, 0x30782168642 3330782168643, 0x30782168643 3330782168644, 0x30782168644 3330782168645, 0x30782168645 3330782168646, 0x30782168646 3330782168647, 0x30782168647 3330782168648, 0x30782168648 3330782168649, 0x30782168649 3883544086630, 0x38835440866 3927569962533, 0x39275699625 3927570397557, 0x39275703975 Core i7-8559U で6時間ほど実行してここまで高々13桁。 やはり想定通り気の利いた高速解放が要りますテヘペロ。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/683
684: デフォルトの名無しさん [sage] 2025/03/18(火) 16:35:06.57 ID:lVLkTjWA >>680 ruby (0..10**16-1).each{|e| puts "#{e},0x#{e.to_s(16)}" if %r|[a-f]|!~e.to_s(16)} http://mevius.5ch.net/test/read.cgi/tech/1691038333/684
685: デフォルトの名無しさん [] 2025/03/18(火) 21:39:06.90 ID:9hwr8+MV >>683 14桁と15桁には該当値がないので、そこに列挙された数に0を追加した72個が15桁以下の答で 結果的には合っているよ。 出題時に作ったC++プログラムはideoneで36桁以下を0.43秒で完了した。これをPowerShellに 移植したプログラムは15桁以下を0.5秒未満、36桁以下を数分で完了した。 その後、改良したC++プログラムではideoneで36桁以下を0.23秒に短縮できた。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/685
686: 9 [sage] 2025/03/18(火) 21:41:48.53 ID:GYPHuJM6 >>683 >やはり想定通り気の利いた高速解放が要りますテヘペロ。 そのヒントになるかいな…? ・16進数を10進数に変換すると桁数は同じまたは高々1桁増えるのみ(だともう、証明略) ・桁数が同じ場合、16進数と10進数が同じということはあり得ない、自明 ・一桁増える場合は先頭または末尾に一桁増える。残りが16進数と同じ部分文字列であるかが評価対象となる http://mevius.5ch.net/test/read.cgi/tech/1691038333/686
687: 9 [sage] 2025/03/18(火) 21:42:49.00 ID:GYPHuJM6 >>685 あそうなんだ。じゃオレ様が一番乗りということでヨロ ノシ http://mevius.5ch.net/test/read.cgi/tech/1691038333/687
688: 9 [sage] 2025/03/18(火) 21:52:10.05 ID:GYPHuJM6 >>686 >・一桁増える場合は先頭または末尾に一桁増える。残りが16進数と同じ部分文字列であるかが評価対象となる 二桁増える場合があるのでこれは誤りでした http://mevius.5ch.net/test/read.cgi/tech/1691038333/688
689: 684 [sage] 2025/03/19(水) 06:18:11.44 ID:khMnA4jS ようやく題意は理解したけど良い解法が思いつかない ちなみに36桁以下だと答えはいくつありますか? http://mevius.5ch.net/test/read.cgi/tech/1691038333/689
690: デフォルトの名無しさん [sage] 2025/03/19(水) 08:44:27.79 ID:khMnA4jS >>680 ruby 遅いけど i=0 while i<10**16 if %r|[a-f]|=~i.to_s(16) i=i.to_s(16).gsub(%r|[a-f].*|){|e| e.gsub(%r|.|,"f")}.hex else puts "#{i},0x#{i.to_s(16)}" if %r|#{i.to_s(16)}|=~i.to_s end i+=1 end http://mevius.5ch.net/test/read.cgi/tech/1691038333/690
691: 9 [sage] 2025/03/19(水) 16:33:58.47 ID:kDrq13vm >>686 > ・桁数が同じ場合、16進数と10進数が同じということはあり得ない、自明 大間違い。16進数と10進数で桁数が同じ値のうち、一桁のものは、16進も10審も同じだった…orz 結局、高速解放はあるんだろうか? あるいはコラッツ予想みたいに「無いかもしれない」類の、考えるだけ無駄な問題なのだろうか? http://mevius.5ch.net/test/read.cgi/tech/1691038333/691
692: デフォルトの名無しさん [] 2025/03/19(水) 21:08:24.40 ID:VtmjGkS9 >>689 167個で最大値は697786638998562641695629924526065234 >>691 時間をかけて64桁以下で解いたら、405個で最大値は 2714476666993915057605587441263923823484611431446449961712093492 だった。これはナイーヴな解法ではC++ですら到底求められない値だから、高速解法が 実在する証になっているだろう。 解答例は1週間くらい経ったら載せるので、それまでよく考えてみて下さい。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/692
693: デフォルトの名無しさん [] 2025/03/19(水) 22:39:07.36 ID:P0JLFopv お題:単位分数のエジプト風分解(2進数風味) 1/aを、1/a=1/b+c/dを満たす1/bとc/dに分解する。 aは1以上の整数とする。 c, dは整数とし、bは2の整べき乗(1, 2, 4,...)とする。 c/dは絶対値が最小である事(負数であってもよい)。 例: 1/3→1/4+1/12 : b=4, c=1, d=12 1/7→1/8+1/56 : b=8, c=1, d=56 1/9→1/8-1/72 : b=8, c=-1, d=72(c=1, d=-72も可) 1/13→1/16+3/208 : b=16, c=3, d=288 1/60→1/64+1/960 : b=64, c=1, d=960 http://mevius.5ch.net/test/read.cgi/tech/1691038333/693
694: 693 [] 2025/03/19(水) 22:42:43.02 ID:P0JLFopv aは2以上の整数とする。 に訂正します。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/694
695: デフォルトの名無しさん [] 2025/03/19(水) 23:16:25.83 ID:G4dDQ6P7 >>693 R https://ideone.com/TaaAw2 aが2の整べき乗の場合の出力形式に指定がなかったので適当に決めた。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/695
696: デフォルトの名無しさん [sage] 2025/03/20(木) 08:21:38.87 ID:6IEA4H0O >>693 Rust fn f(a: i64) -> String { let b = (a as u64).next_power_of_two() as i64; let b = if 3 * a > 2 * b { b } else { b >> 1 }; let (c, d) = (b - a, a * b); let shift = c.trailing_zeros().min(d.trailing_zeros()); let (c, d) = (c >> shift, d >> shift); if a == b { format!("1/{a}=1/{b}") } else { format!("1/{a}=1/{b}{c:+}/{d}") } } fn main() { assert_eq!("1/3=1/4+1/12", f(3)); assert_eq!("1/7=1/8+1/56", f(7)); assert_eq!("1/9=1/8-1/72", f(9)); assert_eq!("1/13=1/16+3/208", f(13)); assert_eq!("1/60=1/64+1/960", f(60)); assert_eq!("1/64=1/64", f(64)); assert_eq!("1/6718464=1/8388608+1631/55037657088", f(6718464)); assert_eq!("1/123456789=1/134217728+10760939/16570089725755392", f(123456789)); } http://mevius.5ch.net/test/read.cgi/tech/1691038333/696
697: デフォルトの名無しさん [sage] 2025/03/21(金) 12:56:29.73 ID:CgJbZEAu >>680 Rust fn odai_680() -> Vec<i128> { let mut answer = vec![0]; let n_max = (0..).find(|&n| pow16(n + 1) > pow10(36)).unwrap(); for s in (0..).take_while(|&s| pow16(n_max) >= pow10(n_max + s + 1)) { let c = (0..=n_max).map(|i| pow16(i) - pow10(i + s)).collect::<Vec<_>>(); let rmax = c.iter().scan(0, |s, &c| { *s += if c > 0 { c * 9 } else { 0 }; Some(*s) }).collect::<Vec<_>>(); let rmin = c.iter().scan(0, |s, &c| { *s += if c < 0 { c * 9 } else { 0 }; Some(*s) }).collect::<Vec<_>>(); let (mut i, mut n, mut d, mut ct) = (0, 1, vec![0; c.len()], vec![0; c.len() + 1]); loop { d[i] += 1; if d[i] < 10 { let m = pow10(n as u32 + s); ct[i] = c[i] * d[i] + ct[i+1]; if i == 0 { if ct[0] >= 0 && ct[0] % m < pow10(s) { answer.push(d.iter().take(n).rev().fold(0, |sum, &d| sum * 16 + d)) } } else { let (max, min) = (ct[i] + rmax[i-1], ct[i] + rmin[i-1]); if max >= 0 && (max - min > m || pow10(s) > min % m || min % m > max % m) { i -= 1; } } } else { d[i] = -1; i += 1; if i == n { if n == d.len() { break; } n += 1; } } } } answer.sort(); answer } http://mevius.5ch.net/test/read.cgi/tech/1691038333/697
698: デフォルトの名無しさん [sage] 2025/03/21(金) 12:58:11.47 ID:CgJbZEAu >>697 // 略記 fn pow16(x: u32) -> i128 { 16_i128.pow(x) } fn pow10(x: u32) -> i128 { 10_i128.pow(x) } // 結果検証 fn main() { let answer = odai_680(); assert_eq!(167, answer.len()); for &a in &answer { assert!(a.to_string().contains(&format!("{a:x}"))); } assert_eq!(0, answer[0]); assert_eq!(1, answer[1]); assert_eq!(357440, answer[10]); assert_eq!(2182104649, answer[54]); assert_eq!(3927570397557, answer[71]); assert_eq!(38135630558262267902210, answer[99]); assert_eq!(331052794565713975838768757043267, answer[152]); assert_eq!(697786638998562641695629924526065234, answer[answer.len() - 1]); } http://mevius.5ch.net/test/read.cgi/tech/1691038333/698
699: デフォルトの名無しさん [] 2025/03/21(金) 20:49:29.98 ID:uwhksDTb >>697-698 Rustはよく知らないが、mainのforループ内をprintln!("{}", a);に置き換えれば解が表示されるんだよね? 実行結果を>>685で述べたC++プログラムのものと照合したら167個の解すべてが一致した。見事正解! 実行時間はC++プログラムの数倍かかるようだが、ideoneでの実行時間も見たいので載せて下さい。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/699
700: デフォルトの名無しさん [] 2025/03/23(日) 23:00:51.13 ID:pi1bImlR >>680から1週間経ったので解答例を掲載 >>685を書いたときに作ってあった2つのC++プログラム https://ideone.com/KID2jR https://ideone.com/ysdd6b 1番目ではsolve関数の再帰呼び出しの対象とするx[p]の下限と上限を線形探索するが、 2番目では二分探索する。要素数10では二分探索の効果は薄いと思いきや、大分速くなった。 2番目を読み返していたらバグを発見してしまった。i = N - 1のとき63行目のa[i + 1]はa[N]となり 配列の添字範囲外アクセス。0との比較だけだし、if文の評価がどっちでも以降の処理は結局同じだから、 実害も解への影響もないが、厳格さが必要ならif ((i + 1 < N ? a[i + 1] : 0) >= 0) {と書き換えるべきだな。 実行時間への影響は無視できる。 それぞれのPowerShellへの移植版 https://ideone.com/vEGZ3D https://ideone.com/azzMa4 完全な逐語訳ではなく、PowerShellで書くと遅くなったり煩雑になったりする箇所は適宜改変した。 15桁以下の場合は64ビット整数でも桁溢れしないので、BigIntの代わりにInt64を使えば少し速くなる。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/700
701: デフォルトの名無しさん [] 2025/03/24(月) 22:16:36.44 ID:/lNBwDBZ 非素数であることが既知の巨大整数を素因数分解するときの 最速のアルゴリズムって何がある? http://mevius.5ch.net/test/read.cgi/tech/1691038333/701
702: デフォルトの名無しさん [] 2025/03/25(火) 15:25:56.57 ID:Yc/egiP0 >>699 > 実行時間はC++プログラムの数倍かかるようだが rustc -C opt-level=2 でコンパイルしたら g++ -O2 でコンパイルした ideone_KID2jR.cpp (>>700の一つめ) とほぼ同じ速度出たよ http://mevius.5ch.net/test/read.cgi/tech/1691038333/702
703: デフォルトの名無しさん [sage] 2025/03/25(火) 15:54:47.24 ID:GZ5kfx5g >>702 データ精度を揃えたアルゴリズム比較のために >>697-698をi128固定ではなくnum::BigIntにして計測して見ては? あと出題者>>685は>>700の二つ目で(倍速以上に)短縮出来たと言っているよ http://mevius.5ch.net/test/read.cgi/tech/1691038333/703
704: デフォルトの名無しさん [] 2025/03/25(火) 16:11:02.68 ID:Yc/egiP0 そこまでは興味ないや 「数倍」だったのはもしかして最適化オプション付けてなかったんじゃない?ってだけの話 http://mevius.5ch.net/test/read.cgi/tech/1691038333/704
705: デフォルトの名無しさん [] 2025/03/25(火) 17:30:47.40 ID:Yc/egiP0 >>697-698をBigIntに変えるのはどうしたらいいのか分かんなかったので >>700の方を boost::multiprecision::cpp_int から boost::multiprecision::int128_t に変えてみた 改変版 | オリジナル https://ideone.com/Ie0HhO 0.12s | https://ideone.com/KID2jR 0.43s https://ideone.com/np3p5h 0.11s | https://ideone.com/ysdd6b 0.23s http://mevius.5ch.net/test/read.cgi/tech/1691038333/705
706: デフォルトの名無しさん [sage] 2025/03/25(火) 20:18:24.92 ID:oTGl9wWX >>705 感心した、出題者回答C++コードはほんの少し変更するだけで簡単にBigInt/i128切り替え出来るのか >>697-698 Rustはどうなのかな? http://mevius.5ch.net/test/read.cgi/tech/1691038333/706
707: デフォルトの名無しさん [] 2025/03/25(火) 23:43:24.86 ID:V/NXIH+S >>704 >>699では最適化オプションを付けてrustc -O a.rsでコンパイルした。最適化なしでは ありの4.6倍くらい掛かった。もしやと思ってコンパイラをアップデートしてみたら、 実行時間は約3分の1に激減し、>>700の1番目と大差ない1.3倍ほどに収まった。 Rustの古いコンパイラ(5年前のもの)がこんなに低性能だったとは… http://mevius.5ch.net/test/read.cgi/tech/1691038333/707
708: デフォルトの名無しさん [sage] 2025/03/27(木) 11:39:31.21 ID:vU3T1Sq/ >>697 crateのnumを使う http://mevius.5ch.net/test/read.cgi/tech/1691038333/708
709: デフォルトの名無しさん [] 2025/03/27(木) 20:29:20.38 ID:DyGv4jyd c言語で実用的なプログラムを作りたい。 いいテーマはありますか? http://mevius.5ch.net/test/read.cgi/tech/1691038333/709
710: デフォルトの名無しさん [sage] 2025/03/27(木) 20:35:59.71 ID:cvPlHeM5 お題:#(シャープ)を入力の段数でウンコ状に並べて出力せよ 出力は全角でも半角でもどちらでもよしとする(5ch は半角スペース表示できない) in < 3 out > # ### ##### http://mevius.5ch.net/test/read.cgi/tech/1691038333/710
711: デフォルトの名無しさん [] 2025/03/27(木) 21:06:27.50 ID:AGn6MWSp >>710 PowerShell function unko($n) { if ($n -ge 1) {1..$n |% {" " * ($n - $_) + "#" * (2 * $_ - 1)}} } unko 3 -- 実行結果 -- # ### ##### http://mevius.5ch.net/test/read.cgi/tech/1691038333/711
712: デフォルトの名無しさん [] 2025/03/28(金) 21:33:35.13 ID:VDfNaTNz お題:素因数の総和が2025である2000万以下の自然数をすべて求めて下さい。 例) 32272 素因数分解すると32272 = 2 × 2 × 2 × 2 × 2017で、 素因数の総和は2 + 2 + 2 + 2 + 2017 = 2025となります。 ※20億以下でもC++で5秒以内に余裕で完了できますが、出力が長すぎるため2000万以下としました。 その結果、Rでも5秒以内に余裕で完了できる問題になりました。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/712
713: デフォルトの名無しさん [] 2025/03/28(金) 21:54:52.53 ID:e6/uDocq >>710 山状ではだめだったのか 俺にはわからない http://mevius.5ch.net/test/read.cgi/tech/1691038333/713
714: デフォルトの名無しさん [] 2025/03/28(金) 22:12:15.09 ID:g08AymBh お題 AさんがBさんに惚れてることを A-B と表します 両思いのペアを出力してください 入力 D-L,U-X,U-Y,U-R,Z-B,B-E,B-M,B-N,V-H,V-X,W-F,W-R,R-B,R-W,O-W,O-S,F-A,Q-X,P-E,P-L,X-X,Y-M,Y-C,L-U,L-V,I-X,E-B,H-M,A-S 出力 B,E R,W http://mevius.5ch.net/test/read.cgi/tech/1691038333/714
715: デフォルトの名無しさん [] 2025/03/28(金) 22:28:49.68 ID:VDfNaTNz >>714 PowerShell $s = "D-L,U-X,U-Y,U-R,Z-B,B-E,B-M,B-N,V-H,V-X,W-F,W-R,R-B,R-W,O-W,O-S,F-A,Q-X,P-E,P-L,X-X,Y-M,Y-C,L-U,L-V,I-X,E-B,H-M,A-S" $h = @{} $s -split "," |% { $a, $b = $_ -split "-" $h[$a] += , $b } foreach ($a in $h.keys) { foreach ($b in $h[$a]) { if ($a -lt $b -and $h[$b] -contains $a) {"$a,$b"} } } -- 実行結果 -- B,E R,W http://mevius.5ch.net/test/read.cgi/tech/1691038333/715
716: デフォルトの名無しさん [] 2025/03/28(金) 23:19:47.32 ID:VDfNaTNz >>714 PowerShellでもう少し短く $s = "D-L,U-X,U-Y,U-R,Z-B,B-E,B-M,B-N,V-H,V-X,W-F,W-R,R-B,R-W,O-W,O-S,F-A,Q-X,P-E,P-L,X-X,Y-M,Y-C,L-U,L-V,I-X,E-B,H-M,A-S" $h = @{} $s -split "," |% { $a, $b = $_ -split "-" $i, $t = if ($a -lt $b) {1, "$a,$b"} else {2, "$b,$a"} $h[$t] = $h[$t] -bor $i } $h.keys |? {$h[$_] -eq 3} | sort -- 実行結果 -- B,E R,W http://mevius.5ch.net/test/read.cgi/tech/1691038333/716
717: デフォルトの名無しさん [sage] 2025/03/29(土) 11:51:50.06 ID:UeqVkFR5 >>714 Rust use itertools::Itertools; fn f(input: &str) -> impl Iterator<Item = &str> { input.split(',') .map(|pair| (pair, pair.splitn(2, '-').collect_tuple().unwrap())) .filter(|(_, (a, b))| a < b) .flat_map(|(pair, (a, b))| { input.split(',') .map(|pair| pair.splitn(2, '-').collect_tuple().unwrap()) .filter_map(move |(x, y)| (a == y && b == x).then_some(pair)) }) } fn main() { let input = "D-L,U-X,U-Y,U-R,Z-B,B-E,B-M,B-N,V-H,V-X,W-F,W-R,R-B,R-W,O-W,O-S,F-A,Q-X,P-E,P-L,X-X,Y-M,Y-C,L-U,L-V,I-X,E-B,H-M,A-S"; itertools::assert_equal(["B-E", "R-W"], f(input).sorted()); } http://mevius.5ch.net/test/read.cgi/tech/1691038333/717
718: デフォルトの名無しさん [sage] 2025/03/30(日) 01:28:45.68 ID:KrBJAiIU お題: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=??? http://mevius.5ch.net/test/read.cgi/tech/1691038333/718
719: デフォルトの名無しさん [] 2025/03/30(日) 15:24:52.85 ID:6QsLEZYT >>718 ん? 何千回も試行してその実際の発生率を出すの? それとも数学的に確率の理論値を出すの? http://mevius.5ch.net/test/read.cgi/tech/1691038333/719
720: デフォルトの名無しさん [sage] 2025/03/30(日) 15:35:52.69 ID:bQF7/1H+ 後者で学校の課題な予感がするな http://mevius.5ch.net/test/read.cgi/tech/1691038333/720
721: デフォルトの名無しさん [] 2025/03/30(日) 20:11:24.72 ID:qyCZpZxd >>718 R Version4 https://ideone.com/r03zEZ ideoneのRは古すぎてエラーが出てしまうので、出力は入力欄に記載した。 巨大整数型を使わなければideoneでも実行できる。 https://ideone.com/K0RefY http://mevius.5ch.net/test/read.cgi/tech/1691038333/721
722: デフォルトの名無しさん [] 2025/03/30(日) 20:58:57.54 ID:qyCZpZxd >>718 C++への移植版 https://ideone.com/g87ECX これもideoneのC++が古すぎて10行目をm = size(d)と書けず変更せざるを得なかった。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/722
723: 警備員[Lv.4] [] 2025/03/31(月) 03:24:21.45 ID:V+SeThnI >>714 Kotlin //paiza.io/projects/WMZL8ULLNxc0zJQPI2uUsA URLあると書けなかったので先頭のhttps:を抜いた。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/723
724: デフォルトの名無しさん [sage] 2025/03/31(月) 05:32:04.89 ID:lZyiUZP+ >>718 学校の課題をここに書くなって教わらなかったの? http://mevius.5ch.net/test/read.cgi/tech/1691038333/724
725: デフォルトの名無しさん [] 2025/03/31(月) 22:37:26.59 ID:eEIz6yDp >>718 >>721-722を整理して行列とヴェクトルの積ですっきり書けるようにした。 R (ideoneでも巨大整数型で実行可能になった) https://ideone.com/sHNag3 C++ https://ideone.com/7zgflb 式を展開してしまえばPowerShellで結局これだけ。 $a, $b, $c, $d, $e, $f = 0, 1, 1, 2, 2, [BigInt]4 2..100 |% { $a = 10 * $a + 5 * $b + 2 * $c + 2 * $d + $e $b = 5 * $b + 3 * $c + $e + $f $c = 5 * $c + $f $d = 8 * $d + 4 * $e + 2 * $f $e = 4 * $e + 2 * $f $f = 4 * $f for ($p = $a; $p % 10 -eq 0; $p /= 10) {} "P[$_] = 0.$p" } http://mevius.5ch.net/test/read.cgi/tech/1691038333/725
726: デフォルトの名無しさん [] 2025/04/01(火) 22:39:42.98 ID:9GVSWQu0 半角スペースの意味がわからない そういうこだわりは古臭いよ http://mevius.5ch.net/test/read.cgi/tech/1691038333/726
727: デフォルトの名無しさん [sage] 2025/04/02(水) 13:29:35.55 ID:k9Y5euIy いまどきのプログラミングなら出力はHTMLだよな http://mevius.5ch.net/test/read.cgi/tech/1691038333/727
728: デフォルトの名無しさん [sage] 2025/04/02(水) 13:47:27.57 ID:hi8l+lAW PHPさえその動作禁止だぞ http://mevius.5ch.net/test/read.cgi/tech/1691038333/728
729: デフォルトの名無しさん [] 2025/04/02(水) 14:31:23.27 ID:vIYRPSqy >>725 変数名がa、b、cの時点でプロじゃねえな http://mevius.5ch.net/test/read.cgi/tech/1691038333/729
730: デフォルトの名無しさん [sage] 2025/04/02(水) 15:10:39.64 ID:hi8l+lAW 行列演算は数学でもa,b,c,dだから… http://mevius.5ch.net/test/read.cgi/tech/1691038333/730
731: デフォルトの名無しさん [] 2025/04/02(水) 19:51:02.16 ID:7MGV8+qg 俺が言ってるのは5chのプロじゃねえなってことだから 数学は関係ない http://mevius.5ch.net/test/read.cgi/tech/1691038333/731
732: デフォルトの名無しさん [] 2025/04/02(水) 19:56:31.51 ID:/hTkauy0 5chのプロ 笑 http://mevius.5ch.net/test/read.cgi/tech/1691038333/732
733: デフォルトの名無しさん [sage] 2025/04/02(水) 20:14:17.34 ID:ZWpp3MuE 5chのプロはどんな変数名使うのか教えて http://mevius.5ch.net/test/read.cgi/tech/1691038333/733
734: デフォルトの名無しさん [] 2025/04/02(水) 21:11:27.43 ID:HCJVcqu8 >>726 >>725の全角空白のこと? 項の書き忘れや書き間違いがないか分かりやすくするため。余分な空白や長い変数名が ディスク・メモリ空間やコンパイル・インタプリト時間を無駄に増やすと気にする方が古臭くない? とはいえ、今でもインタプリタ言語のPowerShellでは変数名を長くすると顕著に遅くなる。例えば、 $t1 = measure-command {for ($i = 0; $i -lt 1000000; $i++) {}} $t2 = measure-command {for ($AnExtraordinarilyLongVariableName = 0; $AnExtraordinarilyLongVariableName -lt 1000000; $AnExtraordinarilyLongVariableName++) {}} $t2.Ticks / $t1.Ticks をPowerShell Ver.7で実行すると1.56前後の値が表示される。奇妙なことに、かなり古いVer.2では1前後の値になる。 実時間ではVer.7の$t2とVer.2の$t2が同程度なので、Ver.7では短い変数名での最適化が施されているということか。 それはさておき、>>712を解く人はいませんか? http://mevius.5ch.net/test/read.cgi/tech/1691038333/734
735: デフォルトの名無しさん [] 2025/04/02(水) 23:31:04.18 ID:vIYRPSqy >>734 縦に揃えるのは無駄に横に長くなる http://mevius.5ch.net/test/read.cgi/tech/1691038333/735
736: デフォルトの名無しさん [] 2025/04/02(水) 23:33:04.35 ID:vIYRPSqy >>734 ループは毎回、構文を解析しているわけじゃねえぞ? http://mevius.5ch.net/test/read.cgi/tech/1691038333/736
737: 警備員[Lv.5] [] 2025/04/05(土) 14:46:26.08 ID:bpkT9prW >>719 このお題の場合は数学的に答えを出そうとするとプログラムを作る必要がなくなってしまわないか? 人が普通に数学的に考えて行くと答えが出てしまいそうな気がするんだが。 またはAIに聞いたらすぐ答えが出そうな感じが。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/737
738: デフォルトの名無しさん [sage] 2025/04/08(火) 23:28:40.30 ID:OzdBhfzQ >>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 } http://mevius.5ch.net/test/read.cgi/tech/1691038333/738
739: デフォルトの名無しさん [sage] 2025/04/08(火) 23:30:40.48 ID:OzdBhfzQ >>738 素因数の総和が2025になる問題を可能な素数の組合せ総当りで挑戦してみました 20億以下で約0.4秒と規定時間以内に実行できました 実行時間 solve(2025, 20000000): 22.638309ms 実行時間 solve(2025, 2000000000): 418.607978ms fn main() { for (n, limit) in [(2025, 2000_0000), (2025, 20_0000_0000)] { let start_time = std::time::Instant::now(); let answer = solve(n, limit); let end_time = std::time::Instant::now(); println!("実行時間 solve({n}, {limit}): {:?}", end_time - start_time); // 個数と最初と最後の検証 let (valid_len, valid_first, valid_last) = match (n, limit) { (2025, 2000_0000) => (1265, 30255, 19970000), (2025, 20_0000_0000) => (49942, 30255, 1999986740), _ => (0, 0, 0), }; assert_eq!(answer.len(), valid_len); assert_eq!(*answer.first().unwrap(), valid_first); assert_eq!(*answer.last().unwrap(), valid_last); } } http://mevius.5ch.net/test/read.cgi/tech/1691038333/739
740: デフォルトの名無しさん [] 2025/04/09(水) 14:40:43.48 ID:jYixYFG8 >>737 AIも同じこと言ってた http://mevius.5ch.net/test/read.cgi/tech/1691038333/740
741: デフォルトの名無しさん [] 2025/04/09(水) 22:22:33.83 ID:Ip5PiQSs >>738-739 出題時に作成した解答例 C++ https://ideone.com/y1YZlj R https://ideone.com/zvqAsg と解の個数と最小値・最大値が一致するので正解だろう。 ローカルでコンパイルしようとしたら、 error[E0425]: cannot find function `generate_primes` in this scope と表示されコンパイルできなかったので、実行時間の比較はできなかった。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/741
742: デフォルトの名無しさん [sage] 2025/04/09(水) 22:57:11.84 ID:R3DmBa+t >>741 すみません 素数の一覧を返すだけなので素数列挙でもライブラリ利用でも何でもいいのですが 例えばエラトステネスの篩ならこんな感じの関数で // 素数の一覧を返す [2, 3, 5, 7, 11, ... , (最大max)] fn generate_primes(max: usize) -> Vec<usize> { // maxの平方根までの素数の倍数を篩にかければ全ての素数が見つかる let limit = max.isqrt() + 1; let mut is_prime = vec![true; max + 1]; is_prime[0] = false; is_prime[1] = false; // 偽初期値 let mut prime = 1; // 次の素数を探す (前回の素数以降でtrueを探すと次の素数) while let Some(pos) = is_prime[(prime + 1)..limit].iter().position(|bool| *bool) { prime += pos + 1; // この素数の倍数をfalseにする 【エラトステネスの篩】 is_prime[(prime << 1)..].iter_mut().step_by(prime).for_each(|bool| *bool = false); } // 素数一覧を返す (trueになるindex値が素数) is_prime.iter().enumerate().filter_map(|(index, bool)| bool.then_some(index)).collect() } http://mevius.5ch.net/test/read.cgi/tech/1691038333/742
743: デフォルトの名無しさん [] 2025/04/09(水) 23:40:58.68 ID:Ip5PiQSs >>738-739, 742と>>741のC++を解の標準出力なしに変更したものの実行速度を比較したら、 前者の方が2000万以下では27%、20億以下では11%速かった。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/743
744: デフォルトの名無しさん [sage] 2025/04/09(水) 23:43:56.02 ID:R3DmBa+t 前者はどっち? アルゴリズムが違うのかちょっと見てみる http://mevius.5ch.net/test/read.cgi/tech/1691038333/744
745: デフォルトの名無しさん [] 2025/04/09(水) 23:50:45.01 ID:Ip5PiQSs >>744 前者は>>738-739, 742のRustプログラム。後者 (C++プログラム) はvectorへの要素追加回数が 多いので時間が掛かっていそう。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/745
746: デフォルトの名無しさん [sage] 2025/04/09(水) 23:59:16.31 ID:R3DmBa+t たしかにC++の20億だと数秒かかりますね 何がそんなに違うのかな http://mevius.5ch.net/test/read.cgi/tech/1691038333/746
747: デフォルトの名無しさん [sage] 2025/04/10(木) 00:43:03.90 ID:1pFQYAQA vectorのメモリは必要分を最初に確保すると速くならない? vectorの最初のサイズの初期値は要素10個分だったはず。11個目が追加されたら20個確保して全要素コピーんsんてやってたら遅いよ http://mevius.5ch.net/test/read.cgi/tech/1691038333/747
748: デフォルトの名無しさん [sage] 2025/04/10(木) 02:19:18.58 ID:Zvxe3V8x ベクタはC++もRustも他でもほぼ同じ仕様で埋まると倍の新たなエリアを確保してコピー これは2^n個が埋まった時点でそれ以前の累積コピー個数は 最悪の1個スタートでも1+2+4+ ... + 2^(n-2)+2^(n-1) =2^n - 1個しかない つまりO(1)とみなせるため問題になることは少ない 言語による詳細な差もC++とRustならほぼ無いと思われる 一方で今回の20億以内で素数和が2025になる数を求める問題 C++版がRust版より約10倍遅くなってる原因は ・pushしていくベクタがRust版は1個でC++版は2026個のベクタを利用 ・pushしていく回数がRust版は解の個数と同じ49942回でC++版は134621081回 ワーキングメモリ使用量の差が効いてる http://mevius.5ch.net/test/read.cgi/tech/1691038333/748
749: デフォルトの名無しさん [] 2025/04/10(木) 22:03:03.91 ID:Y2N8/SQw >>747 vector p[0]〜p[S]のサイズの最大値4499個(20億以下では88876個)分のメモリを for (auto &v : p) v.reserve(4499); で最初に割り付けておくと、>>743ではRustの方が2000万以下で27%、20億以下で11%速かったのが、 2000万以下では差が縮まりRustの方が14%速く、20億以下では逆転しRustの方が20%遅くなった。 サイズの最大値は実行前には分からないから、上記の改変はあくまでもvectorのサイズ拡張が実行時間に 及ぼす影響を見るためのテストで、解答として使うことはできないが。 vectorのサイズ拡張は、新しいメモリ割り付けとそこへの要素コピーに掛かる時間によってだけではなく、 要素の格納アドレスが変わることによるキャッシュ有効率の低下によっても、速度低下をもたらしそう。 >>746, 748 どっちがどれだけ速いかは実行環境に依存するとはいえ、C++が20億で数秒とかRustより約10倍遅いと いうのはいくら何でも遅すぎておかしいと思う。解の標準出力をなしにするのを忘れていたり、Windowsで コンパイル後の実行ファイルの実行時間をPowerShellでmeasure-command {a.exe}のように計測して ウィルス・チェックに要した時間も含まれていたりしない? http://mevius.5ch.net/test/read.cgi/tech/1691038333/749
750: デフォルトの名無しさん [sage] 2025/04/11(金) 07:38:20.09 ID:oaeJuxMT >>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 } http://mevius.5ch.net/test/read.cgi/tech/1691038333/750
751: デフォルトの名無しさん [sage] 2025/04/11(金) 22:07:48.99 ID:CMM29JI3 すごいな アルゴリズムの違いでそんなに速度差変わるものなんだな http://mevius.5ch.net/test/read.cgi/tech/1691038333/751
752: デフォルトの名無しさん [] 2025/04/11(金) 22:44:47.89 ID:4wK2/GRg >>750 これはとても速いな。ローカルで実行してみたら、>>738のRustプログラムと比較して 2000万以下で16倍、20億以下で55倍の速さだった。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/752
753: デフォルトの名無しさん [sage] 2025/04/12(土) 09:11:24.51 ID:xiQsTIG2 >>712 @Wolfram https://ideone.com/4xyb1s http://mevius.5ch.net/test/read.cgi/tech/1691038333/753
754: デフォルトの名無しさん [] 2025/04/12(土) 21:18:53.69 ID:RVQAocGC >>741のC++プログラムは for (int i = S; i >= 2; i--) のループの最後のi = 2の場合を ループの外に出して最適化 (p[S]以外のp[_]への要素追加をしないように) するだけで、 20億以下で解の出力なしのときの実行時間が元のプログラムの半分未満になるな。 https://ideone.com/RtTEO2 (1.02秒) ↓ https://ideone.com/1O04wl (0.44秒) http://mevius.5ch.net/test/read.cgi/tech/1691038333/754
755: デフォルトの名無しさん [sage] 2025/04/12(土) 21:26:41.27 ID:csJOBVaF >>754 それに気づいたけど まだ>>750と比べて20倍遅いからメモ化の方針が徒となってるのかな http://mevius.5ch.net/test/read.cgi/tech/1691038333/755
756: 753 [sage] 2025/04/13(日) 11:09:12.37 ID:vq5HB/06 >>712 初Rust https://ideone.com/aaj5D8 http://mevius.5ch.net/test/read.cgi/tech/1691038333/756
757: デフォルトの名無しさん [sage] 2025/04/13(日) 23:46:14.76 ID:bmEZDV0H >>756 遅い原因は長さ2000万のベクタ利用? http://mevius.5ch.net/test/read.cgi/tech/1691038333/757
758: デフォルトの名無しさん [sage] 2025/04/13(日) 23:53:41.46 ID:fz+Jdq57 配列にするとどうかね http://mevius.5ch.net/test/read.cgi/tech/1691038333/758
759: デフォルトの名無しさん [sage] 2025/04/17(木) 00:27:46.72 ID:dz0qzhSq 素因数和2025のお題の3系統のコードを読み解いてみた >>756 2000万まで各々で素因数の和を求めて2025になるかを確認する方法。 ただし各数の素因数分解を工夫せずにすると大変なので、 各数の最小素因数(SPF)を先に一気にエラトステネスの篩で求めてる。 それを用いれば各数の素因数分解はその分解数回の割算だけで求まる。 ただしそのSPF表のために長さ2000万のベクタを用いている。 もし20億までなら32bit✕20億で8GBが許容できるとしても、 あるいはこのSPF一覧のベクタを用いなくても、 20億回の処理を劇的に減らす枝刈り方法を組み込めないと厳しい。 2000万までの計算でも一番遅い。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/759
760: デフォルトの名無しさん [sage] 2025/04/17(木) 00:29:06.02 ID:dz0qzhSq >>741 2000万個すべてを素因数分解する方法とは逆に、 2025以下の素数の組み合わせを調べていく方法。 そのうち和が2025になる組み合わせの積が各解となる。 それを効率よく求めるために2025(+1)個のベクタのベクタpを用意している。 つまり和がsumとなる時の積をp[sum]に記録していく。 効率面からの仮の初期値p[0]に1を入れて、各素数iについて降順に、 ベクタp[j]にxがある時、ベクタp[i+j]にx*iをpushしていく。 ここでjの上限は 2025 - i、処理するxの上限は 2000万 / i の枝刈りができる。 最終的にベクタp[2025]の一覧が解となる。 2025個のベクタを用いることが長所および短所になっている。 この改良版>>754では、最後の素数2だけ特別扱いすることで倍速にしている。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/760
761: デフォルトの名無しさん [sage] 2025/04/17(木) 00:32:14.51 ID:dz0qzhSq >>738 これも2025以下の素数を組み合わせて和が2025になる解を調べる方法。 解一覧を収めるベクタ以外は、固定の長さ305のベクタのみが使われている。 この長さの 305 とは2025以下~3以上の素数[2017, 2011, ... 5, 3]の数になってる。 各素数の冪乗の和 2017^e2017 + 2011^e2011 + ... + 5^e5 + 3^e3 及び積を計算していくが、 各指数のe2017などは解に不要なので使われておらず、 各冪乗の和自体も不要なので2025までの残りの数が使われていて、 固定長ベクタの値は(素数, 残りの数, ここまでの積)の3つ組となっている。 その素数を1つ使うと残りの数が減算されてて積が乗算されるのを繰り返していく。 素数2だけ特別扱いされており、残りの数の半分だけ左シフトすると解の積が出来上がる。 各if~continueが枝刈りとなっていて、残りの下限(=和の上限)や積の上限などがある この改良版>>750では、次の素数以降の組み合わせで起き得る積の下限で枝刈りしている。 例えば7以下の素数で残り21ならば積の下限は7*7*7=343となるため、 ここまでの積に343を掛けた値が2000万(または20億)を超えていれば枝刈りできるようだ。 このアルゴリズムは作業メモリが固定で小さく常にL1キャッシュに乗り有利と思われる点と、 様々な枝刈りがしやすく処理する組み合わせを大きく減らしている点により、 他のアルゴリズムより桁違いに高速になっていると推測される。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/761
762: デフォルトの名無しさん [sage] 2025/05/03(土) 06:56:07.77 ID:Hs+w1scb お題:0か1のランダムな要素を持つW*Hの行列と二点の座標x, yとp, qが入力される 直線(x,y)→(p, q) を行列内で要素1に当たらないように任意の位置に合同変換したい 合同変換できる座標があればその二点の座標を出力し、なければ「なし」と出力せよ http://mevius.5ch.net/test/read.cgi/tech/1691038333/762
763: デフォルトの名無しさん [sage] 2025/05/03(土) 14:00:53.01 ID:2KurydQy ? http://mevius.5ch.net/test/read.cgi/tech/1691038333/763
764: デフォルトの名無しさん [sage] 2025/05/03(土) 14:59:51.97 ID:LoSO6jC9 行列の1は格子点上の印なのかクロスワードの黒マスなのか (x,y)、(p,q)は任意の点なのか格子点なのか 合同変換される直線(x,y)→(p,q)は実は線分だったりしないのか 無限の可能性を感じさせるお題だな http://mevius.5ch.net/test/read.cgi/tech/1691038333/764
765: デフォルトの名無しさん [sage] 2025/05/03(土) 15:10:32.79 ID:OINldK7L 検証用のデータを書いていないお題は失格 入力例とその時の出力例が必要 もし出力が複数個で長いならその特例の一部や個数など http://mevius.5ch.net/test/read.cgi/tech/1691038333/765
766: デフォルトの名無しさん [] 2025/06/21(土) 16:41:25.25 ID:muNvYhtO お題 2次元の配列があったときに 一番左上を起点として右上方向、左下方向、右上方向… というふうに斜めに配列の要素をたどることを ジグザグスキャンと名付けます たとえば、3 * 3の配列の場合は次の順番で配列の要素にアクセスします (1, 2, 6) (3, 5, 7) (4, 8, 9) 二次元の配列を入力としてジグザグスキャンを行ってください 結果を1次元の配列として出力してください 例 入力: (A, B, C), (D, E, F), (G, H, I) 出力: (A, B, D, G, E, C, F, H, I) 入力: (A, B, C), (D, E, F) 出力: (A, B, D, E, C, F) 入力: (A, B), (C, D), (E, F) 出力: (A, B, C, E, D, F) http://mevius.5ch.net/test/read.cgi/tech/1691038333/766
767: デフォルトの名無しさん [] 2025/06/21(土) 19:44:57.30 ID:jAwJC0YX >>766 R https://wandbox.org/permlink/JoDE3h6F6k7gKbPs http://mevius.5ch.net/test/read.cgi/tech/1691038333/767
768: デフォルトの名無しさん [sage] 2025/06/21(土) 23:05:10.33 ID:awm9eire >>766 Rust fn f<T: Clone, const M: usize, const N: usize>(input: &[[T; N]; M]) -> Vec<T> { let mut output = Vec::<T>::new(); for x in 0..(M + N - 1) { let start = if x < N { 0 } else { x + 1 - N }; let end = if x < M { x } else { M - 1 }; let iter = (start..=end).map(|m| input[m][x - m].clone()); if x & 1 == 1 { output.extend(iter.clone()); } else { output.extend(iter.rev()); } } output } fn main() { assert_eq!(f(&[['A', 'B', 'C'], ['D', 'E', 'F'], ['G', 'H', 'I']]), ['A', 'B', 'D', 'G', 'E', 'C', 'F', 'H', 'I']); assert_eq!(f(&[['A', 'B', 'C'], ['D', 'E', 'F']]), ['A', 'B', 'D', 'E', 'C', 'F']); assert_eq!(f(&[['A', 'B'], ['C', 'D'], ['E', 'F']]), ['A', 'B', 'C', 'E', 'D', 'F']); } http://mevius.5ch.net/test/read.cgi/tech/1691038333/768
769: デフォルトの名無しさん [sage] 2025/06/29(日) 20:45:32.73 ID:f7vmTtNq お題:W*Hの行列に迷路を生成してください(アルゴリズムは任意) http://mevius.5ch.net/test/read.cgi/tech/1691038333/769
770: デフォルトの名無しさん [sage] 2025/06/29(日) 21:58:43.69 ID:HlaloW8+ >>769 解がないため不成立 inputとoutputの事例などがないため不成立 http://mevius.5ch.net/test/read.cgi/tech/1691038333/770
771: デフォルトの名無しさん [sage] 2025/07/25(金) 12:30:11.02 ID:CjDQVF2B 【問題】 整数のリストが与えられたとき、そのリストを昇順に安定ソートした時の各要素のインデクス(0開始)を対応させたリストを作成せよ 【例】 入力: 1 100 10 10000 1000 出力: 0 2 1 4 3 入力: 3 1 4 1 5 9 2 出力: 3 0 4 1 5 6 2 入力: 0 1 0 1 0 1 0 1 出力: 0 4 1 5 2 6 3 7 実際に必要になって実装したけどスマートな方法があったら知りたい http://mevius.5ch.net/test/read.cgi/tech/1691038333/771
772: デフォルトの名無しさん [sage] 2025/07/25(金) 20:46:23.28 ID:dyl0C+2U >>771 例がおかしい わかりやすい最後の例で示すと 入力: 0 1 0 1 0 1 0 1 出力: 0 4 1 5 2 6 3 7 間違い 出力: 0 2 4 6 1 3 5 7 正解 安定ソートなので同値は順序を保ってこうなる http://mevius.5ch.net/test/read.cgi/tech/1691038333/772
773: デフォルトの名無しさん [sage] 2025/07/25(金) 21:30:28.86 ID:Z69qH9vG >>771 C++ 特にひねりは無い https://ideone.com/mTHn46 http://mevius.5ch.net/test/read.cgi/tech/1691038333/773
774: デフォルトの名無しさん [sage] 2025/07/26(土) 12:26:55.07 ID:xCVVpUlx >>772 出題者だけど「各要素の移動先のインデクス」って書いた方がよかったか 文言削りすぎた http://mevius.5ch.net/test/read.cgi/tech/1691038333/774
775: デフォルトの名無しさん [] 2025/07/26(土) 15:08:13.56 ID:T78ZrTu7 >>771 SQL select row_number() over(order by arrayValue, arrayIndex) - 1 from arrayTable order by arrayIndex http://mevius.5ch.net/test/read.cgi/tech/1691038333/775
776: デフォルトの名無しさん [] 2025/07/26(土) 19:25:22.74 ID:T78ZrTu7 >>771 Java 24 https://text.is/4Z27R http://mevius.5ch.net/test/read.cgi/tech/1691038333/776
777: デフォルトの名無しさん [sage] 2025/07/27(日) 10:09:36.80 ID:vFJ24xnO >>771 ocaml https://ideone.com/E7eFPC >>771 octave https://ideone.com/KkHu9S >>771 ruby https://ideone.com/pPIxcE http://mevius.5ch.net/test/read.cgi/tech/1691038333/777
778: デフォルトの名無しさん [sage] 2025/07/27(日) 17:05:48.29 ID:vFJ24xnO >>771 c https://ideone.com/6Wn3eD http://mevius.5ch.net/test/read.cgi/tech/1691038333/778
779: デフォルトの名無しさん [sage] 2025/07/27(日) 17:08:58.25 ID:vFJ24xnO >>771 ruby 2.6以降? sorti = ->a {a.map.with_index.sort.map &:last} f = sorti << sorti g = method(:p) << f http://mevius.5ch.net/test/read.cgi/tech/1691038333/779
780: デフォルトの名無しさん [] 2025/07/27(日) 20:19:17.79 ID:uFbo+/2v >>771 R https://ideone.com/ctaQC5 統計用言語だけあってライブラリ関数rankを呼び出すだけ。ties.method = "min"を指定すれば 同値を同順位(例えば2番目の例では出力が3 0 4 0 5 6 2となる)にもできる。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/780
781: デフォルトの名無しさん [sage] 2025/07/27(日) 21:43:59.43 ID:w39E9j9Q >>771 Rust 既に色々と出ているため別の観点からのコード 一時作業メモリ最小 & ソートは1回 & ジェネリック fn f<T: std::cmp::Ord>(input: &[T]) -> Vec<usize> { let len = input.len(); // ポジションのリスト [0, 1, 2, 3, ... , len-1] を作成 let mut pos_list: Vec<usize> = (0..len).collect(); // inputを利用してそのポジションだけをソート pos_list.sort_by_key(|&pos| &input[pos]); // 返すべきランクのリスト let mut rank_list: Vec<usize> = vec![0; len]; // ポジション⇔ランクは逆写像なのでソートは不要 (0..len).for_each(|rank| rank_list[pos_list[rank]] = rank); rank_list } fn main() { assert_eq!(f(&[1, 100, 10, 10000, 1000]), [0, 2, 1, 4, 3]); assert_eq!(f(&[3, 1, 4, 1, 5, 9, 2]), [3, 0, 4, 1, 5, 6, 2]); assert_eq!(f(&[0, 1, 0, 1, 0, 1, 0, 1]), [0, 4, 1, 5, 2, 6, 3, 7]); } http://mevius.5ch.net/test/read.cgi/tech/1691038333/781
782: 777 [sage] 2025/07/27(日) 22:54:22.66 ID:YfUjoiLt >>771 octave ソート一回 https://ideone.com/dTRKBs >>771 ruby 2.5 ソート一回 https://ideone.com/akDhpS http://mevius.5ch.net/test/read.cgi/tech/1691038333/782
783: 警備員[Lv.11] [] 2025/07/28(月) 23:30:37.16 ID:uO5vEij8 >>771 >>776をKotlinに変換してKotlinらしくなるように色々省略しただけのもの。 やはり最初からラムダとか考慮されている言語だと色々省略できて分り易くなるね。 https://paiza.io/projects/0Dhknk4mUHrMqtuwzCDAxQ http://mevius.5ch.net/test/read.cgi/tech/1691038333/783
784: デフォルトの名無しさん [sage] 2025/07/29(火) 00:12:31.56 ID:9AXsNEm+ >>771 Rust https://ideone.com/jYX2ws バイナリヒープ使うとソート過程で直接リスト作れるけどコード量増えるしヒープソート遅いから実用性は微妙か C言語ならありかもしれない http://mevius.5ch.net/test/read.cgi/tech/1691038333/784
785: デフォルトの名無しさん [sage] 2025/07/30(水) 21:50:10.50 ID:Ug40aZKP >>771 java https://ideone.com/Z8Q9Dk http://mevius.5ch.net/test/read.cgi/tech/1691038333/785
786: デフォルトの名無しさん [] 2025/07/31(木) 14:56:29.97 ID:cLL+G38O >> 771 java >> 785氏のデータも加えてみた。 https://ideone.com/vzXoGd ideoneのjavaはバージョン古いのか... ま、通りがかりにこのスレみつけたのでちょっと書いただけ。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/786
787: デフォルトの名無しさん [] 2025/07/31(木) 18:54:11.86 ID:cLL+G38O ち、勘が鈍った。>>もつけ間違えるし、sage忘れるし。 http://mevius.5ch.net/test/read.cgi/tech/1691038333/787
788: 785 [sage] 2025/07/31(木) 21:15:09.63 ID:R3hgrYP8 >>771 java compose乱用 https://ideone.com/TBTZgj http://mevius.5ch.net/test/read.cgi/tech/1691038333/788
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.026s