プログラミングのお題スレ 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/
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
イヤ、スクラッチで書いても意味ないでしょ?
903638
垢版 |
2023/07/08(土) 22:09:14.33ID:fDz284w7
四則演算の式評価なら1数十stepでParserを手書きできるということでそれもありじゃね?
2023/07/08(土) 22:12:28.67ID:+KTtE1Ht
うーん、まぁそれはそうも言えるかな
しかしその手の話は結局“車輪の再発明”してるだけだからな
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
2023/07/09(日) 07:12:14.55ID:LeSv46FO
まぁ物によるだろうけどほとんどのプログラミング言語は最低でも文脈依存文法以上を解析できるパーサーでないと解析できない
ましてや今日のコンパイラは何行目の何文字目がおかしいのか、それがどんな間違いなのかも示して修正案まで出してくれる、そこまでの作業を一般的なパーサー生成機に落とし込むこと1から考えるよりはパーサーそのもの自分で作る方が早いかもしれんわな
ただ今回のは四則演算とカッコだけなんだから文脈自由文法の解析機で解析できるから素人が作った解析機を使わない意味は実用上はまずない、まさに車輪の再発明の典型になってしまう
しかしまぁここはある意味“再発明を楽しむスレ”でもあるからなw
2023/07/09(日) 07:18:47.36ID:LeSv46FO
専門家の作った解析機を使わない意味はないだorz
まぁただパーサー生成機の作ったパーサーはもちろん「どんな文法でも対応できる」ために効率を犠牲にする場合もあるので速度とかをギチギチにチューンするつもりなら意味はあるか
実際今回のも()と+,-,×だけやからな
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]を求めよ。
(この情報はフィクションであり、架空のものです。実際の軍事情報とは関係ありません)
2023/07/09(日) 15:00:34.36ID:x2TUQyIt
最後の注意書きが寒い
だったら最初から固有名詞出さなきゃ良いのに
2023/07/09(日) 16:39:33.98ID:vyR210yR
>>908
防衛装備移転三原則に反する恐れがあるので、このお題は撤回致します。回答しないで下さい。
2023/07/09(日) 18:30:16.18ID:trhah0Kt
自分の書き込みにそんなに勝ちがあると思ってるのかこいつ
スベってるよ
912デフォルトの名無しさん
垢版 |
2023/07/09(日) 18:54:23.02ID:GCtDZZpJ
>>875
Kotlin
https://paiza.io/projects/GqQNgKH7i2A0Vn4TIlLENQ
2023/07/09(日) 21:17:36.11ID:HwvqYkKm
>>884
haskell
https://ideone.com/6hUFuO
914638
垢版 |
2023/07/10(月) 15:31:23.20ID:FUofuCtL
>>897 Perl5、見やすくするためインデントは全角スペースに置換してあります。
 たまには回答して進ぜるけど、もしかして回答欲しくて簡単なお題だしたん?

use Math::Trig qw{pi deg2rad spherical_to_cartesian};
use constant ra => 6378;
for (<DATA>) {
 ($lo, $la) = map{deg2rad($_)} /(-?\d+)/g;
 # 球面→cartesian座標変換library使用
 $phy = pi / 2.0 - $lo;
 ($x, $y, $z) = spherical_to_cartesian(ra, $la, $phy);
 printf "L) (%.3f, %.3f)[rad] -> (%.1f, %.1f, %.1f)\n", $lo, $la, $x, $y, $z;
 # 手書き
 $ralo = ra * cos($lo);
 printf "H) (%.3f, %.3f)[rad] -> (%.1f, %.1f, %.1f)\n", $lo, $la,
  $ralo * cos($la), $ralo * sin($la), ra * sin($lo);
}
__DATA__
(0, 0)
(90, 0)
(45, 0)
(45, -45)

実行結果
$ perl 21_897_緯度経度→xyz.pl
L) (0.000, 0.000)[rad] -> (6378.0, 0.0, 0.0)
H) (0.000, 0.000)[rad] -> (6378.0, 0.0, 0.0)
L) (1.571, 0.000)[rad] -> (0.0, 0.0, 6378.0)
H) (1.571, 0.000)[rad] -> (0.0, 0.0, 6378.0)
L) (0.785, 0.000)[rad] -> (4509.9, 0.0, 4509.9)
H) (0.785, 0.000)[rad] -> (4509.9, 0.0, 4509.9)
L) (0.785, -0.785)[rad] -> (3189.0, -3189.0, 4509.9)
H) (0.785, -0.785)[rad] -> (3189.0, -3189.0, 4509.9)
2023/07/11(火) 15:24:57.95ID:zBgA5NaS
お題:神経質なipow10()
整数を引数とし、その10のべき乗を浮動小数点数で返す関数を書け。
結果が浮動小数点数で厳密に表現出来ない場合(10の-1乗=0.1とか)、
浮動小数点数として、(結果を)厳密に最近値に丸めた値を返すこと。
2023/07/11(火) 15:51:15.42ID:nXEJ21bU
高校時代全く数学できなかったんだろうなぁ
917915
垢版 |
2023/07/12(水) 01:10:01.78ID:OtxkddAG
正の整数の範囲だけなら、CPythonのmath.pow()もそう悪くないんだ…
(10**23と10**210が外れ)。
tps://sagecell.sagemath.org/?z=eJxdjUEKwyAURPeB3GG601REt4WeRVxo86H6xQhNb18lLaWd5Zt5TKycsD03UCpcG-KdfXOUI89THF3ybf2UhR-dcgWBMqrPtyC-gk5-d9a4sBecYeVlntBDcXjCGm0USOJ0PU46wbJ08t6NlEq5CVI_hl7DLqT6sw4qXzvIOGU=&lang=python&interacts=eJyLjgUAARUAuQ==
2023/07/12(水) 09:36:32.37ID:OzccPY9R
この手の計算ライブラリではあるある
真値が無理数の場合次善策として“最近の値”を出す事、当然それ出してくれると思いがちだけどそんな値出してくれるライブラリなどほとんどない
原理的に出せないわけではない、適当にレジスタの精度を設定して上から、下からの近似値を出す、求める桁数まで一致してればそれが“最近”、一致してなければ精度上げて再計算‥を繰り返せば必ず最後は一致する‥でもそのために貴重な時間リソースが無駄になる、なので普通は“精度は±××、上からの近似の中では最良”くらいが関の山、それすら守ってなくても普通、ましてや“小数第何位までは確実に合ってる”などとは全く期待できない
そのあたりの“実用上それで十分、それ以上の事やって誰得?”と割り切れるまでが一週目
919915
垢版 |
2023/07/12(水) 15:28:21.53ID:6VP/LOOe
"1e23" とかの文字列を構成して、Cのstrtod()やsscand()的な関数を使って変換する分には誤差が出ないっぽいのですけど
(これの誤差が出るライブラリは駆逐されたらしい)、
これはこれで「負け」た気分になるのが…w
920915
垢版 |
2023/07/12(水) 15:35:55.97ID:9l9n30C9
>>919
sscanfですたorz
921デフォルトの名無しさん
垢版 |
2023/07/12(水) 17:47:05.90ID:MwP3bMsR
分母が2べきでない限り内部的に分母が2べきの有理数で保持するタイプの浮動小数は“定数”を10進のリテラルで与えるとそこで誤差が出たり、あるいはその逆もある、いわゆる基数変換誤差
多くの場合、基数変換誤差は計算の最初と最後でしかでないのでそもそもあまり話題にはならない、大昔のインタプリタ言語とかだったら計算結果を毎回10進表示に変換して文字列として保持してるようなやつもあっただろうけど、もう流石にそのタイプは駆逐されてるんじゃなかろか
大体そもそも他の組み込み関数の誤差評価がもっと大甘なのにそこだけ頑張っても意味がない
2023/07/12(水) 18:35:23.52ID:wgfcR5Sc
COBOLはまだまだ健在ですよ
923915
垢版 |
2023/07/13(木) 05:18:24.50ID:102DBCHI
何で「負け」なのかと云うと、
IEEE754的な意味での「再現性」を担保する為に
(binary64の数値を有効桁17桁で10進文字列に変換して、
それをstrtod()とかするとbit perfectで元に戻るってやつ)、
strtod()とかは内部で多倍長演算をやってるので…。
(glibcの実装(GNU MPに丸投げ?)と、ルーセントの中の人
が書いたやつ(そのほか)の2系統あり)。

…なんとかズル出来ないのか?w
924915
垢版 |
2023/07/13(木) 05:22:25.37ID:102DBCHI
要するに牛刀割鶏感がでかい
いまさら気にしても仕方がなくもないけど
925デフォルトの名無しさん
垢版 |
2023/07/13(木) 05:46:44.20ID:UahP4Rhb
そもそもコレ変数へ値をそんな自由に“セット”する方法がないんだよな
例えば値が10^(-30)として二進展開して

2^(-30)
=1.100_0010_1000_0010_0101_1111_...×2^(-103)

という巡回小数になる
単精度での内部表示は

0_00011000_100_0010_1000_0010_0110_0000

になる、なるとわかってもこの値を変数にセットす方法がない
おそらく整数0xc68660をセットして2^24で割ればいける時もあるかもしれないけどそれとて言語の保証外、浮動小数点型の変数に何か値をセットしてそれを2べきの整数で割ったとて、いくら“割る数”が2べきであっても仮数部わ変わらず指数部だけ変わってくれる保証をしてる言語の方が少ない
実験すればそれでうまくいくかどうかわかるかもしれないけどregulationでそれでうまくいくと保証されてるわけではない、せいぜい“多分うまく行ってる”くらいしかわからない
Cとかなら[char]型でa[0]a[1]a[2]a[3]に値入れてfloat &bにb=aするとかできるかもしれないけど最近の型にうるさい言語だとそれとてできない
926デフォルトの名無しさん
垢版 |
2023/07/13(木) 06:10:46.95ID:FkuVPs5p
0xc28260÷2^24乗ね
この計算をさせて本当に内部的に変数に0_00011000_100_0010_1000_0010_0110_0000
がセットされたかどうか確認する方法もない
もう一回2^24かけて0xc28260かけて戻ってくるかチェックするとかして間接的に確かめるしかない
Cとかputhonとかならできるのかもしれないけど
2023/07/13(木) 21:54:33.63ID:pFytGTyV
お題: 入力として32ビット整数のビットマスクが与えられる。
ビットマスクに含まれる有効なビットの組み合わせをブルートフォースせよ。

例)
0x13
→(0x1, 0x2, 0x3, 0x10, 0x11, 0x12, 0x13).
0x45
→(0x1, 0x4, 0x5, 0x40, 0x41, 0x44, 0x45).
0x92C
→???
2023/07/13(木) 22:05:50.51ID:zo6OijSK
>>927
>→(0x1, 0x2, 0x3, 0x10, 0x11, 0x12, 0x13).
0x0 は含まないルール?
2023/07/13(木) 22:06:44.17ID:pFytGTyV
>>928
あ、ゼロ忘れてた。ゼロもお願いします。
930デフォルトの名無しさん
垢版 |
2023/07/13(木) 23:34:46.42ID:Gk3QqB7S
>>927
Haskell
https://ideone.com/FqDur8
931デフォルトの名無しさん
垢版 |
2023/07/13(木) 23:41:47.50ID:qsjHWAGp
sort意味なしorz
932デフォルトの名無しさん
垢版 |
2023/07/14(金) 00:29:53.20ID:iQAPuZ6f
>>927
R
https://www.ideone.com/gL23rg
2023/07/14(金) 12:13:37.67ID:i4ROjxmQ
お題: ぶつかる迷路。

入力として与えられたフロア図の表すフロアのA地点にロボットRがあり、B地点にロボットSがある。しかし、RとSは同時に同じ場所を占有することはできない(衝突する)。

フロア図の例(上が北):
#######
#_A___#
#_#_###
#_#__B#
#######

#:カベ、_:空きスペース、A:A地点、B:B地点。

ロボットRとSは次の5つのコマンドが使用できる。

コマンド0:一つ待つ。
コマンド1:西に1つ動く。
コマンド2:東に1つ動く。
コマンド3:北に1つ動く。
コマンド4:南に1つ動く。

RがB地点に、SがA地点に到達するまで、RとSを最短のコマンドリストで動かせ。
到達できないときは「ERROR」と表示して終了せよ。
2023/07/14(金) 13:10:06.13ID:i4ROjxmQ
>>933

出力は題意のコマンドリスト2つです。

回答例)
((2, 2, 0, 0, 1, 4, 4, 2, 2), (1, 1, 3, 3, 1))
935638
垢版 |
2023/07/14(金) 16:41:43.17ID:9h33JNqm
>>927 Perl5

for (qw(0x13 0x45 0x92C)) {
 $n = eval;
 @a = map{sprintf "0x%x", $_} grep{($_ & $n) == $_} 0..$n;
 print "$_: @a\n";
}

※インデントは全角スペースに置換してあります。


実行結果
$ perl 21_927.pl
0x13: 0x0 0x1 0x2 0x3 0x10 0x11 0x12 0x13
0x45: 0x0 0x1 0x4 0x5 0x40 0x41 0x44 0x45
0x92C: 0x0 0x4 0x8 0xc 0x20 0x24 0x28 0x2c 0x100 0x104 0x108 0x10c 0x120 0x124 0x128 0x12c 0x800 0x804 0x808 0x80c 0x820 0x824 0x828 0x82c 0x900 0x904 0x908 0x90c 0x920 0x924 0x928 0x92c
936638
垢版 |
2023/07/14(金) 18:16:11.02ID:9h33JNqm
>>935 これだとコード書くの安直で楽だけど、効率悪いんだよね、特に値が大きいとき。
 効率に配慮すると、こうか↓

sub f {
 if (@_) {
  my $b = shift;
  @_ ? map{$_, $_ | 2**$b} f(@_) : ($_, $_ | 2**$b);
 }
}
for (qw(0x13 0x45 0x92C)) {
 $n = eval;
 @b = grep{$n & 2**$_} 0..31;
 @s = map{sprintf "0x%x", $_} f(@b);
 print "$_: @s\n";
}

※インデントは全角スペースで置換してありま


実行結果:
$ perl 21_927_effective_bit_mask.pl
0x13: 0x0 0x1 0x2 0x3 0x10 0x11 0x12 0x13
0x45: 0x0 0x1 0x4 0x5 0x40 0x41 0x44 0x45
0x92C: 0x0 0x4 0x8 0xc 0x20 0x24 0x28 0x2c 0x100 0x104 0x108 0x10c 0x120 0x124 0x128 0x12c 0x800 0x804 0x808 0x80c 0x820 0x824 0x828 0x82c 0x900 0x904 0x908 0x90c 0x920 0x924 0x928 0x92c
937915
垢版 |
2023/07/14(金) 19:28:34.12ID:Q8y8QZ/7
仕事で書いたら怒られるやつw
(プラットホームや、ライブラリのバージョンとかに依存する可能性があるから)
tps://sagecell.sagemath.org/?z=eJy1krFqwzAQhneD3-FKhsjguFJsUmooHdK1UOjQsTi27BzYklEUkrxEpy6FQpcOfoi-Tto-RqTaISElzdSbdHe679fxK1eygirRU8CqlkpDLReuk9tqxlOsknLbuGlT13GdjOeA5iKjBL3YdcCEYaQG0mU20mTGYcBGYQw9GN-t9FSKMGAsiMgDikwuZjCKJqi93YgNxfVcCWDcjh7QhoYFJ2hwDvdJwW_tTmNelqREMV_CchRBUeIkhetjgsNfcozG_yjH6IFeSKOTekdgZrTtdBXjDmE0oD6gZy3rwef763fz8fXcrJ_e1i_NvouPtZJa6lXNd352nLyUiSad94QYHmG-Z6neDzeXChBQgEpEwckgpBe-2eNyi8G9nwJnV38I2qgVCk3si9tTP5OC970Noga8Nw==&lang=python&interacts=eJyLjgUAARUAuQ==
938デフォルトの名無しさん
垢版 |
2023/07/14(金) 22:15:33.11ID:iQAPuZ6f
>>933
・を「一つ待つ」として、最短のコマンドリストは>>934

R: →→・・←↓↓→→
S: ←←↑↑←

の他にも、Sは同上で

R: →・・→←↓↓→→
R: →↓↑→←↓↓→→
R: →→←→←↓↓→→
R: →→→←←↓↓→→

もあり、あまりすっきりしない問題なので解く気が起きないな。
2023/07/14(金) 22:26:17.98ID:PGyidJ8C
>>938
移動量も最短にした方がいいか?
2023/07/14(金) 22:31:38.64ID:PGyidJ8C
>>939
移動量も最短にする。また、動けるとき、かつ待てるときは待つよりも先に動く方を優先するという条件を追加します。
2023/07/14(金) 22:44:41.18ID:PGyidJ8C
>>940
さらに次の3つの条件を追加します。
西か東か迷った場合は西を優先します。
北か南か迷った場合は北を優先します。
南/北の向きか東/西の向きかを迷った場合は東/西の向きを優先します。
2023/07/15(土) 03:29:30.91ID:deBIZu3e
>>927 Ruby
def solution( mk )
mb = 1
a = [0]
print "0x%X\n→(" % mk
while mk > 0
a.dup.each{|b| a << b + mb } if mk.odd?
mb <<= 1
mk >>= 1
end
puts a.map{|x| '0x%X' % x }.join(', ') + ')'
end

solution( 0 ) # 0の場合 0x0でいいのかな?
solution( 0x13 )
solution( 0x45 )
solution( 0x92C )
レス数が900を超えています。1000を超えると表示できなくなるよ。