プログラミングのお題スレ Part21

レス数が900を超えています。1000を超えると表示できなくなるよ。
2022/11/13(日) 19:00:36.84ID:ZCYlhUwL
プログラミングのお題スレです。

【出題と回答例】
1 名前:デフォルトの名無しさん
  お題:お題本文

2 名前:デフォルトの名無しさん
  >>1 使用言語
  回答本文
  結果がある場合はそれも

【ソースコードが長くなったら】 (オンラインでコードを実行できる)
https://ideone.com/
http://codepad.org/
http://compileonline.com/
http://rextester.com/runcode
https://runnable.com/
https://code.hackerearth.com/
http://melpon.org/wandbox
https://paiza.io/

宿題は宿題スレがあるのでそちらへ。

※前スレ
プログラミングのお題スレ Part20
https://mevius.5ch.net/test/read.cgi/tech/1624028577/
803デフォルトの名無しさん
垢版 |
2023/06/16(金) 22:11:45.10ID:2udbfubS
>>798
大体わかっているみたいだけど少し丁寧に書いてみる
素数次数の係数が 1 でそれ以外の係数が 0 の形式的冪級数 f を考える
f^3 の k 次の項の係数は 素数 3 個を選んで足した和が k になる場合の数になるので今回は k = 1234567 の係数を求めたい
長さ N の多項式の積は高速フーリエ変換による畳み込みで O(N log N) で計算できるので形式的冪級数を前から必要なだけとって多項式にして適用する
また取りうる値が大きくて誤差が問題になるときは数論変換と中国剰余定理で復元する方法もあるけど今回は不要
3乗している対象は配列の各項なのでそこはボトルネックにはならない
2023/06/16(金) 22:23:18.66ID:sH9/3LIG
うん、やっとわかった
fftの計算への応用つて真っ先に整数そのものの掛け算が思いついてしまうけど、別に整数そのものの掛け算でなくてもいいわけだ
完全に目からウロコ
2023/06/16(金) 23:47:11.07ID:xSzkTILM
>>795

とりあえずHaskell
10000項くらいまではちゃんと動くよう
Haskellの整数型は一応規格上の制限はないみたいだけど多分GHCには流石に制限あるだらうから何項まで動くか不明
2023/06/17(土) 06:25:35.36ID:1fuSaXml
>>775
Rust + termion
https://gist.github.com/rust-play/aaa7a8eb1831e14b947f486986211461
807デフォルトの名無しさん
垢版 |
2023/06/17(土) 15:32:59.09ID:2LgWs1Ta
お題

15時間20分を15.2と表記するとして
15.2+2.4=18.0時間って計算させるにはどうやればいいの?
2023/06/17(土) 22:31:22.41ID:6cwG2na1
整数部分と小数部分に分ける
小数部分は2桁とみなす
60進数の小数点数として扱う
809デフォルトの名無しさん
垢版 |
2023/06/17(土) 23:26:07.50ID:AP5jnZhM
>>807
Rだと自作のクラスでなくても演算子を再定義できてしまうから、そういう奇妙な表記の
数式での計算も可能。
www.ideone.com/xzSCyt
2023/06/18(日) 22:57:19.74ID:kNhEMEAG
>>807 octave
https://ideone.com/S0EqvY
function c = f(a, b)
m = (fix(a) + fix(b)) * 60 + round((a - fix(a) + b - fix(b)) * 100);
c = fix(m / 60) + rem(m, 60) / 100;
end
2023/06/20(火) 15:17:12.61ID:AKiKNbfi
お題 Fourier 変換

長さが2べきの複素数の列が与えられます
(複素数はDouble型2つのタプルで表現するとする)
そのFourier変換である同じ長さの列を計算する関数を実現して下さい
またそれを利用して同じ長さの畳み込み積を計算する関数を実現して下さい

(但し書き)
長さNの数列(aₙ)のFourier変換F(aₙ)とは第k項が
Σ[n=0,N-1] (cos(2πkn/N) + isin(2πkn/N))aₙ
である列を与える変換とする
その逆変換F⁻¹(aₙ)は第k項が
1/NΣ[n=0,N-1] (cos(-2πkn/N) + isin(-2πkn/N))aₙ
で与えられる変換である
数列(aₙ)と(bₙ)の畳み込み積とは
F⁻¹( F(aₙ) × F(bₙ) )
で与えられる積である、ただしこの×は各項毎の積で与えられる列である
2023/06/20(火) 15:17:18.47ID:AKiKNbfi
(例)
・F (a,b,c,d) = (a+b+c+d, a+bi-c-di,a-b+c-d,a-bi-c+di)
・F(1,2,3,0,0,0,0,0) =
6.0 :+ 0.0
2.4142135623730954 :+ 4.414213562373095
(-1.9999999999999996) :+ 2.0
(-0.4142135623730949) :+ (-1.5857864376269046)
2.0 :+ 0.0
(-0.4142135623730949) :+ 1.585786437626905
(-2.0000000000000004) :+ (-2.0)
2.4142135623730945 :+ (-4.414213562373096)
・1,2,3,0,0,0,0,0と4,5,6,0,0,0,0,0の畳み込み積
=
3.999999999999999 :+ 2.6645352591003757e-15
12.999999999999998 :+ (-1.6730659520119792e-15)
28.0 :+ (-5.773159728050814e-15)
27.0 :+ (-5.432361405589022e-15)
18.0 :+ (-8.881784197001252e-16)
1.7763568394002505e-15 :+ 3.656004566188772e-15
1.7763568394002505e-15 :+ 3.9968028886505635e-15
0.0 :+ 3.4494227914122297e-15
2023/06/20(火) 15:59:11.28ID:1adBi336
お題(難易度★)

a=1のとき、b=1000000
a=2のとき、b=999999
a=3のとき、b=999998

上記の法則を元に、aがnのときのbの値を求めなさい
2023/06/20(火) 23:32:28.84ID:UkUQRL6u
>>813 py

import numpy as np
from scipy.optimize import least_squares

data = np.array([
1000000,
999999,
999998,
999997,
])

def poly_2d(x, a, b, c, d, e, f):
return a * x**5 + b * x**4 + c * x ** 3 + d * x ** 2 + e * x + f

def residuals(params, data):
a, b, c, d, e, f = params
res = []
for x in range(1, len(data) + 1):
res.append(data[x - 1] - poly_2d(x, a, b, c, d, e, f))
return res

initial_guess = [1, 1, 1, 1, 1, 1]
result = least_squares(residuals, initial_guess, args=(data,))
a, b, c, d, e, f = result.x

print(f"fn = lambda x: {a:.6f}*x**5 + {b:.6f}*x**4 + {c:.6f}*x**3 + {d:.6f}*x**2 + {e:.6f}*x + {f:.6f}")


fn = lambda x: round(a*x**5 + b*x**4 + c*x**3 + d*x**2 + e*x + f)


print(fn(1))
print(fn(2))
print(fn(3))
print(fn(4))


fn = lambda x: -9433.011975*x**5 + 81785.062791*x**4 + -204704.849008*x**3 + 32573.601042*x**2 + 400859.570602*x + 698919.625800

1000000
999999
999998
999997
2023/06/20(火) 23:56:19.99ID:Mo20HwBH
>>813 octave
https://ideone.com/7v5QU9
f = @(n) polyval(polyfit([1 2 3], [1000000 999999 999998], 1), n);
2023/06/21(水) 00:19:23.72ID:ay5yB12X
なんて短いんだすげえ
817638
垢版 |
2023/06/21(水) 07:20:53.86ID:oE07EYTe
>>805
Haskellのオジチャンは 一体どこに回答を書いたんだろう…
2023/06/21(水) 09:26:22.30ID:p7Lpt5pu
Haskell爺さんはリンクを書き忘れましたとさ
メデタシメデタシorz

https://ideone.com/TTY3nD
2023/06/21(水) 20:25:12.09ID:FNuxfRD0
お題: 入力を(x, minv, maxv)の3整数とする。xを閉区間[minv, maxv]に制限した値を返すプログラム(ただしminv≦maxv)。

例)
(1, 3, 5)→3.
(100, 5, 120)→100.
(208, 5, 120)→120.
2023/06/21(水) 21:30:09.94ID:iBv5iJxF
>>819 octave
https://ideone.com/gn1GYh
f = @(x, minv, maxv) min(max(minv, x), maxv);
2023/06/21(水) 21:34:57.73ID:FNuxfRD0
お題: 2次元ソート。

与えられた比較関数Compare2Dを用いて2次元のデータを並べ替える。

typedef int DATA;
int Compare2D(DATA left, DATA above, DATA target);
左端でも上端でもない、ターゲットのデータについて
引数leftは一つ左のデータ、
引数aboveは一つ上のデータ、
引数targetはターゲットのデータとする。
比較関数の戻り値は、比較結果が小さいとき-1に、同じとき0に、大きいとき1になる。

比較関数Compare2Dとソートアルゴリズムを適当に定め、アスキーコードの一部(0x20~0x5f)、つまり、アスキー表の一部を乱数で撹乱した二次元データをソートしたときに、
アスキー表の一部を表す長方形状になるようにし、ソート前の撹乱後の二次元データと、ソート後の二次元データを自然にわかりやすく出力するプログラムを作れ。
2023/06/21(水) 21:38:27.11ID:FNuxfRD0
>>821
修正。比較関数は次の2つとする。

int CompareX(DATA left, DATA target);
int CompareY(DATA above, DATA target);
2023/06/21(水) 22:25:34.39ID:FNuxfRD0
>>822
お題を撤回します。熟慮が足りない。。。
824デフォルトの名無しさん
垢版 |
2023/06/21(水) 23:17:43.90ID:4mNklWjb
>>819
PowerShell 6以上なら[Math]::Clampを、C++ 2017以上なら#include <algorithm>で
clampを呼び出すだけだな。
2023/06/22(木) 04:06:08.77ID:kP7EKeZ8
お題:数学的な処理を使って東京タワーっぽいアスキーアートを出力せよ
アスキーアートのクオリティは問わない
2023/06/22(木) 10:33:46.03ID:kNfUaD9C
おじいちゃんスカイツリーでも良いですか?
2023/06/22(木) 17:08:30.10ID:4hSYT0iP
いいよ
828デフォルトの名無しさん
垢版 |
2023/06/22(木) 21:46:09.75ID:k1X9Be1P
>>811-812
Rでfft関数を使わずに式通りの低速変換。畳み込み積は普通に求めた値を左に併記した。
www.ideone.com/pUV71G
829638
垢版 |
2023/06/23(金) 00:36:01.83ID:+Wf7JNOC
>>811-812 Perl5、若いころ物理数学で勉強した記憶を呼び戻しながら、LibraryやComplex型を使用せず、また複素数をタプルで表して愚直に実装してみた。
長さが2のべき乗とのことだがバタフライ演算による計算量の低減は実装していない。なお10^-15乗などの微小な数値の仮数部がお手本解と異なるところがあるが計算誤差によるもので実質0だと思う。
(やっぱ記号を使った数式よりも物理的な意味やイメージと対応付けて捉える方が俺にとってはしっくりくるわ)

use utf8;
use constant PI => 3.141592653589793;
use feature qw{signatures say};

sub 基底($波数, $N) { [map{[cos(2*PI*$波数*$_/$N), sin((2*PI*$波数*$_/$N))]} 0..$N-1] }
sub 複素数の積($a, $b) { [$$a[0]*$$b[0] - $$a[1]*$$b[1], $$a[0]*$$b[1] + $$a[1]*$$b[0]] }

use List::Util 'reduce';
sub 積和相関($x, $e) { reduce{[$$a[0]+$$b[0], $$a[1]+$$b[1]]} map{複素数の積 $$x[$_], $$e[$_]} 0..$#$e }

sub FT(@s) { map{ 積和相関(\@s, 基底($_, scalar @s)) } 0..$#s }
sub iFT(@s) { my $n = @s; map{[$$_[0]/$n, $$_[1]/$n]} map{ 積和相関(\@s, 基底(-$_, $n)) } 0..$n-1 }

sub CV($a, $b) { my @c = FT(@$a); my @d = FT(@$b); iFT( map{複素数の積 $c[$_], $d[$_]} 0..$#c ) }

sub prti { join(', ', map{"$$_[0]". (0 <= $$_[1] and '+') ."$$_[1]i"} @_) }

my @a = ([1, 0], [2, 0], [3, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]);
my @b = ([4, 0], [5, 0], [6, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]);

say 'FT: ', prti FT(@a);
say 'CV: ', prti CV(\@a, \@b);


実行結果
$ perl 21_811_FT_CV.pl
FT: 6+0i, 2.41421356237309+4.41421356237309i, -2+2i, -0.414213562373095-1.5857864376269i, 2-4.89858719658941e-16i, -0.414213562373094+1.58578643762691i, -2-2i, 2.41421356237309-4.4142135623731i
CV: 4+2.66453525910038e-15i, 13+1.77635683940025e-15i, 28+8.88178419700125e-16i, 27-5.77315972805081e-15i, 18-1.77635683940025e-15i, -6.21724893790088e-15-7.99360577730113e-15i, 8.88178419700125e-15+7.105427357601e-15i, 1.24344978758018e-14-2.8421709430404e-14i
2023/06/23(金) 12:40:23.36ID:13UCTwmm
お題(難易度★★)

0, 1, 2, 3, 6, 11, 20, 37 ...

上記の数列の法則を元に、n番目の整数aを求めるプログラムを作成せよ

【条件】
3 <= n <= 1000

【例】
n=6なら、a=11となる
n=9なら、a=68となる
831デフォルトの名無しさん
垢版 |
2023/06/23(金) 13:24:19.71ID:dK7C3R5x
どういう法則なの?
2023/06/23(金) 13:33:04.37ID:4S/+5n0L
前3つ足すかな
833デフォルトの名無しさん
垢版 |
2023/06/23(金) 13:39:27.23ID:dK7C3R5x
なるほど
2023/06/23(金) 14:36:35.46ID:3/mQWA5G
constexpr int foo(int n){
constexpr int t[] = {1, 0, 1, 2, 3, 6, 11, 20, 37, 68};
return t[n % std::size(t)];
}

これでOK
ルールを推測させる系は出題側の意図した答えを出させるためにどう制限かけるかが問われる
835デフォルトの名無しさん
垢版 |
2023/06/23(金) 15:48:43.65ID:dK7C3R5x
アスペル回答やめなよみっともない
836デフォルトの名無しさん
垢版 |
2023/06/23(金) 15:49:02.54ID:dK7C3R5x
> これでOK
何いってんだお前
837デフォルトの名無しさん
垢版 |
2023/06/23(金) 15:49:31.53ID:dK7C3R5x
あーあ、お前が潜水艦に乗って爆縮されたら良かったのにな~
2023/06/23(金) 16:23:56.10ID:lCxAQSJF
潜水艦の操縦がゲームコントローラとかワクワク感たまらねぇ
マジレスするとRustで造ってれば安全だったはず
2023/06/23(金) 20:31:23.73ID:jsz8JGh5
>>830 ruby
https://ideone.com/lOvKLI
g = ->(m) {
a = (3...m).inject([0, 1, 2]) {|a, _| a << a[-1] + a[-2] + a[-3]}
->(n) {n < 1 || m < n ? nil : a[n - 1]}
}
f = g.(1000)
p [*0..9, 1000, 1001].map {|i| [i, f.(i)]}

[[0, nil], [1, 0], [2, 1], [3, 2], [4, 3], [5, 6], [6, 11], [7, 20], [8, 37], [9, 68], [1000, 1258890285439289522674621215321790399357402658069918084564035590888323288383996894058630489346490443306057821146808944309219589954636534445475146599057985479816395429617207869586544429749851128733512216004490332659216184693670760709292866744282443549293609850952277], [1001, nil]]
840デフォルトの名無しさん
垢版 |
2023/06/23(金) 20:38:59.27ID:ss2MRWW+
>>830
Rでnが大きい場合にも高速に計算(例のnでは意味がないが)
www.ideone.com/FrR91K

C#でHaskell風の遅延評価による無限数列生成
www.ideone.com/ZZhdwh

初期値が一般的な値と異なってもトリボナッチ数列と呼んで良いようなので関数名はそうした。
2023/06/23(金) 20:54:20.93ID:XMi0kQuB
>>830
Haskell
https://ideone.com/WJrH5y
842638
垢版 |
2023/06/24(土) 00:18:48.24ID:2bg5q6qP
>>830 Perl5

use feature qw{signatures say}; no warnings 'experimental';
use bigint;
sub g($n, @a) {
 push(@a, $a[-3]+$a[-2]+$a[-1]) while @a < $n;
 $a[-1];
}
say g($_, (0, 1, 2)) for 6, 9, 1000;


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


実行結果(CPU: Core-i7 8559u)
$ time perl 21_830.pl
11
68
1258890285439289522674621215321790399357402658069918084564035590888323288383996894058630489346490443306057821146808944309219589954636534445475146599057985479816395429617207869586544429749851128733512216004490332659216184693670760709292866744282443549293609850952277

real 0m0.143s
user 0m0.061s
sys 0m0.062s
2023/06/24(土) 12:05:15.03ID:InxA93a4
この問題10年前ぐらいで外資系のスキルテストで見たことあるな
844デフォルトの名無しさん
垢版 |
2023/06/24(土) 14:57:48.91ID:hvZZJK0e
>>830
Java
https://paiza.io/projects/JYTlI5W0BPVSc-JPPoE2qg
845デフォルトの名無しさん
垢版 |
2023/06/24(土) 15:15:39.01ID:hvZZJK0e
>>819
Java
https://paiza.io/projects/uykeDMT928Po7gCaDq_q9g
2023/06/24(土) 15:31:35.78ID:UXKekmZD
>>830 ocaml
https://ideone.com/F63V9S
847デフォルトの名無しさん
垢版 |
2023/06/24(土) 19:11:36.41ID:hvZZJK0e
>>807
Java
https://paiza.io/projects/yOQuLSMbxK4zja1xQGnahw?language=java
2023/06/27(火) 07:02:47.02ID:vEx8Tsrp
この手の代数系のn乗計算に持ち込めるタイプは

a^(2n) = (a^n) × (a^n)
a^(2n+1) = (a^n) × (a^n) × a

を利用する実装ができてるかがミソやな
2023/06/27(火) 17:20:06.80ID:nTtoyom2
>>738
C
https://ideone.com/JGH96u

まぁスーパー亀レスなんだけど普段はHaskellerなのでなんとかHaskellで完走できないかとアレやコレやと考えてみたんだけどダメだったorz
多分競プロに出るようなスーパーHaskellerならなんとかなるのかもしれないけど諦めた、試合終了
しかしせっかく色々考えたので備忘録がわりにCに移植
やっぱりCはえー、Haskellだと1分近くかかる計算が0.5秒とか
使ったのは有限体上のFourier変換

p = 1272446977、buffer size = 524288

で計算、buffer sizeを稼ぐためにBuffer sizeが2べきでなくても使えるように組んだんだけどCならそんなもんこだわらなくても余裕の完走なので結局2^19で利用
逆フーリエ変換も不要だと後で分かったけどせっかく作ったので残してあります
850デフォルトの名無しさん
垢版 |
2023/06/28(水) 02:38:39.77ID:BKNectP5
>>819
Kotlin

Kotlin には coerceIn() というずばりそれをするための拡張関数があったのでそれを使った。
ついでに入力で負の値も受け付けるようにした。

https://paiza.io/projects/kOpfBfJtefVllIjHTVVX1g
2023/06/28(水) 10:19:23.37ID:tyOdgkaM
お題(初級)

a+b=cの式において、cが5で割り切れるためのaとbの組み合わせは何通りあるか

条件
1 <= c <= 10000000
2023/06/28(水) 10:27:52.05ID:rc9mzp3b
>>851
無限
2023/06/28(水) 16:02:12.58ID:y3h++4DU
無限なわけ無いだろと思ったけどa, bが自然数とは指定されてないからなぁ
2023/06/28(水) 17:05:55.94ID:ome4PLJ4
お題:配膳ロボット。
あるレストランでは1台の配膳ロボットが活躍している。
配膳ロボットの仕事は、キッチンまで料理を取りに行き、
シェフに料理をもらい、料理をお客様まで持っていくことだ。

フロア図(上が北):
#######
#____C#
####_##
#K_#__#
##___R#
#######

#:カベ。K:キッチン。R:ロボット。C:お客様。_:空きスペース。

ロボットには次のようなコマンドが定義されている:
 コマンド0:1つ待つ(料理を載せるのに必要な待ち時間)。
 コマンド1:西に1つ移動。
 コマンド2:東に1つ移動。
 コマンド3:北に1つ移動。
 コマンド4:南に1つ移動。

入力の盤面からロボットの仕事を完了するコマンドリストを生成せよ。

生成例)(1, 1, 1, 3, 1, 0, 2, 4, 2, 2, 3, 3, 3, 2, 0).
855デフォルトの名無しさん
垢版 |
2023/06/28(水) 22:25:22.22ID:72JUC/Ak
>>854
R
www.ideone.com/TmKZmx
2023/06/29(木) 21:40:36.19ID:o6Q7Yv9N
>>855はもう少しすっきり書けた。
www.ideone.com/A4TRQe
2023/06/29(木) 22:07:55.18ID:3I5v6/ED
>>856
フロア図を変えても動くかな?
解法を少し解説お願いします。
858デフォルトの名無しさん
垢版 |
2023/06/29(木) 22:55:32.18ID:o6Q7Yv9N
>>857
フロア図を変えた場合の実行例
www.ideone.com/vFtBf4

出発位置から目的位置まで複数の経路がある場合は最短経路が選択されるようになっている。

解法は単純で、行列Aの途中経過表示を見れば分かるように、出発位置fromからi + 1個の
コマンドで行ける位置にi + 1と印をつける操作を、i = 1, 2, 3, , ...について順々に、
目的位置toに到達するまで繰り返すだけ。
2023/06/30(金) 13:09:46.14ID:EKSFeYG5
お題:点と長方形の当たり判定。

「x0≦px<x1かつy0≦py<y1」のときtrueを返し、その他のときfalseを返す
関数PtInRect(px, py, x0, y0, x1, y1)を作成せよ。

例)
PtInRect(1, 2, 2, 2, 4, 3)→false.
PtInRect(3, 2, 2, 2, 4, 3)→true.
PtInRect(3, 3, 2, 2, 4, 3)→false.
PtInRect(4, 4, 3, 2, 5, 5)→true.
PtInRect(5, 4, 3, 2, 5, 5)→false.
860デフォルトの名無しさん
垢版 |
2023/06/30(金) 17:51:07.93ID:qvUbtEeq
>>859
Kotlin script

fun PtInRect(px: Int, py: Int, x0: Int, y0: Int, x1: Int, y1: Int) = x0 <= px && px < x1 && y0 <= py && py < y1
2023/06/30(金) 20:29:55.07ID:EKSFeYG5
お題: テキストキャンバス、再び。

ヨコ20文字×タテ5文字の長方形の半角空白のテキストキャンバスがある。
(1) キャンバスの(x, y)の位置に半角文字chを書き込む関数SetPixelV(x, y, ch)を作成せよ。
(2) SetPixelVを使ってx0≦x≦x1かつy0≦y≦y1を満たす長方形領域(x, y)を半角文字chで塗りつぶす関数FillRect(x0, y0, x1, y1, ch)を作成せよ。
(3) テキストキャンバスを表示する関数PrintCanvas()を作成せよ。
(4) 次の処理を実行せよ。

FillRect(3, 0, 7, 4, '#');
SetPixelV(3, 0, ' ');
SetPixelV(3, 4, ' ');
SetPixelV(7, 4, ' ');
SetPixelV(7, 0, ' ');
FillRect(4, 1, 6, 3, ' ');
FillRect(11, 0, 11, 4, '#');
SetPixelV(12, 2, '#');
SetPixelV(13, 1, '#');
SetPixelV(14, 0, '#');
SetPixelV(13, 3, '#');
SetPixelV(14, 4, '#');
PrintCanvas();
862デフォルトの名無しさん
垢版 |
2023/06/30(金) 21:04:09.04ID:LXyG/dm2
>>861
R 関数の引数には正しい値が与えられるものとし、エラーチェックは省略
www.ideone.com/lb8qym
863デフォルトの名無しさん
垢版 |
2023/07/01(土) 09:06:02.22ID:J+nsogj/
>>861
Kotlin

折角なのでそれ用のクラスを作った。

https://paiza.io/projects/IG4aL3pei3zdZ1b3br2H9g
2023/07/01(土) 10:26:18.84ID:6ckc7dLG
お題: レーザーでカラスを撃退。

右手系の三次元空間に強力なレーザー光を放射できるレーザー砲塔(ほうとう)が原点(0, 0, 0)にある。この砲塔は最初はx軸方向を向いている。
砲塔では以下のコマンドが利用可能だ。

- Turn(Pan, Tilt): 砲塔を水平方向にPanラジアン右向きに自転し、垂直方向にTiltラジアン上向きに自転するコマンド。PanとTiltの値は負でもよい。
- Fire(): 現在の向きにレーザーを放射するコマンド。

カラスの位置(x, y, z)が入力されたら、そのカラスを撃退するコマンドリストを生成せよ。
砲塔の向きはその都度、記憶するものとする。
角度を求めるのにatan2関数を使ってもよい。各数値は小数点以下2桁まで表示せよ。
例) (1, 0, 0)→(Fire()).
(0, 0, 2)→(Turn(π/2, 0), Fire()).
(0, 3, 0)→(Turn(0, π/2), Fire()).
(1, 2, 1)→???
※ カラスは鳥獣保護法で保護対象です。
865デフォルトの名無しさん
垢版 |
2023/07/01(土) 10:57:07.14ID:LlqqD8Ud
光子に質量は無いんだっけ
866デフォルトの名無しさん
垢版 |
2023/07/01(土) 11:02:27.57ID:LlqqD8Ud
Turn(Pan, Tilt) は何回使っても良いのかな?
それとも 2回以上使うときは Turn(Pan, Tilt) と Turn(Pan, Tilt) の積を計算した上で
1回にまとめるべき?
2023/07/01(土) 11:05:28.08ID:6ckc7dLG
>>863
キャラコードゼロになってるよ。
2023/07/01(土) 11:06:23.46ID:6ckc7dLG
>>866
まとめた方が早いだろ。
2023/07/01(土) 13:53:06.23ID:2N653o6Y
大学でちゃんと講義受けてたのかどうか知らんけど

各数値は小数点以下2桁まで表示せよ。

もうこう言う言い回しをするのはやめた方がいい
870デフォルトの名無しさん
垢版 |
2023/07/01(土) 16:42:08.76ID:J+nsogj/
>>867
初期化ミスってた。こっそり直しておいた。
871デフォルトの名無しさん
垢版 |
2023/07/01(土) 20:22:54.21ID:OW14MEis
>>864
例は
(1, 0, 0)→(Fire()).
(0, 0, 2)→(Turn(0, π/2), Fire()).
(0, 3, 0)→(Turn(0, -π/2), Fire()).
(1, 2, 1)→???
じゃないの?

だとしてR
www.ideone.com/ddFJ7j
2023/07/01(土) 20:51:13.02ID:6ckc7dLG
>>871
ごめんごめん、正しくは右手系でz軸が上向き。訂正。

(1, 0, 0)→(Fire()).
(0, 0, 2)→(Turn(0, π/2), Fire()).
(0, 3, 0)→(Turn(-π/2, -π/2), Fire()).

砲塔の向きを記憶すると書いてある。また(0, 3, 0)でy軸方向を向くのにPanが必要だから、こうだろう。すみません。
873デフォルトの名無しさん
垢版 |
2023/07/01(土) 21:05:37.20ID:OW14MEis
>>872
(0, 0, 2)つまり真上から(0, 3, 0)つまり水平真北へ向きを変えるには、水平方向回転は不要で
下向き90度の垂直方向回転だけでできるんじゃないの?

もしそうでなく>>872のように水平回転も必要という仕様なら、>>871の6行目を
  Pan <- c(0, -diff(atan2(P[, 2], P[, 1])))
に変えれば良い。
2023/07/01(土) 21:13:00.67ID:6ckc7dLG
>>873
うん、水平回転も必要。真上を向いていると垂直方向の意味がわからないからね。
2023/07/02(日) 17:45:16.73ID:bkSdQ5Ko
お題:半角スペースで区切られた単語が並ぶ文字列がある
この文字列を単語に分割してソートして配列にして返す関数を実装せよ
2023/07/02(日) 18:54:51.40ID:Tqn0qozx
>> 875
Haskell
https://ideone.com/7CWlDd
877デフォルトの名無しさん
垢版 |
2023/07/02(日) 20:55:09.72ID:SNPDeW60
>>875
PowerShell

function ExtractAndSortWords($s) {[RegEx]::Matches($s, "\w+") |% {$_.value} | sort}

ExtractAndSortWords "The quick brown fox jumped over the lazy dog." |% {$_}

[実行結果]
brown
dog
fox
jumped
lazy
over
quick
The
the
878638
垢版 |
2023/07/03(月) 00:25:45.25ID:HgLiPfoF
>>875 Perl5、出現した単語の重複を許容するか、あるいはuniqにするか明確でないけど、下記は許容する方法

sub f { sort shift =~ /(\w+)/g }


実行結果
https://ideone.com/FjaIX7
2023/07/03(月) 14:52:44.63ID:JGR8BE7g
お題:放物運動の飛距離。

重量5[kg]の物体が、入力として与えられた仰角[deg]と初速[m/s]で発射され、自由落下する。
空気抵抗は、速度に比例する大きさの力とする。地平は平面と見なす。
時刻t[s]に対してdt=0.1[s]とし、台形求積法を使用するものとする。

空気抵抗係数 k=0.24[kg/m].
重力加速度 g=9.8[m/s^2].

空気抵抗のある場合の飛距離と、空気抵抗のない場合の飛距離を求め、比較せよ。

入力例)
(30, 8)→???
(45, 8)→???
(60, 8)→???
(60, 12)→???
880デフォルトの名無しさん
垢版 |
2023/07/03(月) 23:48:04.74ID:+izrFQr7
>>879
時間刻み幅が粗すぎて着地時刻を適切に判定できないから、飛距離も求められない。
軌跡のグラフを描いて大体の位置を読み取るしかない。

R
www.mycompiler.io/view/K4qPKREzkRI

[コードを実行] ボタンを押すとグラフが表示される。白丸が空気抵抗なし、黒丸があり。
2023/07/04(火) 00:24:53.30ID:xKkoXb5c
>>880
天才がおる。
君ならICBMの計算も出来そうだ。
ちょっと試してみようか。
882デフォルトの名無しさん
垢版 |
2023/07/04(火) 18:50:11.09ID:o8LQKs7n
>>875
Kotlin

なんとなく拡張関数で作った。まあでもsplit使っちゃってて肝心な所は自分では何も書いてないな。

https://paiza.io/projects/j1jz6yNCVfWZLIv8d5RFjA
883デフォルトの名無しさん
垢版 |
2023/07/04(火) 22:31:05.24ID:0YaO2gnD
>>880の14行目は
  a <- c(0, -g) - k * (v + a * dt) ^ 2 / m
でなく
  a <- c(0, -g) - k * (v + aprev * dt) ^ 2 / m
の方が良かった。精度が少しだけ上がる。
884デフォルトの名無しさん
垢版 |
2023/07/04(火) 22:31:52.02ID:0YaO2gnD
お題:62進数の計算

62進数の整数の加・減・乗算から成る式の文字列が入力される。計算結果を62進数の文字列で出力せよ。
ただし、10進数の0〜9, 10〜35, 36〜61に相当する数字にはそれぞれ0〜9, A〜Z, a〜zを用い、
計算の途中経過と最終結果は64ビット符号付き整数の範囲内に収まると想定して良い。

[例]
入力: 123 + ABC
出力: 123 + ABC = BDF

[問題]
2023-7-4
printf - (Hello + world)
Windows * 11
The - quick - brown * fox + jumped - over + the - lazy * dog
ABCDEFG + HIJKLMNOP + QRSTUV + WXYZ
2023/07/05(水) 00:02:51.51ID:f5gUiL1f
>>884

Haskell
https://ideone.com/eguY57
886デフォルトの名無しさん
垢版 |
2023/07/05(水) 16:19:03.51ID:eWV2G44w
>>884
Perl

計算面倒だから文字列の状態で数値部分を10進数に変換してから eval 使うという手抜きプログラム。
その代わり割り算や割った余りも出せる。( / と % )。ただし結果の出力が整数でしか出ない。
結果が負の値になってもマイナス付けて出せるようにした。

https://paiza.io/projects/zf3aXm60nlM59-TjhoiEyQ
887デフォルトの名無しさん
垢版 |
2023/07/05(水) 16:32:04.27ID:5Lz4OcyC
計算結果を62進数の文字列で出力せよ。
888デフォルトの名無しさん
垢版 |
2023/07/05(水) 17:55:35.60ID:eWV2G44w
出るよ。
889884
垢版 |
2023/07/05(水) 22:10:28.44ID:uOCDoNkY
>>886
>Perl
>計算面倒だから文字列の状態で数値部分を10進数に変換してから eval 使うという手抜きプログラム

それでOK。出題者が事前に書いたRとPowerShellのプログラムもまさにそのやり方。構文解析を
自前で書かせるつもりはなかった。整数同士の割り算は結果が言語により異なるので問題から外した。

www.ideone.com/L0fgm6
www.ideone.com/J2cLd2 (実行結果は上と同じ)

RubyとPythonもevalを使えるので似たように書けるはず。なんかPとRで始まる言語ばかりだな。
890638
垢版 |
2023/07/05(水) 23:15:53.66ID:RHYedEAt
Parser generator使って自前で構文解析&計算させようとして苦戦していた俺涙目
2023/07/06(木) 00:20:52.37ID:8lEmyrt+
>>890
オレもParser generatorでやろうと思ってるよ
eval なんか使えないからね
でも日曜日までまとまった時間ないからまたまた超遅レスになる予定
2023/07/06(木) 20:52:00.35ID:qCiseCT1
お題: 緯度と経度から距離と方位を求める。

地球が球体であると仮定し、地球の半径を6378[km]とする。
緯度と経度を角度[deg]で与える。
北緯と西経は正の値で、南緯と東経は負の値で与えるものとする。
二点ABの緯度と経度を与えるとき、ABの距離d[km]と、AからBへ向かう方位角φ[deg]を求めよ。
方位角は北:0度、東:90度、南:180度、西:270度とする(時計回り)。

例)
A(139.74477, 35.6544), B(39.8261, 21.4225)
→(9491, 293).

参考) https://keisan.casio.jp/exec/system/1257670779
893デフォルトの名無しさん
垢版 |
2023/07/06(木) 23:43:20.91ID:jglGRjQ9
>>892
R
www.ideone.com/S5Jubo
2023/07/07(金) 01:04:00.47ID:wU+5w+HX
>>892
haskell
角が合わんorz寝よ

https://ideone.com/8Rk7Fp
895デフォルトの名無しさん
垢版 |
2023/07/07(金) 11:02:22.14ID:UaYcujNV
>>892
完全にぴったり地球の表裏側2点の場合の方位角は?
2023/07/07(金) 13:25:49.78ID:WCk9ojNW
>>895
定義しない、または任意。
2023/07/08(土) 00:02:54.35ID:pNCQQCuc
お題: 緯度経度を三次元座標に変換。

地球を半径6378[km]の球体だと仮定し、地球の中心を三次元空間の原点とする。この空間は右手系である。
原点より緯度0度経度0度の地点に向かう向きをx軸方向とする。
また原点より北極点に向かう向きをz軸方向とする。
入力として与えられた緯度経度のペア[deg^2]を三次元座標[km^3]に変換せよ。

例)
(0, 0)→(6378, 0, 0).
(90, 0)→(0, 0, 6378).
(45, 0)→??? (0, -45)→???
(45, -45)→??? (30, -45)→???
898638
垢版 |
2023/07/08(土) 18:46:12.49ID:fDz284w7
>>884 Perl5、見易くするためインデントは全角スペースに置換してあります。

use feature qw{signatures}; no warnings 'experimental';
use Parse::RecDescent;
sub ope($valp, @args) { my $val = $valp->();
 while (@args) { my ($op, $parm) = splice @args, 0, 2; $op->($val, $parm->()); } $val }
%d = map{$_ => $i++} 0..9,'A'..'Z','a'..'z';
%e = map{$d{$_} => $_} keys %d;
use List::Util 'reduce';
sub dec($d62) { reduce {$a*62 + $b} map{$d{$_}} split '', $d62 }
my $parse = new Parse::RecDescent <<'End';
 expr: <leftop:term addsub term> {sub { ::ope @{$item[1]} }}
 addsub: '+' {sub { $_[0] += $_[1] }} | '-' {sub { $_[0] -= $_[1] }}
 term: <leftop:factor muldiv factor> { sub {::ope @{$item[1]} }}
 muldiv: '*' {sub { $_[0] *= $_[1] }} | '/' {sub { $_[0] /= $_[1] }}
 factor: dig62 | '(' expr ')' { $item[2] }
 dig62: /[0-9A-Za-z]+/ {sub { ::dec $item[1] }}
End
sub enc($d) { my $r = $d % 62; $d = int(($d - $r) / 62); $d ? (enc($d) . $e{$r}) : $e{$r}; }
for (<DATA>) {
 $n = $parse->expr($_)->();
 $n = $n < 0 ? '-' . enc(-$n) : enc($n);
 print "$_ = $n\n";
}
__DATA__
123 + ABC
4 - K
2023-7-4
printf - (Hello + world)
Windows * 11
The - quick - brown * fox + jumped - over + the - lazy * dog
ABCDEFG + HIJKLMNOP + QRSTUV + WXYZ
899638
垢版 |
2023/07/08(土) 18:47:35.93ID:fDz284w7
>>898 の実行結果:

$ perl 21_884_calc_dig26.pl
123 + ABC
 = BDF
4 - K
 = -G
2023-7-4
 = 201s
printf - (Hello + world)
 = odFAME
Windows * 11
 = XFWRSlos
The - quick - brown * fox + jumped - over + the - lazy * dog
 = -Q1YGAW2x
ABCDEFG + HIJKLMNOP + QRSTUV + WXYZ
 = HITvzYcgj


※ Parse::RecDescentという再帰降下型Parser generatorのperl moduleを使用したので、
 動作させるにはそのインストールされている必要がありますが、ideonなどのオンライン
 プログラムサービスには多分インストールされていなくて動作しないんじゃないかなともいます
900デフォルトの名無しさん
垢版 |
2023/07/08(土) 21:33:55.36ID:CSKg1TdC
>>897
R
www.ideone.com/RHXhIq
変哲は、普通に書くとsinとcosが合わせて4個か5個必要な所を2個にしたことだけ。
901884
垢版 |
2023/07/08(土) 21:40:41.86ID:CSKg1TdC
>>898
ならば出題者からもeval任せでない自前の実装プログラムをどうぞ。

C
www.ideone.com/erwpI4

「C言語による最新アルゴリズム事典」に載っている10進小数の四則演算式評価プログラムを
ちょっと改変したらサッと作れた。

C++
www.ideone.com/MFEuc6

Cプログラムのグローバル変数と下請け関数をクラスに入れて隠蔽した。readch関数のかわりに、
空白を読み飛ばすようにオーバーライドした++演算子を使ってすっきり書いた。
2023/07/08(土) 22:03:59.24ID:+KTtE1Ht
イヤ、スクラッチで書いても意味ないでしょ?
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。