プログラミングのお題スレ Part22
>>58 へのお題 指定した年とその後(またはそれ以前に)同じカレンダーになる年を100個求めよ // 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 } >>59 指定した年と同じカレンダーの年を前後 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] お題:2Dゲームのスクロール処理 整数の二次元配列(高さ50, 横幅100)上にランダムに整数1〜9が200個配置される。 この配列を高さ20, 横幅40の矩形領域に切り取って表示したい。キーボードの入力(l, r, t, b)で矩形領域を移動させ切り取る領域を変化させよ。 >>64 試しに自分で書いてどんなプログラムになるのか見せてくれ >>64 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} } } お題:ウィンドウのアラインメント処理 マウスの座標の変化からウインドウを描画すべき座標を計算したい。 ただし変形する形は縦横4方向、斜め4方向の8パターンとし、寄せた方向に幅が1/2となること。 曜日はシュメール人が使い始めたらしいので、お近くのシュメール人に聞きください。 文字列Sの中に含まれる回文をすべて列挙ってどうやったらいいですかね(*_*) aとかbみたいな一文字でも回文とみなしますです 文字列Sは1文字以上100文字以下で、半角英字であることがわかってます とんでもない計算量になる気がするのですが、鮮やかなやりかたってないものかと…トホ(ヽ´ω`) >>71 それって例えば "ABCBAXYZZYX" だったら "ABCBA" と "XYZZYX" が抜き出せれば良いの? 途中の "BCB", "C", "YZZY", "ZZ" も抜き出すの? 回文の長さに制限があるから、回文の長さで場合分けすれば、全部列挙可能。 >>72 途中のもぜんぶっす… 含まれる回文、ひとつのこらず出力です(;´∀`) たとえAとかBみたいな一文字でも回文と定義します なのでAとかXも抜き出します٩(′д‵)۶ で、一文字目にAがあって、5文字目にもAがあるじゃないですか?こういった場合は、どっちも出力しちゃって大丈夫です! 重複された出力が行われるのは問題ないんです! ただ、「過去にすでにその分の出力が行われていた場合、重複した出力を再度行わない」というやりかたでもし計算量が飛躍的に下がるということであれば、そのやりかたが知りたいというのもまああります(*_*; 重複する出力をするかしないか、それはどちらでもオケーです 全パターンチェックするようにループ回すならとりあえず理屈ではできると思うんですが、計算量がとんでもないことになりそうな感じで、ちょっとお手上げでした/(^o^)\ たとえば文字列Sがabbbaだとすると、すくなくともa,b,bb,bbb.abbbaが最低一回は出力される必要があります できればaやbが複数回出力されず一回しか出力されないほうがいいですが、必須ではないです >>71 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; } >>76 間違えた。 printf("%*s\n", (int)klen, str + i); を printf("%.*s\n", (int)klen, str + i); に訂正。 >>77 ありがとうございます、ちょっとためしてみますm(_ _)m >>77 動いている様子を確認させていただきました!!ありがとうございました! 当チケットはこれにてクローズとさせていただきたいと思いますヽ(=´▽`=)ノ >>76 こうすると計算量を減少できる 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"); } まずこの部分が最初のヒントで >>それって例えば "ABCBAXYZZYX" だったら "ABCBA" と "XYZZYX" が抜き出せれば良いの? >>途中の "BCB", "C", "YZZY", "ZZ" も抜き出すの? >途中のもぜんぶっす… 最も長いものを抜き出せばその一部分はその中に含まれている だから短いのが判明した時点で引き続き長いのも探索しないと多重に無駄に比較が行なわれてしまう もう一つのポイントは回文は対称系で長さ奇数と偶数の二種類があること 長さ奇数「DCBABCD」と長さ偶数「DCBAABCD」どちらの場合も 比較は対称点となるAからのみ出発して比較していけばよくて 順方向&逆方向へ最長分を比較していけば上述の無駄な比較を減らせる このような順番で見つかっていくことになる >>81 の実行結果 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 お題 abc1.mp4 abc2.mp4 .. abc20.mp4があるとします これを名前順でソートできるようにするため abc001.mp4 abc002.mp4 ... abc020.mp4 とリネームしてください コレでどーかぬ #!/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 いいだしっぺということで作ってきたら既に投稿が 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 お題:celeronで快適に動作するwebブラウザを作れ >>85 Perl5 rename "abc$_.mp4", sprintf 'abc%03d.mp4',$_ for 1..20; ※abc1.mp4 abc2.mp4 .. abc20.mp4 があるとしています。 また abc001.mp4 abc002.mp4 ... abc020.mp4 は既存かのチェックは省いています。 すごい簡潔ですね!perlすごい これはワンライナーではないのでしょうか #!/usr/bin/perl .. としてperl rename.plを動かすと動きました ファイルはこれ(bash)で用意できます for i in {1..20}; do touch abc$i.mp4; done tcsh のバヤイわこうかぬ foreach i (`seq 1 20`) # 1から20までの数値を生成 # ファイル名を生成し、touchコマンドでファイルを作成 set filename = "abc$i.mp4" touch $filename end 1~20を決め打ちして良いならもっと簡単にできたな。まあいいや。 お題:32ビット浮動小数点数のnextafter() 32ビット精度(IEEE754のbinary32)の変数aを 64ビット精度(IEEE754のbinary64)の変数bに代入する。 ここで、nextafterf(a, 0)やnextafterf(a, 正の無限)などに相当する操作を bに対して行え(bを32ビット浮動小数点数に戻すのは無しで)。 操作結果のoverflowやunderflowは考慮しなくてもよい。 お題:日本語の文章が入力されるので「、」をカンマに、「。」を改行に変換せよ Python s = input() s = s.replace("、", ",") s = s.replace("。", "\n") print(s) Haskell import Data.List.Utils main = do s <- getContents putStrLn $ replace "。" "\n" $ replace "、" "," s コンパイルはしてないので動かないかも お題 文字列S=abcdefghij(10文字)が与えられて 配列[0,4,7]が与えられる このときSの0番目を4番目、4番目を7番目、7番目を0番目に移動した文字列を出力するプログラムを書いてください >>101 Ruby 文字列S='abcdefghij' 配列=[0,4,7] 文字列 = 文字列S.dup 配列.zip( 配列.rotate ).each{|i,j| 文字列[i] = 文字列S[j] } puts 文字列 お題: コンソールに指定したUTF-8文字列のQRコードを表示するプログラム。 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(()) } お題: 指定されたフォントのひらがなの各文字について ひらがなの線に囲まれて閉じた領域の個数を調べ、最もその個数の多い文字ベスト3を出力せよ。 >>97 bash のコマンドラインで以下のように入力すると標準入力から入力して「、」が「,」に、「。」が改行に変換されて標準出力に出力される。 (起動する環境は bash でなければならないということはないと思うが、他のシェルは確認していない)。 sed 's/、/,/g;s/。/\n/g' もちろん日本語入出力可能な端末を使用して、尚且つ sed がその入力をまともに受け付けてくれなければちゃんと動かない。 お題: 指定されたフォントのひらがなの各文字について ひらがなの線に囲まれて閉じた領域の面積を調べ、各文字毎にそれぞれの面積の順序を最も大きい物から順に出力せよ。 またその情報を元に輪郭のhierarchy情報をcv2で利用出来る形で出力せよ お題 文字列が入力されます 赤と緑を入れ替えて 黒と白を入れ替えて 黄と青を入れ替えてください 例 入力: 緑のカバンに500万入れて白の紙で黄色のカバン言うて書きながら赤のカバン言いながら置いてくれたら俺黒のカバン言いながら取りに行くわ 出力: 赤のカバンに500万入れて黒の紙で青色のカバン言うて書きながら緑のカバン言いながら置いてくれたら俺白のカバン言いながら取りに行くわ >>111 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 >>111 ウェブブラウザのJavaScript https://pastebin.com/YvymwTeN ユーザースクリプトの体裁で書いたけどブラウザーのConsoleでも動かせる Firefox: Ctrl+Shift+K Chrome: Ctrl+Shift+J https://mevius.5ch.net/test/read.cgi/tech/1691038333/111 を開いてそこで実行 結果はレスに直接追記 重複がないからXPathのtranslate()でいけるな思った、それだけ >>104 1. qrencode というプログラムをインストールする。(例: RedHat系Linuxなら yum install qrencode) 2. qrencode で出力に ansi 等を指定して文字列で出力する。 例: qrencode -t ansi やっほー 3. 画面に出て来たQRコードをスマホで撮影する等して確認する。 4. 終わり。 [クライシスアクター」「豊島保養所」←画像検索&拡散! 他スレに丸ごとコピペよろしっく!! ネットでできる反レプティリアン・反イルミ活動です!!!!! 動画サイトのコメ欄もねらい目だぞーーーー!!!!!!! [クライシスアクター」「豊島保養所」←画像検索&拡散! 他スレに丸ごとコピペよろしく!! ネットでできる反レプティリアン・反イルミ活動です!!!!! 動画サイトのコメ欄もねらい目だぞ!!!!!!! お題: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 >>120 「もっとも効率がいいエレベーターの停止順序」とは? 1.停止回数がもっとも少ない 2.移動した階数の和が最も小さい 3.ほか など、どのような指標? while (true) push(BUTTON_A) お題:角カッコの列が入力されるのでカッコの対応が取れていたら1,取れていなかったら0と表示せよ < [[]] > 1 < [[] > 0 >>127 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 >>127 Ruby %W( [[]] [[] [[[[]][[]]] [[[[]][[]]]] ][ #{} ).each{|s| w = s.dup {} while w.sub!( /\[\]/, '' ) puts "#{(s != '' && w == '')? 1 : 0} #{s.inspect}" } # 1 "[[]]" # 0 "[[]" # 0 "[[[[]][[]]]" # 1 "[[[[]][[]]]]" # 0 "][" # 0 "" 1) BY RG 2) RG BY 3) GR YB 1-3を回転対称で同じとみなせるグループと線対称で同じとみなせるグループに分類せよ 4色を2x2の升にランダムに一つづつ配置して4x3x2通りのパターンを作成し それぞれを上の基準でグループ分けせよ お題:Pythonのmath.ulp()と同機能の関数 引数が正規化数限定のサブセットでも可(その旨を明記)。 Pythonで実装する場合は(もちろん)math.ulp()を使ってはならない。 簡単なお題: >>133 のサブセット(求めたulpも正規化数限定) 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] >>136 math.ulp()は符号を戻さないらしいです: ulp(1) == ulp(-1) お題:文字列「せんだ」「みつを」「ナハナハ」がランダムに100行入力される。せんだ、みつを、ナハナハが順番に入力されたときに1と一行出力せよ お題: (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)の逆関数。 補足:(1)(2)いずれも実用的な時間内で求める事(steps=1相当のnextafter()をループで回すのは不可)。 >>143 nextafter()は、浮動小数点数の、(数直線上での)「隣」を求めるやつですね(C99以降?)。 Python3.12のやつは、隣の隣の隣の…を求める事が出来る様に拡張されました。 前スレの補足: V8やLLVMは、自前でstrtod()的なものを実装してました。 tps://arxiv.org/abs/2101.11408 >>101 octave https://ideone.com/87WGBO function s = f(s, i) s(circshift(i, -1, 2)) = s(i); end >>127 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)) >>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; } >>148 ChatGPT にそのままテキストを読ませたらこう答えた。 ------------------------------------------------------------------------------------------------- 通学に自転車を使わない学生は34人、自転車を使うがバスを使わない学生は39人、バスを使うが自転車を使わない学生は18人です。 100人の学生全体からこれらの人数を引いた残りの学生がバスと自転車の両方を使っている学生の数です。 100人 - 34人 (自転車を使わない学生) - 39人 (バスを使わない学生) - 18人 (自転車を使わない学生) = 9人 したがって、通学にバスと自転車の両方を使う学生は9人です。 ------------------------------------------------------------------------------------------------- ここで徒歩については考慮しないのかとツッコミを入れたらこう答えた。 ------------------------------------------------------------------------------------------------- 申し訳ありません、徒歩の学生についての情報が提供されていなかったため、上記の計算では徒歩を選択した学生については考慮されていませんでした。徒歩を選択した学生の数についての情報がなければ、バスと自転車の両方を使う学生の正確な数を計算することはできません。 ------------------------------------------------------------------------------------------------- そして更にこういうツッコミを入れる。 最初の34人は自転車を使っていないだけで密かにバスを使っているかも知れないのだが、そのことは考慮しないのか? ChatGPT 申し訳ありません、私の以前の回答は不完全でした。確かに、最初の34人のうち自転車を使っていないという情報だけでは、彼らがバスを使っているかどうかを確定することはできません。そのため、正確な答えを得るためには追加の情報が必要です。 もし最初の34人のうち何人かが実際にはバスを利用している場合、それを考慮する必要があります。与えられた情報だけからは、バスと自転車の両方を使う学生の正確な数を特定することはできません。必要な情報が揃わない限り、正確な答えを提供することはできません。 >>85 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 ) } 次へ続く # 変更後のファイル名の配列 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 お題:ランダムに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 プログラミングの依頼はここでいいでしょうか。 ココナラで依頼したのですが見送りになってしまいました。 お金は出すので製品版を作って欲しいです。 できないなら何が定義できていないのか教えて下さい。 AIによる詩作成 まずAIが詩を作成するための学習ツールを作ります AIがリンゴの形相を分解するには辞書が必要となる リンゴを検索し辞書を比較し関連性の高いワード リンゴ⊇(赤い、丸い、果物…)を拾うのだ これが学習ツールであり 一致したワードからさらに形相に分解する リンゴ⊇(赤い、丸い、果物、酸っぱい…) その中の果物を形相分解するには 果物⊇(リンゴ、サクランボ、なし…) その中のなしを様相分解すると なし⊇(果物、丸い、黄緑…) ここから詩を作るには『黄緑のリンゴ』などになる 形相分解すると客観的な『深さ』(今回は三段階)を持った詩になる read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる