プログラミングのお題スレ Part22at TECH
プログラミングのお題スレ Part22 - 暇つぶし2ch218:9
24/02/04 16:39:59.23 jTY6zdRX.net
>>210 Perl5

use feature qw{:5.16 signatures};
no warnings qw(experimental::signatures);
@s = qw[a1=a2 b1=b2 b3=b2 c1=c2 e1=e2 a3=a4 c3=c4 e1=e3 a2=a4 c3=c1 b3=a4 c2=d1 a4=a5 d2=c1 b4=b3 d3=c3];
for (map{[sort /(\w+)=(\w+)/]} @s) {
 ($l, $r) = @$_;
 $g{$r} //= $g{$l} //= $g{$r} // $l;
 $h{$g{$r}} = $g{$l} if $g{$l} ne $g{$r};
}
$h{$k} = sub($e){$h{$e} ? __SUB__->($h{$e}) : $e}->($v) while ($k, $v) = each %h;
$g{$_} = $h{$g{$_}} // $g{$_} for keys %g;
push @{$r{$v}}, $k while ($k, $v) = each %g;
say "@$_" for values %r;

※見易くするためインデントを全角スペースに置換してあります


実行結果
$ perl 22_206_grouping.pl
b3 a3 a5 b4 a4 a1 b1 a2 b2
c1 d1 d3 c3 c2 d2 c4
e3 e1 e2

219:9
24/02/04 18:22:17.66 jTY6zdRX.net
>>210 宛てじゃなかった
>>208 の回答だったわ… orz

220:デフォルトの名無しさん
24/02/04 18:32:39.04 fS5H2fbQ.net
>>208
>>217をPowerShellに移植

$in =
  "a1=a2", "b1=b2", "b3=b2", "c1=c2", "e1=e2", "a3=a4", "c3=c4", "e1=e3",
  "a2=a4", "c3=c1", "b3=a4", "c2=d1", "a4=a5", "d2=c1", "b4=b3", "d3=c3"

$in -split "=" |% {$h = @{}; $n = 0} {if (!$h[$_]) {$h[$_] = $n++}}
$eq = $in |% {, $h[$_ -split "="]}

$g = 1..$n
do {
  $changed = $false
  $eq |% {
    $i, $j = $_
    switch ($g[$i] - $g[$j]) {
      {$_ -gt 0} {$g[$i] = $g[$j]; $changed = $true}
      {$_ -lt 0} {$g[$j] = $g[$i]; $changed = $true}
    }
  }
} while ($changed)

$h.keys | sort {$h[$_]} | group {$g[$h[$_]]} |% {"[$($_.group -join ", ")]"}

-- 実行結果 --
[a1, a2, b1, b2, b3, a3, a4, a5, b4]
[c1, c2, c3, c4, d1, d2, d3]
[e1, e2, e3]

221:デフォルトの名無しさん
24/02/04 19:02:37.59 fS5H2fbQ.net
>>220の5行目の if (!$h[$_]) を if ($h[$_] -eq $null) に訂正

222:デフォルトの名無しさん
24/02/04 19:43:39.57 NiYs7EK6.net
>>208
C++
スレリンク(tech板:125番)
完全にやっつけ仕事、いろいろ課題がありますね

223:211
24/02/04 23:55:45.21 ytAuzkvH.net
>>208 ruby
URLリンク(ideone.com)
>>213から若干のアレンジ
・同一グループの収集にSortedSetを使用

224:17
24/02/05 02:54:15.12 8tY/Vubv.net
>>208
Kotlin

入力データを標準入力から入力したり、クラス作ってその中でまとめる等、色々やって長くなった。

URLリンク(paiza.io)

225:221
24/02/05 20:08:21.07 tt/WRhkt.net
>>208 ruby
URLリンク(ideone.com)
>>223から若干のアレンジ
・SortedSet単位でのみいじるようにした
f = -> a {
g = -> a {a.combination(2) {|x, y| break g.(a.tap {x.merge y; a.delete y}) if x.intersect? y}}
h = a.map {|s| s.split('=')}.flatten.uniq.map.with_index.to_h
a = a.map {|s| s.split('=').map {|k| h[k]}.to_set SortedSet}
g.(a).map {|set| set.map &h.invert.method(:[])}
}

226:デフォルトの名無しさん
24/02/05 23:26:45.85 YjqgZClx.net
>>208
>>220-221をC#化
URLリンク(ideone.com)

227:223
24/02/05 23:51:15.55 tt/WRhkt.net
>>208 rust
URLリンク(ideone.com)
>>225の移植
・色々迷いアリ
 .map(|k| *h.get(k).unwrap())のところは当初
 .map(|k| h.get(k).map(|&i| i)).flatten()などとしていたが
 正解がわからないので迷った挙げ句に短く書けるほうを採用
・これに限らずrustは不慣れなので色々珍妙なことをしている可能性アリ

228:225
24/02/06 22:07:13.88 6T/Xuns0.net
>>208 rust
URLリンク(ideone.com)
>>227から若干の修正
・不必要なループ回数を訂正
・二重forを一重に(でもかえって煩雑に)
・まだまだ迷いアリ
 .map(|k| *h.get(k).unwrap())は結局
 .flat_map(|k| h.get(k)).cloned()に置き換え
 こっちのほうが個人的にはスッキリ感アリ
>>208 rust
URLリンク(ideone.com)
・上記のmutナシ版
・パフォーマンス的な観点もナシ

229:デフォルトの名無しさん
24/02/06 22:17:05.66 ICpsP2hv.net
>>208
C#で>>226とは別の解法
URLリンク(ideone.com)

230:デフォルトの名無しさん
24/02/09 20:11:03.28 xlZlW34G.net
>>208
C#でHashSet型を使用。実効速度は>>226>>229より遅い。
URLリンク(ideone.com)

231:226
24/02/09 22:33:42.16 JDB9tF7l.net
>>228
すべてruby移植版rust
DでもE見た目派生まとめ

mutあり版
URLリンク(ideone.com) // for if return
URLリンク(ideone.com) // match find
URLリンク(ideone.com) // if let find

mutなし版
URLリンク(ideone.com) // for if return
URLリンク(ideone.com) // match find
URLリンク(ideone.com) // if let find

集合同士の組み合わせに重なりが一個もなかったときに
最後に返す a がポツーンと片隅に居るのが落ち着かなかったので
match/if letで書き直してみたがそれはそれで難があり?
条件部分が奥に入ってしまったのがなんかイヤだったり?
一行目が長くなりすぎる、という理由で二行に分けたり?
やっぱ元のfor if returnのリズムのほうが眼球に入りやすい?

232:デフォルトの名無しさん
24/02/10 22:10:46.31 HaBtyH/G.net
>>208
>>229をC++に移植
URLリンク(ideone.com)

233:デフォルトの名無しさん
24/02/11 15:34:27.52 3wEOIMb0.net
>>208 octave
URLリンク(ideone.com)
>>208 octave
URLリンク(ideone.com)

234:デフォルトの名無しさん
24/02/11 20:38:42.50 v64KP9lJ.net
>>208
>>232をDで書くと
URLリンク(ideone.com)
になるが、switch case 0, 1, 2の場合も3の場合と同じ処理にすると、効率は落ちるもののかなり短くできる。
URLリンク(ideone.com)

235:223
24/02/12 23:45:12.86 ix8w7wd+.net
>>208 octave
URLリンク(ideone.com)
・組み合わせつくって集合のペアごとに調べることをやめた
・集合間で重複する要素に着目して集合を減らすようにした
>>225
g.(a).map {|set| set.map &h.invert.method(:[])}じゃなくて単に
g.(a).map {|set| h.keys.values_at *set}で良かった

236:デフォルトの名無しさん
24/02/14 09:32:06.19 JjlrBdlD.net
お題:数値が入力されるのでその数値に最も近い回分数を出力せよ
回分数とは回分になっている数(負数含まず)のことである
最も近い回分数が2つある場合は2つとも出力せよ
入力 0
出力 0
入力 17
出力 22
入力 100
出力 99
出力 101

237:デフォルトの名無しさん
24/02/14 15:20:24.32 VoM/Kva2.net
>>236 lisp
URLリンク(ideone.com)

238:デフォルトの名無しさん
24/02/14 21:10:48.99 /8p4lTpf.net
>>236 ocaml
URLリンク(ideone.com)

>>236 rust
URLリンク(ideone.com)

239:デフォルトの名無しさん
24/02/14 23:21:42.28 iTsk+dOj.net
>>238
PowerShell
URLリンク(ideone.com)

240:デフォルトの名無しさん
24/02/15 21:30:35.17 MveN6p4/.net
>>236
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)),
 }
}

241:デフォルトの名無しさん
24/02/15 22:00:50.95 fu0tHwRa.net
>>236
>>239は入力が1~9のとき出力が正しくなかった。function内の1行目に if ($n -le 9) {return $n} を
挿入すると修正される。

Rでは添字の開始値は1で添字0では空のデータが返るので、入力が1~9のときの場合分けは不要。
[]演算子と+演算子を文字列でも使えるように再定義した。
URLリンク(ideone.com)

Dでは添字範囲指定は半開区間なので、入力が1~9のときの場合分けは不要。
URLリンク(ideone.com)

242:デフォルトの名無しさん
24/02/15 23:18:01.58 IMdr4idU.net
>>236 c
URLリンク(ideone.com)

243:9
24/02/16 02:56:10.41 7jtCAGu+.net
>>236 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

244:9
24/02/16 03:13:10.80 7jtCAGu+.net
>>243

  last if keys %a;
 }
 @a = keys %a;



  last if @a = keys %a;
 }

とコンパクトに書けるんだった、まぁいいや

245:9
24/02/16 14:47:55.29 TIAwaOOw.net
>>236 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";
}

246:デフォルトの名無しさん
24/02/16 21:57:03.19 cLyPSkE5.net
>>236 pascal
URLリンク(ideone.com)

247:17
24/02/16 23:58:17.22 C4FuIAno.net
>>236
Kotlin
何か画期的なアルゴリズムを使ったわけではなく、むしろほとんど何も考えずただ作られただけのプログラム。
URLリンク(paiza.io)

248:9
24/02/17 02:10:36.54 K8P5qDCx.net
>>236 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}

249:デフォルトの名無しさん
24/02/17 18:14:20.87 nUY+CX2J.net
>>236 pascal
URLリンク(ideone.com)
・dynamic array 使用

250:デフォルトの名無しさん
24/02/17 19:03:53.65 eWGoJOTY.net
>>236
C++
スレリンク(tech板:126番)

251:デフォルトの名無しさん
24/02/17 20:00:17.98 k6cg1rdP.net
>>236
>>241のC#版
URLリンク(ideone.com)

Julia版
URLリンク(ideone.com)

252:デフォルトの名無しさん
24/02/17 20:51:00.88 nUY+CX2J.net
>>236 octave
URLリンク(ideone.com)

253:デフォルトの名無しさん
24/02/17 21:45:58.19 nUY+CX2J.net
>>236 ruby
URLリンク(ideone.com)

254:デフォルトの名無しさん
24/02/18 17:05:41.93 z028saCP.net
>>253
>[[0, [0]], [17, [11]], [100, [99, 101]]]
17 は、22 だよ

255:デフォルトの名無しさん
24/02/18 18:14:23.24 puttXdr1.net
>>237
しらみ潰しで失格
>>238
しらみ潰しで失格
>>242
しらみ潰しで失格

256:デフォルトの名無しさん
24/02/18 18:14:51.62 puttXdr1.net
>>245
しらみ潰しで失格
>>246
しらみ潰しで失格
>>247
しらみ潰しで失格

257:デフォルトの名無しさん
24/02/18 18:15:27.81 puttXdr1.net
>>248
しらみ潰しで失格
>>249
しらみ潰しで失格
>>250
しらみ潰しで失格

258:デフォルトの名無しさん
24/02/18 18:16:03.57 puttXdr1.net
>>252
しらみ潰しで失格
>>253
しらみ潰しで失格

259:デフォルトの名無しさん
24/02/18 18:26:09.28 ovKjFpQ6.net
>>255-258 アスペで不合格w

260:デフォルトの名無しさん
24/02/18 18:34:19.30 rWy6ZYAH.net
>>236 ruby
URLリンク(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
}
>>254
(`・ω・´)ゞ
誤:a - 1, a + 1
正:a - 1, b + 1

261:デフォルトの名無しさん
24/02/18 19:41:35.69 rWy6ZYAH.net
>>236 dart
URLリンク(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)]));
}

262:デフォルトの名無しさん
24/02/20 08:46:37.56 8US2zplP.net
【㋮㋑㋣㋹㊀㋳】 チャールズ3世戴冠式に`死神´
スレリンク(kokusai板)
sssp://o.5ch.net/22ja8.png

263:17
24/02/20 10:47:13.25 YmH8jdAc.net
>>256
しらみ潰しって、どんなテストしたの?

264:デフォルトの名無しさん
24/02/20 12:59:46.62 qzcGLGiS.net
しらみ潰しとは例えば1から順番に見つかるまで全てを試していく最悪な方法を指す
今回の場合だと与えた数から順番に見つかるまで±1を続けて全てを試していって探すプログラムが該当する

265:9
24/02/20 17:18:07.59 X5uoFLgg.net
「どんなテストしたの?」
って質問だよ

266:◆QZaw55cn4c
24/02/20 20:48:17.02 RtAsHDVN.net
>>264
私は >>250
だけれども、解法としてはそれしかないと思いますね

267:デフォルトの名無しさん
24/02/20 22:00:55.76 e+y9lgSN.net
>>251>>240
しらみ潰しではなく
きちんとプログラミングして算出しているようにみえますね

268:デフォルトの名無しさん
24/02/21 13:54:29.89 ve9Dz9D8.net
>>266
私は解答は提出していないが、ざっくりと自分が思いついた方法
まず、以下のような操作を考える
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が答え
十分大きな数に対しては虱潰しに回文判定していくより速く求まる

269:デフォルトの名無しさん
24/02/21 16:02:55.06 Sko4Sglv.net
>>268
N=17
のときは?

270:259
24/02/21 23:06:20.13 DX/jvS2m.net
>>261
Iterable.generate(n).map(f)は単に
Iterable.generate(n, f)で良かったと判明

271:デフォルトの名無しさん
24/02/21 23:42:23.78 bqTl0uQM.net
>>236
>>251をC++で書き換え(入力値は64ビット整数の範囲内限定)
URLリンク(ideone.com)
元々はCで書き、4行目はなし、15行目と24行目はstrrev(s + i);だったが、Windowsのgccでは
コンパイルできたのにideoneではできなかったので、仕方なくC++にしてstd::reverseで代用した。

272:デフォルトの名無しさん
24/02/22 00:34:50.13 +mJgzEZf.net
>>236 lisp
>>268を参考に>>251(C#)を移植
URLリンク(ideone.com)

273:デフォルトの名無しさん
24/02/22 01:30:35.61 9s07Ijs0.net
>>236
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] },
 }
}

274:266
24/02/22 01:47:44.56 c61GBvnr.net
>>269
N=17=1*10+7*1のとき、Nは2桁(偶数桁)でM=1*1=1
B(M)=B(1)=11はNより小さいのでB(M-1)は考えなくてよい
B(M+1)=B(2)=22なので11,22が答えの候補
11より22のほうが17に近いので22が答え
ちょっとNに対するMの説明が足りてなかったけど言葉で上手く言い表せないすみません(上位半分以上かつ最小の桁数を抜き出す、的な)

275:デフォルトの名無しさん
24/02/22 20:54:45.16 +nyM4OV5.net
>>236 ruby
URLリンク(ideone.com)
・それっぽい三個の候補から選んでるだけ

276:デフォルトの名無しさん
24/02/22 21:04:16.48 3p8Kt6H4.net
>>236
>>271の一部でC++の機能をどうせ使ってしまったので、この際、全部をC++流に変えたら
C流よりすっきり書けた。
URLリンク(ideone.com)

277:273
24/02/22 21:48:36.22 +nyM4OV5.net
>>275
> [1000, [1001]]
誤:ps = [p.(s), p.(t.to_i.pred.abs.to_s + u), p.(t.succ + u)]
正:ps = [p.(s), p.(t.to_i.pred.abs.to_s + u), p.(t.succ + u), p.(s.to_i.pred.abs.to_s)]
とりあえず雑に修正してみたが?
(ノ∀`)アチャー

278:17
24/02/23 18:10:28.85 ZR6D6MGM.net
>>264
>>247のKotlinのプログラムは何も考えてなくて本当に馬鹿正直に±1して一つ一つ検査する方式で作ったんだけど、それでもあなたのテストではダメということになったの?
まあ Int (符号付32bit整数) 使ってるからその限界超えたらダメではあるんだけど、そういう問題ではなく?

279:デフォルトの名無しさん
24/02/23 18:58:34.05 9Umf93zL.net
>>278
それはしらみつぶしと言われる駄目プログラミングだよ
例えば求める解法が存在する方程式を解くのに値を±1しながら順に代入して試していくのと同じ

280:デフォルトの名無しさん
24/02/23 21:39:34.55 ZR6D6MGM.net
>>279
あー。プログラムにバグがあってまともに答えが出ないっていうことではなく何の捻りもないプログラムだからダメっていう感想ね。それならわかる。
こちらもアルゴリズム思い浮かばないけどとりあえず作ってみただけだし。ダメというほどではないが良いとも思えないプログラムなので。

281:273
24/02/23 23:06:54.56 RzwC5Hr4.net
>>236 ruby
URLリンク(ideone.com)
・273の[1000, [1001]]バグ修正版
・275とは違う方法で修正してみたがやっつけ感大
>>236 ruby 2.5.5
URLリンク(ideone.com)
・いわゆる(?)ジェネレータ版
・「終端を持たない範囲オブジェクト」はRuby 2.6.0から

282:デフォルトの名無しさん
24/02/24 00:25:03.27 f2xn4abB.net
>>236
Ruby
URLリンク(paiza.io)

283:279
24/02/24 13:21:16.94 aSUCvHSH.net
>>236 ruby 2.5.5
URLリンク(ideone.com)
・ジェネレータ版ちょっとアレンジ
・to_sしてto_iするのをやめた

284:
24/02/24 14:25:41.40 NZEL8Kud.net
異なる自然数 a, b (a > b) における a^3 - b^3 を「a, b の三乗差」と呼ぶことにする。
異なる5通りの組(a, b) (c, d) ... (j, k) について三乗差がすべて相等しいとき
その組(a, b)...(j, k) および三乗差自体を求めよ
異なる6通りの組で三乗差が相等しい場合があるかも検討せよ

285:デフォルトの名無しさん
24/02/24 16:47:38.19 KRWvIUHe.net
>>284
[(1134, 357), (1155, 504), (1246, 805), (2115, 2004), (4746, 4725)]
a^3 - b^3 == 1412774811

286:17
24/02/24 16:52:08.36 Pf8MFN4C.net
数学、か・・・

287:デフォルトの名無しさん
24/02/24 18:16:29.01 O6Cw1j13.net
>>284 ruby
URLリンク(ideone.com)
・そのまま版
・5秒じゃ㍉

288:デフォルトの名無しさん
24/02/24 20:03:55.52 mNVJyIZh.net
>>236
>>276を巨大整数対応にした。
URLリンク(ideone.com)

289:デフォルトの名無しさん
24/02/24 22:30:55.28 mNVJyIZh.net
>>284
aが5000以下限定で>>285の解はRで5秒以内に求められた。8~9行目は下三角行列の要素番号から
行番号と列番号を求めているだけで、>>284を解く特別なアルゴリズムというわけではない。
URLリンク(ideone.com)

290:285
24/02/25 08:52:58.18 M1xmyD2F.net
>>284 ruby 2.5.5
URLリンク(ideone.com)
・285の無駄なループ回数を削減
・でも5秒じゃ㍉

291:デフォルトの名無しさん
24/02/25 21:06:57.77 CUQUyFSy.net
>>284
>>289は下三角行列の要素番号から列番号を求めるのに2次方程式を解くのが分かりにくかったから、
各列の最下行の要素番号を計算しておいてそれを二分探索するように変更した。
URLリンク(ideone.com)
n = 25000で実行してみても、n = 5000ときの解のa, bを両方とも2, 3, 4, 5倍した解しか別に
見つからなかった。

292:デフォルトの名無しさん
24/02/26 22:18:39.21 CjcYgBx5.net
>>284
>>291と似た手順でC++
URLリンク(ideone.com)
Rではソートする前に重複値だけを抽出しているが、C++のunique関数はソート済みデータにしか
使えないので使っていない。

293:288
24/02/27 21:45:30.42 nu8aoj+0.net
>>284 c
URLリンク(ideone.com)
・288の移植

294:デフォルトの名無しさん
24/02/27 22:30:42.88 BJV11H6M.net
>>284
下三角行列の各列内の要素は昇順で既に並んでいるのに、>>292は下三角行列の全要素を
ソートして無駄なので、列のマージに変更(要するにマージソートを途中段階から開始)
したら少し速くなった。
URLリンク(ideone.com)

n = 10000でも5秒以内に終わった。
URLリンク(ideone.com)

295:288
24/02/28 22:00:05.18 7ZY4TL6q.net
>>284 c++
URLリンク(ideone.com)
・288の移植
>>284 rust
URLリンク(ideone.com)
・288の移植

296:デフォルトの名無しさん
24/02/28 23:21:09.16 FCtvUtiC.net
>>284
>>294とは別の方法で>>292を高速化
URLリンク(ideone.com)
1³, 2³, 3³, …, 5000³をD = 5001で割った余りはすべて異なる値になるから、d = a³ − b³を
Dで割った余りはどれか1つの値に偏ることなく均等に分布する。dをDで割った余りによりdを
区分すれば、各区分に入る個数はどれも多すぎないのでソートに時間が余りかからない。
Dの値はconstexpr関数によりコンパイラに計算させている。n = 10000, 15000のときは
それぞれD = 10002, 15009になる。

297:291
24/02/29 22:20:45.85 HlaTo1dC.net
>>284 c
URLリンク(ideone.com)
・291から省メモリ化
 旧:unsigned int values[10];
 新:unsinged short values[4];

298:デフォルトの名無しさん
24/03/01 22:22:26.10 6k2oCbjk.net
>>284
C++
URLリンク(ideone.com)
>>296はa, bの二重ループ内でa³ − b³をD = 5001で割った余りrにより区分していたが、
rのループ内でa, bを変化させるように変更したら、2次元配列がなくなってすっきりした。
その結果、メモリ使用量が激減し、nが大きい場合でも実行できるようになった。

299:デフォルトの名無しさん
24/03/01 22:23:18.03 6k2oCbjk.net
>>298の続き
n = 1000000, m = 6で実行すると、12通りの解が見つかった。

[6つ組解]
424910390480793: (75978, 23919), (77385, 33768), (83482, 53935), (141705, 134268), (317982, 316575), (596001, 595602)
620174235433536: (86184, 27132), (87780, 38304), (90237, 48573), (94696, 61180), (160740, 152304), (360696, 359100)
1238805803151000: (107487, 14487), (108540, 34170), (110550, 48240), (119260, 77050), (454260, 452250), (851430, 850860)
1384074844012224: (112152, 29844), (125324, 83600), (130050, 93426), (159372, 138624), (224928, 215412), (357447, 353799)
1936290882196125: (127629, 52254), (133320, 75675), (149285, 111620), (228525, 215430), (246510, 235395), (290214, 282339)
4589726535576000: (170172, 69672), (177760, 100900), (185265, 120945), (304700, 287240), (328680, 313860), (386952, 376452)
4961393883468288: (172368, 54264), (175560, 76608), (180474, 97146), (189392, 122360), (321480, 304608), (721392, 718200)
11072598752097792: (224304, 59688), (250648, 167200), (260100, 186852), (318744, 277248), (449856, 430824), (714894, 707598)
36717812284608000: (340344, 139344), (355520, 201800), (370530, 241890), (609400, 574480), (657360, 627720), (773904, 752904)
52279853819295375: (382887, 156762), (399960, 227025), (447855, 334860), (685575, 646290), (739530, 706185), (870642, 847017)

[7つ組解]
15490327057569000: (249281, 6281), (255258, 104508), (266640, 151350), (298570, 223240), (457050, 430860), (493020, 470790), (580428, 564678)
123922616460552000: (498562, 12562), (510516, 209016), (533280, 302700), (555795, 362835), (597140, 446480), (914100, 861720), (986040, 941580)

6つ組解の(2, 7), (4, 8), (5, 10), (6, 9)番目は各括弧内で自然数比になっている。
6つ組解の5番目の2倍は7つ組解の1番目のうちの6組を構成している。

300:デフォルトの名無しさん
24/03/01 22:24:42.81 6k2oCbjk.net
>>284
C++
URLリンク(ideone.com)
>>298のrのループ内でa³ − b³をD2 = 5003で割った余りr2により区分し、それぞれの区分ごとに
解を探すようにしたら速くなった。ただし、nが大きい場合にはかえって遅くなる。

301:
24/03/03 19:08:39.58 75HCbpT6.net
>>299
出題者です。
すごいです。ありがとうございます。私の手元ではまだ6通り解、7通り解のひとつも入手できていないので、参考になりました
私のアルゴリズムは効率が悪いようですね

302:デフォルトの名無しさん
24/03/03 22:19:54.92 ZEDvt9uH.net
>>284
C++
URLリンク(ideone.com)

>>300でnを大きくするにつれ>>298に対する高速化効果が薄れていくのは、ABをvectorでなく
配列にしたらある程度改善された。n = 5000のときの実行時間は>>298の半分以下になった。
ただし、n = 1000000まで大きくすると、296よりやっぱり遅くなる。

>>301
どんなプログラムを書いたのか見せて。

303:デフォルトの名無しさん
24/03/06 22:35:52.23 lIZep5aT.net
>>284
C++
URLリンク(ideone.com)
>>302の実行時間を分析すると、最も時間が掛かっているのは46~と47行目だと判明した。
そこで配列ABの第1次元と第2次元を入れ替えてみると、n = 5000では変わらないが、
1万, 2万, 5万, 10万, 20万では35%前後高速になった。これは、改良前には第2次元の添字が
小さい要素に書き込みが集中しているため、改良後のように第1次元に入れ替えた方が
纏まったメモリ領域に書き込みが集中しキャッシュの効きが良くなるからだと考えられる。
一方、n = 100万で高速化しないのは、書き込み集中領域が大きすぎるからだろう。

URLリンク(ideone.com)
n = 100万の場合にはr2の値によってデータを多数の列へ振り分けるのをやめ、列を1つにして、
その内部でr2の値により2種類に区分し、それぞれの内部で2種類にさらに区分し、…と再帰的に
区分していけば(要するにクイックソートの変形版)、1つの配列内での要素のスワップだけで済み、
キャッシュの効きが改善されるとの予想通り、n = 100万で実行速度は>>298より25%速くなった。
(原理的には>>302より非効率なのでn = 5000では>>302より当然遅い)

304:デフォルトの名無しさん
24/03/08 19:02:53.21 oHHhAfhn.net
>>303
ハズレが多いから2passは効果ある?

305:デフォルトの名無しさん
24/03/09 22:13:47.64 C74EWG6S.net
>>284
C++
URLリンク(ideone.com)
関数mainのループで配列A, B, Pに書き込まずdにだけ書き込むようにし、関数FindDuplicatesで
dの添字Pではなくdそのものをソートするように変えて、n = 1000000の場合に>>303より10%高速化。
関数PrintSolutionでa, bをmainでと同じ方法で再計算するのは非効率だが、PrintSolutionは僅か12回しか
呼ばれないため、全体の実行時間への影響は無視できる。

306:デフォルトの名無しさん
24/03/09 22:47:01.30 v99WCN19.net
お題

460円 580円 600円 の3種類の商品があります
これらを組み合わせて合計10個買ったら5360円になりました
組み合わせを求めるプログラムを書いてください

ちなみに答えの一つは
・600円×2
・580円×4
・460円×4
だそうです

スレリンク(cigaret板:56番)-57

307:デフォルトの名無しさん
24/03/09 23:59:51.39 C74EWG6S.net
>>306
面倒なのでRで全探索
URLリンク(ideone.com)

308:デフォルトの名無しさん
24/03/10 01:20:18.65 8NU5B5F+.net
>>306
面倒なので全て460円を引くと
A=0円 B=120円 C=140円
10個で760円という問題
面倒なのでさらに20で割ると
A=0円 B=6 C=7円
10個で38円という問題
つまり唯一奇数のCは偶数個が確定
Cが6個以上だと42円以上でオーバーしてNG
Cが4個だと28円で残り10円をA,Bで作れないからNG
Cが2個だと14円で残り24円はBが4個で残り4個がA
Cが0個だと0円で残り38円をA,Bで作れないからNG
つまり解は(A,B,C)=(4,4,2)しかない

309:デフォルトの名無しさん
24/03/10 11:20:30.42 Doj9A/yB.net
>>308
すごすぎるだろ、日本の未来を頼む

310:デフォルトの名無しさん
24/03/10 19:06:13.20 qBLPZ6x8.net
>>306
Rで全探索でなくちゃんと解くと
URLリンク(ideone.com)
解が複数ある場合と全くない場合の例として、600円を540円と520円に変更したときの出力も載せた。

311:デフォルトの名無しさん
24/03/10 20:08:55.20 6qxPF4Wx.net
2pass案は多少工夫したらかなり速い
n ␣␣m ␣296␣ ␣301-1 ␣301-2 ␣303␣ ␣2pass
5k␣␣5 ␣ 0.5s ␣ 0.1s ␣ 0.5s ␣ 0.4s ␣ 0.1s
25k ␣5 ␣12.7s ␣ 2.5s ␣13.9s ␣11.1s ␣ 1.7s
100k␣5 ␣3m52s ␣49.3s ␣4m13s ␣3m26s ␣38.9s
1M* ␣6 ␣8h23m ␣2h50m ␣8h51m ␣6h43m ␣1h11m
*n=100万は1万サンプルの部分ループ500k≦r<510kから100倍
>>303の296と301-2の比較記述と違う傾向があるのはキャッシュ階層の違いだと思う
2passは301-1に近いけど1pass目でのランダムアクセスサイズを落としながらも
誤判定率を低く抑える(0.2%~2%)工夫をするのがお楽しみだと思う

312:デフォルトの名無しさん
24/03/14 14:43:15.33 ZraPd1+Q.net


313:デフォルトの名無しさん
24/03/27 23:42:08.75 sRZ89+IF.net
>>306
a = (600, 580, 460)
m = min(a)
h = set()
def buy(b, yen):
if yen < m: return
for i in range(0, len(a)):
v = a[i]
if yen >= v:
b[i] += 1
if yen == v:
h.add(str(b))
else:
buy(b, yen - v)
b[i] -= 1
buy([0, 0, 0], 5360)
for s in h: print(s)

314:デフォルトの名無しさん
24/03/27 23:55:15.74 qNf/D02g.net
>>306
Haskell
[(a, b, c) | a <- [0..20], b <- [0..20], c <- [0..20], a * 460 + b * 580 + c * 600 == 5360]
output: [(0,2,7),(4,4,2)]

315:デフォルトの名無しさん
24/03/28 00:00:41.99 0Zoa9Vsx.net
合計10個という条件忘れてた。
[(a, b, c) | a <- [0..20], b <- [0..20], c <- [0..20], a + b + c == 10, a * 460 + b * 580 + c * 600 == 5360]
output: [(4,4,2)]

316:デフォルトの名無しさん
24/03/31 11:57:53.31 enek7T1c.net
大幅に手直しした
特に前回数値が一部出てこない状態になっていたので色々と手動で最適化した
新しいアイディアを思いつかない限りはシングルスレッドでの限界に近いと思う

n m 301-1 303 2pass 2pass'
5k 5 0.1s 0.4s 0.1s 0.1s
25k 5 2.5s 11.1s 2.3s* 1.7s
100k 5 49.3s 3m26s 38.9s 27.7s
1M* 6 2h50m 6h43m 1h11m 48m10s
2M* 6 17h06m 28h27m 5h47m 3h13m
Max* 6 35h51m 51h23m 11h09m 5h47m

*前回>>311 2pass n=25kの再計測値
*n=1Mは部分ループ500k<=r<510kから100倍
*n=2Mは部分ループ500k<=r<505kから400倍
*Max:=2642245は3乗がUINT64に収まる最大
*n=Maxは部分ループ500k<=r<500k+3785から2642245/3785倍

ヒント含みの数値がこちら

n D1 D2 D3 = 5000 5001 5003 5009
false_positive = 23 / 5001 = 0.46%
total_t_pass1 = 64.220 ms 2.568 ns/iter
total_t_pass2 = 0.044 ms 0.381 ns/iter
real 0m0.097s

317:デフォルトの名無しさん
24/03/31 11:58:50.32 enek7T1c.net
n D1 D2 D3 = 25000 25003 25005 25006
false_positive = 171 / 25003 = 0.68%
total_t_pass1 = 1654.681 ms 2.647 ns/iter
total_t_pass2 = 1.407 ms 0.329 ns/iter
real 0m1.709s

false_positive = 2211 / 100005 = 2.21%
total_t_pass1 = 27338.298 ms 2.734 ns/iter
total_t_pass2 = 78.402 ms 0.355 ns/iter
real 0m27.692s

n D1 D2 D3 = 1000000 1000002 1000009 1000015
false_positive = 18 / 10000 = 0.18%
total_t_pass1 = 28674.338 ms 2.867 ns/iter
total_t_pass2 = 5.642 ms 0.313 ns/iter
real 0m28.897s

n D1 D2 D3 = 2000000 2000003 2000013 2000015
false_positive = 13 / 5000 = 0.26%
total_t_pass1 = 28777.424 ms 2.878 ns/iter
total_t_pass2 = 8.620 ms 0.332 ns/iter
real 0m29.015s

n D1 D2 D3 = 2642245 2642246 2642253 2642258
false_positive = 315 / 3785 = 8.32%
total_t_pass1 = 29210.857 ms 2.921 ns/iter
total_t_pass2 = 336.864 ms 0.405 ns/iter
real 0m29.800s

318:デフォルトの名無しさん
24/03/31 22:30:39.09 4FIGx2uN.net
>>306
ぶっちゃけ、他の言語の人と同じっぽくないので心配なんだが…。
自分なりにHaskellで全探索じゃないバージョン書いてみた。
Haskell
[(a, b, c) | a <- [0..10], b <- [0..10 - a], c <- [0..10 - (a + b)], a * 460 + b * 580 + c * 600 == 5360, a + b + c == 10]
答えは同じ[(4,4,2)]。

319:デフォルトの名無しさん
24/04/01 04:52:23.91 iTC1bSa8.net
少し一般化して、N個の商品があり、i番目の商品はA_i円です
合計M個購入し、価格の合計がS円であるような購入の仕方を998244353で割った余りを求めてください
だとO(N M S)より小さい計算量で解けるのかな

320:デフォルトの名無しさん
24/04/01 16:50:08.47 0Kkx57P3.net
2個、4個、8個…みたいにメモ化すればMはlogMにできるかもしれんね
空間がlogM倍されそうだが

321:デフォルトの名無しさん
24/04/13 11:43:17.27 itq2kjOw.net
ヘロンの公式を実装せよ
使用言語:C

322:17
24/04/13 16:57:10.76 SxW/5mRR.net
>>321
URLリンク(paiza.io)
Wikipedia でヘロンの公式を調べてそのまま実装しただけで、ほとんど何も考えてない。

323:デフォルトの名無しさん
24/04/13 23:01:22.75 wFZkrOeZ.net
>>321
URLリンク(ideone.com)
ヘロンが作ったもう1つの式である平方根を加算と除算の繰り返しで求める式も使用。
sqrt関数を呼び出すより実行形式ファイルサイズがほんの少しだけ小さくなる。

324:デフォルトの名無しさん
24/04/14 00:59:32.83 ujzJ2+0Y.net
>>323
無限ループにならない?
機械イプシロン(DBL_EPSILON)とか気になる

325:デフォルトの名無しさん
24/04/14 18:34:21.49 MHeAinLP.net
解答例

#include <stdio.h>
#include <math.h>

void heron(double, double, double);

int main(void)
{
double a, b, c;
printf("3辺a, b, cを入力せよ ");
scanf("%lf,%lf,%lf", &a, &b, &c);

heron(a, b, c);
}

void heron(double x, double y, double z) // heronの定義
{
double s, t;

s = (x+y+z)*0.5;
t = s*(s-x)*(s-y)*(s-z);

printf("3角形の面積は S=%g\n", sqrt(t));

return;
}

326:デフォルトの名無しさん
24/04/14 18:36:52.16 MHeAinLP.net
>>323 さすがですね

327:デフォルトの名無しさん
24/04/15 21:01:04.41 dSNEYg5r.net
>>324
p < 0 のとき(= 三角形を作れない場合)は浮動小数点数の特性に関係なく無限ループになる。
sqrt(p) と同様にNANを返すには、if (p < 0) return 0 / (p - p); を追加すれば良い。
p > 0 のときは無限ループにならないはず。以下が検証プログラム。
URLリンク(ideone.com)
x = sqrt(p), y = p / x とすると、浮動小数点数の特性により x == y とならない場合は存在する。
このとき、xとyの仮数部を整数と見なした値(以降では「仮数整数」と呼ぶ)の差は1なので、
z = (x + y) / 2 はxとyのうち仮数整数が偶数の方に一致する。zを新たなxとして代入しyとzを
再計算すれば、今度はxの仮数整数が偶数なのでzはxに必ず一致し、>>323の収束判定条件が成立する。
具体例で見ると、p = 2 のときはxの仮数整数が奇数なので x != z となるが、zを新たなxとして代入し
再計算すれば x == z が成立する。桁上がりが起こる p = 3.9999999999999996 のときも、同様に
再計算で x == z が成立する。p = 3 のときはxの仮数整数が偶数なので x == z が成立し再計算は不要。

328:デフォルトの名無しさん
24/04/15 22:06:46.39 MxMoolaJ.net
>>327
解説ありがとう
俺には理解できないレベルだと分かりましたw
俺なら収束の自信が無くてDBL_EPSILONを使った判定と
ループ回数上限を組み合わせて実装しそうだ

329:デフォルトの名無しさん
24/04/17 05:47:35.77 F2fqxIYT.net
ヘロンの公式はそのままだと、数値計算での安定性が良くないらしいぞ
解決策は、Wikipediaの英語版の方に…
URLリンク(en.wikipedia.org)

330:327
24/04/17 05:52:23.77 F2fqxIYT.net
そしてこんなとこでもカハンせんせーの名前がが

331:デフォルトの名無しさん
24/04/17 16:28:33.14 7JRzlbtx.net
の長さ
この公式で計算される面積は、理論的には正しい値です。しかし、実際には、以下の理由で誤差が生じる可能性があります。
数値計算の誤差: 計算機で数値を扱う場合、有限桁しか扱えないため、丸め誤差が生じます。特に、辺の長さの値が大きく異なる三角形の場合、この誤差が顕著になります。
四捨五入誤差: 計算結果を小数点以下n桁まで表示する場合、n桁目以降の数字を切り捨てます。この四捨五入誤差も、面積の誤差に影響を与えます。
by Gemini

332:デフォルトの名無しさん
24/04/17 23:38:33.35 k4k/eSae.net
>>329に載っている参考文献
 William M. Kahan, ‘Miscalculating Area and Angles of a Needle-like Triangle’
 URLリンク(www.cs.berkeley.edu)
のTable 1の問題がパソコン等でのC++プログラムでも再現されるか試してみた。
 URLリンク(ideone.com)
Table 1とは違い、Accurate Δが概ね正確な場合にHeron's Δ'が大きく懸け離れた不正確な値に
なってしまうことはなく、ほぼ同じ値になり差はごく僅かしかない。Table 1のような不安定性は
Table 1の計算に使われたプログラマブル関数電卓に特有の問題で、パソコン等のプログラムでは
再現されない。(パソコン等のdoubleの方が精度が高いので当然と言えば当然だが)
一方、(a, b, c) = (5278.64055, 94721.35941, 99999.99996)の場合は、逆にHeron's Δ' = 0が
正確なのにAccurate Δ = 9.53674324543714が大きく懸け離れた不正確な値になってしまう
重大な欠点がある。これは、Accurate Δの式の根号内の第2因数c - (a - b)が正確には0なのに
3.63797880709171e-12と計算されてしまい、この誤差が他の因数との乗算により増幅されるから。
Heron's Δ'の式の根号内の第4因数s - cは0と計算されるので問題ない。
double向けの入力値(a, b, c) = (31622.77777777662, 0.000000000023, 31622.77777777661)を
作れば、Heron's Δ' = 2.30085990753844e-07, Accurate Δ = 3.20111707955507e-07となり、
相対差は確かに大きくなるが、200ビットで計算したほぼ正確な値3.27490470056059e-07から
見れば両方とも不正確だから、Accurate Δの利点はない。
だから、パソコン等のプログラムでは改良版の式を使う必要がないどころか使うべきではなく、
ヘロンの公式をそのまま使う方が良い。

333:デフォルトの名無しさん
24/04/18 07:16:50.63 8T8m8Yde.net
>(a, b, c) = (5278.64055, 94721.35941, 99999.99996)
>c - (a - b)が正確には0なのに3.63797880709171e-12と計算されてしまい

この例に限らず、たいていの場合a,b,cはdoubleでexactに格納されて無くて
この例では「c - (a - b)が正確には0」なのをチョイスしただけでは?

334:デフォルトの名無しさん
24/04/18 07:30:10.21 PYBA8OB3.net
パソロジカルな三角形をパラメトライズして面積を積分する検証はどう?
数式計算での正確な値
Heronで面積計算した時の数値積分
Accurateで面積計算した時の数値積分
を比べるのがフェアかなぁと

335:デフォルトの名無しさん
24/04/18 07:34:09.77 PYBA8OB3.net
> 200ビットで計算したほぼ正確な値3.27490470056059e-07
この例だけ見るとAccurate Δの方が優れているように見えるので
>>333の様なチェリーピックはどちらの計算式でも出来るので平均的に近似が近い方が精度的に優れているかと

336:デフォルトの名無しさん
24/04/18 22:41:59.70 y7NBfn6/.net
>>333
その通り。そして、(a, b, c) = (10000.1, 10000.2, 20000.3)とすれば、正しい面積は0なのに
Heron's Δ' = 2.69745899635295とAccurate Δ = 1.34872949817647は両方とも大間違いになる。
この場合のようにHeron's Δ'での問題がAccurate Δで改善されないだけでなく、>>333の引用の
場合のようにHeron's Δ'では結果的に問題ないのにAccurate Δでは新たな問題が生じてしまうのは、
参考文献の11ページで述べられた
 An algorithm stood convicted of numerical instability if it could be replaced by
 a new algorithm at least about as fast and accurate as the old for all data,
 and good for all data for which the old algorithm was bad.
 すべてのデータに対して旧アルゴリズムと少なくとも同じくらい高速かつ正確であり、
 かつ旧アルゴリズムが悪くなるすべてのデータに対して良くなる新アルゴリズムによって
 置き換えることができるとしたら、旧アルゴリズムは数値的に不安定と判定される。
という判定条件を満たさないから、Accurate Δは改良版としての適性を欠く。
>>335
その例では有効桁数がHeron's Δ'は0桁、Accurate Δは1桁しかなく、どちらの品質も絶対的に
劣悪で、それらの間の相対的な優劣に大した意味はない。
そもそも針のように異様に細長い三角形が重箱の隅をつつくような話で、普通はそんな場合は
想定しなくても良く、ヘロンの公式で充分。そこを敢えてつつくなら、ヘロンの公式だけでなく
改良式もぼろが出てしまうだけ。

337:デフォルトの名無しさん
24/04/18 22:55:38.47 n9UdHBZN.net
総合すると有効桁じゃなくて精度が2桁良いし実装上は大差ないから改良版を使う、と言う方が自然では?

338:デフォルトの名無しさん
24/05/01 12:56:47.83 nIC3qyB/.net
スレ落ちそうなのであげ

339:デフォルトの名無しさん
24/05/01 15:39:17.16 hqp8cDbc.net
>>338
嵐を呼び込むために・・・

340:デフォルトの名無しさん
24/05/01 22:59:10.72 4hNncNW1.net
何でこんなに過疎化しちゃったのか。前に頻繁に出題していた人がいなくなったのか。

341:デフォルトの名無しさん
24/05/02 10:32:38.87 ijoO2C2L.net
お題を出してみてください

342:デフォルトの名無しさん
24/05/02 16:59:52.63 DPVqLIsI.net
>>340
お題が出尽くしたってことはあるんじゃないか?
過去のお題拾ってきてそれを投稿すればいいぐらいまでスレが成熟してしまったのでは?

343:デフォルトの名無しさん
24/05/02 17:21:22.07 pg1ymc2D.net
PC買って、脱衣AIで遊びまくってる「
一日一回無料で使えるみたい「
スレリンク(gymnastics板:98番)

344:17
24/05/02 18:44:04.16 LxBZq7I4.net
>>342
なるほど。それをやるか。

345:17
24/05/14 05:34:03.62 ou5vbzLn.net
じゃあ10年前のこのお題(URLを書くとNGになるようなので書かない)。
プログラミングのお題スレ Part4
115 :デフォルトの名無しさん:2014/06/21(土) 18:36:45.72 ID:/fMJIWig.net
お題:文字列Aを1回以上繰り返した文字列Bが与えられたとき
文字列Aを求める。ただしAの候補が複数ある場合は最短のものとする。

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -> a
123412312341231234123123412312341231234123 -> 1234123
oxoxoxoxoxoxoxoxxoxoxoxoxoxoxoxoxx -> oxoxoxoxoxoxoxoxx

346:デフォルトの名無しさん
24/05/14 17:27:18.46 AXiunB2g.net
URLリンク(ideone.com)
Z-algorithm を使って O(|B|) で解いてみた

347:
24/05/14 20:59:46.84 xk+62xOP.net
>>345
R
URLリンク(ideone.com)
C
URLリンク(ideone.com)

348:
24/05/23 14:16:50.64 zV267ZMC.net
あれ?どんぐりの都合か?URL書いてあると書けなくなったような?

349:
24/05/23 14:17:56.56 zV267ZMC.net
URLの先頭のhを抜いて書いてみよう。
>>345
Kotlin
こちらは普通に自作したやつ。
URLリンク(paiza.io)
こちらは正規表現使ってとても小さくなったやつ。
URLリンク(paiza.io)

350:デフォルトの名無しさん
24/06/01 10:16:34.91 hzaQXY32.net
お題: コロン区切りの時分秒の時刻が与えられるので時分秒をそれぞれ掛け算した結果を表示せよ
例:
04:05:06
120

351:デフォルトの名無しさん
24/06/01 11:08:12.83 hzaQXY32.net
お題: バイト列が与えられる。先頭から解析した場合にバイトが1だったら次の4バイトを読み込んで整数として出力し、バイトが2だったら次のバイトを0が来るまで読み込んで文字列として出力せよ
入力
1 1 0 0 0 2 65 66 67 0 1 128 0 0 0
出力
1ABC128

352:デフォルトの名無しさん
24/06/01 12:57:50.32 M5I0DyuF.net
知らんがな

353:デフォルトの名無しさん
24/06/01 23:31:08.51 oEZc8FHN.net
>>350
R
URLリンク(ideone.com)

>>351
C (データ識別子は1か2しかないものとし、整数のエンディアンは実行環境依存とする)
URLリンク(ideone.com)

354: 警備員[Lv.19]
24/06/02 04:45:03.04 yi3OE76t.net
>>350
Perl

bash のコマンドラインから入力して実行(ワンライナー)

$ perl -ne 'if(/(\d+):(\d+):(\d+)/){print $1*$2*$3,"\n"}else{print"入力エラー\n"}'
1:2:3
6
3:4:5
60
04:05:06
120
$

355: 警備員[Lv.20]
24/06/02 05:19:02.45 yi3OE76t.net
>>351
Kotlin
URLリンク(paiza.io)

356:デフォルトの名無しさん
24/06/03 13:25:02.42 21u+58W3.net
>>350
Windows のPowershell 上で、Ruby の1-liner を使う
末尾の改行を削除して、: で分割して、
文字列を数値型に変換してから、全ての要素を掛ける。
%Q で、ダブルクォーテーションをエスケープする。つまり、split(":")
echo '01:2:09' | ruby -ne 'puts $_.chomp.split(%Q[:]).map(&:to_i).inject(:*)'
18

357:デフォルトの名無しさん
24/06/03 15:28:01.42 p+D7Hh++.net
>ruby -ne 'p eval($_.gsub(":","*"))'
1:2:9
18

358:デフォルトの名無しさん
24/06/07 06:27:47.87 ZJzD8UbY.net
お題:引数sとnを取りシーザー暗号化を行う関数を作れ
sは平文、nはずらす文字数(負数可)、返り値は暗号化後の文字列
同様の関数で「Hello, World!」を暗号化し復号化せよ

359:デフォルトの名無しさん
24/06/07 09:04:03.36 tQi+9x5m.net
#! ruby

class String
def to_c(n)
if %r|^n|=~n
n=(n.sub(%r|^n|,"").to_i+26)%26
lb=("A".."Z").to_a.join
sb=("a".."z").to_a.join
la=lb[n..25]+lb[0..n-1]
sa=sb[n..25]+sb[0..n-1]
return self.tr(lb,la).tr(sb,sa)
else
return self
end
end
end

p "Hello,World!".to_c("n3") #=>"Khoor,Zruog!"
p "Hello,World!".to_c("n-5") #=>"Czggj,Rjmgy!"
p "Hello,World!".to_c("s") #=>"Hello,World!"
p "Khoor,Zruog!".to_c("n-3") #=>"Hello,World!"
p "Czggj,Rjmgy!".to_c("n5") #=>"Hello,World!"

360:デフォルトの名無しさん
24/06/07 09:04:13.66 tQi+9x5m.net
#! ruby

class String
def to_c(n)
if %r|^n|=~n
n=(n.sub(%r|^n|,"").to_i+26)%26
lb=("A".."Z").to_a.join
sb=("a".."z").to_a.join
la=lb[n..25]+lb[0..n-1]
sa=sb[n..25]+sb[0..n-1]
return self.tr(lb,la).tr(sb,sa)
else
return self
end
end
end

p "Hello,World!".to_c("n3") #=>"Khoor,Zruog!"
p "Hello,World!".to_c("n-5") #=>"Czggj,Rjmgy!"
p "Hello,World!".to_c("s") #=>"Hello,World!"
p "Khoor,Zruog!".to_c("n-3") #=>"Hello,World!"
p "Czggj,Rjmgy!".to_c("n5") #=>"Hello,World!"

361:デフォルトの名無しさん
24/06/07 21:13:26.78 U/DqAKAj.net
>>358
R
URLリンク(ideone.com)

362:デフォルトの名無しさん
24/06/07 23:24:01.54 KUK95Vnh.net
Haskell
範囲外の数値は平文字をそのまま返すこととした。
import Data.Char
cearsar n |(-26) <= n && n <= 26 = map (f n)
where
f x = chr.(+x).ord
cearsar _ = cearsar 0
sample:
ghci> cearsar 50 "Hello, World!"
"Hello, World!"
ghci> cearsar 3 "Hello, World!"
"Khoor/#Zruog$"
ghci> cearsar (-3) "Khoor/#Zruog$"
"Hello, World!"

363:デフォルトの名無しさん
24/06/07 23:28:58.71 KMptjexu.net
TA = [ * ?\x20 .. ?\x7E ]
TS = TA.join
def caesar( s, n ) s.tr( TS, TA.rotate( n ).join ) end
s = "Hello, World!"
p caesar( s, 0 ) #=> "Hello, World!"
p caesar( s, 1 ) #=> "Ifmmp-!Xpsme\""
p caesar( s, -1 ) #=> "Gdkkn+~Vnqkc "
p caesar( s, 20240607 ) #=> "Jgnnq.\"Yqtnf#"
p caesar( caesar( s, 20240607 ), -20240607 ) #=> "Hello, World!"
p caesar( 'HAL9000', 1 ) #=> "IBM:111"

364:9
24/06/11 14:41:10.23 NjINqn/m.net
>>350 Perl5

($x = '04:05:06') =~ s/:/*/g;
print eval $x;

365:9
24/06/13 14:34:57.00 XgNTPGgf.net
>>351
> 「バイトが1だったら次の4バイトを読み込んで整数として出力し、」
正直、意味がわからんかった
例で見ると
1 1 0 0 0 → 1
1 128 0 0 0 → 128
ということだが
1に続く4バイトを加算して出力するって意味だったのかいな

366:デフォルトの名無しさん
24/06/13 14:48:43.48 sldne70j.net
>>365
整数が4バイト型という脳内補完だった

367:デフォルトの名無しさん
24/06/13 14:54:19.57 lNMgjwmg.net
>>365
出題者がエンディアンを知らなくて説明もなくリトル環境を前提にしてしまっている
エンディアンを知っている人たちは出題には書かれてないけど例よりリトル前提だと読み取ってこたえている

368:デフォルトの名無しさん
24/06/13 14:59:03.73 fAZ1qthZ.net
>>367
リトルエンディアンはビットが逆って事じゃ無いぞ
10 00なら
00 10だぞ

369:デフォルトの名無しさん
24/06/13 15:00:51.22 lNMgjwmg.net
>>368
>>365を見てないのか?

370:9
24/06/13 17:03:39.85 XgNTPGgf.net
>>367
ああそういうことか「4バイトを読み込んで整数」と書いてあるのはそういう意味だったのか
ならわかるかも。
オレは4バイト一個一個が整数だと捉えて、それを「4バイトを読み込んで整数」とは何のこっちゃと?になってたわ

371:9
24/06/13 17:07:01.55 XgNTPGgf.net
すまんね68系で育ったもんですぐ連想できなんだ

372:デフォルトの名無しさん
24/06/14 21:10:23.18 H7FTNa+g.net
>>369
例が間違えてるか説明が足りて無い
要は4バイトを読み込んでと説明してるが「一気に4バイト読み込む」とおかしくなる
1バイトずつ順に4バイトを読み込んでという説明なら例が腑に落ちる

373:デフォルトの名無しさん
24/06/14 21:15:46.04 cNkcubsv.net
例を示しての出題だから

374:
24/06/15 16:15:42.96 h/vMPGM+.net
>>358
Kotlin
面倒なのでASCIIコード(0x20-0x7e)でしかシフトしないやつを作った。
まあでも Kotlin は Java 同様に内部でUnicodeで扱っているので平仮名とか漢字とか全然違う言語の文字とかも比較的楽に追加できると思う。
URLリンク(paiza.io)

375:デフォルトの名無しさん
24/06/19 15:22:47.09 xfTENZQh.net
>>350 awk
URLリンク(ideone.com)

376:デフォルトの名無しさん
24/06/20 17:43:48.64 0f6ktMCR.net
お題:迷路生成を様々な言語で
例:
C
URLリンク(ideone.com)

377:デフォルトの名無しさん
24/06/20 20:17:47.11 0f6ktMCR.net
URLリンク(paiza.io)

378:デフォルトの名無しさん
24/06/21 02:17:42.15 wIxdZD1d.net
迷路。やっつけで汚い。乱数自前

C
URLリンク(paiza.io)

Rust
URLリンク(paiza.io)

379:デフォルトの名無しさん
24/06/21 05:01:41.33 wIxdZD1d.net
乱数改良

C
URLリンク(paiza.io)

Rust
URLリンク(paiza.io)

380:デフォルトの名無しさん
24/07/26 09:46:37.73 PcAUXe08.net
お題:配管サイズの「A呼称」「B呼称」の相互変換
URLリンク(www.keyence.co.jp)
などに掲載されている「A呼称」から「B呼称」への変換。及びその逆変換。
「A呼称」は整数値で(8とか)、「B呼称」は実数(0.125とか)または分母を8とする分数の分子(1とか)で表すものとする。
規格に存在しない場合(42Aとか)は考慮しなくてもよい。
表を引くだけなら簡単過ぎるので、ツェラーの公式の様な「技巧的」な解法を求む。

381:デフォルトの名無しさん
24/07/27 06:14:08.30 QMQQaL7S.net
REM 呼称変換.bat
chcp 65001

ruby -x "%~f0"
ruby tmp.rb
goto end

#~
#!ruby
#encoding: utf-8
Encoding.default_external='UTF-8'

require 'base64'

st=<<'EOS'
IyFydWJ5CiNlbmNvZGluZzogdXRmLTgKRW5jb2RpbmcuZGVmYXVsdF9leHRl
cm5hbD0nVVRGLTgnCgpjbGFzcyBPYmplY3QKICBkZWYgdG9fZmwKICAgIHJl
dHVybiBldmFsKHNlbGYuc3BsaXQoIisiKS5tYXB7fGV8CiAgICAgIGUuc3Bs
aXQoIi8iKS5tYXB7fGZ8IGYudG9fZi50b19zfS4KICAgICAgam9pbigiLyIp
fS5qb2luKCIrIikpCiAgZW5kCmVuZAoKY2xhc3MgTnVtZXJpYwogIEBAYT1b
Niw4LDEwLDE1LDIwLDI1LDMyLDQwLDUwLDY1LAogICAgICA4MCw5MCwxMDAs
MTI1LDE1MCwxNzUsMjAwLDIyNV0KICBAQGI9WyIxLzgiLCIxLzQiLCIzLzgi
LCIxLzIiLCIzLzQiLCIxIiwKICAgICAgIjErMS80IiwiMSsxLzIiLCIyIiwi
MisxLzIiLCIzIiwKICAgICAgIjMrMS8yIiwiNCIsIjUiLCI2IiwiNyIsIjgi
LCI5Il0KICBAQGM9QEBiLm1hcHt8ZXwgZS50b19mbH0KICBkZWYgYV90b19i
CiAgICBuPXNlbGYKICAgIGlmIG48MjUwCiAgICAgIGE9NgogICAgICBAQGEu
ZWFjaHt8ZXwgYT1lIGlmIGUvbjw9MS4wfQogICAgICBiPUBAYltAQGEuaW5k
ZXgoYSldCiAgICAgIGM9QEBjW0BAYS5pbmRleChhKV0KICAgICAgcmV0dXJu
ICIoYT0je2F9KSBiPSN7Yn09I3tjfSIKICAgIGVsc2UKICAgICAgYT0obi81
MCkudG9faSo1MAogICAgICBiPWEvMjUKICAgICAgcmV0dXJuICIoYT0je2F9

382:デフォルトの名無しさん
24/07/27 06:15:03.76 QMQQaL7S.net
KSBiPSN7Yn0iCiAgICBlbmQKICBlbmQKICBkZWYgYl90b19hCiAgICBuPXNl
bGYKICAgIGlmIG48MTAKICAgICAgYz0wLjEyNQogICAgICBAQGMuZWFjaHt8
ZXwgYz1lIGlmIGUvbjw9MS4wfQogICAgICBhPUBAYVtAQGMuaW5kZXgoYyld
CiAgICAgIGI9QEBiW0BAYy5pbmRleChjKV0KICAgICAgcmV0dXJuICIoYj0j
e2J9PSN7Y30pIGE9I3thfSIKICAgIGVsc2UKICAgICAgYj1uLnRvX2kKICAg
ICAgYT1iKjI1CiAgICAgIHJldHVybiAiKGI9I3tifSkgYT0je2F9IgogICAg
ZW5kCiAgZW5kCmVuZAoKd2hpbGUgMQogIGFyPVsi77yh5ZG856ew44GL44KJ
77yi5ZG856ewIiwi77yi5ZG856ew44GL44KJ77yh5ZG856ewIiwi57WC5LqG
Il0KICBtc2c9YXIubWFwLndpdGhfaW5kZXh7fGUsaXwiI3tpKzF9OiN7ZX0i
fS5qb2luKCJcbiIpKyJcbiIKICBwcmludCBtc2crImlucHV0IG51bWJlciA+
ICIKICBuPSRzdGRpbi5nZXRzLnRvX2kKICBicmVhayBpZiBuPT0zCiAgbmV4
dCBpZiBuPT0wCiAgd2hpbGUgMQogICAgcHJpbnQgIiN7YXJbbi0xXX06aW5w
dXQgdmFsdWUgPiAiCiAgICBtPSRzdGRpbi5nZXRzLmNob21wCiAgICBicmVh
ayBpZiBtPT0iIgogICAgbT1tLnRvX2ZsCiAgICBwdXRzIG0uYV90b19iIGlm
IG49PTEKICAgIHB1dHMgbS5iX3RvX2EgaWYgbj09MgogIGVuZAplbmQK
EOS

File.write("tmp.rb",Base64.decode64(st))
__END__
:end

383:デフォルトの名無しさん
24/07/30 12:03:21.52 zP/xDheD.net
お題
C言語のトライグラフ(可能ならダイグラフも)と普通のテキストとの相互変換。

ファイルまたは標準入力から読んで変換した結果を標準出力に出力する。
面倒なら文字列変換する関数とそれをテストするメイン関数のみでも良い。

384: 警備員[Lv.8]
24/08/03 07:16:23.70 HS6IEZQf.net
お題
Unicode 文字列を UTF-9 へ変換する。また UTF-9 を Unicode 文字列に変換する。
ただし1バイトが9bitではないコンピュータを使用する場合は9bit以上で扱いやすいbit数の変数(例えば 16bitの変数)を代用して下9bitのみを使用する等しても良い。
UTF-9 の仕様は RFC 4042 を見るか、または下記URLのページを参照。
URLリンク(www.wdic.org)

385: 警備員[Lv.9]
24/08/03 17:38:42.19 HS6IEZQf.net
>>383
Kotlin

Digraph, Trigraph の変換と逆変換

URLリンク(paiza.io)
URLリンク(paiza.io)

Map と正規表現使った簡単な変換なので他の言語で作っても大差ないと思う。

386:デフォルトの名無しさん
24/08/03 20:58:23.65 S2fEkJP0.net
お題
整数の格子がある(伝われ)
任意の2点間を線で結ぶ(座標成分は実数)
格子と交わるところで線を分割せよ
sssp://o.5ch.net/23qe8.png

387:デフォルトの名無しさん
24/08/03 21:19:51.17 VMb0ie+F.net
>>386
jwwの外部変形としてこんな感じで交点で分割させるの作ったことあるけどプログラミングスレののお題としては座標指定もなく漠然としすぎていていかがなものか。ちょっと伝わんなかった。

388:デフォルトの名無しさん
24/08/03 21:36:58.95 dM8NlTKR.net
ごめん、画像から察してほしい
遊びだから曖昧なところは適当で
URLリンク(i.imgur.com)

389:デフォルトの名無しさん
24/08/03 21:50:20.46 VMb0ie+F.net
>>388
二直線の交点は連立方程式を解けば良くて行列を使えば簡単だけど、どういう回答が求められてるのかが分からず途方に暮れております

390:デフォルトの名無しさん
24/08/03 22:08:55.42 /AInVOhB.net
>>388
出直し

391:デフォルトの名無しさん
24/08/03 22:28:33.50 Dl6/uvrz.net
クイズと「プログラミングのお題」との決定的な違い
検証するための入力(問題)と出力(解答)例が明記されているかどうか

392:デフォルトの名無しさん
24/08/03 22:29:35.16 S2fEkJP0.net
テンプレに書いてなかったしいいやって思っちゃった
ここまで伝わらんもんなのか…

393:デフォルトの名無しさん
24/08/03 22:35:56.24 S2fEkJP0.net
具体例を計算するのはめんどくさいけど、例えばさっきの絵で言えば右上が始点で左下が終点なら始点側から順番に座標を出力するとかね

394:デフォルトの名無しさん
24/08/03 22:41:57.69 Dl6/uvrz.net
入力例とその時の出力例を
データとして数種類用意すればOK
例えば>>236とか>>345を参考

395:デフォルトの名無しさん
24/08/03 22:42:49.82 t4RpIT1N.net
>>392
そういうことは伝える努力をしてから言おうな

396:デフォルトの名無しさん
24/08/03 22:44:30.36 S2fEkJP0.net
めんどくさい
そこまでして出そうと思わんから興味ないならスルーで

397:デフォルトの名無しさん
24/08/03 22:52:49.60 /AInVOhB.net
この頭の悪さを見るに学校の課題か何かを丸投げしようとしてるのかな

398:デフォルトの名無しさん
24/08/03 23:04:31.31 Dl6/uvrz.net
入出力例があると仕様が定まってプログラミングのお題が成立する
入出力例がないと宿題を手伝わせようとしているだけの可能性も否定できないね

399:デフォルトの名無しさん
24/08/04 00:49:43.30 iskScWib.net
>>396
ドンマイ、出題の意図は分かった気がするので改めて出題
お題
10mm方眼用紙、左下原点、入力された任意の直線と方眼線との交点を求めよ
(例)始点(3.5,5.2)終点(6.3,8.1)

400:デフォルトの名無しさん
24/08/04 04:51:29.74 9TVMMXOl.net
>>386
nodejs
URLリンク(www.mycompiler.io)

401:デフォルトの名無しさん
24/08/09 23:38:00.57 PnKZlDGe.net
お題:与えられた線分を指定された長さLで分割せよ。ただし最後に余る分は長さLでなくてもよい。
線分([始点,終点])=[[0,0],[100,100]]
L=50

[[[0,0],[50,50]],[[50,50],[100,100]]]

402:
24/08/10 04:24:35.61 C1sXjWXk.net
>>401
その例おかしくない?それか問題がおかしいか。
長さがLということはx=yの線を分割する場合は座標はx, y 共にL/√2倍にならないか?

403:デフォルトの名無しさん
24/08/10 08:05:08.91 cX2Nc5cZ.net
ごめん、ミスった

404:デフォルトの名無しさん
24/08/10 08:07:10.85 cX2Nc5cZ.net
修正
線分([始点,終点])=[[0,0],[120,0]]
L=50

[[[0,0],[50,0]],[[50,0],[100,0]],[[100,0],[120,0]]]

405:デフォルトの名無しさん
24/08/10 08:54:23.54 DYGkQoQe.net
REM 座標計算.bat
chcp 65001
ruby -x "%~f0"
goto end
#~
#!ruby
#encoding: utf-8
Encoding.default_external='UTF-8'
require "matrix"
while 1
print "input start point > " #0,0
p1=$stdin.gets.split(",").map{|e| e.to_f}
print "input end point > " #120,0
p2=$stdin.gets.split(",").map{|e| e.to_f}
print "input length > " #50
l=$stdin.gets.to_f
exit if l<=0
p1[1]=0 unless p1[1]
p2[1]=0 unless p2[1]
v1=Vector.elements(p1)
v2=Vector.elements(p2)
m=(v2-v1).r
n=(m/l).to_i
a=(0..n).map{|e| l*e}
b=a.map{|e| v1+(v2-v1)*(e/(v2-v1).r)}.map{|e| e.to_a}
b<<p2
p b.uniq
end
__END__
:end

406:デフォルトの名無しさん
24/08/20 15:28:18.45 YrWgN0+y.net
お題:今日、または任意の日付から、もういくつ寝るとお正月かを求めよ。(昼寝は除く)

407:デフォルトの名無しさん
24/08/20 18:03:45.73 UEEknM+z.net
>>406 lisp
URLリンク(ideone.com)

408:デフォルトの名無しさん
24/08/21 11:05:18.96 kc5yLFga.net
>>406
徹夜はどうしますか?

409:
24/08/22 08:01:35.77 dwyU9o+h.net
>>406
bash のコマンドラインから expr コマンドと date コマンドを利用して次のようにして計算した。
実際に日数が経過後に1月1日になっているかの確認もした。
$ expr $( date -d '2024/12/31' +%j ) - $( date +%j ) + 1
132
$ date -d 'now +132 days'
2025年 1月 1日 水曜日 07:58:54 JST
$

410:
24/08/22 08:04:39.02 dwyU9o+h.net
>>409 をちょっと改良
今年に限定しないやりかた。
$ expr $( date -d $(date +%Y)'/12/31' +%j ) - $( date +%j ) + 1
132
$

411:デフォルトの名無しさん
24/08/24 01:28:41.99 Ou5o/VfJ.net
ロケール設定なしとかジョークかよ

412:デフォルトの名無しさん
24/08/24 07:25:49.23 /cWP8Umv.net
こまけぇこたぁいいんだよ(AA略)

413:デフォルトの名無しさん
24/08/24 23:36:40.04 /cWP8Umv.net
てかこのお題で私、期間中にヨーロッパから帰国しますんでってな特殊ケースまで折り込めって方が無理に思えるけど、ロケール設定した模範解答をどぞ、

414:デフォルトの名無しさん
24/08/24 23:58:49.15 D7M8BxWI.net
せっかくだから、旧正月も考慮して

415:デフォルトの名無しさん
24/09/01 04:58:12.84 sYmH1KkQ.net
お題:複数の文字列が格納されている配列と配列の添字がある。標準入力からnextが入力されたら文字列を表示し添字を進め、prevが入力されたら文字列を表示して添字を戻す。添字が始点と終点に達したら始点は終点に、終点は始点に移動させる。動作は例に合うように実装せよ。
v = ["aaa","bbb","ccc"]
next
aaa
next
bbb
prev
aaa
next
bbb
next
ccc
next
aaa

416:デフォルトの名無しさん
24/09/01 08:19:39.59 MmIh9kGJ.net
>>415 lua
URLリンク(ideone.com)

417:デフォルトの名無しさん
24/09/01 11:51:46.92 Zfu0bsG/.net
>>415
REM nextprev.bat
ruby -x "%~f0"
exit
#~
#!ruby
#encoding: utf-8
i=0;v=["aaa","bbb","ccc"]
while 1
puts v[i]
print "input next or prev [n/p]> "
a=$stdin.gets.chomp
if ""==a
exit
elsif /^n/=~a
i=i+1
elsif /^p/=~a
i=i-1
end
i=(i+3)%3
end

418:デフォルトの名無しさん
24/09/03 07:13:35.79 1bP400Ev.net
お題
引数aから引数bまでの数列を返す関数がある。この関数を数列にゾロ目が含まれていた場合に空の数列を返すように実装せよ

419:デフォルトの名無しさん
24/09/03 07:56:47.18 Jxau6mSM.net
>>418 lisp
URLリンク(ideone.com)

420:デフォルトの名無しさん
24/09/03 09:22:31.13 HQsZJT0t.net
>>419
windowsを使ってるんですが>>419を実行するにはどのような環境を整えれば良いでしょうか?

421:デフォルトの名無しさん
24/09/03 10:00:07.45 VHciJKZC.net
417ではないが,clispかsbclをインストールすればいいよ.Windowsでもできるし,WSLならさらに簡単にできる

422:デフォルトの名無しさん
24/09/03 10:17:03.41 HQsZJT0t.net
>>421
ありがとうございます
そうするとemacsが使えるようになるのでしょうか?
それともプログラミング言語としてのlisp環境が整うだけでしょうか?

423:デフォルトの名無しさん
24/09/03 13:27:22.48 Jxau6mSM.net
>>420
Windowsは不断使いしていないんで開発環境とかemacsとかはわからないけど、動かすだけなら
URLリンク(www.sbcl.org) からWindows版のSBCLインストーラーを落としてインストール
コマンドプロンプトなどのコマンド行で
sbcl --script ファイル名 とすると「ファイル名」のファイルをスクリプトとして実行します
--script を付けない場合REPLが起動します(Pythonでいうところの対話モード)
これの終了は (quit) と入力してEnterキー

424:デフォルトの名無しさん
24/09/03 13:38:16.60 Jxau6mSM.net
ちょっと試すだけならウェブサービスを使う手も
Common Lispを動かせるオンラインコンパイラーサイト
URLリンク(rextester.com)
URLリンク(www.jdoodle.com)
URLリンク(wandbox.org)
これらはideoneとは異なり "Share" とか "Save" とかをクリックしない限り保存・公開されない(はず)

425:デフォルトの名無しさん
24/09/03 22:13:24.20 HQsZJT0t.net
レス頂いた方、ありがとうございます
とりあえず>>424辺りで試してみます

426:デフォルトの名無しさん
24/09/04 03:34:25.27 k+9kMn3u.net
REM zorome.bat
ruby -x "%~f0"
exit
#~
#!ruby
while 1
print "input a > "
a=$stdin.gets.chomp
exit if a==""
a=a.to_i
print "input b > "
b=$stdin.gets.to_i
ar=(a..b).to_a
z=0
ar.each{|e|
n=e.to_s.gsub(/^-/,"")
m=n.split("").uniq
if n.size>1 && m.size==1
z=1
break
end
}
ar=[] if z==1
p ar
end
__END__
a=0;b=10 => [0,1,2,3,4,5,6,7,8,9,10]
a=0;b=11 => []

427:デフォルトの名無しさん
24/09/04 06:34:37.52 FQ5fjJ2m.net
>>418
fn is_zorome(n: i32) -> bool {
let s = n.abs().to_string();
let b = s.as_bytes();
if b.len() > 1 {
b[1..].iter().all(|&d| d == b[0])
} else {
false
}
}
fn odai(a: i32, b: i32) -> Vec<i32> {
if (a..=b).any(|n| is_zorome(n)) {
vec![]
} else {
(a..=b).collect()
}
}
fn main() {
assert_eq!(odai(1, 10), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
assert_eq!(odai(1, 11), []);
}

428: 警備員[Lv.7]
24/09/29 14:12:38.24 Sdg7KlJR.net
>>418
Kotlin
(URL投稿禁止になってるようなので先頭の https:// は抜きで)。
paiza.io/projects/nPK7U1uDtt4b7O2saECP0A

[入力]タブの方で開始、終了の値を入れている。とりあえず 10 40 を入れてある。
一桁の数を指定した場合は全てゾロ目扱いになるので出力は空のリストになる。

429:デフォルトの名無しさん
24/10/08 17:17:22.09 CS1PHEoT.net
お題:文字列を中央寄せする関数を作れ。
関数は文字列、全体の横幅(整数)、余白を埋める文字、を引数に取る。横幅分の文字列を引数の文字で作成し、その中央に引数の文字列を埋め込み戻り値として返せ。

430:デフォルトの名無しさん
24/10/08 19:52:28.65 Rq2an05y.net
py
text.center

431:
24/10/09 00:07:23.87 O5zCFPJO.net
>>429
文字幅についてはどう考えれば良い?
エンコーディングが UTF-8 や UTF-16 だとバイト数や要素数が画面の表示幅と一致しないわけだが。
一致するような Shift-JIS だったとしても端末のフォント設定次第で表示幅が変わる。

432:デフォルトの名無しさん
24/10/09 00:38:16.24 j8RLE5Fj.net
EUCにも半角2バイト文字なんてあったりする

433:デフォルトの名無しさん
24/10/09 00:56:06.70 LtADXZKH.net
asciiの前提では
全角判定関数は切り分けるべきだし

434:デフォルトの名無しさん
24/10/09 01:18:55.72 4B3K5XUV.net
#ドラクエ3が超好きだったので、お題にしてみる。ただしロト3のファミコン版のドラクエな!w
"こちらの職業は勇者、戦士、空手家、僧侶、柔道家の5人がかりw
勇者から柔道家までの5人の攻撃回数が異なります。"まずは変数と確率の問題。
勇者=you戦士=sen,空手家=kara,僧侶=sou
まず勇者は1~2回攻撃、戦士は1~3回攻撃、空手は2~3回攻撃、柔道は足払いで相手を20%で麻痺させることができる。(1ターン何もできない)10%では超麻痺。(2ターン何も敵は動かない)
5%でクリティカルヒットの足払いで3ターン敵は何もできない。
柔道は敵に攻撃を加えられない分、足払いで相手を痙攣させる。
(勇者の1回分の攻撃は100〜200、20%の確率でクリティカルヒットの攻撃になることがある。
(戦士の攻撃は200〜300、20%の確率で攻撃がクリティカルヒット1回になることがある。
(空手家)空手家の攻撃は350〜500、ただし20%の確率で攻撃がクリティカルヒットとなるときがある。youはぞろ目(111とか222とか999まで)の場合はロトの剣を取得する。
攻撃回数無限で全てクリティカルヒットになります。
クリティカルヒットは攻撃力X2です。さてプログラムをやっていくか。"
*ただし、ロトの剣は勇者しか使えない。
”まずギルガメッシュっていう名前のenemy
ラスボスの名前はenemyとする。ボスのHPは5万。
ボスは基本的に何もしません、できません。これやるとさすがに面倒なのでw
基本的にボスは攻撃しません。(面倒だからw)
一方的になかまあつめてボコすw”
*ロトの剣で攻撃したら攻撃力が1.5倍あがります。*
**癒しの穂。食べたら防御力と賢さがあがります**
ロトの剣の出現条件は3並びで一つ食べることができます。
例えば111攻撃とか222攻撃とか333攻撃とか〜999まで。
次の発言からコードを書いていく。
ニーズあるか?

435:デフォルトの名無しさん
24/10/09 01:22:59.53 YvVjSPhZ.net
プログラミングする以前に読むのが面倒くさい

436:デフォルトの名無しさん
24/10/09 01:43:57.73 4B3K5XUV.net
しまった。初期化してなかったなw変数のところ。
あとsouの回復もホイミ、ベホイミ、ベホマラーの3種類だけ。
その3種類がぞろ目の時(111,222など)
そしたらベホマズンを使える。ほぼ運ゲーですw
人修羅みたいに取り巻きがいます。それはバラモスエビルと神龍です。
ある一定時期を過ぎると取り巻きが一斉にHPを連続してあげまくるので
取り巻き先に倒さないと厳しいです。取り巻き=tori種類1の取り巻き=tori0
種類2の取り巻き=tori1 5人だとなかなか倒せないから6人目の魔法剣士=maken
だれか
これをいれよう。
さてif文を完成させよう!if zoma =1
print("ゾーマが現れた”)
import random
random.random()x = random.uniform(0.1,0.9)
print(x)
if x >202 :
print( 'enemyに' +200のダメージを与えた)
elif x > 0.5 :
print( 'enemyに100+のダメージを与えた' )
elif x > 0.2 :
print( '相手が躱した' )
else :
print( "まだゾーマは死んでません")
つかれたーw
もっと簡単なやつにしまーすw

437:デフォルトの名無しさん
24/10/09 01:45:35.37 YvVjSPhZ.net
頑張って読んだけどこのままでは多分スレチ、ずっと条件を簡単にして出題し直してみる。

お題
勇者(HP1000)対魔王(HP5000)、先鋒勇者、サイコロ(目は1から6)を振って出た目だけ相手にダメージを与えられ、交互に攻撃しHP0となったら負け。魔王のサイコロは1個だけど勇者のサイコロはN個(N=1~10)の時の勇者の勝率を求めよ。

438:デフォルトの名無しさん
24/10/09 02:10:34.29 4B3K5XUV.net
# RPGの攻撃状況を再現
# モンスターと戦っている。
# 1から10のサイコロをふって、
# 6未満の場合、サイコロの目だけダメージを与えたと表示。
# 6以上の場合、クリティカルヒットとして、100のダメージを与えたと表示。
# 0の場合、防御されたとして、0ダメージを表示。
import random
hit = random.randint(0,10)
if 1 <= hit < 6:
print("スライムに、" + str(hit) + "のダメージを与えた!")
elif hit >= 6:
print("クリティカルヒットダメージ100を与えた")
else:
print("ダメージは、" + str(hit) + "防御された")
#楽しすぎだなwこれはw


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch