プログラミングのお題スレ Part22 (863レス)
1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
234
(27): デフォルトの名無しさん [sage] 2024/02/14(水)09:32 ID:JjlrBdlD(1)
お題:数値が入力されるのでその数値に最も近い回分数を出力せよ
回分数とは回分になっている数(負数含まず)のことである
最も近い回分数が2つある場合は2つとも出力せよ

入力 0
出力 0

入力 17
出力 22

入力 100
出力 99
出力 101
235
(1): デフォルトの名無しさん [] 2024/02/14(水)15:20 ID:VoM/Kva2(1)
>>234 lisp
https://ideone.com/MvDoGf
236
(2): デフォルトの名無しさん [sage] 2024/02/14(水)21:10 ID:/8p4lTpf(1)
>>234 ocaml
https://ideone.com/4RtyBj

>>234 rust
https://ideone.com/eLCvSJ
238
(1): デフォルトの名無しさん [sage] 2024/02/15(木)21:30 ID:MveN6p4/(1)
>>234
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)),
 }
}
239
(1): デフォルトの名無しさん [] 2024/02/15(木)22:00 ID:fu0tHwRa(1)
>>234
>>237は入力が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
240
(1): デフォルトの名無しさん [sage] 2024/02/15(木)23:18 ID:IMdr4idU(1)
>>234 c
https://ideone.com/mWihci
241
(1): 9 [sage] 2024/02/16(金)02:56 ID:7jtCAGu+(1/2)
>>234 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
243
(1): 9 [sage] 2024/02/16(金)14:47 ID:TIAwaOOw(1)
>>234 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";
}
244
(1): デフォルトの名無しさん [sage] 2024/02/16(金)21:57 ID:cLyPSkE5(1)
>>234 pascal
https://ideone.com/F1gAKR
245
(2): 17 [] 2024/02/16(金)23:58 ID:C4FuIAno(1)
>>234
Kotlin

何か画期的なアルゴリズムを使ったわけではなく、むしろほとんど何も考えずただ作られただけのプログラム。

https://paiza.io/projects/S5qsLnHz_pZD3um9jYRg_Q
246
(1): 9 [sage] 2024/02/17(土)02:10 ID:K8P5qDCx(1)
>>234 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}
247
(1): デフォルトの名無しさん [sage] 2024/02/17(土)18:14 ID:nUY+CX2J(1/3)
>>234 pascal
https://ideone.com/kRXq6z
・dynamic array 使用
248
(2): デフォルトの名無しさん [] 2024/02/17(土)19:03 ID:eWGoJOTY(1)
>>234
C++
2chスレ:tech
249
(3): デフォルトの名無しさん [] 2024/02/17(土)20:00 ID:k6cg1rdP(1)
>>234
>>239のC#版
https://ideone.com/glAEMw

Julia版
https://ideone.com/cbP5Dm
250
(1): デフォルトの名無しさん [sage] 2024/02/17(土)20:51 ID:nUY+CX2J(2/3)
>>234 octave
https://ideone.com/MXux5X
251
(2): デフォルトの名無しさん [sage] 2024/02/17(土)21:45 ID:nUY+CX2J(3/3)
>>234 ruby
https://ideone.com/0pvK4o
258: デフォルトの名無しさん [sage] 2024/02/18(日)18:34 ID:rWy6ZYAH(1/2)
>>234 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
}

>>252
(`・ω・´)ゞ
誤:a - 1, a + 1
正:a - 1, b + 1
259
(1): デフォルトの名無しさん [sage] 2024/02/18(日)19:41 ID:rWy6ZYAH(2/2)
>>234 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)]));
}
269
(1): デフォルトの名無しさん [] 2024/02/21(水)23:42 ID:bqTl0uQM(1)
>>234
>>249をC++で書き換え(入力値は64ビット整数の範囲内限定)
https://ideone.com/e1AM8A

元々はCで書き、4行目はなし、15行目と24行目はstrrev(s + i);だったが、Windowsのgccでは
コンパイルできたのにideoneではできなかったので、仕方なくC++にしてstd::reverseで代用した。
270: デフォルトの名無しさん [] 2024/02/22(木)00:34 ID:+mJgzEZf(1)
>>234 lisp
>>266を参考に>>249(C#)を移植
https://ideone.com/CUPTas
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.039s