プログラミングのお題スレ Part22 (859レス)
上下前次1-新
抽出解除 レス栞
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
640(10): デフォルトの名無しさん [sage] 2025/02/17(月) 13:08:08.60 ID:lz3iaMcC(1) AAS
お題:ランダムな数列が与えられる。隣り合う数字が偶数同士の時、あいだに0を。奇数同士の時は1を挿入し、それ以外は何も挿入しない
In < 123346
Out > 12313406
641: デフォルトの名無しさん [sage] 2025/02/17(月) 13:47:54.59 ID:1CKZ5rpi(1) AAS
>>640 ruby
DATA.readlines(chomp:1).map{|e|
a=e.split("").map{|f| f.to_i}
(0..a.size-2).each{|n|
a[n]=a[n]*10 if (a[n]%2==0 && a[n+1]%2==0)
a[n+1]=a[n+1]+10 if (a[n]%2==1 && a[n+1]%2==1)}
puts "IN < #{e}\nOUT > #{a.map{|f| f.to_s}.join}"}
__END__
123346
642: デフォルトの名無しさん [sage] 2025/02/17(月) 20:02:39.61 ID:SzDlV4TD(1) AAS
>>640 lisp
外部リンク:ideone.com
643(1): デフォルトの名無しさん [] 2025/02/17(月) 20:47:46.22 ID:2enU2rA/(1/2) AAS
>>640
PowerShell (一般的な文字コードを想定)
function f([string]$s)
{
$rprev = 2
-join ([char[]]$s |% {
$r = $_ % 2
if ($r -eq $rprev) {$r}
$rprev = $r
$_
})
}
123346, 12333468, 1, "" |% {"$_ → $(f $_)"}
[実行結果]
123346 → 12313406
12333468 → 123131340608
1 → 1
→
645(1): デフォルトの名無しさん [sage] 2025/02/17(月) 20:58:11.16 ID:UxhkW11K(1) AAS
>>640 Rust
fn f(input: &[u8]) -> Vec<u8> {
input.windows(2).fold(Vec::new(), |mut vec, w| {
if vec.is_empty() {
vec.push(w[0]);
}
if (w[0] ^ w[1]) & 1 == 0 {
vec.push(w[0] & 1 + b'0');
}
vec.push(w[1]);
vec
})
}
fn main() {
assert_eq!(f(b"123346"), b"12313406");
assert_eq!(f(b"12333468"), b"123131340608");
}
647(1): デフォルトの名無しさん [sage] 2025/02/18(火) 17:51:16.96 ID:ZRfTlf8i(1) AAS
Vecのnewやpushなど普通にcollectに任せる手もあるね
条件付き挿入は汎用にOptionで取捨を示してflat_mapとflattenでも可能
前値など状態を保ちつつ1つにまとめるならfoldでイテレータに流すならscan
一例としてこんな感じ
fn f(input: &[u8]) -> Vec<u8> {
input
.iter()
.scan(None, |pre, &x| {
Some([
pre.replace(x & 1)
.and_then(|p| (p == x & 1).then_some(p + b'0')),
Some(x),
])
})
.flat_map(|list| list.into_iter().flatten())
.collect()
}
>>640
Rust
648: デフォルトの名無しさん [] 2025/02/19(水) 21:30:14.30 ID:LKzHskwz(1) AAS
>>640
>>643-644の3つのfを上から順にf1, f2, f3とし、長い文字列を引数として呼び出したときの
実行時間を比較すると、
$s = -join (1..10000)
$t = 1..3 |% {(iex "measure-command {f$_ $s}").ticks}
$tmin = ($t | measure -min).minimum
1..3 |% {"f$_`: {0:0.00}倍" -f ($t[$_ - 1] / $tmin)}
[実行結果の一例]
f1: 34.78倍
f2: 1.00倍
f3: 14.93倍
大差でf2 < f3 < f1となった。インタプリタ言語のコード実行は遅いので、処理を自分で
書くほど遅くなり、ライブラリ関数等に丸投げすれば速くなることによる。
外部リンク:ideone.com
コンパイラ言語のC#で同様の比較をすると (PowerShellより速いので文字列を長くし、
f1の改良版としてStringBuilder使用のf4を追加した)、当然f4< f1 < f2 < f3になった。
651(1): 警備員[Lv.21] [] 2025/02/22(土) 15:11:12.54 ID:nEyoRU5r(1/3) AAS
>>640
Perl5
外部リンク:paiza.io
652: 警備員[Lv.21] [] 2025/02/22(土) 15:42:54.65 ID:nEyoRU5r(2/3) AAS
>>640
Kotlin
外部リンク:paiza.io
653: 警備員[Lv.21] [] 2025/02/22(土) 15:53:04.03 ID:nEyoRU5r(3/3) AAS
>>640
C
外部リンク:paiza.io
654: デフォルトの名無しさん [] 2025/02/22(土) 23:33:07.08 ID:k7PDvk0j(1) AAS
>>640
Haskell
外部リンク:ideone.com
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.034s