プログラミングのお題スレです。
【出題と回答例】
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/
探検
プログラミングのお題スレ Part21
レス数が900を超えています。1000を超えると表示できなくなるよ。
2022/11/13(日) 19:00:36.84ID:ZCYlhUwL
814デフォルトの名無しさん
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
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
815デフォルトの名無しさん
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);
https://ideone.com/7v5QU9
f = @(n) polyval(polyfit([1 2 3], [1000000 999999 999998], 1), n);
816デフォルトの名無しさん
2023/06/21(水) 00:19:23.72ID:ay5yB12X なんて短いんだすげえ
818デフォルトの名無しさん
2023/06/21(水) 09:26:22.30ID:p7Lpt5pu819蟻人間 ◆T6xkBnTXz7B0
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.
例)
(1, 3, 5)→3.
(100, 5, 120)→100.
(208, 5, 120)→120.
820デフォルトの名無しさん
2023/06/21(水) 21:30:09.94ID:iBv5iJxF821蟻人間 ◆T6xkBnTXz7B0
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)、つまり、アスキー表の一部を乱数で撹乱した二次元データをソートしたときに、
アスキー表の一部を表す長方形状になるようにし、ソート前の撹乱後の二次元データと、ソート後の二次元データを自然にわかりやすく出力するプログラムを作れ。
与えられた比較関数Compare2Dを用いて2次元のデータを並べ替える。
typedef int DATA;
int Compare2D(DATA left, DATA above, DATA target);
左端でも上端でもない、ターゲットのデータについて
引数leftは一つ左のデータ、
引数aboveは一つ上のデータ、
引数targetはターゲットのデータとする。
比較関数の戻り値は、比較結果が小さいとき-1に、同じとき0に、大きいとき1になる。
比較関数Compare2Dとソートアルゴリズムを適当に定め、アスキーコードの一部(0x20~0x5f)、つまり、アスキー表の一部を乱数で撹乱した二次元データをソートしたときに、
アスキー表の一部を表す長方形状になるようにし、ソート前の撹乱後の二次元データと、ソート後の二次元データを自然にわかりやすく出力するプログラムを作れ。
822蟻人間 ◆T6xkBnTXz7B0
2023/06/21(水) 21:38:27.11ID:FNuxfRD0824デフォルトの名無しさん
2023/06/21(水) 23:17:43.90ID:4mNklWjb825デフォルトの名無しさん
2023/06/22(木) 04:06:08.77ID:kP7EKeZ8 お題:数学的な処理を使って東京タワーっぽいアスキーアートを出力せよ
アスキーアートのクオリティは問わない
アスキーアートのクオリティは問わない
826デフォルトの名無しさん
2023/06/22(木) 10:33:46.03ID:kNfUaD9C おじいちゃんスカイツリーでも良いですか?
827デフォルトの名無しさん
2023/06/22(木) 17:08:30.10ID:4hSYT0iP いいよ
828デフォルトの名無しさん
2023/06/22(木) 21:46:09.75ID:k1X9Be1P829638
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
長さが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
830デフォルトの名無しさん
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となる
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 どういう法則なの?
832デフォルトの名無しさん
2023/06/23(金) 13:33:04.37ID:4S/+5n0L 前3つ足すかな
833デフォルトの名無しさん
2023/06/23(金) 13:39:27.23ID:dK7C3R5x なるほど
834デフォルトの名無しさん
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
ルールを推測させる系は出題側の意図した答えを出させるためにどう制限かけるかが問われる
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 あーあ、お前が潜水艦に乗って爆縮されたら良かったのにな~
838デフォルトの名無しさん
2023/06/23(金) 16:23:56.10ID:lCxAQSJF 潜水艦の操縦がゲームコントローラとかワクワク感たまらねぇ
マジレスするとRustで造ってれば安全だったはず
マジレスするとRustで造ってれば安全だったはず
839デフォルトの名無しさん
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]]
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
初期値が一般的な値と異なってもトリボナッチ数列と呼んで良いようなので関数名はそうした。
Rでnが大きい場合にも高速に計算(例のnでは意味がないが)
www.ideone.com/FrR91K
C#でHaskell風の遅延評価による無限数列生成
www.ideone.com/ZZhdwh
初期値が一般的な値と異なってもトリボナッチ数列と呼んで良いようなので関数名はそうした。
841デフォルトの名無しさん
2023/06/23(金) 20:54:20.93ID:XMi0kQuB842638
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
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
843デフォルトの名無しさん
2023/06/24(土) 12:05:15.03ID:InxA93a4 この問題10年前ぐらいで外資系のスキルテストで見たことあるな
844デフォルトの名無しさん
2023/06/24(土) 14:57:48.91ID:hvZZJK0e845デフォルトの名無しさん
2023/06/24(土) 15:15:39.01ID:hvZZJK0e846デフォルトの名無しさん
2023/06/24(土) 15:31:35.78ID:UXKekmZD847デフォルトの名無しさん
2023/06/24(土) 19:11:36.41ID:hvZZJK0e848デフォルトの名無しさん
2023/06/27(火) 07:02:47.02ID:vEx8Tsrp この手の代数系のn乗計算に持ち込めるタイプは
a^(2n) = (a^n) × (a^n)
a^(2n+1) = (a^n) × (a^n) × a
を利用する実装ができてるかがミソやな
a^(2n) = (a^n) × (a^n)
a^(2n+1) = (a^n) × (a^n) × a
を利用する実装ができてるかがミソやな
849デフォルトの名無しさん
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で利用
逆フーリエ変換も不要だと後で分かったけどせっかく作ったので残してあります
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
Kotlin
Kotlin には coerceIn() というずばりそれをするための拡張関数があったのでそれを使った。
ついでに入力で負の値も受け付けるようにした。
https://paiza.io/projects/kOpfBfJtefVllIjHTVVX1g
851デフォルトの名無しさん
2023/06/28(水) 10:19:23.37ID:tyOdgkaM お題(初級)
a+b=cの式において、cが5で割り切れるためのaとbの組み合わせは何通りあるか
条件
1 <= c <= 10000000
a+b=cの式において、cが5で割り切れるためのaとbの組み合わせは何通りあるか
条件
1 <= c <= 10000000
852デフォルトの名無しさん
2023/06/28(水) 10:27:52.05ID:rc9mzp3b >>851
無限
無限
853デフォルトの名無しさん
2023/06/28(水) 16:02:12.58ID:y3h++4DU 無限なわけ無いだろと思ったけどa, bが自然数とは指定されてないからなぁ
854蟻人間 ◆T6xkBnTXz7B0
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).
あるレストランでは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/Ak856デフォルトの名無しさん
2023/06/29(木) 21:40:36.19ID:o6Q7Yv9N >>855はもう少しすっきり書けた。
www.ideone.com/A4TRQe
www.ideone.com/A4TRQe
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に到達するまで繰り返すだけ。
フロア図を変えた場合の実行例
www.ideone.com/vFtBf4
出発位置から目的位置まで複数の経路がある場合は最短経路が選択されるようになっている。
解法は単純で、行列Aの途中経過表示を見れば分かるように、出発位置fromからi + 1個の
コマンドで行ける位置にi + 1と印をつける操作を、i = 1, 2, 3, , ...について順々に、
目的位置toに到達するまで繰り返すだけ。
859蟻人間 ◆T6xkBnTXz7B0
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.
「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
Kotlin script
fun PtInRect(px: Int, py: Int, x0: Int, y0: Int, x1: Int, y1: Int) = x0 <= px && px < x1 && y0 <= py && py < y1
861蟻人間 ◆T6xkBnTXz7B0
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();
ヨコ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/dm2863デフォルトの名無しさん
2023/07/01(土) 09:06:02.22ID:J+nsogj/864蟻人間 ◆T6xkBnTXz7B0
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)→???
※ カラスは鳥獣保護法で保護対象です。
右手系の三次元空間に強力なレーザー光を放射できるレーザー砲塔(ほうとう)が原点(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回にまとめるべき?
それとも 2回以上使うときは Turn(Pan, Tilt) と Turn(Pan, Tilt) の積を計算した上で
1回にまとめるべき?
869デフォルトの名無しさん
2023/07/01(土) 13:53:06.23ID:2N653o6Y 大学でちゃんと講義受けてたのかどうか知らんけど
各数値は小数点以下2桁まで表示せよ。
もうこう言う言い回しをするのはやめた方がいい
各数値は小数点以下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
例は
(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
872蟻人間 ◆T6xkBnTXz7B0
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が必要だから、こうだろう。すみません。
ごめんごめん、正しくは右手系で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:OW14MEis874蟻人間 ◆T6xkBnTXz7B0
2023/07/01(土) 21:13:00.67ID:6ckc7dLG >>873
うん、水平回転も必要。真上を向いていると垂直方向の意味がわからないからね。
うん、水平回転も必要。真上を向いていると垂直方向の意味がわからないからね。
875デフォルトの名無しさん
2023/07/02(日) 17:45:16.73ID:bkSdQ5Ko お題:半角スペースで区切られた単語が並ぶ文字列がある
この文字列を単語に分割してソートして配列にして返す関数を実装せよ
この文字列を単語に分割してソートして配列にして返す関数を実装せよ
876デフォルトの名無しさん
2023/07/02(日) 18:54:51.40ID:Tqn0qozx877デフォルトの名無しさん
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
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
sub f { sort shift =~ /(\w+)/g }
実行結果
https://ideone.com/FjaIX7
879蟻人間 ◆T6xkBnTXz7B0
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)→???
重量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
[コードを実行] ボタンを押すとグラフが表示される。白丸が空気抵抗なし、黒丸があり。
時間刻み幅が粗すぎて着地時刻を適切に判定できないから、飛距離も求められない。
軌跡のグラフを描いて大体の位置を読み取るしかない。
R
www.mycompiler.io/view/K4qPKREzkRI
[コードを実行] ボタンを押すとグラフが表示される。白丸が空気抵抗なし、黒丸があり。
881蟻人間 ◆T6xkBnTXz7B0
2023/07/04(火) 00:24:53.30ID:xKkoXb5c882デフォルトの名無しさん
2023/07/04(火) 18:50:11.09ID:o8LQKs7n >>875
Kotlin
なんとなく拡張関数で作った。まあでもsplit使っちゃってて肝心な所は自分では何も書いてないな。
https://paiza.io/projects/j1jz6yNCVfWZLIv8d5RFjA
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
の方が良かった。精度が少しだけ上がる。
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
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
885デフォルトの名無しさん
2023/07/05(水) 00:02:51.51ID:f5gUiL1f886デフォルトの名無しさん
2023/07/05(水) 16:19:03.51ID:eWV2G44w >>884
Perl
計算面倒だから文字列の状態で数値部分を10進数に変換してから eval 使うという手抜きプログラム。
その代わり割り算や割った余りも出せる。( / と % )。ただし結果の出力が整数でしか出ない。
結果が負の値になってもマイナス付けて出せるようにした。
https://paiza.io/projects/zf3aXm60nlM59-TjhoiEyQ
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で始まる言語ばかりだな。
>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使って自前で構文解析&計算させようとして苦戦していた俺涙目
891デフォルトの名無しさん
2023/07/06(木) 00:20:52.37ID:8lEmyrt+892蟻人間 ◆T6xkBnTXz7B0
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
地球が球体であると仮定し、地球の半径を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:jglGRjQ9894デフォルトの名無しさん
2023/07/07(金) 01:04:00.47ID:wU+5w+HX895デフォルトの名無しさん
2023/07/07(金) 11:02:22.14ID:UaYcujNV >>892
完全にぴったり地球の表裏側2点の場合の方位角は?
完全にぴったり地球の表裏側2点の場合の方位角は?
897蟻人間 ◆T6xkBnTXz7B0
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)→???
地球を半径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
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などのオンライン
プログラムサービスには多分インストールされていなくて動作しないんじゃないかなともいます
$ 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:CSKg1TdC901884
2023/07/08(土) 21:40:41.86ID:CSKg1TdC >>898
ならば出題者からもeval任せでない自前の実装プログラムをどうぞ。
C
www.ideone.com/erwpI4
「C言語による最新アルゴリズム事典」に載っている10進小数の四則演算式評価プログラムを
ちょっと改変したらサッと作れた。
C++
www.ideone.com/MFEuc6
Cプログラムのグローバル変数と下請け関数をクラスに入れて隠蔽した。readch関数のかわりに、
空白を読み飛ばすようにオーバーライドした++演算子を使ってすっきり書いた。
ならば出題者からもeval任せでない自前の実装プログラムをどうぞ。
C
www.ideone.com/erwpI4
「C言語による最新アルゴリズム事典」に載っている10進小数の四則演算式評価プログラムを
ちょっと改変したらサッと作れた。
C++
www.ideone.com/MFEuc6
Cプログラムのグローバル変数と下請け関数をクラスに入れて隠蔽した。readch関数のかわりに、
空白を読み飛ばすようにオーバーライドした++演算子を使ってすっきり書いた。
902デフォルトの名無しさん
2023/07/08(土) 22:03:59.24ID:+KTtE1Ht イヤ、スクラッチで書いても意味ないでしょ?
903638
2023/07/08(土) 22:09:14.33ID:fDz284w7 四則演算の式評価なら1数十stepでParserを手書きできるということでそれもありじゃね?
904デフォルトの名無しさん
2023/07/08(土) 22:12:28.67ID:+KTtE1Ht うーん、まぁそれはそうも言えるかな
しかしその手の話は結局“車輪の再発明”してるだけだからな
parsingみたいに重たい処理は可能なら既存の実績のあるparser generator使えるならそれ使うのか本筋な気はするけどね
初学者がparsingの基礎の練習問題として使うのはありかな
しかしその手の話は結局“車輪の再発明”してるだけだからな
parsingみたいに重たい処理は可能なら既存の実績のあるparser generator使えるならそれ使うのか本筋な気はするけどね
初学者がparsingの基礎の練習問題として使うのはありかな
905638
2023/07/08(土) 22:16:05.45ID:fDz284w7 GCCやCLangも何とparserはyaccなど使わずに手書きなんだそうだ。
理由は下記サイトなど参照。きめ細かいエラー処理など可能になるかもしれないがコードはとても込み入って大変そうだわ。
c - Are GCC and Clang parsers really handwritten? - Stack Overflow
https://stackoverflow.com/questions/6319086/are-gcc-and-clang-parsers-really-handwritten
理由は下記サイトなど参照。きめ細かいエラー処理など可能になるかもしれないがコードはとても込み入って大変そうだわ。
c - Are GCC and Clang parsers really handwritten? - Stack Overflow
https://stackoverflow.com/questions/6319086/are-gcc-and-clang-parsers-really-handwritten
906デフォルトの名無しさん
2023/07/09(日) 07:12:14.55ID:LeSv46FO まぁ物によるだろうけどほとんどのプログラミング言語は最低でも文脈依存文法以上を解析できるパーサーでないと解析できない
ましてや今日のコンパイラは何行目の何文字目がおかしいのか、それがどんな間違いなのかも示して修正案まで出してくれる、そこまでの作業を一般的なパーサー生成機に落とし込むこと1から考えるよりはパーサーそのもの自分で作る方が早いかもしれんわな
ただ今回のは四則演算とカッコだけなんだから文脈自由文法の解析機で解析できるから素人が作った解析機を使わない意味は実用上はまずない、まさに車輪の再発明の典型になってしまう
しかしまぁここはある意味“再発明を楽しむスレ”でもあるからなw
ましてや今日のコンパイラは何行目の何文字目がおかしいのか、それがどんな間違いなのかも示して修正案まで出してくれる、そこまでの作業を一般的なパーサー生成機に落とし込むこと1から考えるよりはパーサーそのもの自分で作る方が早いかもしれんわな
ただ今回のは四則演算とカッコだけなんだから文脈自由文法の解析機で解析できるから素人が作った解析機を使わない意味は実用上はまずない、まさに車輪の再発明の典型になってしまう
しかしまぁここはある意味“再発明を楽しむスレ”でもあるからなw
907デフォルトの名無しさん
2023/07/09(日) 07:18:47.36ID:LeSv46FO 専門家の作った解析機を使わない意味はないだorz
まぁただパーサー生成機の作ったパーサーはもちろん「どんな文法でも対応できる」ために効率を犠牲にする場合もあるので速度とかをギチギチにチューンするつもりなら意味はあるか
実際今回のも()と+,-,×だけやからな
まぁただパーサー生成機の作ったパーサーはもちろん「どんな文法でも対応できる」ために効率を犠牲にする場合もあるので速度とかをギチギチにチューンするつもりなら意味はあるか
実際今回のも()と+,-,×だけやからな
908蟻人間 ◆T6xkBnTXz7B0
2023/07/09(日) 09:04:09.08ID:S0HvsOQY お題: 飛翔体のシミュレーション。
クレムリン(北緯55度東経37度)から東京(北緯35度東経139度)に向けて初速12[km/s]、重量30[kg]の飛翔体が発射される。
地球は半径6378[km]の球体と仮定し、重力加速度を9.8[m/s^2]とする。
飛翔体は噴射せず自由落下すると仮定する。空気抵抗は考慮しない。
発射時刻をt=0[s]とするとき、t=120とt=240のときの飛翔体の座標[deg^2]を求めよ。
(この情報はフィクションであり、架空のものです。実際の軍事情報とは関係ありません)
クレムリン(北緯55度東経37度)から東京(北緯35度東経139度)に向けて初速12[km/s]、重量30[kg]の飛翔体が発射される。
地球は半径6378[km]の球体と仮定し、重力加速度を9.8[m/s^2]とする。
飛翔体は噴射せず自由落下すると仮定する。空気抵抗は考慮しない。
発射時刻をt=0[s]とするとき、t=120とt=240のときの飛翔体の座標[deg^2]を求めよ。
(この情報はフィクションであり、架空のものです。実際の軍事情報とは関係ありません)
909デフォルトの名無しさん
2023/07/09(日) 15:00:34.36ID:x2TUQyIt 最後の注意書きが寒い
だったら最初から固有名詞出さなきゃ良いのに
だったら最初から固有名詞出さなきゃ良いのに
910蟻人間 ◆T6xkBnTXz7B0
2023/07/09(日) 16:39:33.98ID:vyR210yR >>908
防衛装備移転三原則に反する恐れがあるので、このお題は撤回致します。回答しないで下さい。
防衛装備移転三原則に反する恐れがあるので、このお題は撤回致します。回答しないで下さい。
911デフォルトの名無しさん
2023/07/09(日) 18:30:16.18ID:trhah0Kt 自分の書き込みにそんなに勝ちがあると思ってるのかこいつ
スベってるよ
スベってるよ
912デフォルトの名無しさん
2023/07/09(日) 18:54:23.02ID:GCtDZZpJ913デフォルトの名無しさん
2023/07/09(日) 21:17:36.11ID:HwvqYkKmレス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 中国国営メディア「沖縄は日本ではない」… ★6 [BFU★]
- ナイツ塙が指摘のローソンコーヒーカップ、ロゴ「L」で誤解生みデザイン変更へ 在庫使い切る3か月後にリニューアル [muffin★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【速報】 高市政権、「日本版DOGE」を立ち上げ 米国で歳出削減をした「政府効率化省(DOGE)」になぞらえたもの [お断り★]
- バービー、 台湾有事の発言の波紋で「たまったもんじゃない」「高市さんに真意は聞きたい」「国民に向けて説明してほしい」 [muffin★]
- 20代の3割が「テレビ見ない」現実…そして静かに広がる「究極のテレビ離れ」とは [muffin★]
- 【悲報】中国→日本行きの航空チケット、高市有事の影響で50万人分がキャンセルされる [834922174]
- 【悲報】早速高市首相のせいで全国の民泊でキャンセルラッシュwwwwwwwwwwww 経営者も嘆き「こんな事は初めてだ…」😲 [871926377]
- んなっしょい🍬禁止🈲のお🏡
- 中国「高市が謝罪撤回しないとこれ全部なくなるけどどうする?」 [931948549]
- 高市早苗「……なんて言ってみたw」中国「なんだ、言ってみただけかw」👈これで全部元通りになるという事実 [782460143]
- 【悲報】ガラパゴス島国ジャップ、自分達の容姿が優れてると錯覚してしまう [383063292]
