プログラミングのお題スレ 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