プログラミングのお題スレ Part22 (858レス)
上下前次1-新
抽出解除 レス栞
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
234(27): デフォルトの名無しさん [sage] 2024/02/14(水) 09:32:06.19 ID:JjlrBdlD(1) AAS
お題:数値が入力されるのでその数値に最も近い回分数を出力せよ
回分数とは回分になっている数(負数含まず)のことである
最も近い回分数が2つある場合は2つとも出力せよ
入力 0
出力 0
入力 17
出力 22
入力 100
出力 99
出力 101
235(1): デフォルトの名無しさん [] 2024/02/14(水) 15:20:24.32 ID:VoM/Kva2(1) AAS
>>234 lisp
外部リンク:ideone.com
236(2): デフォルトの名無しさん [sage] 2024/02/14(水) 21:10:48.99 ID:/8p4lTpf(1) AAS
>>234 ocaml
外部リンク:ideone.com
>>234 rust
外部リンク:ideone.com
238(1): デフォルトの名無しさん [sage] 2024/02/15(木) 21:30:35.17 ID:MveN6p4/(1) AAS
>>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:50.95 ID:fu0tHwRa(1) AAS
>>234
>>237は入力が1〜9のとき出力が正しくなかった。function内の1行目に if ($n -le 9) {return $n} を
挿入すると修正される。
Rでは添字の開始値は1で添字0では空のデータが返るので、入力が1〜9のときの場合分けは不要。
[]演算子と+演算子を文字列でも使えるように再定義した。
外部リンク:ideone.com
Dでは添字範囲指定は半開区間なので、入力が1〜9のときの場合分けは不要。
外部リンク:ideone.com
240(1): デフォルトの名無しさん [sage] 2024/02/15(木) 23:18:01.58 ID:IMdr4idU(1) AAS
>>234 c
外部リンク:ideone.com
241(1): 9 [sage] 2024/02/16(金) 02:56:10.41 ID:7jtCAGu+(1/2) AAS
>>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:55.29 ID:TIAwaOOw(1) AAS
>>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:03.19 ID:cLyPSkE5(1) AAS
>>234 pascal
外部リンク:ideone.com
245(2): 17 [] 2024/02/16(金) 23:58:17.22 ID:C4FuIAno(1) AAS
>>234
Kotlin
何か画期的なアルゴリズムを使ったわけではなく、むしろほとんど何も考えずただ作られただけのプログラム。
外部リンク:paiza.io
246(1): 9 [sage] 2024/02/17(土) 02:10:36.54 ID:K8P5qDCx(1) AAS
>>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:20.87 ID:nUY+CX2J(1/3) AAS
>>234 pascal
外部リンク:ideone.com
・dynamic array 使用
248(2): デフォルトの名無しさん [] 2024/02/17(土) 19:03:53.65 ID:eWGoJOTY(1) AAS
>>234
C++
2chスレ:tech
249(3): デフォルトの名無しさん [] 2024/02/17(土) 20:00:17.98 ID:k6cg1rdP(1) AAS
>>234
>>239のC#版
外部リンク:ideone.com
Julia版
外部リンク:ideone.com
250(1): デフォルトの名無しさん [sage] 2024/02/17(土) 20:51:00.88 ID:nUY+CX2J(2/3) AAS
>>234 octave
外部リンク:ideone.com
251(2): デフォルトの名無しさん [sage] 2024/02/17(土) 21:45:58.19 ID:nUY+CX2J(3/3) AAS
>>234 ruby
外部リンク:ideone.com
258: デフォルトの名無しさん [sage] 2024/02/18(日) 18:34:19.30 ID:rWy6ZYAH(1/2) AAS
>>234 ruby
外部リンク:ideone.com
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:35.69 ID:rWy6ZYAH(2/2) AAS
>>234 dart
外部リンク:ideone.com
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:23.78 ID:bqTl0uQM(1) AAS
>>234
>>249をC++で書き換え(入力値は64ビット整数の範囲内限定)
外部リンク:ideone.com
元々はCで書き、4行目はなし、15行目と24行目はstrrev(s + i);だったが、Windowsのgccでは
コンパイルできたのにideoneではできなかったので、仕方なくC++にしてstd::reverseで代用した。
270: デフォルトの名無しさん [] 2024/02/22(木) 00:34:50.13 ID:+mJgzEZf(1) AAS
>>234 lisp
>>266266(3): デフォルトの名無しさん [sage] 2024/02/21(水) 13:54:29.89 ID:ve9Dz9D8(1) AAS
>>264
私は解答は提出していないが、ざっくりと自分が思いついた方法
まず、以下のような操作を考える
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が答え
十分大きな数に対しては虱潰しに回文判定していくより速く求まる
を参考に>>249(C#)を移植
外部リンク:ideone.com
271: デフォルトの名無しさん [sage] 2024/02/22(木) 01:30:35.61 ID:9s07Ijs0(1) AAS
>>234
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] },
}
}
273(2): デフォルトの名無しさん [sage] 2024/02/22(木) 20:54:45.16 ID:+nyM4OV5(1/2) AAS
>>234 ruby
外部リンク:ideone.com
・それっぽい三個の候補から選んでるだけ
274(1): デフォルトの名無しさん [] 2024/02/22(木) 21:04:16.48 ID:3p8Kt6H4(1) AAS
>>234
>>269の一部でC++の機能をどうせ使ってしまったので、この際、全部をC++流に変えたら
C流よりすっきり書けた。
外部リンク:ideone.com
279(1): 273 [sage] 2024/02/23(金) 23:06:54.56 ID:RzwC5Hr4(1) AAS
>>234 ruby
外部リンク:ideone.com
・273の[1000, [1001]]バグ修正版
・275とは違う方法で修正してみたがやっつけ感大
>>234 ruby 2.5.5
外部リンク:ideone.com
・いわゆる(?)ジェネレータ版
・「終端を持たない範囲オブジェクト」はRuby 2.6.0から
280: デフォルトの名無しさん [sage] 2024/02/24(土) 00:25:03.27 ID:f2xn4abB(1) AAS
>>234
Ruby
外部リンク:paiza.io
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.050s