プログラミングのお題スレです。
【出題と回答例】
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
■ このスレッドは過去ログ倉庫に格納されています
2022/11/13(日) 19:00:36.84ID:ZCYlhUwL
799デフォルトの名無しさん
2023/06/16(金) 21:34:18.18ID:FhD4SiQz アレ?
やっぱりこれ三乗してるんじゃないの?
O(N)ちゃうやん
O(N)の意味わかってる?
やっぱりこれ三乗してるんじゃないの?
O(N)ちゃうやん
O(N)の意味わかってる?
800デフォルトの名無しさん
2023/06/16(金) 21:36:03.94ID:AuLvoWXx801デフォルトの名無しさん
2023/06/16(金) 21:36:46.05ID:FhD4SiQz イヤ、整数計数の多項式環の三乗もfftで早くできるのかな?
802デフォルトの名無しさん
2023/06/16(金) 21:41:30.83ID:FhD4SiQz もしかしたらできるか
fftのアルゴリズムってこっちのコンボリューション積をあっちの各点積に持っていく方法だから多項式環でもできるんかな?
fftのアルゴリズムってこっちのコンボリューション積をあっちの各点積に持っていく方法だから多項式環でもできるんかな?
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乗している対象は配列の各項なのでそこはボトルネックにはならない
大体わかっているみたいだけど少し丁寧に書いてみる
素数次数の係数が 1 でそれ以外の係数が 0 の形式的冪級数 f を考える
f^3 の k 次の項の係数は 素数 3 個を選んで足した和が k になる場合の数になるので今回は k = 1234567 の係数を求めたい
長さ N の多項式の積は高速フーリエ変換による畳み込みで O(N log N) で計算できるので形式的冪級数を前から必要なだけとって多項式にして適用する
また取りうる値が大きくて誤差が問題になるときは数論変換と中国剰余定理で復元する方法もあるけど今回は不要
3乗している対象は配列の各項なのでそこはボトルネックにはならない
804デフォルトの名無しさん
2023/06/16(金) 22:23:18.66ID:sH9/3LIG うん、やっとわかった
fftの計算への応用つて真っ先に整数そのものの掛け算が思いついてしまうけど、別に整数そのものの掛け算でなくてもいいわけだ
完全に目からウロコ
fftの計算への応用つて真っ先に整数そのものの掛け算が思いついてしまうけど、別に整数そのものの掛け算でなくてもいいわけだ
完全に目からウロコ
805デフォルトの名無しさん
2023/06/16(金) 23:47:11.07ID:xSzkTILM806デフォルトの名無しさん
2023/06/17(土) 06:25:35.36ID:1fuSaXml807デフォルトの名無しさん
2023/06/17(土) 15:32:59.09ID:2LgWs1Ta お題
15時間20分を15.2と表記するとして
15.2+2.4=18.0時間って計算させるにはどうやればいいの?
15時間20分を15.2と表記するとして
15.2+2.4=18.0時間って計算させるにはどうやればいいの?
808デフォルトの名無しさん
2023/06/17(土) 22:31:22.41ID:6cwG2na1 整数部分と小数部分に分ける
小数部分は2桁とみなす
60進数の小数点数として扱う
小数部分は2桁とみなす
60進数の小数点数として扱う
809デフォルトの名無しさん
2023/06/17(土) 23:26:07.50ID:AP5jnZhM810デフォルトの名無しさん
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
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
811デフォルトの名無しさん
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ₙ) )
で与えられる積である、ただしこの×は各項毎の積で与えられる列である
長さが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ₙ) )
で与えられる積である、ただしこの×は各項毎の積で与えられる列である
812デフォルトの名無しさん
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
・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
813デフォルトの名無しさん
2023/06/20(火) 15:59:11.28ID:1adBi336 お題(難易度★)
a=1のとき、b=1000000
a=2のとき、b=999999
a=3のとき、b=999998
上記の法則を元に、aがnのときのbの値を求めなさい
a=1のとき、b=1000000
a=2のとき、b=999999
a=3のとき、b=999998
上記の法則を元に、aがnのときのbの値を求めなさい
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
■ このスレッドは過去ログ倉庫に格納されています
