プログラミングのお題スレ Part22
1 :デフォルトの名無しさん :2023/08/03(木) 13:52:13.20 ID:/xW45k0z.net プログラミングのお題スレです。 【出題と回答例】 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/
2 :デフォルトの名無しさん :2023/08/03(木) 14:04:23.10 ID:Lr04Zjag.net >>1 O2
3 :デフォルトの名無しさん :2023/08/06(日) 12:21:14.08 ID:/9zIb/V0.net お題 1行につき一つの文章が入力されます アルファベット26文字がすべて含まれている文章をフィルタリングしてください 大文字小文字は区別しません そのうちもっとも短い文章を出力してください 入力 The quick brown fox jumps over a lazy dog. The jay, pig, fox, zebra and my wolves quack! Pack my box with seven dozen liquor jugs. The horse, pig, fox, zebra and my wolves quack! Jackdaws love my small sphinx of quartz. Jackdaws love my big sphinx of quartz. The quick brown fox jumps over a lazy cat. Pack my box with five dozen liquor jugs. 出力 Jackdaws love my big sphinx of quartz.
4 :デフォルトの名無しさん :2023/08/06(日) 17:47:37.64 ID:RhhSFLLO.net >>3 Kotlin https://paiza.io/projects/cmJpXwaAhFH6jYozb0bb2g
5 :デフォルトの名無しさん :2023/08/06(日) 18:08:09.04 ID:RhhSFLLO.net >>3 C https://paiza.io/projects/McLPuKlM4c-1C9EgarDGjw
6 :デフォルトの名無しさん :2023/08/06(日) 19:07:03.27 ID:Md+pNxjw.net use std::io::{self, BufRead, BufReader}; const FULL_BITS: u32 = (1 << 26) - 1; fn main() { let mut shortest: Option<String> = None; for line in BufReader::new(io::stdin()).lines() { let line = line.unwrap(); let mut bits = 0; for b in line.as_bytes() { let index = match b { b'A'..=b'Z' => b - b'A', b'a'..=b'z' => b - b'a', _ => continue, }; bits |= 1 << index; } if bits != FULL_BITS { continue; } if let Some(ref shortest) = shortest { if shortest.len() < line.len() { continue; } } shortest = Some(line); } if let Some(shortest) = shortest { println!("{shortest}"); } else { eprintln!("ERROR: no matched lines"); } }
7 :デフォルトの名無しさん :2023/08/06(日) 20:04:54.35 ID:pJXl8PQk.net >>3 R https://ideone.com/ZdKsPa
8 :デフォルトの名無しさん :2023/08/07(月) 01:25:47.55 ID:dolrRGoi.net >>6 それなんて言語?
9 :9 :2023/08/07(月) 01:46:18.23 ID:PMO8D1QO.net >>3 Perl5 for (<DATA>) { my %h = map{$_ => 1} grep{/[a-z]/i} split ''; push @a, $_ if 26 == keys %h; } @s = sort{length($a) <=> length($b)} @a; print $s[0]; __DATA__ The quick brown fox jumps over a lazy dog. The jay, pig, fox, zebra and my wolves quack! Pack my box with seven dozen liquor jugs. The horse, pig, fox, zebra and my wolves quack! Jackdaws love my small sphinx of quartz. Jackdaws love my big sphinx of quartz. The quick brown fox jumps over a lazy cat. Pack my box with five dozen liquor jugs. ※ 見易くするためインデントを全角スペースに置換してあります。 実行結果: $ perl 22_3_az26.pl Jackdaws love my big sphinx of quartz.
10 :デフォルトの名無しさん :2023/08/07(月) 01:57:03.56 ID:PMO8D1QO.net >>9 ゴメン、2行目に間違いあり…orz my %h = map{$_ => 1} grep{/[a-z]/i} split ''; ↓正しくは my %h = map{$_ => 1} map{lc} grep{/[a-z]/i} split ''; 実行結果は今回のテストデータだとたまたま同じ結果になる。
11 :デフォルトの名無しさん :2023/08/07(月) 09:39:33.60 ID:3KYy8N/l.net >>8 Rustでは?
12 :デフォルトの名無しさん :2023/08/07(月) 19:28:19.42 ID:dolrRGoi.net >>11 言われてみればRustに見えるな。 Rustは趣味で学習始めたばかりでよく分からなかった。
13 :デフォルトの名無しさん :2023/08/07(月) 20:51:54.50 ID:ZWV0+Q1Z.net >>3 Haskell https://ideone.com/ACKqL8
14 :デフォルトの名無しさん :2023/08/08(火) 16:30:48.37 ID:mHXT/QMM.net >>10 2行目はもっと簡潔に書ける my %h = map{$_ => 1} map{lc} grep{/[a-z]/i} split ''; ↓ my %h = map{lc $_ => 1} /([A-Za-z])/g; 結局、これでよい筈 for (<DATA>) { my %h = map{lc $_ => 1} /([A-Za-z])/g; push @a, $_ if 26 == keys %h; } @s = sort{length $a <=> length $b} @a; print $s[0]; __DATA__ … (ry
15 :デフォルトの名無しさん :2023/08/08(火) 19:36:27.56 ID:ODiXw46s.net >>3 Rust use std::collections::HashSet; use std::io::{self, BufRead, BufReader}; fn main() { match BufReader::new(io::stdin()) .lines() .map(Result::unwrap) .filter(|line| { line.bytes() .filter(|b| matches!(b, b'A'..=b'Z'| b'a'..=b'z')) .collect::<HashSet<_>>() .len() .eq(&26) }) .min_by_key(String::len) { Some(shortest) => println!("{shortest}"), None => eprintln!("ERROR: no matched lines"), } }
16 :デフォルトの名無しさん :2023/08/09(水) 12:27:32.68 ID:ZMLVZrF/.net 無駄に比較回数が増えるsortを使っている>>13 と>>14 は不正解 単純にminが正解
17 :デフォルトの名無しさん :2023/08/10(木) 13:37:16.01 ID:YYBOmFjO.net >>3 Perl https://paiza.io/projects/05DzwASHT6-4bVjpenNDBQ
18 :蟻人間 ◆T6xkBnTXz7B0 :2023/08/10(木) 19:00:30.10 ID:kqXaMgBC.net お題: ちょっとした画像処理。 赤い丸がいくつか描画された不透明な画像ファイル「input.png」を読み込んで、赤い丸を緑の丸に描き変えたものを画像ファイル「output.png」に保存するプログラム。 ここに「赤い」とは、HSV色空間において、色相が0度~60度か300度~360度の範囲にあり、彩度が30%以上で、明度が50%以上の色であると定義する。 「丸」とは、円形度が0.7~1.3の範囲の単一色の図形であると定義する。 「緑」とはRGBで#008000の色であると定義する。
19 :デフォルトの名無しさん :2023/08/10(木) 19:03:42.87 ID:0ymjHRaX.net 絶対自分でやる気ないお題出すな
20 :デフォルトの名無しさん :2023/08/10(木) 19:07:41.57 ID:yqkCXlxz.net >>6 >>15 同じ言語とは思えないほど違うな
21 :デフォルトの名無しさん :2023/08/10(木) 21:44:28.63 ID:4K08AJqU.net >>16 このスレで正解とか不正解とか言ってる時点で不正解
22 :デフォルトの名無しさん :2023/08/11(金) 00:03:07.62 ID:6txSsch+.net >>16 head , sort で無駄ソートは起こらない minimumByと最大2倍程度の差しか発生しない https://hackage.haskell.org/package/base-4.18.0.0/docs/src/Data.OldList.html#sort
23 :デフォルトの名無しさん :2023/08/11(金) 00:37:49.70 ID:NzWkf1P2.net 今回のようなsortを一切必要としない問題で何度もsortを用いるプログラマーは劣等生
24 :デフォルトの名無しさん :2023/08/11(金) 00:43:13.53 ID:0bfZQT9B.net >>23 Haskellのhead . sortはソートしないってのに sortって書いてあるからソートすると思ってるんやろ?
25 :デフォルトの名無しさん :2023/08/11(金) 01:09:02.59 ID:NzWkf1P2.net sortを使うことを問題にしているのであって sortしていないなら問題ないだろう 個別の話などしていない そこまで言うならとHaskellのプログラム >>13 を見にいってみたが 入力文字列を各文字でソートして重複を取り除いてabcdefghijklmnopqrstuvwxyzと比較しているのか hasAllAlph = ( == [ 'a' .. 'z' ] ) . tail . nub . sort . map toLowOrSp . ( ' ' : )
26 :9 :2023/08/11(金) 02:38:50.64 ID:4P/NDj/+.net スレが伸びているので何かと思えば、オレほか一部の回答者がsortを使ったのが そんなに気に入らなかったか、気に障ったか、 ざまぁみろw としか言いようがないが 後出しでケチつけてるのは出題者じゃないようだが そしたらsortも、そしてminもあえて使わないバージョン、 書き方はいろいろあると思うけど: >>3 Perl5 use List::Util 'first'; for (<DATA>) { my %h = map{lc $_ => 1} /([A-Za-z])/g; $a[length $_] = $_ if 26 == keys %h; } print first{defined} @a; __DATA__ The quick brown fox jumps over a lazy dog. The jay, pig, fox, zebra and my wolves quack! Pack my box with seven dozen liquor jugs. The horse, pig, fox, zebra and my wolves quack! Jackdaws love my small sphinx of quartz. Jackdaws love my big sphinx of quartz. The quick brown fox jumps over a lazy cat. Pack my box with five dozen liquor jugs. 実行結果 ~ $ perl 22_3_az26_a.pl Jackdaws love my big sphinx of quartz.
27 :デフォルトの名無しさん :2023/08/11(金) 02:52:08.14 ID:45O+1i6X.net そう、haskellの評価戦略はcall by need (の一種) で必要に応じて展開される、head . sort では 「sortした後の最初の項」を求めているのでそれを出すための必要最小限の事しかしない 件のData.Listにおけるsortでは ①与えられた列を1回目のバスで広義単調増大列いくつかに分割する、コストはO(n) ②できた列を2つずつマージして広義単調増大列の個数を半分にする、全部やればコストはO(n) ③②を列の数が1になるまで繰り返す、コストはO(log(n)) で全部の処理を要求してもO(nlog(n))でいわゆるクイックソートと同じコスト しかしheadがこのsortの処理を呼ぶ時にはmergeする2列の中の最小値だけ残されてあとは捨てられる、なので最初の①の結果が最悪のケース、長さ1の列がn個できた場合でもmerge処理は最大n-1回だけ行われて終了する、すなわち事実上minimumと一緒 じゃあminimumBy ( on length )でいいじゃんという話なのだけど「遅延評価を利用すればほとんどコストレスでminimumByと同様の事ができる」というのがHaskellの面白いところ なのでそっちを採用 これは遅延評価の文化に慣れてないと中々わからない
28 :デフォルトの名無しさん :2023/08/11(金) 07:58:17.97 ID:vOTsx3Ge.net >>25 そちらのsortはO(nlog(n))なのでダメですね
29 :9 :2023/08/11(金) 08:37:47.88 ID:4P/NDj/+.net O(nlog(n))がダメかどうかは、データの規模および実行時間による
30 :デフォルトの名無しさん :2023/08/11(金) 09:12:59.75 ID:BG0MJIEb.net あかん、通じてないね 時間の無駄やった
31 :デフォルトの名無しさん :2023/08/11(金) 09:22:47.99 ID:HI+ykM5H.net Perlな人の短く書ければよいだけで計算量とか知らないだろうから仕方ないと思うよ しかしHaskellな人がsortを何箇所も使っているのは驚いた head . sort以外のsortはあかんね
32 :デフォルトの名無しさん :2023/08/11(金) 09:27:54.00 ID:vdwKG93K.net お前ら賢いんだから自分も疑え
33 :デフォルトの名無しさん :2023/08/11(金) 14:03:26.02 ID:v1edpQDw.net doubt
34 :17 :2023/08/11(金) 16:34:17.24 ID:j3k4ZyED.net 俺は Perl で書いたやつも sort 使わず >>4 ,5 と同じやり方にした。 一番短い文を最後に出すだけで良いなら sort やる必要ないよね。 何らかの制約があってそうしなければ出来ないとか、使っても思い切り最適化されて最終的に同じ動きになるというなら使うかも知れないが。
35 :デフォルトの名無しさん :2023/08/11(金) 17:25:08.27 ID:I5t9Gg6x.net 遅延評価は馴染みない人にはわからんからしょうがない
36 :デフォルトの名無しさん :2023/08/11(金) 17:41:01.68 ID:Nevl7mZs.net Haskell版で問題にされてるのは 遅延評価でO(n)となるhead $ sort部分ではなく O(nlog(n))のsortが別途あること
37 :デフォルトの名無しさん :2023/08/11(金) 22:35:55.39 ID:H5Y2+fuz.net >>35 遅延評価は色んな言語にあるよ その対象や動作は各言語や各機能によって様々で PromiseやFutureのような非同期に遅延評価されるものもあるけど 今回のお題だとC#のLINQメソッドチェーンによる遅延評価やRubyのlazy指定などが有効だね >>15 のRustのイテレータメソッドチェーンも遅延評価されるから何万行の入力が来てもメモリを消費せずに済むね
38 :デフォルトの名無しさん :2023/08/14(月) 19:55:41.01 ID:KSpEuPpD.net マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ マサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲマサナヲ ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ ヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマヲナサマ
39 :デフォルトの名無しさん :2023/08/14(月) 20:16:21.84 ID:29MXQOm3.net >>38 Java public class Main { public static void main(String[] args) { System.out.println( "マサナヲ".repeat(8).concat("\n").repeat(4).concat("\n") .concat("ヲナサマ".repeat(8).concat("\n").repeat(4).concat("\n")) .repeat(2)); } }
40 :デフォルトの名無しさん :2023/08/15(火) 16:29:06.61 ID:eu+UdA0l.net このサイトより http://agora.ex.nii.ac.jp/digital-typhoon/ 2023/8/1/0/0 から 2023/8/16/23/0 まで 表示日時を変更しながら1時間毎の静止気象衛星画像(地球)を収集し (衛星画像 は 可視光 2048x2048 程度 512x512 等も可 起動オプションで指定出来るとボーナス特典) gif animation または png animation ファイルに変換せよ 例 8/14/0/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081315.globe.1.jpg 8/15/0/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081415.globe.1.jpg 8/15/15/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081505.globe.1.jpg
41 :デフォルトの名無しさん :2023/08/15(火) 23:36:55.46 ID:GhE5EH0z.net 蟻人間がコテハン外したのかな
42 :デフォルトの名無しさん :2023/08/16(水) 10:34:21.25 ID:tgyEZLGb.net 可視光より赤外線の方が雲はきれいだけど 可視光は影が毎日くるくる回るからこっちはこっちで面白いね
43 :9 :2023/08/16(水) 13:32:44.58 ID:vjpqg3x7.net >>40 bash、curl および GraphicsMagick の convert コマンドを使用。動作確認したOSはUbuntu 20.04LTS。数百枚のjpegからgifへのconvertには多少時間がかかります。 オプション -h または --highres を指定すると 2048x2048、オプション無しあるいは -l または --lowreso を指定すると 512x512、なおボーナスはスイス銀行の秘密口座に。 ※見易くするためインデントは全角スペースに置換してあります。8月16日23時まで取得するようにしているがまだ無い将来の画像は含まない。 res='512x512' # default OPT=`getopt -o hl -l highreso,lowreso -- "$@"` eval set -- "$OPT" while true; do case "$1" in -h | --highreso) res='2048x2048' shift ;; -l | --lowreso) res='512x512' shift ;; --) shift break ;; esac done dir=$(mktemp -d TmpDir.XXXXXX) for d in $(seq -w 01 16); do for h in $(seq -w 0 23); do dh="$d$h" file="HMW92308${dh}.globe.1.jpg" url="http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/${res}/${file}" echo $url; curl -f -s -R -o "$dir/$file" $url done done #set -x time convert $(ls $dir/*.jpg) TyphoonAime${res}.gif ls -o TyphoonAime${res}.gif
44 :9 :2023/08/16(水) 13:42:58.39 ID:vjpqg3x7.net >>43 typo orz -h または --highres ↓ -h または --highreso
45 :9 :2023/08/16(水) 19:12:35.95 ID:y9YJABkH.net >>43 これだと、scriptを実行するたびに全てのjpegファイルをtemporaryディレクトリにdownloadするためサーバの負荷の面で行儀がよくないので、 ディレクリは TyphoonJpegDir512x512 または TyphoonJpegDir2048x2048 で固定とし、未取得のjpegがあればdownloadするように直すわ。 res='512x512' # default OPT=`getopt -o hl -l highreso,lowreso -- "$@"` eval set -- "$OPT" while true; do case "$1" in -h | --highreso) res='2048x2048' shift ;; -l | --lowreso) res='512x512' shift ;; --) shift break ;; esac done dir=./TyphoonJpegDir${res} for d in $(seq -w 01 16); do for h in $(seq -w 0 23); do file="HMW92308${d}${h}.globe.1.jpg" url="http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/${res}/${file}" [ -f $dir/$file ] || { echo $url; curl -f -s -R -o "$dir/$file" $url; } done done #set -x time convert $(ls $dir/*.jpg) TyphoonAime${res}.gif ls -o TyphoonAime${res}.gif ※見やすくするためインデントは全角スペースに置換してあります。
46 :17 :2023/08/17(木) 00:52:29.22 ID:YACPkQ1f.net >>40 Kotlin ただし paiza.io のサイトの都合で大きい画像の出力がうまく行かないのと時間が掛かるとタイムアウトしてしまうので、 それらを避けるために 2023/08/15~2023/08/16 の8時間間隔(0, 8, 16 時)の画像を収集して 120x120 の大きさに 変更してアニメーションGIFにして出力するようにした。その時に HTML で <img src="data:image/gif;base64,..."> で埋め込んでいるのでHTMLモードで表示させるとブラウザに画像が表示される。スマホでも見てみたがちゃんと 動いている画像で表示された。 https://paiza.io/projects/w-fOIVbPGuSPh1_DJTSatA
47 :デフォルトの名無しさん :2023/08/18(金) 10:27:20.40 ID:Rd3M1fjh.net 可視光は globe.0 だな しかも夜のデータ無いやん
48 :デフォルトの名無しさん :2023/08/18(金) 11:07:33.13 ID:wx26N4AH.net >>40 UTC で答えてる人が多いみたいだけど >例 >8/14/0/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081315.globe.1.jpg JST ですよね
49 :デフォルトの名無しさん :2023/08/18(金) 17:11:49.56 ID:TT1gR8pP.net 過去未来100年(幅201年)の範囲で 2023年とカレンダーの曜日が一致する年を全て出力せよ また任意の指定年の前後100年で同じ動作をする(閏年も考慮)ように改変せよ
50 :デフォルトの名無しさん :2023/08/18(金) 20:03:41.92 ID:Bxqhk529.net >>49 R https://ideone.com/keSaYi
51 :デフォルトの名無しさん :2023/08/19(土) 00:14:13.53 ID:Za4r2XUP.net >>50 曜日をわざわざ求める必要はなかったな。 R https://ideone.com/1Zh5wd
52 :デフォルトの名無しさん :2023/08/19(土) 02:12:13.34 ID:7swIlm9f.net 6,11,11,6,11,11,・・・なんでこうなうの?
53 :デフォルトの名無しさん :2023/08/19(土) 10:40:53.03 ID:7swIlm9f.net >>48 JSTだとしたら >8/15/15/0 http://agora.ex.nii.ac.jp/digital-typhoon/globe/color/2023/512x512/HMW923081505.globe.1.jpg は 8/15/14/0 じゃないかな 夏時間?
54 :む げ :2023/08/20(日) 17:53:44.63 ID:yELvYXkhV 初カキコ失礼します あのさ夏休みの宿題学びポケットとかいうWEB問題サイトに追われてるんだけど 「あと夏休み期間2か」それの自動回答ロボットを作ってくれない 作ってくれたら命に代えても感謝するんだけどなーとか言ってる 冗談じゃなくてまじで追われていて学校退学になりそうだ方まじで助けで,、、、
55 :む げ :2023/08/20(日) 17:54:11.37 ID:yELvYXkhV タスケテ>>>
56 :デフォルトの名無しさん :2023/08/20(日) 20:19:24.17 ID:T0IVLETo.net >>52 365と366を7で割った余りは1と2なので、平年には翌年の元日の曜日が1つ進み、閏年には2つ進む。 100の倍数の年の例外を除けば、曜日の進みは1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, ...のように 1, 1, 1, 2というパターンの繰り返しになる。 パターン1, 1, 1, 2のうちの最初の1の年から始めて、何年後に曜日の進みの累積が7の倍数かつ その年が閏年でなくなるかを順々に求めれば6, 11, 11年後となり、ここでパターン1, 1, 1, 2の うちの最初の1の年に戻るので、以降は6, 11, 11年後というパターンの繰り返しになる。 ┌──────────┐ │ ↓ @@@❷@@@❷@@@❷@@@❷@@@❷@@@❷@@@❷@@@❷ │ ↑ │ ↑ └─────┘ └──────────┘
57 :蟻人間 ◆T6xkBnTXz7B0 :2023/08/20(日) 21:28:53.42 ID:KEiNPJgB.net お題: お風呂の準備。 容積225Lの浴槽に適温39度のお湯200Lを用意したい。 次の2つのスイッチのON/OFFを切り替えてお湯を用意するプログラムを作れ。 スイッチ1: これをONにすると浴槽に水温20度の水を分速10Lで投入する。 スイッチ2: これをONにすると浴槽の水を800ワットの電熱線で加熱する。 ただし、浴槽に容積の1/2以上の水またはお湯が入っていないときは、空焚き防止のため、加熱しないものとする。 放熱は考慮しなくてもよい。 出力例) 時刻??: スイッチ1をONにしました。 時刻??: スイッチ2をONにしました。 時刻??: お風呂ができました。 時刻??: スイッチ1をOFFにしました。 時刻??: スイッチ2をOFFにしました。
58 :17 :2023/08/20(日) 22:57:39.22 ID:pbHEs6OP.net >>49 Kotlin 折角なので Iterator で作った。(でも AbstractIterator クラス使ったので特に苦労はしていない) https://paiza.io/projects/v1X96MyvBFn0N4z9X-9gkw
59 :17 :2023/08/20(日) 23:07:16.25 ID:pbHEs6OP.net >>57 800Wの電熱線で加熱するとどれだけの量の水がどのぐらいの時間で1度上がるか、など、基本的な事が分からない。
60 :デフォルトの名無しさん :2023/08/21(月) 05:17:48.42 ID:9NybdpKD.net >>58 200年分のデータを配列を貯め込む>>51 の方法よりも そのようなメモリ消費を必要としないイテレータを作る案は好ましい方法ですね しかし-100や+100は今回たまたまのマジックナンバーに過ぎないですし 例えばお題が「指定した年とその後(またはそれ以前に)同じカレンダーになる年を100個求めよ」もありえます したがって作成しておくべき汎用イテレータは指定した年から順方向に返すイテレータと逆方向に返すイテレータでしょう それがあれば今回のお題を含めた様々なバリエーションのお題に対応できると思います
61 :デフォルトの名無しさん :2023/08/21(月) 10:53:53.65 ID:qNeGin4f.net >>60 へのお題 指定した年とその後(またはそれ以前に)同じカレンダーになる年を100個求めよ
62 :デフォルトの名無しさん :2023/08/21(月) 12:55:28.09 ID:tqXtwiP4.net // Rust 双方向イテレータ版 struct SameCalendarYear(u32); impl Iterator for SameCalendarYear { type Item = u32; fn next(&mut self) -> Option<u32> { common_next(self.0, false).map(|year| { self.0 = year; year }) } } impl DoubleEndedIterator for SameCalendarYear { fn next_back(&mut self) -> Option<u32> { common_next(self.0, true).map(|year| { self.0 = year; year }) } } fn common_next(start_year: u32, is_before: bool) -> Option<u32> { let mut day = 0; let mut year = start_year; while year > 0 { if is_before { year -= 1; } day += 1 + leap(year); if day >= 7 { day -= 7; } if !is_before { year += 1; } if day == 0 && leap(year) == leap(start_year) { return Some(year); } } None } fn leap(year: u32) -> u32 { (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) as u32 }
63 :デフォルトの名無しさん :2023/08/21(月) 12:57:26.59 ID:tqXtwiP4.net >>61 指定した年と同じカレンダーの年を前後 n 個表示 (長くなるので今回は10個だけ表示) fn main() { let n = 10; for year in [2000, 2023, 2024, 2025, 2100] { println!("{year}年より前: {:?}", SameCalendarYear(year).rev().take(n).collect::<Vec<_>>()); println!("{year}年より後: {:?}", SameCalendarYear(year).take(n).collect::<Vec<_>>()); } } このRust公式の実行環境で実行やコード編集ができます https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=5e5a518120f75351ca5ff5fdd0bf4d8c // 実行結果 2000年より前: [1972, 1944, 1916, 1876, 1848, 1820, 1780, 1752, 1724, 1684] 2000年より後: [2028, 2056, 2084, 2124, 2152, 2180, 2220, 2248, 2276, 2316] 2023年より前: [2017, 2006, 1995, 1989, 1978, 1967, 1961, 1950, 1939, 1933] 2023年より後: [2034, 2045, 2051, 2062, 2073, 2079, 2090, 2102, 2113, 2119] 2024年より前: [1996, 1968, 1940, 1912, 1872, 1844, 1816, 1776, 1748, 1720] 2024年より後: [2052, 2080, 2120, 2148, 2176, 2216, 2244, 2272, 2312, 2340] 2025年より前: [2014, 2003, 1997, 1986, 1975, 1969, 1958, 1947, 1941, 1930] 2025年より後: [2031, 2042, 2053, 2059, 2070, 2081, 2087, 2098, 2110, 2121] 2100年より前: [2094, 2083, 2077, 2066, 2055, 2049, 2038, 2027, 2021, 2010] 2100年より後: [2106, 2117, 2123, 2134, 2145, 2151, 2162, 2173, 2179, 2190]
64 :蟻人間 ◆T6xkBnTXz7B0 :2023/08/21(月) 15:10:32.39 ID:GU1DZq8L.net >>59 中学校の物理で習うはずなんだけどなあ。忘れたか。 https://chuugakurika.com/2017/10/24/post-155/
65 :デフォルトの名無しさん :2023/08/21(月) 22:02:18.08 ID:s7o0Gu1A.net >>61 R https://ideone.com/1o1wp6
66 :デフォルトの名無しさん :2023/08/24(木) 05:04:40.60 ID:UkV1PQmo.net お題:2Dゲームのスクロール処理 整数の二次元配列(高さ50, 横幅100)上にランダムに整数1〜9が200個配置される。 この配列を高さ20, 横幅40の矩形領域に切り取って表示したい。キーボードの入力(l, r, t, b)で矩形領域を移動させ切り取る領域を変化させよ。
67 :デフォルトの名無しさん :2023/08/24(木) 08:57:28.75 ID:a6n854uv.net >>66 試しに自分で書いてどんなプログラムになるのか見せてくれ
68 :デフォルトの名無しさん :2023/08/24(木) 22:51:17.82 ID:hcnR5QOK.net >>66 PowerShell (等幅フォント限定。最初は一番左上の領域が表示される。qキーで終了。Ubuntu版ではカーソルが消えない) $a = random (1..9999) -count 200 |% {$_ % 9 + 1} $b = random (0..4999) -count 200 $c = [char[][]](,(," " * 100) * 50) 0..199 |% {$c[[Math]::Floor($b[$_] / 100)][$b[$_] % 100] = [string]$a[$_]} $L = 0..49 |% {-join $c[$_]} $UI = $Host.UI.RawUI $p, $s = $UI.CursorPosition, $UI.CursorSize $p.y = [Math]::Min($p.y, $UI.BufferSize.Height - 23) $x = $y = 0 $border = "+" + "-" * 40 + "+" while ($true) { try {$UI.CursorSize = 0} catch {} $UI.CursorPosition = $p $border 0..19 |% {"|" + $L[$y + $_].SubString($x, 40) + "|"} $border switch ($UI.ReadKey(6).Character) { "l" {if ($x -gt +0) {$x--}} "r" {if ($x -lt 60) {$x++}} "t" {if ($y -gt +0) {$y--}} "b" {if ($y -lt 30) {$y++}} "q" {try {$UI.CursorSize = $s} catch {} return} } }
69 :デフォルトの名無しさん :2023/08/25(金) 00:19:01.99 ID:P3glK3pZ.net お題:ウィンドウのアラインメント処理 マウスの座標の変化からウインドウを描画すべき座標を計算したい。 ただし変形する形は縦横4方向、斜め4方向の8パターンとし、寄せた方向に幅が1/2となること。
70 :デフォルトの名無しさん :2023/08/25(金) 14:02:15.09 ID:5+gJach+.net >>66-67 OpenCVのROI便利だよな
71 :デフォルトの名無しさん :2023/08/26(土) 14:14:02.40 ID:EQIr/PqP.net 世界で最初の月曜日ってどうやって決まったの?
72 :17 :2023/08/26(土) 14:42:38.00 ID:Wr5tcJsi.net 曜日はシュメール人が使い始めたらしいので、お近くのシュメール人に聞きください。
73 :デフォルトの名無しさん :2023/08/26(土) 20:03:48.42 ID:LJcWLtrE.net 文字列Sの中に含まれる回文をすべて列挙ってどうやったらいいですかね(*_*) aとかbみたいな一文字でも回文とみなしますです 文字列Sは1文字以上100文字以下で、半角英字であることがわかってます とんでもない計算量になる気がするのですが、鮮やかなやりかたってないものかと…トホ(ヽ´ω`)
74 :17 :2023/08/26(土) 22:26:37.90 ID:Wr5tcJsi.net >>73 それって例えば "ABCBAXYZZYX" だったら "ABCBA" と "XYZZYX" が抜き出せれば良いの? 途中の "BCB", "C", "YZZY", "ZZ" も抜き出すの?
75 :蟻人間 ◆T6xkBnTXz7B0 :2023/08/26(土) 23:04:31.69 ID:JYg5slq9.net 回文の長さに制限があるから、回文の長さで場合分けすれば、全部列挙可能。
76 :デフォルトの名無しさん :2023/08/26(土) 23:09:39.72 ID:jGmIYD91.net >>74 途中のもぜんぶっす… 含まれる回文、ひとつのこらず出力です(;´∀`) たとえAとかBみたいな一文字でも回文と定義します なのでAとかXも抜き出します٩(′д‵)۶ で、一文字目にAがあって、5文字目にもAがあるじゃないですか?こういった場合は、どっちも出力しちゃって大丈夫です! 重複された出力が行われるのは問題ないんです! ただ、「過去にすでにその分の出力が行われていた場合、重複した出力を再度行わない」というやりかたでもし計算量が飛躍的に下がるということであれば、そのやりかたが知りたいというのもまああります(*_*; 重複する出力をするかしないか、それはどちらでもオケーです 全パターンチェックするようにループ回すならとりあえず理屈ではできると思うんですが、計算量がとんでもないことになりそうな感じで、ちょっとお手上げでした/(^o^)\
77 :デフォルトの名無しさん :2023/08/26(土) 23:20:42.48 ID:jGmIYD91.net たとえば文字列Sがabbbaだとすると、すくなくともa,b,bb,bbb.abbbaが最低一回は出力される必要があります できればaやbが複数回出力されず一回しか出力されないほうがいいですが、必須ではないです
78 :蟻人間 ◆T6xkBnTXz7B0 :2023/08/26(土) 23:29:51.32 ID:JYg5slq9.net >>73 C++ #include <stdio.h> bool is_kaibun(const char *str, size_t len) { for (size_t i = 0; i < len/2; i++) if (str[i] != str[len - i - 1]) return false; return true; } void detect_kaibun(const char *str, size_t len) { for (size_t klen = 1; klen <= len; klen++) { for (size_t i = 0; i < len - klen + 1; i++) if (is_kaibun(str + i, klen)) printf("%*s\n", (int)klen, str + i); } } int main(void) { detect_kaibun("ABCBCXC", 7); return 0; }
79 :蟻人間 ◆T6xkBnTXz7B0 :2023/08/26(土) 23:37:32.47 ID:JYg5slq9.net >>78 間違えた。 printf("%*s\n", (int)klen, str + i); を printf("%.*s\n", (int)klen, str + i); に訂正。
80 :デフォルトの名無しさん :2023/08/26(土) 23:40:14.43 ID:jGmIYD91.net >>79 ありがとうございます、ちょっとためしてみますm(_ _)m
81 :デフォルトの名無しさん :2023/08/26(土) 23:44:49.05 ID:M8vKemPr.net 連続部分列 https://en.m.wikipedia.org/wiki/Longest_palindromic_substring 部分列 https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2895
82 :デフォルトの名無しさん :2023/08/27(日) 00:17:21.22 ID:3rRjeZjU.net >>79 動いている様子を確認させていただきました!!ありがとうございました! 当チケットはこれにてクローズとさせていただきたいと思いますヽ(=´▽`=)ノ
83 :デフォルトの名無しさん :2023/08/27(日) 01:14:16.06 ID:xDzSjAxc.net >>78 こうすると計算量を減少できる fn len_of_eq(s: &str, index: usize, even: usize) -> usize { let mut len = 0; for (p, q) in std::iter::zip(s[(index + even)..].chars(), s[0..=index].chars().rev()) { if p != q { break; } len += 1; } return len; } fn print_kaibun(s: &str) { for index in 0..s.len() { for even in 0..=1 { for len in 1..=len_of_eq(s, index, even) { let first = index + 1 - len; let last = index + len - 1 + even; println!("{first}~{last}: {}", &s[first..=last]); } } } } fn main() { print_kaibun("ABCBAXYZZYX"); }
84 :デフォルトの名無しさん :2023/08/27(日) 01:16:42.56 ID:xDzSjAxc.net まずこの部分が最初のヒントで >>それって例えば "ABCBAXYZZYX" だったら "ABCBA" と "XYZZYX" が抜き出せれば良いの? >>途中の "BCB", "C", "YZZY", "ZZ" も抜き出すの? >途中のもぜんぶっす… 最も長いものを抜き出せばその一部分はその中に含まれている だから短いのが判明した時点で引き続き長いのも探索しないと多重に無駄に比較が行なわれてしまう もう一つのポイントは回文は対称系で長さ奇数と偶数の二種類があること 長さ奇数「DCBABCD」と長さ偶数「DCBAABCD」どちらの場合も 比較は対称点となるAからのみ出発して比較していけばよくて 順方向&逆方向へ最長分を比較していけば上述の無駄な比較を減らせる このような順番で見つかっていくことになる >>83 の実行結果 0~0: A 1~1: B 2~2: C 1~3: BCB 0~4: ABCBA 3~3: B 4~4: A 5~5: X 6~6: Y 7~7: Z 7~8: ZZ 6~9: YZZY 5~10: XYZZYX 8~8: Z 9~9: Y 10~10: X
85 :17 :2023/08/27(日) 05:51:19.72 ID:A+RJ0qtc.net >>82 ここはお題スレなのでクローズはない。
86 :17 :2023/09/07(木) 20:20:41.05 ID:HlrfnodH.net >>73 Kotlin https://paiza.io/projects/qh3bysWxeqAkDEImg1ZyPw
87 :デフォルトの名無しさん :2023/09/20(水) 14:42:58.26 ID:I55f6i4N.net お題 abc1.mp4 abc2.mp4 .. abc20.mp4があるとします これを名前順でソートできるようにするため abc001.mp4 abc002.mp4 ... abc020.mp4 とリネームしてください
88 :デフォルトの名無しさん :2023/09/20(水) 18:43:20.77 ID:DIo9fsPi.net コレでどーかぬ #!/bin/bash # ファイル名のプレフィックス prefix="abc" # ソート対象のファイルリストを取得 file_list=$(ls ${prefix}*.mp4 | sort) # ファイルを001、002、...の形式にリネーム counter=1 for file in $file_list; do new_name=$(printf "${prefix}%03d.mp4" $counter) mv "$file" "$new_name" counter=$((counter + 1)) done
89 :デフォルトの名無しさん :2023/09/20(水) 18:50:38.69 ID:I55f6i4N.net いいだしっぺということで作ってきたら既に投稿が printfするところは一緒ですね bash,勉強になります haskell import Text.Printf import System.IO import System.Directory import System.FilePath.Glob import Data.List import Control.Monad kaku = ".mp4" fn = "abc" main = do files <- glob (fn <> "*" <> kaku) zipWithM_ (\a b -> renameFile a b) files (map f files) where f l = let r1 = reverse $ takeWhile ((/=) '/') $ reverse l in let r2 = (r1 \\ fn) \\ kaku in fn <> printf "%03d" (read r2 :: Int) <> kaku
90 :デフォルトの名無しさん :2023/09/22(金) 11:23:46.58 ID:R2SvRL0Z.net お題:celeronで快適に動作するwebブラウザを作れ
91 :9 :2023/09/22(金) 16:53:16.55 ID:8M97O6g7.net >>87 Perl5 rename "abc$_.mp4", sprintf 'abc%03d.mp4',$_ for 1..20; ※abc1.mp4 abc2.mp4 .. abc20.mp4 があるとしています。 また abc001.mp4 abc002.mp4 ... abc020.mp4 は既存かのチェックは省いています。
92 :デフォルトの名無しさん :2023/09/22(金) 17:31:41.64 ID:fCKJ4NGF.net すごい簡潔ですね!perlすごい これはワンライナーではないのでしょうか #!/usr/bin/perl .. としてperl rename.plを動かすと動きました ファイルはこれ(bash)で用意できます for i in {1..20}; do touch abc$i.mp4; done
93 :デフォルトの名無しさん :2023/09/22(金) 20:45:10.11 ID:CSDqgjJn.net tcsh のバヤイわこうかぬ foreach i (`seq 1 20`) # 1から20までの数値を生成 # ファイル名を生成し、touchコマンドでファイルを作成 set filename = "abc$i.mp4" touch $filename end
94 :17 :2023/09/24(日) 00:36:54.25 ID:FZ40Ia2p.net >>87 Kotlin https://paiza.io/projects/GEok1uy5LzC9VB9ARGu4yg
95 :17 :2023/09/24(日) 00:44:46.90 ID:FZ40Ia2p.net 1~20を決め打ちして良いならもっと簡単にできたな。まあいいや。
96 :デフォルトの名無しさん :2023/09/24(日) 01:16:14.31 ID:nC1Pu7Ba.net >>94 なかなかおもろいサイトやぬ
97 :デフォルトの名無しさん :2023/09/24(日) 01:37:34.83 ID:XDqOvN5B.net >>87 haskellで再投稿 https://ideone.com/HHMuMT
98 :デフォルトの名無しさん :2023/09/26(火) 17:04:35.08 ID:lhHS5sJh.net お題:32ビット浮動小数点数のnextafter() 32ビット精度(IEEE754のbinary32)の変数aを 64ビット精度(IEEE754のbinary64)の変数bに代入する。 ここで、nextafterf(a, 0)やnextafterf(a, 正の無限)などに相当する操作を bに対して行え(bを32ビット浮動小数点数に戻すのは無しで)。 操作結果のoverflowやunderflowは考慮しなくてもよい。
99 :デフォルトの名無しさん :2023/09/27(水) 11:02:54.03 ID:Jpj1XONB.net お題:日本語の文章が入力されるので「、」をカンマに、「。」を改行に変換せよ
100 :デフォルトの名無しさん :2023/09/27(水) 11:36:52.67 ID:uGji0T93.net Python s = input() s = s.replace("、", ",") s = s.replace("。", "\n") print(s)
101 :デフォルトの名無しさん :2023/09/27(水) 13:01:54.91 ID:9Ywamwi5.net Haskell import Data.List.Utils main = do s <- getContents putStrLn $ replace "。" "\n" $ replace "、" "," s コンパイルはしてないので動かないかも
102 :デフォルトの名無しさん :2023/09/27(水) 20:48:13.39 ID:hJUMqAFS.net >>99 R https://ideone.com/syZ9JI
103 :デフォルトの名無しさん :2023/09/28(木) 08:18:15.29 ID:q8VwFY1b.net お題 文字列S=abcdefghij(10文字)が与えられて 配列[0,4,7]が与えられる このときSの0番目を4番目、4番目を7番目、7番目を0番目に移動した文字列を出力するプログラムを書いてください
104 :デフォルトの名無しさん :2023/09/28(木) 09:17:20.57 ID:iiudb0JA.net >>103 lisp https://www.ideone.com/pOwDJd
105 :デフォルトの名無しさん :2023/09/28(木) 13:09:43.08 ID:tckV2TlV.net >>103 Ruby 文字列S='abcdefghij' 配列=[0,4,7] 文字列 = 文字列S.dup 配列.zip( 配列.rotate ).each{|i,j| 文字列[i] = 文字列S[j] } puts 文字列
106 :蟻人間 ◆T6xkBnTXz7B0 :2023/09/28(木) 13:15:33.53 ID:eLIN3EHU.net お題: コンソールに指定したUTF-8文字列のQRコードを表示するプログラム。
107 :デフォルトの名無しさん :2023/09/28(木) 14:55:17.75 ID:7+/lnWbq.net use std::io::{stdin, Read}; use std::error::Error; use qrcode::QrCode; fn read() -> Result<String, Box<dyn Error>> { Ok(stdin().lock().bytes().map(|c| c.expect("char") as char).collect()) } fn main() -> Result<(), Box<dyn Error>> { let qr = QrCode::new(read()?.as_bytes())?; let s = qr.render().light_color(' ').dark_color('#').build(); println!("{}", s); Ok(()) }
108 :蟻人間 ◆T6xkBnTXz7B0 :2023/09/28(木) 21:17:30.48 ID:yc7Vl2N1.net お題: 指定されたフォントのひらがなの各文字について ひらがなの線に囲まれて閉じた領域の個数を調べ、最もその個数の多い文字ベスト3を出力せよ。
109 :デフォルトの名無しさん :2023/09/28(木) 22:53:24.99 ID:8VuS2PIw.net 自分でやれ いやできないかすまん
110 :デフォルトの名無しさん :2023/09/28(木) 22:59:15.05 ID:isk1iJ0r.net pythonならcv2使ってやるかな
111 :17 :2023/09/29(金) 10:58:18.12 ID:eBy6R6wt.net >>99 bash のコマンドラインで以下のように入力すると標準入力から入力して「、」が「,」に、「。」が改行に変換されて標準出力に出力される。 (起動する環境は bash でなければならないということはないと思うが、他のシェルは確認していない)。 sed 's/、/,/g;s/。/\n/g' もちろん日本語入出力可能な端末を使用して、尚且つ sed がその入力をまともに受け付けてくれなければちゃんと動かない。
112 :デフォルトの名無しさん :2023/09/29(金) 11:02:02.85 ID:F8aJXNq9.net お題: 指定されたフォントのひらがなの各文字について ひらがなの線に囲まれて閉じた領域の面積を調べ、各文字毎にそれぞれの面積の順序を最も大きい物から順に出力せよ。 またその情報を元に輪郭のhierarchy情報をcv2で利用出来る形で出力せよ
113 :デフォルトの名無しさん :2023/09/30(土) 17:32:44.04 ID:xxjzuZuq.net お題 文字列が入力されます 赤と緑を入れ替えて 黒と白を入れ替えて 黄と青を入れ替えてください 例 入力: 緑のカバンに500万入れて白の紙で黄色のカバン言うて書きながら赤のカバン言いながら置いてくれたら俺黒のカバン言いながら取りに行くわ 出力: 赤のカバンに500万入れて黒の紙で青色のカバン言うて書きながら緑のカバン言いながら置いてくれたら俺白のカバン言いながら取りに行くわ
114 :デフォルトの名無しさん :2023/09/30(土) 18:00:29.42 ID:oqu6hf3+.net >>113 node const swap = (text, [w1, w2]) => text.split(w1).map(v => v.replaceAll(w2, w1)).join(w2) const swapAll = (text, rules) => rules.reduce(swap, text) const text = '緑のカバンに500万入れて白の紙で黄色のカバン言うて書きながら赤のカバン言いながら置いてくれたら俺黒のカバン言いながら取りに行くわ' const rules = [['赤', '緑'], ['黒', '白'], ['黄', '青']] const replaced = swapAll(text, rules) // console.log(replaced) console.log(replaced === '赤のカバンに500万入れて黒の紙で青色のカバン言うて書きながら緑のカバン言いながら置いてくれたら俺白のカバン言いながら取りに行くわ') // true
115 :デフォルトの名無しさん :2023/09/30(土) 19:24:03.19 ID:t2v1jL5l.net >>113 R https://www.ideone.com/FCPqvY
116 :デフォルトの名無しさん :2023/09/30(土) 20:00:09.54 ID:iuoy3pEW.net >>113 ウェブブラウザのJavaScript https://pastebin.com/YvymwTeN ユーザースクリプトの体裁で書いたけどブラウザーのConsoleでも動かせる Firefox: Ctrl+Shift+K Chrome: Ctrl+Shift+J https://mevius.5ch.net/test/read.cgi/tech/1691038333/113 を開いてそこで実行 結果はレスに直接追記 重複がないからXPathのtranslate()でいけるな思った、それだけ
117 :17 :2023/10/02(月) 01:36:39.53 ID:hWT/DRlk.net >>103 Kotlin https://paiza.io/projects/95GuXcUyZr8AkmVsRESj5Q
118 :17 :2023/10/02(月) 01:52:26.35 ID:hWT/DRlk.net >>106 1. qrencode というプログラムをインストールする。(例: RedHat系Linuxなら yum install qrencode) 2. qrencode で出力に ansi 等を指定して文字列で出力する。 例: qrencode -t ansi やっほー 3. 画面に出て来たQRコードをスマホで撮影する等して確認する。 4. 終わり。
119 :デフォルトの名無しさん :2023/10/02(月) 11:46:19.28 ID:0odvDMYE.net >>118 よくできました 蟻ポイント30
120 :デフォルトの名無しさん :2023/10/06(金) 16:54:06.65 ID:jg1c5xSH.net [クライシスアクター」「豊島保養所」←画像検索&拡散! 他スレに丸ごとコピペよろしっく!! ネットでできる反レプティリアン・反イルミ活動です!!!!! 動画サイトのコメ欄もねらい目だぞーーーー!!!!!!!
121 :デフォルトの名無しさん :2023/10/06(金) 16:54:28.09 ID:jg1c5xSH.net [クライシスアクター」「豊島保養所」←画像検索&拡散! 他スレに丸ごとコピペよろしく!! ネットでできる反レプティリアン・反イルミ活動です!!!!! 動画サイトのコメ欄もねらい目だぞ!!!!!!!
122 :デフォルトの名無しさん :2023/10/08(日) 19:28:55.20 ID:faQf3SiN.net お題:n階建てのビルに定員4人のエレベーターがある。エレベーターは各階でボタンが押されるとその階に向かう。住人達はエレベータを呼んで乗るとエレベーター内で次に向かう階へのボタンを押す。ボタンを押すのは乗員全員である。乗るのを待っている住人が定員より多かった場合、エレベーターは乗れなかった住人を優先的に回収する。住人は列の先頭から順番にエレベーターに乗り込む。エレベーターは乗員を降ろしている間に住人を追加で乗せることはなく、すべての乗員を降ろしてから次の住人の回収に向かうものとする。 もっとも効率がいいエレベーターの停止順序を求め、入力に対して停止階のリストを出力せよ。 エレベーターの初期位置は1階とする。 入力 階数 乗員数 住人たちがいる階 乗員iが向かう階 乗員iが向かう階 … 5 1 1 5 2 4 3 2 3 2 1 3 5 出力 停止階 停止階 … 1 5 4 3 2 1 3 5 入力 10 5 1 1 2 3 4 4 9 4 10 10 10 1 8 6 6 6 5 出力 1 2 3 4 1 4 1 10 4 6 8 4 5
123 :9 :2023/10/08(日) 20:24:03.46 ID:zYJ3wh+h.net >>122 「もっとも効率がいいエレベーターの停止順序」とは? 1.停止回数がもっとも少ない 2.移動した階数の和が最も小さい 3.ほか など、どのような指標?
124 :デフォルトの名無しさん :2023/10/09(月) 13:56:36.62 ID:V7NN5mnX.net >>123 2.移動した階数の和が最も小さい
125 :デフォルトの名無しさん :2023/10/09(月) 19:10:41.03 ID:5dE8x2G+.net >>87 C# https://paiza.io/projects/q-lUy-6voRo_XdJfyAdw6A
126 :デフォルトの名無しさん :2023/10/09(月) 22:18:18.11 ID:5dE8x2G+.net >>113 C# https://paiza.io/projects/WbaYdgONPOZUKqB_TVkNbw?language=csharp
127 :デフォルトの名無しさん :2023/10/12(木) 11:02:46.67 ID:u59ybXeV.net スイカゲームを自動操縦するプログラムを造れ
128 :デフォルトの名無しさん :2023/10/12(木) 12:31:12.32 ID:hnj5q8Ch.net while (true) push(BUTTON_A)
129 :デフォルトの名無しさん :2023/10/14(土) 00:00:08.85 ID:sMwx6jpS.net お題:角カッコの列が入力されるのでカッコの対応が取れていたら1,取れていなかったら0と表示せよ < [[]] > 1 < [[] > 0
130 :17 :2023/10/14(土) 02:22:24.53 ID:BgrcFKKf.net >>129 Perl bash 等のシェルのコマンドラインで以下のように入力すると標準入力から入力して結果を標準出力に出力する。 perl -ne '$n=0;while(/(.)/g){if($1eq"["){$n++}elsif($1eq"]"){$n--}}$f=$n==0?1:0;print"$f\n"' 実行例 [[]] 1 [[] 0 [[[[]][[]]] 0 [[[[]][[]]]] 1
131 :17 :2023/10/14(土) 04:16:14.71 ID:BgrcFKKf.net >>113 Kotlin https://paiza.io/projects/ll5rbpwAp7dzQ_lOoj7RPw
132 :デフォルトの名無しさん :2023/10/14(土) 10:19:17.10 ID:BRbCCPQd.net >>129 Ruby %W( [[]] [[] [[[[]][[]]] [[[[]][[]]]] ][ #{} ).each{|s| w = s.dup {} while w.sub!( /\[\]/, '' ) puts "#{(s != '' && w == '')? 1 : 0} #{s.inspect}" } # 1 "[[]]" # 0 "[[]" # 0 "[[[[]][[]]]" # 1 "[[[[]][[]]]]" # 0 "][" # 0 ""
133 :デフォルトの名無しさん :2023/10/14(土) 22:38:53.08 ID:5dUK8HoW.net >>129 C# https://paiza.io/projects/biEUVjCtGCYB8s0ny8vsAQ
134 :デフォルトの名無しさん :2023/10/16(月) 08:51:26.93 ID:kgcCjrnK.net 1) BY RG 2) RG BY 3) GR YB 1-3を回転対称で同じとみなせるグループと線対称で同じとみなせるグループに分類せよ 4色を2x2の升にランダムに一つづつ配置して4x3x2通りのパターンを作成し それぞれを上の基準でグループ分けせよ
135 :デフォルトの名無しさん :2023/10/17(火) 07:02:57.86 ID:InaHR8fg.net >>134 Ruby https://ideone.com/J7Ec40
136 :デフォルトの名無しさん :2023/10/18(水) 20:40:59.79 ID:4ifgnZXl.net お題:Pythonのmath.ulp()と同機能の関数 引数が正規化数限定のサブセットでも可(その旨を明記)。 Pythonで実装する場合は(もちろん)math.ulp()を使ってはならない。
137 :134 :2023/10/18(水) 20:46:23.24 ID:4ifgnZXl.net 簡単なお題: >>135 のサブセット(求めたulpも正規化数限定)
138 :デフォルトの名無しさん :2023/10/18(水) 20:56:02.06 ID:L3TY2GGf.net import struct def my_ulp(x): # 浮動小数点数xをバイト列に変換 b = struct.pack("d", x) # バイト列を整数に変換 i = int.from_bytes(b, "little") # 符号部(1ビット)を取り出す s = i >> 63 # 指数部(11ビット)を取り出す e = (i >> 52) & 0x7ff # 仮数部(52ビット)を取り出す m = i & 0xfffffffffffff # 指数部が0や最大値ならエラー if e == 0 or e == 0x7ff: raise ValueError("x is not a normalized number") # 仮数部の最下位ビット(1ビット)を求める lsb = m & 1 # 符号部と指数部を元に戻す i = (s << 63) | ((e - lsb) << 52) # 整数をバイト列に変換 b = i.to_bytes(8, "little") # バイト列を浮動小数点数に変換 return struct.unpack("d", b)[0]
139 :134 :2023/10/18(水) 21:44:13.43 ID:4ifgnZXl.net >>137 間違えましたorz
140 :134 :2023/10/18(水) 21:52:04.82 ID:4ifgnZXl.net >>138 math.ulp()は符号を戻さないらしいです: ulp(1) == ulp(-1)
141 :デフォルトの名無しさん :2023/10/21(土) 04:08:56.28 ID:TaroWUwV.net お題:文字列「せんだ」「みつを」「ナハナハ」がランダムに100行入力される。せんだ、みつを、ナハナハが順番に入力されたときに1と一行出力せよ
142 :デフォルトの名無しさん :2023/10/21(土) 23:03:24.39 ID:x0YGunAE.net >>141 C# https://paiza.io/projects/2AXALD9gCHkTYmJ7WYKEOQ
143 :デフォルトの名無しさん :2023/10/25(水) 07:23:48.08 ID:gFkqcLnH.net お題: (1)Python3.12以降の、math.nextafter()のサブセット (実装はPythonでなくても構いません) 64ビット長程度の整数iを引数として、 a)iがゼロ:foo(i) = 0.0 b)i > 0:foo(i) = nextafter(0, inf, steps=i) c)i < 0:foo(i) = nextafter(0, -inf, steps=-i) を満たすfoo()を書く。 Python3.12を使う場合は、nextafter()を使ってはならない。 (2)(1)の逆関数。
144 :141 :2023/10/25(水) 07:27:56.03 ID:gFkqcLnH.net 補足:(1)(2)いずれも実用的な時間内で求める事(steps=1相当のnextafter()をループで回すのは不可)。
145 :デフォルトの名無しさん :2023/10/25(水) 12:47:47.78 ID:Bgy3SEXp.net なんだnextafterって
146 :141 :2023/10/25(水) 23:22:03.23 ID:gFkqcLnH.net >>145 nextafter()は、浮動小数点数の、(数直線上での)「隣」を求めるやつですね(C99以降?)。 Python3.12のやつは、隣の隣の隣の…を求める事が出来る様に拡張されました。
147 :21-923 :2023/10/26(木) 00:31:46.93 ID:7aLp+Ojb.net 前スレの補足: V8やLLVMは、自前でstrtod()的なものを実装してました。 tps://arxiv.org/abs/2101.11408
148 :デフォルトの名無しさん :2023/10/28(土) 20:54:22.44 ID:U0JINWpQ.net >>103 octave https://ideone.com/87WGBO function s = f(s, i) s(circshift(i, -1, 2)) = s(i); end >>129 ocaml https://ideone.com/IY1dWU let chars s = let rec aux acc i = if i < 0 then acc else aux (s.[i] :: acc) (i - 1) in aux [] ((String.length s) - 1) let f s = let rec aux = function ([], []) -> 1 | (_, []) -> 0 | ('['::bs, ']'::cs) -> aux (bs, cs) | (bs, c::cs) -> aux (c::bs, cs) in aux ([], (chars s))
149 :デフォルトの名無しさん :2023/10/31(火) 00:00:13.24 ID:mywig6Xf.net >>3 c https://ideone.com/BnNzUC int has26(const char *p) { int c, count[26] = {0}; for (; c = tolower(*p); p++) if (isalpha(c)) count[c - 'a']++; for (c = 'a'; c <= 'z'; c++) if (count[c - 'a'] < 1) return 0; return 1; } const char *f(const char **lines, int n) { const char *found = 0; int i, len, minlen; for (i = 0; i < n; i++) if (has26(lines[i])) if (!found) found = lines[i], minlen = strlen(lines[i]); else if (len = strlen(lines[i]) < minlen) found = lines[i], minlen = len; return found; }
150 :デフォルトの名無しさん :2023/11/02(木) 14:01:24.52 ID:4TnUpiLT.net お題 https://i.imgur.com/XZDqbeJ.png
151 :17 :2023/11/05(日) 02:55:01.08 ID:w6RhJs5K.net >>150 ChatGPT にそのままテキストを読ませたらこう答えた。 ------------------------------------------------------------------------------------------------- 通学に自転車を使わない学生は34人、自転車を使うがバスを使わない学生は39人、バスを使うが自転車を使わない学生は18人です。 100人の学生全体からこれらの人数を引いた残りの学生がバスと自転車の両方を使っている学生の数です。 100人 - 34人 (自転車を使わない学生) - 39人 (バスを使わない学生) - 18人 (自転車を使わない学生) = 9人 したがって、通学にバスと自転車の両方を使う学生は9人です。 ------------------------------------------------------------------------------------------------- ここで徒歩については考慮しないのかとツッコミを入れたらこう答えた。 ------------------------------------------------------------------------------------------------- 申し訳ありません、徒歩の学生についての情報が提供されていなかったため、上記の計算では徒歩を選択した学生については考慮されていませんでした。徒歩を選択した学生の数についての情報がなければ、バスと自転車の両方を使う学生の正確な数を計算することはできません。 -------------------------------------------------------------------------------------------------
152 :17 :2023/11/05(日) 02:58:00.24 ID:w6RhJs5K.net そして更にこういうツッコミを入れる。 最初の34人は自転車を使っていないだけで密かにバスを使っているかも知れないのだが、そのことは考慮しないのか? ChatGPT 申し訳ありません、私の以前の回答は不完全でした。確かに、最初の34人のうち自転車を使っていないという情報だけでは、彼らがバスを使っているかどうかを確定することはできません。そのため、正確な答えを得るためには追加の情報が必要です。 もし最初の34人のうち何人かが実際にはバスを利用している場合、それを考慮する必要があります。与えられた情報だけからは、バスと自転車の両方を使う学生の正確な数を特定することはできません。必要な情報が揃わない限り、正確な答えを提供することはできません。
153 :デフォルトの名無しさん :2023/11/06(月) 00:02:49.99 ID:fuk9k4cf.net お題:単方向リストを逆順にせよ
154 :デフォルトの名無しさん :2023/11/06(月) 00:48:06.04 ID:uPzAm2Gi.net >>153 Java https://paiza.io/projects/3z8V5XGGFjxqLac8ZYo_kg
155 :デフォルトの名無しさん :2023/11/11(土) 20:39:33.71 ID:iU/7lT3J.net >>87 Ruby で作った。 FileUtils::DryRun を使っているので、実際には変更されません require 'fileutils' HEAD = 'abc' # 先頭文字 EXT = '.mp4' # 末尾の拡張子 HEAD_LEN = HEAD.length # 3文字 EXT_LEN = EXT.length # 4文字 # 絶対パスのディレクトリ名の後ろに、* を付けること! # . で始まる、隠し directory, file を除く glob_pattern = "C:/Users/Owner/Documents/test/*#{ EXT }" target_dir = File.dirname( glob_pattern ) # ディレクトリパスだけを取り出す # 元のファイル名の配列 fname_src_ary = Dir.glob( glob_pattern ) .select { |full_path| File.file?( full_path ) } # ファイルのみ .select do |full_path| file_name = File.basename( full_path ) # 先頭文字が abc かつ、末尾が .mp4 だけに絞り込む file_name.start_with?( HEAD ) && file_name.end_with?( EXT ) end .map { |full_path| File.basename( full_path ) } 次へ続く
156 :153 :2023/11/11(土) 20:41:20.19 ID:iU/7lT3J.net # 変更後のファイル名の配列 fname_dest_ary = fname_src_ary.map do |file_name| str = String.new( file_name ) # 先頭文字の abc と、末尾の .mp4 を取り除いて、数字だけにする str.slice!(-EXT_LEN, EXT_LEN) str.slice!(0, HEAD_LEN) # 10進数の数値型に変換してから、3桁0埋め文字にする HEAD + "%03d" % Integer( str, 10 ) + EXT end require 'set' # 変更後のファイル名が既に存在しているか、チェックする。 # abc100.mp4 など、3桁以上の数値もエラー! fname_src_set = Set.new( fname_src_ary ) # 集合 fname_dest_ary.each { |file_name| raise "ファイル名: #{ file_name } が重複しています" if fname_src_set.include?( file_name ) } # ファイル名を変更する fname_src_ary.zip( fname_dest_ary ) do |src_filename, dest_filename| src_path = target_dir + "/" + src_filename dest_path = target_dir + "/" + dest_filename FileUtils::DryRun.move( src_path, dest_path ) end 出力 mv C:/Users/Owner/Documents/test/abc0.mp4 C:/Users/Owner/Documents/test/abc000.mp4 mv C:/Users/Owner/Documents/test/abc99.mp4 C:/Users/Owner/Documents/test/abc099.mp4
157 :17 :2023/11/21(火) 04:31:35.72 ID:aOoah041.net >>153 Kotlin https://paiza.io/projects/TDUcagXrng4H9zD9AenxjQ
158 :デフォルトの名無しさん :2023/11/25(土) 20:07:06.40 ID:zpqT0hBE.net お題:ランダムに1から9999までの整数を得た時、何回で全種類出揃うか確認せよ 擬似乱数列生成法については指定しないものとする ruby https://ideone.com/rucuHk require 'set' r = 1..9999 c = r.to_a.fill(0) s = r.to_set while !s.empty? n = rand(r) c[n - r.first] += 1 s.delete n end p c.sum ↓ 84736
159 :デフォルトの名無しさん :2023/11/25(土) 22:17:37.68 ID:Al0Rw+0l.net >>158 R https://ideone.com/nTywN4
160 :デフォルトの名無しさん :2023/11/26(日) 10:44:04.74 ID:dd78ITN+.net プログラミングの依頼はここでいいでしょうか。 ココナラで依頼したのですが見送りになってしまいました。 お金は出すので製品版を作って欲しいです。 できないなら何が定義できていないのか教えて下さい。 AIによる詩作成 まずAIが詩を作成するための学習ツールを作ります AIがリンゴの形相を分解するには辞書が必要となる リンゴを検索し辞書を比較し関連性の高いワード リンゴ⊇(赤い、丸い、果物…)を拾うのだ これが学習ツールであり 一致したワードからさらに形相に分解する リンゴ⊇(赤い、丸い、果物、酸っぱい…) その中の果物を形相分解するには 果物⊇(リンゴ、サクランボ、なし…) その中のなしを様相分解すると なし⊇(果物、丸い、黄緑…) ここから詩を作るには『黄緑のリンゴ』などになる 形相分解すると客観的な『深さ』(今回は三段階)を持った詩になる
161 :デフォルトの名無しさん :2023/11/26(日) 10:50:43.54 ID:d/KzVdDP.net >>158 設定があいまいなんだが shuffleとかselectとかchoice系なら 高々9999回で必ず全部出る
162 :デフォルトの名無しさん :2023/11/26(日) 11:41:26.07 ID:1iIVw+fD.net >>158 Java https://paiza.io/projects/NEIRYxOjS1MiyOOhmbhaHA
163 :158 :2023/11/26(日) 12:29:54.58 ID:dd78ITN+.net 製品版なら10万円出します AIでなくても詩作成ツールでいいです
164 :デフォルトの名無しさん :2023/11/26(日) 13:43:11.68 ID:4uIV+oN2.net >>158 lisp https://ideone.com/pYi0rj
165 :デフォルトの名無しさん :2023/11/26(日) 21:12:35.28 ID:SfQeb61a.net >>159 これだと150001回以上となる場合が本来よりも起こりにくくなってしまい駄目だった。 活かしながら書き換えると https://ideone.com/qv7bL9
166 :17 :2023/11/27(月) 10:19:46.26 ID:VB+FhCy9.net >>160 ここは誰かがお題を出して答えたい人が答えるスレなので、どんなお題を書いても構わないが、誰も答えないことはよくある。 また、バグがあっても気づかずにそのままになる事もある。多分大半のプログラムは作った本人以外は検証しないので。 ごく稀に他人がバグを発見することはあるが、発見されてもわざわざ指摘するとは限らないし修正もされないかも知れない。
167 :17 :2023/11/27(月) 10:35:37.58 ID:VB+FhCy9.net >>158 Kotlin https://paiza.io/projects/B7Eq1O1iPp-ynUyb5QGL9g こんなので良いのか?やっぱ Set とか使わずにやった方が良いかな?
168 :デフォルトの名無しさん :2023/11/27(月) 12:57:15.00 ID:lzpjbGZv.net >>158 Ruby >>158 の例が個別の出現回数をカウントしていたのでそれに合わせた c = [0] * 9999 9999.times { redo unless ( c[ rand(9999) ] += 1 ) == 1 } p c.sum
169 :17 :2023/11/27(月) 13:09:30.74 ID:VB+FhCy9.net >>158 また Kotlin https://paiza.io/projects/yYQ9bdMb0_d91607skNw4Q 今度は add ではなく remove でやるようにした。 これでその Ruby の例に近くはなるがカウントする方法は前と同じで個別にはやってない。
170 :デフォルトの名無しさん :2023/11/27(月) 18:30:50.07 ID:O6HTjvgJ.net >>158 Perl perl -E 'for ($r = 9999; $n < $r; $_++) { $h{int(rand($r)) + 1} ||= ++$n }; say' 79596
171 :156 :2023/11/27(月) 20:35:49.92 ID:VuTnBSK2.net >>158 c https://ideone.com/K1fD78 ・lispのひとの(>>164 )をパク…参考にしました ・乱数生成部分は https://c-faq.com/lib/randrange.html からコピペしました int main() { int a[9999] = {0}, size = sizeof a / sizeof *a, sum, min, max, r, i, j, k; srand(time(0)); #define randi(size) ((int)((double)rand() / ((double)RAND_MAX + 1) * (size))) for (r = size; 0 < r; ) if (!a[randi(size)]++) r--; for (sum = min = max = a[0], i = 1; i < size; i++) { sum += a[i]; min = min < a[i] ? min : a[i]; max = a[i] < max ? max : a[i]; } printf("%d\n%f\n[%d, %d]\n", sum, (double)sum / size, min, max); for (i = min; i <= max; i++) { for (k = j = 0; j < size; j++) if (i == a[j]) k++; printf("%d\t%d\n", i, k); } return 0; }
172 :17 :2023/11/28(火) 15:35:44.30 ID:cIauX08C.net >>158 今度はC言語 https://paiza.io/projects/c6ALnYb4rksMFGZT03mcCw 1~9999ではなく実際には0~9998でやっているが、表示する必要もないし一々1足したり後で引いたりも馬鹿らしいのでそのままにした。
173 :デフォルトの名無しさん :2023/11/30(木) 06:46:26.20 ID:/rzYr39l.net お題:英字の羅列された文字列が与えられる。この文字列を分析して数字列を出力せよ。数字の表記ルールは、その文字の両隣の文字がASCIIコードにおける奇数だったら1、そうでなければ0.
174 :デフォルトの名無しさん :2023/11/30(木) 09:19:30.52 ID:AZ5oWFgm.net 前提としてエラー入力はなくて 出力は両隣がある時のみでいいのかな use itertools::{Itertools, assert_equal}; fn convert(input: &[u8]) -> Vec<u8> { input .iter() .tuple_windows() .map(|(prev, _curr, next)| (prev & next & 1) + b'0') .collect() } fn main() { assert_equal(&convert(b"ABC"), b"1"); assert_equal(&convert(b"abcIJKpqrXYZ"), b"1001010000"); }
175 :デフォルトの名無しさん :2023/11/30(木) 20:13:06.94 ID:tzHzM+FM.net >>173 octave https://ideone.com/mx954D function a = f(s) o = rem([0 uint8(s) 0], 2) == 1; a = o(1:end-2) & o(3:end); end >>173 c https://ideone.com/VsnqKu void f(const char *s, int *out, int *len) { int i; for (*len = strlen(s), i = 0; i < *len; i++) out[i] = (i == 0 || i == *len - 1) ? 0 : s[i - 1] & s[i + 1] & 1; }
176 :デフォルトの名無しさん :2023/11/30(木) 20:40:22.09 ID:2Igm/ys/.net >>R https://ideone.com/NqXKMs
177 :17 :2023/12/02(土) 14:30:47.66 ID:FLL1Kaqa.net >>173 Kotlin https://paiza.io/projects/xZXVc46Ys3qUlGX4DAIxzw 両隣が存在する文字のみを対象に処理をするようにした。なので3文字未満はエラーになる。3文字の場合は2文字目だけを対象にして一つ結果を出す。
178 :デフォルトの名無しさん :2023/12/04(月) 20:26:07.07 ID:LtCaDuZa.net >>173 Ruby def solution1( str ) a = 0 str.chars.inject(''){|s,c| s << ( (5 & (a = 7 & a << 1 | c.ord & 1) == 5)? '1' : '0' ) }[2..-1] || '' end solution( '' ) #=> "" solution( 'AB' ) #=> ""
179 :デフォルトの名無しさん :2023/12/08(金) 09:07:44.84 ID:Fcz3Modv.net >>173 lisp https://ideone.com/ftjccy
180 :デフォルトの名無しさん :2023/12/10(日) 17:41:17.00 ID:Dj8Ho2Ik.net >>173 C# https://paiza.io/projects/ymS6iGUKe08auaZZ-2Q6XA
181 :デフォルトの名無しさん :2023/12/13(水) 09:27:48.18 ID:NbIWTS6w.net お題 ビールの空きビンをN本集めると新品のビール1本と交換してもらえる あなたが新品のビールをP本持っている そのとき、あなたが飲めるビールはR本である N, Pを引数としてRを返す関数を定義してください
182 :17 :2023/12/13(水) 15:17:15.28 ID:WwinWAeQ.net >>181 Kotlin または Kotlin script fun beer(n: Int, p: Int) = p + p / n
183 :17 :2023/12/13(水) 15:19:45.81 ID:WwinWAeQ.net ごめん。これだと1回分しか計算してないね。ということで >>182 はボツ。
184 :17 :2023/12/13(水) 15:47:32.26 ID:WwinWAeQ.net >>181 Kotlin https://paiza.io/projects/1gGtpt6dxb6-vzoATj_Qkg 作り直した。 もっと簡略化できそうな感じもしたがやってない。何か画期的な計算方法やアルゴリズムに気付いたらまた作る。
185 :デフォルトの名無しさん :2023/12/13(水) 18:37:32.11 ID:8Qa5an+7.net >>181 Ruby def solution( n, m ) b = r = n while (k = b.div( m )) != 0 b += k - k * m r += k end r end solution( 5, 3 ) #=> 7
186 :デフォルトの名無しさん :2023/12/14(木) 00:01:58.90 ID:WyfgSj4g.net >>181 https://ideone.com/tvmy6F let f n p = let rec aux r p q = if p = 0 then r else aux (r + p) ((p + q) / n) ((p + q) mod n) in aux 0 p 0 let () = print_int @@ f 3 5 ↓ 7
187 :デフォルトの名無しさん :2023/12/14(木) 00:03:09.36 ID:uNhVrYF2.net >>181 R R <- function(N, P) ((P - 1) * N) %/% (N - 1) + 1
188 :17 :2023/12/19(火) 15:39:00.18 ID:S/sB6wJe.net >>181 Kotin https://paiza.io/projects/yPf1W7SClD8GIOV1WD_5LQ 再帰にすればとても簡単だったことに、さっき気付いた。
189 :デフォルトの名無しさん :2024/01/16(火) 00:33:05.98 ID:n8j0XaXx.net お題:時刻の文字列が与えられる。その時刻から1秒後の時刻を出力せよ。 例 入力:00:00:00 出力:00:00:01 入力:23:59:59 出力:00:00:00
190 :9 :2024/01/16(火) 02:37:52.68 ID:SfyAs2IF.net >>189 Perl5 use Time::Piece; use Time::Seconds; for (qw{00:00:00 23:59:59}) { $t = Time::Piece->strptime($_, '%T') + 1; print "入力:$_\n出力:", $t->strftime('%T'), "\n"; } ※見易くするためインデントを全角スペースに置換してあります 実行結果 ~ $ perl 22_187_1秒後.pl 入力:00:00:00 出力:00:00:01 入力:23:59:59 出力:00:00:00
191 :9 :2024/01/16(火) 02:38:47.78 ID:SfyAs2IF.net >>190 use Time::Seconds; これ要らなかった…orz
192 :デフォルトの名無しさん :2024/01/16(火) 20:31:44.73 ID:76+p6SY+.net >>189 octave https://ideone.com/CEGEj8 f = @(s) datestr(addtodate(datenum(s), 1, 'second'), 'HH:MM:SS'); in = ['00:00:00';'23:59:59'], out = f(in)
193 :デフォルトの名無しさん :2024/01/16(火) 20:54:27.73 ID:OiJoE8pV.net >>189 PowerShell "00:00:00", "23:59:59" |% {[String]([DateTime]$_).AddSeconds(1).TimeOfDay}
194 :デフォルトの名無しさん :2024/01/16(火) 21:26:50.38 ID:76+p6SY+.net >>189 ruby https://ideone.com/y2wgxo require 'time' f = -> s {(Time.parse(s) + 1).strftime('%T')} p ['00:00:00', '23:59:59'].map {|s| [s, f.(s)]}
195 :デフォルトの名無しさん :2024/01/16(火) 23:32:13.09 ID:+Emu7d1R.net >>189 js const decode = (s) => s.split(":").map(Number); const encode = (nums) => nums.map((v) => String(v).padStart(2, "0")).join(":"); const inct = (s, sec = 1) => { const a = decode(s); const ss = [ { n: a[0], max: 24 }, { n: a[1], max: 60 }, { n: a[2], max: 60 }, ]; let up = sec; const b = ss .reverse() .map(({ n, max }) => { n += up; up = Math.floor(n / max); return n % max; }) .reverse(); return encode(b); }; console.log(inct("00:00:00"));// 00:00:01 console.log(inct("23:59:59"));// 00:00:00 console.log(inct("00:00:00", 100));// 00:01:40
196 :デフォルトの名無しさん :2024/01/17(水) 00:04:27.61 ID:g7dwo5vO.net >>189 ocaml https://ideone.com/aEsvl6 let sec_of_hms hms = let at i = int_of_string (String.sub hms i 2) in at 0 * 60 * 60 + at 3 * 60 + at 6 let hms_of_sec sec = Printf.sprintf "%02d:%02d:%02d" (sec mod 86400 / 3600) (sec mod 3600 / 60) (sec mod 60) let (<<) f g x = f (g x) let f = hms_of_sec << (+) 1 << sec_of_hms
197 :デフォルトの名無しさん :2024/01/17(水) 01:45:50.10 ID:xvgJymQe.net >>189 Rust (date/timeライブラリ不使用版) fn next_time(cur: &str) -> String { let [sec, min, hour] = cur .rsplitn(3, ':') .map(|s| s.parse().unwrap()) .zip([60, 60, 24]) .scan(1, |carry, (mut value, limit)| { value += *carry; (*carry, value) = if value == limit { (1, 0) } else { (0, value) }; Some(value) }) .collect::<ArrayVec<_, 3>>()[..] else { unreachable!() }; format!("{hour:02}:{min:02}:{sec:02}") } fn main() { assert_eq!(next_time("00:00:00"), "00:00:01"); assert_eq!(next_time("23:59:59"), "00:00:00"); }
198 :17 :2024/01/18(木) 03:01:51.54 ID:opxINJAy.net >>189 Kotlin Java のライブラリそのまま使ってるだけの怠惰なプログラム https://paiza.io/projects/76gN3OCL93cAj7qXnNlyIA
199 :17 :2024/01/19(金) 19:43:44.34 ID:hxZRcaHh.net >>189 Kotlin 今度は Java のライブラリは使わずに時分秒を保持するクラスを自分で作ってそこで秒に足すとか文字列にするとかやるようにした。 https://paiza.io/projects/7YcPDBTxVFt9EVczvBJ8gQ
200 :デフォルトの名無しさん :2024/01/20(土) 23:08:19.98 ID:PCaU0wMN.net >>189 dart 2.3.0 https://ideone.com/khq9gr void main() { var sec_of_hms = (hms) => hms.split(':').fold(0, (acc, s) => acc * 60 + int.parse(s)); var hms_of_sec = (sec) => [sec % 86400 ~/ 3600, sec % 3600 ~/ 60, sec % 60].map((x) => x.toString().padLeft(2, '0')).join(':'); var f = (hms) => hms_of_sec(sec_of_hms(hms) + 1); print(f('00:00:00')); print(f('23:59:59')); }
201 :デフォルトの名無しさん :2024/01/21(日) 17:06:46.39 ID:BpmEGVkv.net >>189 c++ https://mevius.5ch.net/test/read.cgi/tech/1434079972/124
202 :デフォルトの名無しさん :2024/01/21(日) 21:15:52.66 ID:BWkvMixc.net >>189 c https://ideone.com/wRIYl2 int hmstosec(const char *hms) { int h, m, s; return sscanf(hms, "%d:%d:%d", &h, &m, &s) == 3 ? h * 3600 + m * 60 + s : 0; } char *sectohms(char *buff, int sec) { sprintf(buff, "%02d:%02d:%02d", sec % 86400 / 3600, sec % 3600 / 60, sec % 60); return buff; } char *f(char *buff, const char *hms) { return sectohms(buff, hmstosec(hms) + 1); } >>189 c https://ideone.com/3gj90n int hmstosec(const char *hms) { #define _(i) ((hms[i] - '0') * 10 + (hms[i + 1] - '0')) return _(0) * 3600 + _(3) * 60 + _(6); #undef _ } char *sectohms(char *buff, int sec) { #define _(i, value) buff[i] = '0' + (value) / 10, buff[i + 1] = '0' + (value) % 10 return _(0, sec % 86400 / 3600), buff[2] = ':', _(3, sec % 3600 / 60), buff[5] = ':', _(6, sec % 60), buff[8] = '\0', buff; #undef _ } char *f(char *buff, const char *hms) { return sectohms(buff, hmstosec(hms) + 1); }
203 :デフォルトの名無しさん :2024/01/22(月) 15:47:46.18 ID:PT6/fzaV.net >>189 lisp https://ideone.com/J8xIVN
204 :デフォルトの名無しさん :2024/01/23(火) 20:39:51.43 ID:8rvcqFQo.net >>189 gawk https://ideone.com/zBy22y BEGIN {FS=":"} {print strftime("%T", mktime(sprintf("2024 01 23 %s %s %s", $1, $2, $3)) + 1);} >>189 sqlite https://ideone.com/fjEdMz select time('00:00:00', '+1 second'); select time('23:59:59', '+1 second'); >>189 bash https://ideone.com/pYf8vL while read hms; do date '+%T' --date="+1 seconds $hms" done
205 :デフォルトの名無しさん :2024/01/23(火) 22:56:23.02 ID:8rvcqFQo.net >>189 pascal https://ideone.com/sprmCC program ideone; Uses sysutils, dateutils; function f(hms : string) : string; begin f := TimeToStr(IncSecond(StrToTime(hms), 1)) end; begin writeln(f('00:00:00')); writeln(f('23:59:59')); end.
206 :デフォルトの名無しさん :2024/01/23(火) 23:54:34.15 ID:39Fs96AV.net >>189 を時間ライブラリ無しで作成できている言語は現時点で 193のJavaScript 194のOCaml 195のRust 197のKotlin 198のDart 199のC++ 200のC 201のLisp 以上
207 :17 :2024/01/24(水) 00:08:17.22 ID:n4ooUyFj.net >>189 Perl bashのコマンドラインから長い長いワンライナーで。 $ perl -ne 'if(/(\d+):(\d+):(\d+)/){$h=$1;$m=$2;$s=$3;printf"入力:%02d:%02d:%02d\n",$h,$m,$s;$s++;if($s>=60){$m++;$s=0;if($m>=60){$h++;$m=0;if($h>=24){$h=0}}}printf"出力:%02d:%02d:%02d\n",$h,$m,$s}' 1:2:3 入力:01:02:03 出力:01:02:04 0:0:0 入力:00:00:00 出力:00:00:01 23:59:59 入力:23:59:59 出力:00:00:00 $
208 :デフォルトの名無しさん :2024/02/02(金) 06:41:15.23 ID:CC6U77IS.net お題 入力データをグループ分けして出力せよ 入力データの、= の左右は同じグループである。 出力する順番は、入力データの出現順とする UnionFind を使えば良いかも 入力データ ["a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"] 出力 [["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"], ["c1", "c2", "c3", "c4", "d1", "d2", "d3"], ["e1", "e2", "e3"]] Ruby で、UnionFind を自作してみた。 下はユニットテストです https://paiza.io/projects/e6nk1EOu3utyWpV3iuWAFQ?language=ruby https://paiza.io/projects/kjeVtTKeDwEnWVrBU5_nbg?language=ruby
209 :デフォルトの名無しさん :2024/02/02(金) 10:50:23.49 ID:fEMhv+T7.net >>208 Rust fn foo<'a, 'b>(input: &'b [&'a str]) -> Vec<Vec<&'a str>> { struct Data<'a> { name: &'a str, rep: usize, coll: Option<Vec<usize>>, } let mut data = Vec::<Data>::new(); let mut map = HashMap::<&str, usize>::new(); for s in input { let (index0, index1) = s.splitn(2, '=') .map(|s| match map.get(s) { Some(&index) => data[index].rep, None => { let index = data.len(); map.insert(s, index); data.push(Data { name: s, rep: index, coll: Some(vec![index]), }); index }, }) .sorted().tuple_windows().next().unwrap(); if index0 != index1 { let coll0 = data[index0].coll.take().unwrap(); let coll1 = data[index1].coll.take().unwrap(); coll1.iter().for_each(|&index| data[index].rep = index0); data[index0].coll = Some(itertools::merge(coll0, coll1).collect()); } } data.iter().map(|data| &data.coll).flatten() .map(|coll| coll.iter().map(|&index| data[index].name).collect()).collect() }
210 :デフォルトの名無しさん :2024/02/02(金) 10:53:02.58 ID:fEMhv+T7.net >>209 の動作確認用追加分 use std::collections::HashMap; use itertools::Itertools; fn main() { let input = [ "a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3" ]; let output = [ vec!["a1", "a2", "b1", "b2", "b3", "a3", "a4", "a5", "b4"], vec!["c1", "c2", "c3", "c4", "d1", "d2", "d3"], vec!["e1", "e2", "e3"] ]; assert_eq!(foo(&input), output); }
211 :デフォルトの名無しさん :2024/02/02(金) 22:48:33.27 ID:UezRkqGy.net >>208 ruby https://ideone.com/eF5lww f = -> a { w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h a.each_with_object([]) {|s, acc| x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1) if xa && ya then xa.concat (acc.delete ya) << x << y elsif xa then xa << x << y elsif ya then ya << x << y else acc << [x, y] end }.map {|a| a.uniq.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]} }
212 :デフォルトの名無しさん :2024/02/02(金) 22:51:42.74 ID:UezRkqGy.net >>208 rust https://ideone.com/MEZMPO fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // ' let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>(); let mut acc = Vec::<Vec<&str>>::new(); for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) { match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) { (Some(xi), Some(yi)) => { let ys = acc[yi].clone(); acc[xi].extend(ys); acc[xi].extend(xy); acc.remove(yi); }, (Some(xi), None) => acc[xi].extend(xy), (None, Some(yi)) => acc[yi].extend(xy), _ => acc.push(xy), } } for b in acc.iter_mut() { b.sort_by(|c, d| h.get(d).cmp(&h.get(c))); b.dedup(); } acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0]))); acc }
213 :デフォルトの名無しさん :2024/02/02(金) 23:24:19.60 ID:UezRkqGy.net >>208 ruby https://ideone.com/daI0QL ・若干の修正 f = -> a { w = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h a.each_with_object([]) {|s, acc| x, xa, y, ya = s.split('=').map {|k| [k, acc.find {|b| b.include? k}]}.flatten(1) if xa && ya then xa.concat (acc.delete ya) elsif xa then xa << y elsif ya then ya << x else acc << [x, y] end }.map {|a| a.sort_by {|s| w[s]}}.sort_by {|a| w[a[0]]} }
214 :デフォルトの名無しさん :2024/02/02(金) 23:24:45.86 ID:UezRkqGy.net >>208 rust https://ideone.com/dO4xea ・若干の修正 fn f<'a>(a: &[&'a str]) -> Vec<Vec<&'a str>> { // ' let h = a.iter().map(|&s| s.split('=')).flatten().rev().enumerate().map(|(p, s)| (s, p)).collect::<HashMap<_, _>>(); let mut acc = Vec::<Vec<&str>>::new(); for xy in a.iter().map(|s| s.split('=').collect::<Vec<_>>()) { match (acc.iter().position(|b| b.contains(&xy[0])), acc.iter().position(|b| b.contains(&xy[1]))) { (Some(xi), Some(yi)) => { let ys = acc[yi].clone(); acc[xi].extend(ys); acc.remove(yi); }, (Some(xi), None) => acc[xi].push(xy[1]), (None, Some(yi)) => acc[yi].push(xy[0]), _ => acc.push(xy), } } acc.iter_mut().for_each(|b| b.sort_by(|c, d| h.get(d).cmp(&h.get(c)))); acc.sort_by(|c, d| h.get(d[0]).cmp(&h.get(c[0]))); acc }
215 :デフォルトの名無しさん :2024/02/02(金) 23:58:11.98 ID:Uk0I9chw.net >>208 R https://ideone.com/FOwwk2
216 :デフォルトの名無しさん :2024/02/03(土) 02:58:35.44 ID:bEsWZIv5.net >>208 Java https://paiza.io/projects/TzHsf-cnqzdxSASpwlgg_w
217 :デフォルトの名無しさん :2024/02/03(土) 10:26:51.46 ID:kmOXhk/V.net >>208 >>215 Rでもっと短く書けた。 https://ideone.com/vmtYAJ
218 :9 :2024/02/04(日) 16:39:59.23 ID:jTY6zdRX.net >>210 Perl5 use feature qw{:5.16 signatures}; no warnings qw(experimental::signatures); @s = qw[a1=a2 b1=b2 b3=b2 c1=c2 e1=e2 a3=a4 c3=c4 e1=e3 a2=a4 c3=c1 b3=a4 c2=d1 a4=a5 d2=c1 b4=b3 d3=c3]; for (map{[sort /(\w+)=(\w+)/]} @s) { ($l, $r) = @$_; $g{$r} //= $g{$l} //= $g{$r} // $l; $h{$g{$r}} = $g{$l} if $g{$l} ne $g{$r}; } $h{$k} = sub($e){$h{$e} ? __SUB__->($h{$e}) : $e}->($v) while ($k, $v) = each %h; $g{$_} = $h{$g{$_}} // $g{$_} for keys %g; push @{$r{$v}}, $k while ($k, $v) = each %g; say "@$_" for values %r; ※見易くするためインデントを全角スペースに置換してあります 実行結果 $ perl 22_206_grouping.pl b3 a3 a5 b4 a4 a1 b1 a2 b2 c1 d1 d3 c3 c2 d2 c4 e3 e1 e2
219 :9 :2024/02/04(日) 18:22:17.66 ID:jTY6zdRX.net >>210 宛てじゃなかった >>208 の回答だったわ… orz
220 :デフォルトの名無しさん :2024/02/04(日) 18:32:39.04 ID:fS5H2fbQ.net >>208 >>217 をPowerShellに移植 $in = "a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3", "a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3" $in -split "=" |% {$h = @{}; $n = 0} {if (!$h[$_]) {$h[$_] = $n++}} $eq = $in |% {, $h[$_ -split "="]} $g = 1..$n do { $changed = $false $eq |% { $i, $j = $_ switch ($g[$i] - $g[$j]) { {$_ -gt 0} {$g[$i] = $g[$j]; $changed = $true} {$_ -lt 0} {$g[$j] = $g[$i]; $changed = $true} } } } while ($changed) $h.keys | sort {$h[$_]} | group {$g[$h[$_]]} |% {"[$($_.group -join ", ")]"} -- 実行結果 -- [a1, a2, b1, b2, b3, a3, a4, a5, b4] [c1, c2, c3, c4, d1, d2, d3] [e1, e2, e3]
221 :デフォルトの名無しさん :2024/02/04(日) 19:02:37.59 ID:fS5H2fbQ.net >>220 の5行目の if (!$h[$_]) を if ($h[$_] -eq $null) に訂正
222 :デフォルトの名無しさん :2024/02/04(日) 19:43:39.57 ID:NiYs7EK6.net >>208 C++ https://mevius.5ch.net/test/read.cgi/tech/1434079972/125 完全にやっつけ仕事、いろいろ課題がありますね
223 :211 :2024/02/04(日) 23:55:45.21 ID:ytAuzkvH.net >>208 ruby https://ideone.com/2UiT8U ・>>213 から若干のアレンジ ・同一グループの収集にSortedSetを使用
224 :17 :2024/02/05(月) 02:54:15.12 ID:8tY/Vubv.net >>208 Kotlin 入力データを標準入力から入力したり、クラス作ってその中でまとめる等、色々やって長くなった。 https://paiza.io/projects/zdysD5ygRDFVbY2gAGCwOw
225 :221 :2024/02/05(月) 20:08:21.07 ID:tt/WRhkt.net >>208 ruby https://ideone.com/j2xPyB ・>>223 から若干のアレンジ ・SortedSet単位でのみいじるようにした f = -> a { g = -> a {a.combination(2) {|x, y| break g.(a.tap {x.merge y; a.delete y}) if x.intersect? y}} h = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h a = a.map {|s| s.split('=').map {|k| h[k]}.to_set SortedSet} g.(a).map {|set| set.map &h.invert.method(:[])} }
226 :デフォルトの名無しさん :2024/02/05(月) 23:26:45.85 ID:YjqgZClx.net >>208 >>220-221 をC#化 https://ideone.com/qWA5TB
227 :223 :2024/02/05(月) 23:51:15.55 ID:tt/WRhkt.net >>208 rust https://ideone.com/Ma1WGV ・>>225 の移植 ・色々迷いアリ .map(|k| *h.get(k).unwrap())のところは当初 .map(|k| h.get(k).map(|&i| i)).flatten()などとしていたが 正解がわからないので迷った挙げ句に短く書けるほうを採用 ・これに限らずrustは不慣れなので色々珍妙なことをしている可能性アリ
228 :225 :2024/02/06(火) 22:07:13.88 ID:6T/Xuns0.net >>208 rust https://ideone.com/m5INyJ ・>>227 から若干の修正 ・不必要なループ回数を訂正 ・二重forを一重に(でもかえって煩雑に) ・まだまだ迷いアリ .map(|k| *h.get(k).unwrap())は結局 .flat_map(|k| h.get(k)).cloned()に置き換え こっちのほうが個人的にはスッキリ感アリ >>208 rust https://ideone.com/hT5zGF ・上記のmutナシ版 ・パフォーマンス的な観点もナシ
229 :デフォルトの名無しさん :2024/02/06(火) 22:17:05.66 ID:ICpsP2hv.net >>208 C#で>>226 とは別の解法 https://ideone.com/fvtgZa
230 :デフォルトの名無しさん :2024/02/09(金) 20:11:03.28 ID:xlZlW34G.net >>208 C#でHashSet型を使用。実効速度は>>226 と>>229 より遅い。 https://ideone.com/cPsAYu
231 :226 :2024/02/09(金) 22:33:42.16 ID:JDB9tF7l.net >>228 すべてruby移植版rust DでもE見た目派生まとめ mutあり版 https://ideone.com/m5INyJ // for if return https://ideone.com/R8wcOJ // match find https://ideone.com/ifI5EX // if let find mutなし版 https://ideone.com/hT5zGF // for if return https://ideone.com/1PNKbR // match find https://ideone.com/btKWb1 // if let find 集合同士の組み合わせに重なりが一個もなかったときに 最後に返す a がポツーンと片隅に居るのが落ち着かなかったので match/if letで書き直してみたがそれはそれで難があり? 条件部分が奥に入ってしまったのがなんかイヤだったり? 一行目が長くなりすぎる、という理由で二行に分けたり? やっぱ元のfor if returnのリズムのほうが眼球に入りやすい?
232 :デフォルトの名無しさん :2024/02/10(土) 22:10:46.31 ID:HaBtyH/G.net >>208 >>229 をC++に移植 https://ideone.com/RgBBVA
233 :デフォルトの名無しさん :2024/02/11(日) 15:34:27.52 ID:3wEOIMb0.net >>208 octave https://ideone.com/b2MsDk >>208 octave https://ideone.com/x6Lzmb
234 :デフォルトの名無しさん :2024/02/11(日) 20:38:42.50 ID:v64KP9lJ.net >>208 >>232 をDで書くと https://ideone.com/9oenyq になるが、switch case 0, 1, 2の場合も3の場合と同じ処理にすると、効率は落ちるもののかなり短くできる。 https://ideone.com/ILLUdy
235 :223 :2024/02/12(月) 23:45:12.86 ID:ix8w7wd+.net >>208 octave https://ideone.com/VtqJcV ・組み合わせつくって集合のペアごとに調べることをやめた ・集合間で重複する要素に着目して集合を減らすようにした >>225 g.(a).map {|set| set.map &h.invert.method(:[])}じゃなくて単に g.(a).map {|set| h.keys.values_at *set}で良かった
236 :デフォルトの名無しさん :2024/02/14(水) 09:32:06.19 ID:JjlrBdlD.net お題:数値が入力されるのでその数値に最も近い回分数を出力せよ 回分数とは回分になっている数(負数含まず)のことである 最も近い回分数が2つある場合は2つとも出力せよ 入力 0 出力 0 入力 17 出力 22 入力 100 出力 99 出力 101
237 :デフォルトの名無しさん :2024/02/14(水) 15:20:24.32 ID:VoM/Kva2.net >>236 lisp https://ideone.com/MvDoGf
238 :デフォルトの名無しさん :2024/02/14(水) 21:10:48.99 ID:/8p4lTpf.net >>236 ocaml https://ideone.com/4RtyBj >>236 rust https://ideone.com/eLCvSJ
239 :デフォルトの名無しさん :2024/02/14(水) 23:21:42.28 ID:iTsk+dOj.net >>238 PowerShell https://ideone.com/voA7MH
240 :デフォルトの名無しさん :2024/02/15(木) 21:30:35.17 ID:MveN6p4/.net >>236 Rust fn foo(n: usize) -> (usize, Option<usize>) { let n2b = |n: usize| { let mut o = Some(n); iter::from_fn(|| { let n = o.take()?; o = (n >= 10).then(|| n / 10); Some((n % 10) as i8) }).collect::<Vec<i8>>() }; let b2n = |b: &[i8]| b.iter().rev().fold(0_usize, |n, b| n * 10 + *b as usize); let pal = |b: &mut [i8]| { let len = b.len() / 2; let (l, u) = b.split_at_mut(len); iter::zip(l, u.iter().rev()).for_each(|(l, u)| *l = *u); }; let inc = |b: &mut [i8]| { let len = b.len() / 2; let mut c = 1; b[len..].iter_mut().for_each(|b| { *b += c; if *b > 9 { *b = 0; c = 1; } else { c = 0; }}); }; let dec = |b: &mut [i8]| { let len = b.len() / 2; let mut c = 1; b[len..].iter_mut().for_each(|b| { *b -= c; if *b < 0 { *b = 9; c = 1; } else { c = 0; }}); }; let fix = |b: &mut [i8]| { if b.last() == Some(&0) { if b.len() & 1 == 0 { b[(b.len() - 1) / 2] = 9; } true } else { false } }; let mut b = n2b(n); pal(&mut b); let n1 = b2n(&b); match n.cmp(&n1) { Ordering::Equal => return (n, None), Ordering::Greater => inc(&mut b), Ordering::Less => dec(&mut b), } if fix(&mut b) { b.pop(); } pal(&mut b); let n2 = b2n(&b); match n.abs_diff(n1).cmp(&n.abs_diff(n2)) { Ordering::Less => (n1, None), Ordering::Greater => (n2, None), Ordering::Equal => (n1, Some(n2)), } }
241 :デフォルトの名無しさん :2024/02/15(木) 22:00:50.95 ID:fu0tHwRa.net >>236 >>239 は入力が1〜9のとき出力が正しくなかった。function内の1行目に if ($n -le 9) {return $n} を 挿入すると修正される。 Rでは添字の開始値は1で添字0では空のデータが返るので、入力が1〜9のときの場合分けは不要。 []演算子と+演算子を文字列でも使えるように再定義した。 https://ideone.com/PP5swB Dでは添字範囲指定は半開区間なので、入力が1〜9のときの場合分けは不要。 https://ideone.com/hvNBia
242 :デフォルトの名無しさん :2024/02/15(木) 23:18:01.58 ID:IMdr4idU.net >>236 c https://ideone.com/mWihci
243 :9 :2024/02/16(金) 02:56:10.41 ID:7jtCAGu+.net >>236 Perl5 for $n (0,17,100,123459321) { my %a; for (0..$n) { $i = $n - $_; $a{$i} = $i if 0 <= $i and $i =~ /^((\d)(?1)\2|\d?)$/; $j = $n + $_; $a{$j} = $j if $j =~ /^((\d)(?1)\2|\d?)$/; last if keys %a; } @a = keys %a; print "$n -> @a\n"; } ※見やすくするためインデントを全角スペースに置換してあります。 実行結果 $ perl 22_234_palindromic_number.pl 0 -> 0 17 -> 22 100 -> 99 101 123459321 -> 123464321 123454321
244 :9 :2024/02/16(金) 03:13:10.80 ID:7jtCAGu+.net >>243 last if keys %a; } @a = keys %a; は last if @a = keys %a; } とコンパクトに書けるんだった、まぁいいや
245 :9 :2024/02/16(金) 14:47:55.29 ID:TIAwaOOw.net >>236 Perl5、小さい方の検索は0で止まるので負の値を避ける必要はなかった、書き直し。 $r = qr/^((\d)(?1)\2|\d?)$/; for $n (0,17,100,123459321) { my %a; for (0..$n) { $a{$n - $_} = 1 if ($n - $_) =~ $r; $a{$n + $_} = 1 if ($n + $_) =~ $r; last if @a = keys %a; } print "$n -> @a\n"; }
246 :デフォルトの名無しさん :2024/02/16(金) 21:57:03.19 ID:cLyPSkE5.net >>236 pascal https://ideone.com/F1gAKR
247 :17 :2024/02/16(金) 23:58:17.22 ID:C4FuIAno.net >>236 Kotlin 何か画期的なアルゴリズムを使ったわけではなく、むしろほとんど何も考えずただ作られただけのプログラム。 https://paiza.io/projects/S5qsLnHz_pZD3um9jYRg_Q
248 :9 :2024/02/17(土) 02:10:36.54 ID:K8P5qDCx.net >>236 Python3 def f(k): s = str(k) return s == s[::-1] for n in [0, 17, 100, 123459321]: l = set() for i in range(n + 1): if f(n - i): l.add(n - i) if f(n + i): l.add(n + i) if l: print(n, l) break ※見易くするためインデントは全角空白に置換してあります 実行結果 $ python3 22_234_palindromic_number..py 0 {0} 17 {22} 100 {99, 101} 123459321 {123454321, 123464321}
249 :デフォルトの名無しさん :2024/02/17(土) 18:14:20.87 ID:nUY+CX2J.net >>236 pascal https://ideone.com/kRXq6z ・dynamic array 使用
250 :デフォルトの名無しさん :2024/02/17(土) 19:03:53.65 ID:eWGoJOTY.net >>236 C++ https://mevius.5ch.net/test/read.cgi/tech/1434079972/126
251 :デフォルトの名無しさん :2024/02/17(土) 20:00:17.98 ID:k6cg1rdP.net >>236 >>241 のC#版 https://ideone.com/glAEMw Julia版 https://ideone.com/cbP5Dm
252 :デフォルトの名無しさん :2024/02/17(土) 20:51:00.88 ID:nUY+CX2J.net >>236 octave https://ideone.com/MXux5X
253 :デフォルトの名無しさん :2024/02/17(土) 21:45:58.19 ID:nUY+CX2J.net >>236 ruby https://ideone.com/0pvK4o
254 :デフォルトの名無しさん :2024/02/18(日) 17:05:41.93 ID:z028saCP.net >>253 >[[0, [0]], [17, [11]], [100, [99, 101]]] 17 は、22 だよ
255 :デフォルトの名無しさん :2024/02/18(日) 18:14:23.24 ID:puttXdr1.net >>237 しらみ潰しで失格 >>238 しらみ潰しで失格 >>242 しらみ潰しで失格
256 :デフォルトの名無しさん :2024/02/18(日) 18:14:51.62 ID:puttXdr1.net >>245 しらみ潰しで失格 >>246 しらみ潰しで失格 >>247 しらみ潰しで失格
257 :デフォルトの名無しさん :2024/02/18(日) 18:15:27.81 ID:puttXdr1.net >>248 しらみ潰しで失格 >>249 しらみ潰しで失格 >>250 しらみ潰しで失格
258 :デフォルトの名無しさん :2024/02/18(日) 18:16:03.57 ID:puttXdr1.net >>252 しらみ潰しで失格 >>253 しらみ潰しで失格
259 :デフォルトの名無しさん :2024/02/18(日) 18:26:09.28 ID:ovKjFpQ6.net >>255-258 アスペで不合格w
260 :デフォルトの名無しさん :2024/02/18(日) 18:34:19.30 ID:rWy6ZYAH.net >>236 ruby https://ideone.com/N0w91j f = -> n { (0..n).lazy.map {|i| [n - i, n + i].select {|x| x.to_s.reverse.to_i == x}}.find(&:any?).uniq } >>254 (`・ω・´)ゞ 誤:a - 1, a + 1 正:a - 1, b + 1
261 :デフォルトの名無しさん :2024/02/18(日) 19:41:35.69 ID:rWy6ZYAH.net >>236 dart https://ideone.com/e23wRv void main() { var rev = (n) => int.parse(n.toString().split('').reversed.join()); var f = (n) => Iterable.generate(n + 1).map((i) => [n - i, n + i].where((x) => x == rev(x))).firstWhere((a) => a.isNotEmpty).toSet().toList(); print([0, 17, 100].map((n) => [n, f(n)])); }
262 :デフォルトの名無しさん :2024/02/20(火) 08:46:37.56 ID:8US2zplP.net 【㋮㋑㋣㋹㊀㋳】 チャールズ3世戴冠式に`死神´ https://rio2016.5ch.net/test/read.cgi/kokusai/1690352002/l50 sssp://o.5ch.net/22ja8.png
263 :17 :2024/02/20(火) 10:47:13.25 ID:YmH8jdAc.net >>256 しらみ潰しって、どんなテストしたの?
264 :デフォルトの名無しさん :2024/02/20(火) 12:59:46.62 ID:qzcGLGiS.net しらみ潰しとは例えば1から順番に見つかるまで全てを試していく最悪な方法を指す 今回の場合だと与えた数から順番に見つかるまで±1を続けて全てを試していって探すプログラムが該当する
265 :9 :2024/02/20(火) 17:18:07.59 ID:X5uoFLgg.net 「どんなテストしたの?」 って質問だよ
266 :◆QZaw55cn4c :2024/02/20(火) 20:48:17.02 ID:RtAsHDVN.net >>264 私は >>250 だけれども、解法としてはそれしかないと思いますね
267 :デフォルトの名無しさん :2024/02/20(火) 22:00:55.76 ID:e+y9lgSN.net >>251 と >>240 は しらみ潰しではなく きちんとプログラミングして算出しているようにみえますね
268 :デフォルトの名無しさん :2024/02/21(水) 13:54:29.89 ID:ve9Dz9D8.net >>266 私は解答は提出していないが、ざっくりと自分が思いついた方法 まず、以下のような操作を考える 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が答え 十分大きな数に対しては虱潰しに回文判定していくより速く求まる
269 :デフォルトの名無しさん :2024/02/21(水) 16:02:55.06 ID:Sko4Sglv.net >>268 N=17 のときは?
270 :259 :2024/02/21(水) 23:06:20.13 ID:DX/jvS2m.net >>261 Iterable.generate(n).map(f)は単に Iterable.generate(n, f)で良かったと判明
271 :デフォルトの名無しさん :2024/02/21(水) 23:42:23.78 ID:bqTl0uQM.net >>236 >>251 をC++で書き換え(入力値は64ビット整数の範囲内限定) https://ideone.com/e1AM8A 元々はCで書き、4行目はなし、15行目と24行目はstrrev(s + i);だったが、Windowsのgccでは コンパイルできたのにideoneではできなかったので、仕方なくC++にしてstd::reverseで代用した。
272 :デフォルトの名無しさん :2024/02/22(木) 00:34:50.13 ID:+mJgzEZf.net >>236 lisp >>268 を参考に>>251 (C#)を移植 https://ideone.com/CUPTas
273 :デフォルトの名無しさん :2024/02/22(木) 01:30:35.61 ID:9s07Ijs0.net >>236 Rust fn nearest_palindrome_numbers(n: usize) -> Vec<usize> { let mut dd = DecimalDigits::new(n); dd.palindrome_using_upper_half(); let n1 = dd.to_number(); match compare(n, n1) { Equal => return vec![n], Greater => dd.increment_upper_half(), Less => dd.decrement_upper_half(), } if dd.is_most_upper_zero() { return vec![n - 1, n + 1]; } dd.palindrome_using_upper_half(); let n2 = dd.to_number(); match compare_absolute_diff((n, n1), (n, n2)) { Less => return vec![n1], Greater => return vec![n2], Equal => return if n1 < n2 { vec![n1, n2] } else { vec![n2, n1] }, } }
274 :266 :2024/02/22(木) 01:47:44.56 ID:c61GBvnr.net >>269 N=17=1*10+7*1のとき、Nは2桁(偶数桁)でM=1*1=1 B(M)=B(1)=11はNより小さいのでB(M-1)は考えなくてよい B(M+1)=B(2)=22なので11,22が答えの候補 11より22のほうが17に近いので22が答え ちょっとNに対するMの説明が足りてなかったけど言葉で上手く言い表せないすみません(上位半分以上かつ最小の桁数を抜き出す、的な)
275 :デフォルトの名無しさん :2024/02/22(木) 20:54:45.16 ID:+nyM4OV5.net >>236 ruby https://ideone.com/rJCYgT ・それっぽい三個の候補から選んでるだけ
276 :デフォルトの名無しさん :2024/02/22(木) 21:04:16.48 ID:3p8Kt6H4.net >>236 >>271 の一部でC++の機能をどうせ使ってしまったので、この際、全部をC++流に変えたら C流よりすっきり書けた。 https://ideone.com/38bo2E
277 :273 :2024/02/22(木) 21:48:36.22 ID:+nyM4OV5.net >>275 > [1000, [1001]] 誤:ps = [p.(s), p.(t.to_i.pred.abs.to_s + u), p.(t.succ + u)] 正:ps = [p.(s), p.(t.to_i.pred.abs.to_s + u), p.(t.succ + u), p.(s.to_i.pred.abs.to_s)] とりあえず雑に修正してみたが? (ノ∀`)アチャー
278 :17 :2024/02/23(金) 18:10:28.85 ID:ZR6D6MGM.net >>264 >>247 のKotlinのプログラムは何も考えてなくて本当に馬鹿正直に±1して一つ一つ検査する方式で作ったんだけど、それでもあなたのテストではダメということになったの? まあ Int (符号付32bit整数) 使ってるからその限界超えたらダメではあるんだけど、そういう問題ではなく?
279 :デフォルトの名無しさん :2024/02/23(金) 18:58:34.05 ID:9Umf93zL.net >>278 それはしらみつぶしと言われる駄目プログラミングだよ 例えば求める解法が存在する方程式を解くのに値を±1しながら順に代入して試していくのと同じ
280 :デフォルトの名無しさん :2024/02/23(金) 21:39:34.55 ID:ZR6D6MGM.net >>279 あー。プログラムにバグがあってまともに答えが出ないっていうことではなく何の捻りもないプログラムだからダメっていう感想ね。それならわかる。 こちらもアルゴリズム思い浮かばないけどとりあえず作ってみただけだし。ダメというほどではないが良いとも思えないプログラムなので。
281 :273 :2024/02/23(金) 23:06:54.56 ID:RzwC5Hr4.net >>236 ruby https://ideone.com/E9VSE3 ・273の[1000, [1001]]バグ修正版 ・275とは違う方法で修正してみたがやっつけ感大 >>236 ruby 2.5.5 https://ideone.com/1zqSr1 ・いわゆる(?)ジェネレータ版 ・「終端を持たない範囲オブジェクト」はRuby 2.6.0から
282 :デフォルトの名無しさん :2024/02/24(土) 00:25:03.27 ID:f2xn4abB.net >>236 Ruby https://paiza.io/projects/2G8vPQJQOBZecXPD5ZIFTQ?language=ruby
283 :279 :2024/02/24(土) 13:21:16.94 ID:aSUCvHSH.net >>236 ruby 2.5.5 https://ideone.com/04fxGM ・ジェネレータ版ちょっとアレンジ ・to_sしてto_iするのをやめた
284 : :2024/02/24(土) 14:25:41.40 ID:NZEL8Kud.net 異なる自然数 a, b (a > b) における a^3 - b^3 を「a, b の三乗差」と呼ぶことにする。 異なる5通りの組(a, b) (c, d) ... (j, k) について三乗差がすべて相等しいとき その組(a, b)...(j, k) および三乗差自体を求めよ 異なる6通りの組で三乗差が相等しい場合があるかも検討せよ
285 :デフォルトの名無しさん :2024/02/24(土) 16:47:38.19 ID:KRWvIUHe.net >>284 [(1134, 357), (1155, 504), (1246, 805), (2115, 2004), (4746, 4725)] a^3 - b^3 == 1412774811
286 :17 :2024/02/24(土) 16:52:08.36 ID:Pf8MFN4C.net 数学、か・・・
287 :デフォルトの名無しさん :2024/02/24(土) 18:16:29.01 ID:O6Cw1j13.net >>284 ruby https://ideone.com/wBX9Rs ・そのまま版 ・5秒じゃ_
288 :デフォルトの名無しさん :2024/02/24(土) 20:03:55.52 ID:mNVJyIZh.net >>236 >>276 を巨大整数対応にした。 https://ideone.com/Hg3kGJ
289 :デフォルトの名無しさん :2024/02/24(土) 22:30:55.28 ID:mNVJyIZh.net >>284 aが5000以下限定で>>285 の解はRで5秒以内に求められた。8〜9行目は下三角行列の要素番号から 行番号と列番号を求めているだけで、>>284 を解く特別なアルゴリズムというわけではない。 https://ideone.com/w4X3DC
290 :285 :2024/02/25(日) 08:52:58.18 ID:M1xmyD2F.net >>284 ruby 2.5.5 https://ideone.com/4GdMaO ・285の無駄なループ回数を削減 ・でも5秒じゃ_
291 :デフォルトの名無しさん :2024/02/25(日) 21:06:57.77 ID:CUQUyFSy.net >>284 >>289 は下三角行列の要素番号から列番号を求めるのに2次方程式を解くのが分かりにくかったから、 各列の最下行の要素番号を計算しておいてそれを二分探索するように変更した。 https://ideone.com/Tefgkh n = 25000で実行してみても、n = 5000ときの解のa, bを両方とも2, 3, 4, 5倍した解しか別に 見つからなかった。
292 :デフォルトの名無しさん :2024/02/26(月) 22:18:39.21 ID:CjcYgBx5.net >>284 >>291 と似た手順でC++ https://ideone.com/nFRsrK Rではソートする前に重複値だけを抽出しているが、C++のunique関数はソート済みデータにしか 使えないので使っていない。
293 :288 :2024/02/27(火) 21:45:30.42 ID:nu8aoj+0.net >>284 c https://ideone.com/eM18H1 ・288の移植
294 :デフォルトの名無しさん :2024/02/27(火) 22:30:42.88 ID:BJV11H6M.net >>284 下三角行列の各列内の要素は昇順で既に並んでいるのに、>>292 は下三角行列の全要素を ソートして無駄なので、列のマージに変更(要するにマージソートを途中段階から開始) したら少し速くなった。 https://ideone.com/EZSvB3 n = 10000でも5秒以内に終わった。 https://ideone.com/huQiBe
295 :288 :2024/02/28(水) 22:00:05.18 ID:7ZY4TL6q.net >>284 c++ https://ideone.com/teo5Mm ・288の移植 >>284 rust https://ideone.com/G94aN3 ・288の移植
296 :デフォルトの名無しさん :2024/02/28(水) 23:21:09.16 ID:FCtvUtiC.net >>284 >>294 とは別の方法で>>292 を高速化 https://ideone.com/QxjmyT 1³, 2³, 3³, …, 5000³をD = 5001で割った余りはすべて異なる値になるから、d = a³ − b³を Dで割った余りはどれか1つの値に偏ることなく均等に分布する。dをDで割った余りによりdを 区分すれば、各区分に入る個数はどれも多すぎないのでソートに時間が余りかからない。 Dの値はconstexpr関数によりコンパイラに計算させている。n = 10000, 15000のときは それぞれD = 10002, 15009になる。
297 :291 :2024/02/29(木) 22:20:45.85 ID:HlaTo1dC.net >>284 c https://ideone.com/JnJpJW ・291から省メモリ化 旧:unsigned int values[10]; 新:unsinged short values[4];
298 :デフォルトの名無しさん :2024/03/01(金) 22:22:26.10 ID:6k2oCbjk.net >>284 C++ https://ideone.com/1c4s5I >>296 はa, bの二重ループ内でa³ − b³をD = 5001で割った余りrにより区分していたが、 rのループ内でa, bを変化させるように変更したら、2次元配列がなくなってすっきりした。 その結果、メモリ使用量が激減し、nが大きい場合でも実行できるようになった。
299 :デフォルトの名無しさん :2024/03/01(金) 22:23:18.03 ID:6k2oCbjk.net >>298 の続き n = 1000000, m = 6で実行すると、12通りの解が見つかった。 [6つ組解] 424910390480793: (75978, 23919), (77385, 33768), (83482, 53935), (141705, 134268), (317982, 316575), (596001, 595602) 620174235433536: (86184, 27132), (87780, 38304), (90237, 48573), (94696, 61180), (160740, 152304), (360696, 359100) 1238805803151000: (107487, 14487), (108540, 34170), (110550, 48240), (119260, 77050), (454260, 452250), (851430, 850860) 1384074844012224: (112152, 29844), (125324, 83600), (130050, 93426), (159372, 138624), (224928, 215412), (357447, 353799) 1936290882196125: (127629, 52254), (133320, 75675), (149285, 111620), (228525, 215430), (246510, 235395), (290214, 282339) 4589726535576000: (170172, 69672), (177760, 100900), (185265, 120945), (304700, 287240), (328680, 313860), (386952, 376452) 4961393883468288: (172368, 54264), (175560, 76608), (180474, 97146), (189392, 122360), (321480, 304608), (721392, 718200) 11072598752097792: (224304, 59688), (250648, 167200), (260100, 186852), (318744, 277248), (449856, 430824), (714894, 707598) 36717812284608000: (340344, 139344), (355520, 201800), (370530, 241890), (609400, 574480), (657360, 627720), (773904, 752904) 52279853819295375: (382887, 156762), (399960, 227025), (447855, 334860), (685575, 646290), (739530, 706185), (870642, 847017) [7つ組解] 15490327057569000: (249281, 6281), (255258, 104508), (266640, 151350), (298570, 223240), (457050, 430860), (493020, 470790), (580428, 564678) 123922616460552000: (498562, 12562), (510516, 209016), (533280, 302700), (555795, 362835), (597140, 446480), (914100, 861720), (986040, 941580) 6つ組解の(2, 7), (4, 8), (5, 10), (6, 9)番目は各括弧内で自然数比になっている。 6つ組解の5番目の2倍は7つ組解の1番目のうちの6組を構成している。
300 :デフォルトの名無しさん :2024/03/01(金) 22:24:42.81 ID:6k2oCbjk.net >>284 C++ https://ideone.com/tM1cuo >>298 のrのループ内でa³ − b³をD2 = 5003で割った余りr2により区分し、それぞれの区分ごとに 解を探すようにしたら速くなった。ただし、nが大きい場合にはかえって遅くなる。
301 : :2024/03/03(日) 19:08:39.58 ID:75HCbpT6.net >>299 出題者です。 すごいです。ありがとうございます。私の手元ではまだ6通り解、7通り解のひとつも入手できていないので、参考になりました 私のアルゴリズムは効率が悪いようですね
302 :デフォルトの名無しさん :2024/03/03(日) 22:19:54.92 ID:ZEDvt9uH.net >>284 C++ https://ideone.com/LEU7EV >>300 でnを大きくするにつれ>>298 に対する高速化効果が薄れていくのは、ABをvectorでなく 配列にしたらある程度改善された。n = 5000のときの実行時間は>>298 の半分以下になった。 ただし、n = 1000000まで大きくすると、296よりやっぱり遅くなる。 >>301 どんなプログラムを書いたのか見せて。
303 :デフォルトの名無しさん :2024/03/06(水) 22:35:52.23 ID:lIZep5aT.net >>284 C++ https://ideone.com/PG6UiY >>302 の実行時間を分析すると、最も時間が掛かっているのは46〜と47行目だと判明した。 そこで配列ABの第1次元と第2次元を入れ替えてみると、n = 5000では変わらないが、 1万, 2万, 5万, 10万, 20万では35%前後高速になった。これは、改良前には第2次元の添字が 小さい要素に書き込みが集中しているため、改良後のように第1次元に入れ替えた方が 纏まったメモリ領域に書き込みが集中しキャッシュの効きが良くなるからだと考えられる。 一方、n = 100万で高速化しないのは、書き込み集中領域が大きすぎるからだろう。 https://ideone.com/6RzW0n n = 100万の場合にはr2の値によってデータを多数の列へ振り分けるのをやめ、列を1つにして、 その内部でr2の値により2種類に区分し、それぞれの内部で2種類にさらに区分し、…と再帰的に 区分していけば(要するにクイックソートの変形版)、1つの配列内での要素のスワップだけで済み、 キャッシュの効きが改善されるとの予想通り、n = 100万で実行速度は>>298 より25%速くなった。 (原理的には>>302 より非効率なのでn = 5000では>>302 より当然遅い)
304 :デフォルトの名無しさん :2024/03/08(金) 19:02:53.21 ID:oHHhAfhn.net >>303 ハズレが多いから2passは効果ある?
305 :デフォルトの名無しさん :2024/03/09(土) 22:13:47.64 ID:C74EWG6S.net >>284 C++ https://ideone.com/xQD1W8 関数mainのループで配列A, B, Pに書き込まずdにだけ書き込むようにし、関数FindDuplicatesで dの添字Pではなくdそのものをソートするように変えて、n = 1000000の場合に>>303 より10%高速化。 関数PrintSolutionでa, bをmainでと同じ方法で再計算するのは非効率だが、PrintSolutionは僅か12回しか 呼ばれないため、全体の実行時間への影響は無視できる。
306 :デフォルトの名無しさん :2024/03/09(土) 22:47:01.30 ID:v99WCN19.net お題 460円 580円 600円 の3種類の商品があります これらを組み合わせて合計10個買ったら5360円になりました 組み合わせを求めるプログラムを書いてください ちなみに答えの一つは ・600円×2 ・580円×4 ・460円×4 だそうです https://rio2016.5ch.net/test/read.cgi/cigaret/1706726196/56-57
307 :デフォルトの名無しさん :2024/03/09(土) 23:59:51.39 ID:C74EWG6S.net >>306 面倒なのでRで全探索 https://ideone.com/vrtYvk
308 :デフォルトの名無しさん :2024/03/10(日) 01:20:18.65 ID:8NU5B5F+.net >>306 面倒なので全て460円を引くと A=0円 B=120円 C=140円 10個で760円という問題 面倒なのでさらに20で割ると A=0円 B=6 C=7円 10個で38円という問題 つまり唯一奇数のCは偶数個が確定 Cが6個以上だと42円以上でオーバーしてNG Cが4個だと28円で残り10円をA,Bで作れないからNG Cが2個だと14円で残り24円はBが4個で残り4個がA Cが0個だと0円で残り38円をA,Bで作れないからNG つまり解は(A,B,C)=(4,4,2)しかない
309 :デフォルトの名無しさん :2024/03/10(日) 11:20:30.42 ID:Doj9A/yB.net >>308 すごすぎるだろ、日本の未来を頼む
310 :デフォルトの名無しさん :2024/03/10(日) 19:06:13.20 ID:qBLPZ6x8.net >>306 Rで全探索でなくちゃんと解くと https://ideone.com/F44pCL 解が複数ある場合と全くない場合の例として、600円を540円と520円に変更したときの出力も載せた。
311 :デフォルトの名無しさん :2024/03/10(日) 20:08:55.20 ID:6qxPF4Wx.net 2pass案は多少工夫したらかなり速い n ␣␣m ␣296␣ ␣301-1 ␣301-2 ␣303␣ ␣2pass 5k␣␣5 ␣ 0.5s ␣ 0.1s ␣ 0.5s ␣ 0.4s ␣ 0.1s 25k ␣5 ␣12.7s ␣ 2.5s ␣13.9s ␣11.1s ␣ 1.7s 100k␣5 ␣3m52s ␣49.3s ␣4m13s ␣3m26s ␣38.9s 1M* ␣6 ␣8h23m ␣2h50m ␣8h51m ␣6h43m ␣1h11m *n=100万は1万サンプルの部分ループ500k≦r<510kから100倍 >>303 の296と301-2の比較記述と違う傾向があるのはキャッシュ階層の違いだと思う 2passは301-1に近いけど1pass目でのランダムアクセスサイズを落としながらも 誤判定率を低く抑える(0.2%~2%)工夫をするのがお楽しみだと思う
312 :デフォルトの名無しさん :2024/03/14(木) 14:43:15.33 ID:ZraPd1+Q.net t
313 :デフォルトの名無しさん :2024/03/27(水) 23:42:08.75 ID:sRZ89+IF.net >>306 a = (600, 580, 460) m = min(a) h = set() def buy(b, yen): if yen < m: return for i in range(0, len(a)): v = a[i] if yen >= v: b[i] += 1 if yen == v: h.add(str(b)) else: buy(b, yen - v) b[i] -= 1 buy([0, 0, 0], 5360) for s in h: print(s)
314 :デフォルトの名無しさん :2024/03/27(水) 23:55:15.74 ID:qNf/D02g.net >>306 Haskell [(a, b, c) | a <- [0..20], b <- [0..20], c <- [0..20], a * 460 + b * 580 + c * 600 == 5360] output: [(0,2,7),(4,4,2)]
315 :デフォルトの名無しさん :2024/03/28(木) 00:00:41.99 ID:0Zoa9Vsx.net 合計10個という条件忘れてた。 [(a, b, c) | a <- [0..20], b <- [0..20], c <- [0..20], a + b + c == 10, a * 460 + b * 580 + c * 600 == 5360] output: [(4,4,2)]
316 :デフォルトの名無しさん :2024/03/31(日) 11:57:53.31 ID:enek7T1c.net 大幅に手直しした 特に前回数値が一部出てこない状態になっていたので色々と手動で最適化した 新しいアイディアを思いつかない限りはシングルスレッドでの限界に近いと思う n m 301-1 303 2pass 2pass' 5k 5 0.1s 0.4s 0.1s 0.1s 25k 5 2.5s 11.1s 2.3s* 1.7s 100k 5 49.3s 3m26s 38.9s 27.7s 1M* 6 2h50m 6h43m 1h11m 48m10s 2M* 6 17h06m 28h27m 5h47m 3h13m Max* 6 35h51m 51h23m 11h09m 5h47m *前回>>311 2pass n=25kの再計測値 *n=1Mは部分ループ500k<=r<510kから100倍 *n=2Mは部分ループ500k<=r<505kから400倍 *Max:=2642245は3乗がUINT64に収まる最大 *n=Maxは部分ループ500k<=r<500k+3785から2642245/3785倍 ヒント含みの数値がこちら n D1 D2 D3 = 5000 5001 5003 5009 false_positive = 23 / 5001 = 0.46% total_t_pass1 = 64.220 ms 2.568 ns/iter total_t_pass2 = 0.044 ms 0.381 ns/iter real 0m0.097s
317 :デフォルトの名無しさん :2024/03/31(日) 11:58:50.32 ID:enek7T1c.net n D1 D2 D3 = 25000 25003 25005 25006 false_positive = 171 / 25003 = 0.68% total_t_pass1 = 1654.681 ms 2.647 ns/iter total_t_pass2 = 1.407 ms 0.329 ns/iter real 0m1.709s false_positive = 2211 / 100005 = 2.21% total_t_pass1 = 27338.298 ms 2.734 ns/iter total_t_pass2 = 78.402 ms 0.355 ns/iter real 0m27.692s n D1 D2 D3 = 1000000 1000002 1000009 1000015 false_positive = 18 / 10000 = 0.18% total_t_pass1 = 28674.338 ms 2.867 ns/iter total_t_pass2 = 5.642 ms 0.313 ns/iter real 0m28.897s n D1 D2 D3 = 2000000 2000003 2000013 2000015 false_positive = 13 / 5000 = 0.26% total_t_pass1 = 28777.424 ms 2.878 ns/iter total_t_pass2 = 8.620 ms 0.332 ns/iter real 0m29.015s n D1 D2 D3 = 2642245 2642246 2642253 2642258 false_positive = 315 / 3785 = 8.32% total_t_pass1 = 29210.857 ms 2.921 ns/iter total_t_pass2 = 336.864 ms 0.405 ns/iter real 0m29.800s
318 :デフォルトの名無しさん :2024/03/31(日) 22:30:39.09 ID:4FIGx2uN.net >>306 ぶっちゃけ、他の言語の人と同じっぽくないので心配なんだが…。 自分なりにHaskellで全探索じゃないバージョン書いてみた。 Haskell [(a, b, c) | a <- [0..10], b <- [0..10 - a], c <- [0..10 - (a + b)], a * 460 + b * 580 + c * 600 == 5360, a + b + c == 10] 答えは同じ[(4,4,2)]。
319 :デフォルトの名無しさん :2024/04/01(月) 04:52:23.91 ID:iTC1bSa8.net 少し一般化して、N個の商品があり、i番目の商品はA_i円です 合計M個購入し、価格の合計がS円であるような購入の仕方を998244353で割った余りを求めてください だとO(N M S)より小さい計算量で解けるのかな
320 :デフォルトの名無しさん :2024/04/01(月) 16:50:08.47 ID:0Kkx57P3.net 2個、4個、8個…みたいにメモ化すればMはlogMにできるかもしれんね 空間がlogM倍されそうだが
321 :デフォルトの名無しさん :2024/04/13(土) 11:43:17.27 ID:itq2kjOw.net ヘロンの公式を実装せよ 使用言語:C
322 :17 :2024/04/13(土) 16:57:10.76 ID:SxW/5mRR.net >>321 https://paiza.io/projects/_ZdSzHtV9YdEzV-oOySQWQ Wikipedia でヘロンの公式を調べてそのまま実装しただけで、ほとんど何も考えてない。
323 :デフォルトの名無しさん :2024/04/13(土) 23:01:22.75 ID:wFZkrOeZ.net >>321 https://ideone.com/YCi6qe ヘロンが作ったもう1つの式である平方根を加算と除算の繰り返しで求める式も使用。 sqrt関数を呼び出すより実行形式ファイルサイズがほんの少しだけ小さくなる。
324 :デフォルトの名無しさん :2024/04/14(日) 00:59:32.83 ID:ujzJ2+0Y.net >>323 無限ループにならない? 機械イプシロン(DBL_EPSILON)とか気になる
325 :デフォルトの名無しさん :2024/04/14(日) 18:34:21.49 ID:MHeAinLP.net 解答例 #include <stdio.h> #include <math.h> void heron(double, double, double); int main(void) { double a, b, c; printf("3辺a, b, cを入力せよ "); scanf("%lf,%lf,%lf", &a, &b, &c); heron(a, b, c); } void heron(double x, double y, double z) // heronの定義 { double s, t; s = (x+y+z)*0.5; t = s*(s-x)*(s-y)*(s-z); printf("3角形の面積は S=%g\n", sqrt(t)); return; }
326 :デフォルトの名無しさん :2024/04/14(日) 18:36:52.16 ID:MHeAinLP.net >>323 さすがですね
327 :デフォルトの名無しさん :2024/04/15(月) 21:01:04.41 ID:dSNEYg5r.net >>324 p < 0 のとき(= 三角形を作れない場合)は浮動小数点数の特性に関係なく無限ループになる。 sqrt(p) と同様にNANを返すには、if (p < 0) return 0 / (p - p); を追加すれば良い。 p > 0 のときは無限ループにならないはず。以下が検証プログラム。 https://ideone.com/mzemEM x = sqrt(p), y = p / x とすると、浮動小数点数の特性により x == y とならない場合は存在する。 このとき、xとyの仮数部を整数と見なした値(以降では「仮数整数」と呼ぶ)の差は1なので、 z = (x + y) / 2 はxとyのうち仮数整数が偶数の方に一致する。zを新たなxとして代入しyとzを 再計算すれば、今度はxの仮数整数が偶数なのでzはxに必ず一致し、>>323 の収束判定条件が成立する。 具体例で見ると、p = 2 のときはxの仮数整数が奇数なので x != z となるが、zを新たなxとして代入し 再計算すれば x == z が成立する。桁上がりが起こる p = 3.9999999999999996 のときも、同様に 再計算で x == z が成立する。p = 3 のときはxの仮数整数が偶数なので x == z が成立し再計算は不要。
328 :デフォルトの名無しさん :2024/04/15(月) 22:06:46.39 ID:MxMoolaJ.net >>327 解説ありがとう 俺には理解できないレベルだと分かりましたw 俺なら収束の自信が無くてDBL_EPSILONを使った判定と ループ回数上限を組み合わせて実装しそうだ
329 :デフォルトの名無しさん :2024/04/17(水) 05:47:35.77 ID:F2fqxIYT.net ヘロンの公式はそのままだと、数値計算での安定性が良くないらしいぞ 解決策は、Wikipediaの英語版の方に… tps://en.wikipedia.org/wiki/Heron%27s_formula#Numerical_stability
330 :327 :2024/04/17(水) 05:52:23.77 ID:F2fqxIYT.net そしてこんなとこでもカハンせんせーの名前がが
331 :デフォルトの名無しさん :2024/04/17(水) 16:28:33.14 ID:7JRzlbtx.net の長さ この公式で計算される面積は、理論的には正しい値です。しかし、実際には、以下の理由で誤差が生じる可能性があります。 数値計算の誤差: 計算機で数値を扱う場合、有限桁しか扱えないため、丸め誤差が生じます。特に、辺の長さの値が大きく異なる三角形の場合、この誤差が顕著になります。 四捨五入誤差: 計算結果を小数点以下n桁まで表示する場合、n桁目以降の数字を切り捨てます。この四捨五入誤差も、面積の誤差に影響を与えます。 by Gemini
332 :デフォルトの名無しさん :2024/04/17(水) 23:38:33.35 ID:k4k/eSae.net >>329 に載っている参考文献 William M. Kahan, ‘Miscalculating Area and Angles of a Needle-like Triangle’ http://www.cs.berkeley.edu/~wkahan/Triangle.pdf のTable 1の問題がパソコン等でのC++プログラムでも再現されるか試してみた。 https://ideone.com/r4toUS Table 1とは違い、Accurate Δが概ね正確な場合にHeron's Δ'が大きく懸け離れた不正確な値に なってしまうことはなく、ほぼ同じ値になり差はごく僅かしかない。Table 1のような不安定性は Table 1の計算に使われたプログラマブル関数電卓に特有の問題で、パソコン等のプログラムでは 再現されない。(パソコン等のdoubleの方が精度が高いので当然と言えば当然だが) 一方、(a, b, c) = (5278.64055, 94721.35941, 99999.99996)の場合は、逆にHeron's Δ' = 0が 正確なのにAccurate Δ = 9.53674324543714が大きく懸け離れた不正確な値になってしまう 重大な欠点がある。これは、Accurate Δの式の根号内の第2因数c - (a - b)が正確には0なのに 3.63797880709171e-12と計算されてしまい、この誤差が他の因数との乗算により増幅されるから。 Heron's Δ'の式の根号内の第4因数s - cは0と計算されるので問題ない。 double向けの入力値(a, b, c) = (31622.77777777662, 0.000000000023, 31622.77777777661)を 作れば、Heron's Δ' = 2.30085990753844e-07, Accurate Δ = 3.20111707955507e-07となり、 相対差は確かに大きくなるが、200ビットで計算したほぼ正確な値3.27490470056059e-07から 見れば両方とも不正確だから、Accurate Δの利点はない。 だから、パソコン等のプログラムでは改良版の式を使う必要がないどころか使うべきではなく、 ヘロンの公式をそのまま使う方が良い。
333 :デフォルトの名無しさん :2024/04/18(木) 07:16:50.63 ID:8T8m8Yde.net >(a, b, c) = (5278.64055, 94721.35941, 99999.99996) >c - (a - b)が正確には0なのに3.63797880709171e-12と計算されてしまい この例に限らず、たいていの場合a,b,cはdoubleでexactに格納されて無くて この例では「c - (a - b)が正確には0」なのをチョイスしただけでは?
334 :デフォルトの名無しさん :2024/04/18(木) 07:30:10.21 ID:PYBA8OB3.net パソロジカルな三角形をパラメトライズして面積を積分する検証はどう? 数式計算での正確な値 Heronで面積計算した時の数値積分 Accurateで面積計算した時の数値積分 を比べるのがフェアかなぁと
335 :デフォルトの名無しさん :2024/04/18(木) 07:34:09.77 ID:PYBA8OB3.net > 200ビットで計算したほぼ正確な値3.27490470056059e-07 この例だけ見るとAccurate Δの方が優れているように見えるので >>333 の様なチェリーピックはどちらの計算式でも出来るので平均的に近似が近い方が精度的に優れているかと
336 :デフォルトの名無しさん :2024/04/18(木) 22:41:59.70 ID:y7NBfn6/.net >>333 その通り。そして、(a, b, c) = (10000.1, 10000.2, 20000.3)とすれば、正しい面積は0なのに Heron's Δ' = 2.69745899635295とAccurate Δ = 1.34872949817647は両方とも大間違いになる。 この場合のようにHeron's Δ'での問題がAccurate Δで改善されないだけでなく、>>333 の引用の 場合のようにHeron's Δ'では結果的に問題ないのにAccurate Δでは新たな問題が生じてしまうのは、 参考文献の11ページで述べられた An algorithm stood convicted of numerical instability if it could be replaced by a new algorithm at least about as fast and accurate as the old for all data, and good for all data for which the old algorithm was bad. すべてのデータに対して旧アルゴリズムと少なくとも同じくらい高速かつ正確であり、 かつ旧アルゴリズムが悪くなるすべてのデータに対して良くなる新アルゴリズムによって 置き換えることができるとしたら、旧アルゴリズムは数値的に不安定と判定される。 という判定条件を満たさないから、Accurate Δは改良版としての適性を欠く。 >>335 その例では有効桁数がHeron's Δ'は0桁、Accurate Δは1桁しかなく、どちらの品質も絶対的に 劣悪で、それらの間の相対的な優劣に大した意味はない。 そもそも針のように異様に細長い三角形が重箱の隅をつつくような話で、普通はそんな場合は 想定しなくても良く、ヘロンの公式で充分。そこを敢えてつつくなら、ヘロンの公式だけでなく 改良式もぼろが出てしまうだけ。
337 :デフォルトの名無しさん :2024/04/18(木) 22:55:38.47 ID:n9UdHBZN.net 総合すると有効桁じゃなくて精度が2桁良いし実装上は大差ないから改良版を使う、と言う方が自然では?
338 :デフォルトの名無しさん :2024/05/01(水) 12:56:47.83 ID:nIC3qyB/.net スレ落ちそうなのであげ
339 :デフォルトの名無しさん :2024/05/01(水) 15:39:17.16 ID:hqp8cDbc.net >>338 嵐を呼び込むために・・・
340 :デフォルトの名無しさん :2024/05/01(水) 22:59:10.72 ID:4hNncNW1.net 何でこんなに過疎化しちゃったのか。前に頻繁に出題していた人がいなくなったのか。
341 :デフォルトの名無しさん :2024/05/02(木) 10:32:38.87 ID:ijoO2C2L.net お題を出してみてください
342 :デフォルトの名無しさん :2024/05/02(木) 16:59:52.63 ID:DPVqLIsI.net >>340 お題が出尽くしたってことはあるんじゃないか? 過去のお題拾ってきてそれを投稿すればいいぐらいまでスレが成熟してしまったのでは?
343 :デフォルトの名無しさん :2024/05/02(木) 17:21:22.07 ID:pg1ymc2D.net PC買って、脱衣AIで遊びまくってる「 一日一回無料で使えるみたい「 https://mao.5ch.net/test/read.cgi/gymnastics/1322657462/98
344 :17 :2024/05/02(木) 18:44:04.16 ID:LxBZq7I4.net >>342 なるほど。それをやるか。
345 :17 :2024/05/14(火) 05:34:03.62 ID:ou5vbzLn.net じゃあ10年前のこのお題(URLを書くとNGになるようなので書かない)。 プログラミングのお題スレ Part4 115 :デフォルトの名無しさん:2014/06/21(土) 18:36:45.72 ID:/fMJIWig.net お題:文字列Aを1回以上繰り返した文字列Bが与えられたとき 文字列Aを求める。ただしAの候補が複数ある場合は最短のものとする。 例 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> a 123412312341231234123123412312341231234123 -> 1234123 oxoxoxoxoxoxoxoxxoxoxoxoxoxoxoxoxx -> oxoxoxoxoxoxoxoxx
346 :デフォルトの名無しさん :2024/05/14(火) 17:27:18.46 ID:AXiunB2g.net ttps://ideone.com/KrUq7e Z-algorithm を使って O(|B|) で解いてみた
347 : :2024/05/14(火) 20:59:46.84 ID:xk+62xOP.net >>345 R https://ideone.com/ITR83u C https://ideone.com/g2INyj
348 : :2024/05/23(木) 14:16:50.64 ID:zV267ZMC.net あれ?どんぐりの都合か?URL書いてあると書けなくなったような?
349 : :2024/05/23(木) 14:17:56.56 ID:zV267ZMC.net URLの先頭のhを抜いて書いてみよう。 >>345 Kotlin こちらは普通に自作したやつ。 ttps://paiza.io/projects/OYy-A5rfKg7RqLzv-DKMIA こちらは正規表現使ってとても小さくなったやつ。 ttps://paiza.io/projects/jgmtMRDhKfcjYfGAglEl3g
350 :デフォルトの名無しさん :2024/06/01(土) 10:16:34.91 ID:hzaQXY32.net お題: コロン区切りの時分秒の時刻が与えられるので時分秒をそれぞれ掛け算した結果を表示せよ 例: 04:05:06 120
351 :デフォルトの名無しさん :2024/06/01(土) 11:08:12.83 ID:hzaQXY32.net お題: バイト列が与えられる。先頭から解析した場合にバイトが1だったら次の4バイトを読み込んで整数として出力し、バイトが2だったら次のバイトを0が来るまで読み込んで文字列として出力せよ 入力 1 1 0 0 0 2 65 66 67 0 1 128 0 0 0 出力 1ABC128
154 KB
新着レスの表示
掲示板に戻る
全部
前100
次100
最新50
read.cgi ver.24052200
本文 スレッドタイトル 投稿者