ṀÐƤḊ_⁸«©0×⁹I¤÷⁸I¤,®²S½S
左側のy値のリストと右側のそれぞれのx値のリストを取得するダイアディックリンク(コメントでOPによって明示的に許可されている)
オンラインでお試しください!
どうやって?
点灯する(傾斜)セクションの割合は、垂直ドロップの場合に点灯する割合と同じです。勾配の長さを評価するために2乗が発生するため、計算された道のりの高さは負になることがあります(また、以下では、照らされた斜面のランレングスは負の値を負の値で除算して計算されます)。
ṀÐƤḊ_⁸«©0×⁹I¤÷⁸I¤,®²S½S - Link:list, yValues; list, xValues
ÐƤ - for suffixes of the yValues: e.g. [ 3000, 3500, 1000, 5000, 2000, 3500, 0]
Ṁ - maximum [ 5000, 5000, 5000, 5000, 3500, 3500, 0]
Ḋ - dequeue [ 5000, 5000, 5000, 3500, 3500, 0]
⁸ - chain's left argument, yValues [ 3000, 3500, 1000, 5000, 2000, 3500, 0]
_ - subtract [ 2000, 1500, 4000,-1500, 1500,-3500, 0]
0 - literal zero
« - minimum (vectorises) [ 0, 0, 0,-1500, 0,-3500, 0]
© - copy to the register for later
¤ - nilad followed by link(s) as a nilad:
⁹ - chain's right argument, xValues e.g. [ 0, 500, 2500, 5000, 9000, 9000, 10200]
I - incremental differences [ 500, 2000, 2500, 4000, 0, 1200]
× - multiply (vectorises) [ 0, 0, 0,-6000000, 0,-4200000, 0]
¤ - nilad followed by link(s) as a nilad:
⁸ - chain's left argument, yValues [ 3000, 3500, 1000, 5000, 2000, 3500, 0]
I - incremental differences [ 500,-2500, 4000,-3000, 1500,-3500]
÷ - divide (vectorises) [ 0, 0, 0, 2000, 0, 1200, 0]
® - recall from the register [ 0, 0, 0,-1500, 0,-3500, 0]
, - pair (i.e. lit slope [runs, rises]) [[0, 0, 0, 2000, 0, 1200, 0], [0, 0, 0, -1500, 0, -3500, 0]]
² - square (vectorises) [[0, 0, 0, 4000000, 0, 1440000, 0], [0, 0, 0, 2250000, 0, 12250000, 0]]
S - sum (vectorises) [ 0, 0, 0, 6250000, 0, 13690000, 0]
½ - square root (vectorises) [0.0, 0.0, 0.0, 2500.0, 0.0, 3700.0, 0.0]
S - sum 6200.0
[x,y]
座標のリストを取得する25バイトのモナドバージョン:
ṀÐƤḊ_«0
Z©Ṫµ®FI×Ç÷I,DzS½S
これを試してください。
(x1, y1)
と(x2,y2)
。それが「遮断」されている点(x3, y3)
。Y2 <Y3 <= Y1と仮定する。そして、セグメントの長さである((y1 - y3)/(y1 - y2))*sqrt((x1 - x2)^2 + (y1 - y2)^2)
。これは、本質的に実際に使用されるセグメントの割合を掛けた距離式