周波数のリストから全体の期間を見つける


8

http://xkcd.com/1331/に触発されました

このxkcdコミックには、すべて異なる頻度で点滅するgifがいくつかあります。すべてが1つのGIFであった場合、その期間はどうなるか知りたいです。個々の頻度を表す数値のリストを指定して、GIF全体の周期を出力します。

正式な定義

入力:

N
f1
f2
.
.
.
fN

出力:

P

ここで、Nは周波数の数、fiはi番目の周波数、Pは総GIFの結果の周期です。

(\ nの代わりに)任意の区切り文字を使用することを選択できます。必要に応じてNを除外することもできます。これは、区切り文字の数によって推測されます。

いくつかの詳細

周波数は、入力として提供される数値の最も近い倍精度浮動小数点表現です。

出力される周期は、最も近い整数に丸められた(0.5で切り上げられた)64ビット符号なし整数です。2 ^ 64-1より大きい周期を生成する入力は、未定義の動作と見なされます。

同様に、0以下の入力は未定義の動作と見なされます。

勝利条件

ゴルフをコード化すると、最短のコードが勝ちます


可能性のあるスポイラー...これは特定の周波数の積ではないでしょうか?
— danmcardle 2014

@crazedgremlinいいえ、そうではありませんが、あなたはかなり近いです。
— Victor Stafusa 2014

@crazedgremlin-Aが2秒、Bが4秒の場合、結果の期間は8秒ではなく4秒になります。
— デジタルトラウマ

ああ、なるほど。@Cruncher、正確に「頻度」とはどういう意味ですか?1秒あたりの繰り返しまたは繰り返しにかかる時間の長さ?前者を想定します。通常、それが頻度の意味です。
— danmcardle 2014

これには少なくとも2つの方法があります。全体の周波数を入力周波数のGCDとして受け取り、それを反転します。または、入力周波数を取得し、それらをすべて反転して周期を取得し、LCMを全体の周期として取得します。私はGCDを取った。@DavidCarraherがLCMを採用しました。非整数に対処する必要があるだけです。
— Victor Stafusa 2014

回答:


8

APL、4

∧/∘÷

∧論理ANDと数値LCM(整数、浮動小数点数、複素数、有理数、APL実装でサポートされているスタックの数に関係なく)の∧/両方であるので、LCMによる削減、または配列のLCMの計算です。

モナディック÷は数値の逆です。したがって、構成∧/∘÷は、指定された数値の逆数のLCMです。

GCDの逆のもう1つの式はで÷∘(∨/)、∘との間の優先順位を修正するために括弧が必要です/。

あなたはhttp://tryapl.com/でそれをオンラインで試すことができます

例

      ∧/∘÷ .12 .02 3.9 .15 .99
100
      ∧/∘÷ (16÷5)(2÷3)(2.35)(1÷7)
420

Holy bananas!
— ランチャー、

3
@Cruncher†)))!APLで。
— トビア

ブラボー。勝者はいると思います。
— Victor Stafusa 2014

ただ素晴らしい。あなたに脱帽。
— DavidC 2014

4

Mathematica 43 28

二回目

最初の試みは正しくありませんでしたが、必要な成分がいくつか含まれていました(LCM、Rationalize)。完全なソリューションでは、各周波数の分子と分母の両方(共通の分数として表現)を考慮する必要があります。

l 周波数のリストです。

2.35を合理化すると、それは共通の分数235/100に変換されます。

f@l_:=LCM@@(1/Rationalize@l)

すべてのGIFがt = 0で起動すると仮定します。

次の方法では、周波数を「実数」として表現する必要はありません。小数として。彼らは他の種類の分数かもしれません。以下の例は、端数が5分の1、3分の1、100分の1、7分の1の場合です。

2つ以上の周波数が不整合である場合(この場合、少なくとも1つは無理数でなければなりません)、解決策はありません。つまり、すべてのコンポーネントが同時に発火する時点t> 0はありません。

例1

f[{50, 10}]

1/10


例2

f[{16/5, 2/3, 2.35, 1/7}]

420

最小の全体的な周期に各周波数を掛けると、それぞれの場合にサイクルの総数がわかります。

420*{16/5, 2/3, 2.35, 1/7}

{1344、280、987、60}

(16/5ユニットの1344ホップ)は420に着陸します。(2/3ユニットの280ホップ)は420に着陸します。(2.35ユニットの987ホップ)は420に着陸します。


適切な仕事に最適なツール。
— Victor Stafusa 2014

よくわかりません。入力が周波数の場合、f [{50,10}]は、毎秒50回発火する信号の共通サイクルと毎秒10回ファイリングするサイクルを意味しますか?正解は1/10秒ですが、f [{50、10}]は1を返します。実際には、ランダムなものの多くが1の答えを返します。f[{345345、h}]は1を返します
— Michael Stern

私の元のアプローチは不完全だった(したがって正しくなかった)。あなたの観察に対処するような方法でそれを修正しました。現在のソリューションは、幾何学的に意味があります(実際のラインに対してラインセグメントを使用)。
— DavidC、2014

私はそのような解決策を投稿するようになりましたが、あなたは私に打ち負かしました。非常に素晴らしい。
— Jonathan Van Matre、

@ジョナサン。はい、あなたのアプローチは私のものとほとんど同じでした。しかし、私はラウンドの必要性を理解していません。RationalizeとLCMは、結果が整数であることを保証しませんか?
— DavidC、2014

2

JavaScript:191文字

(ルール内で)選択した入力形式は、コンマで区切られた頻度数です。スペースや改行は許可されません。最初のNは指定しないでください。各番号は、オプションのドットがどこかにある、少なくとも1つの[0-9]桁の連続でなければなりません。入力の形式が正しくない場合、動作は未定義です。

使い方:

一部の整数頻度数の周期は、これらの数のGCDです。与えられた数値が整数でない場合は、整数としてすべてが得られるまで10を続けて乗算します(これは、非整数の数値が10進数で与えられるという事実を悪用します)。GCDを計算した後、結果を入力数の乗算に使用される10の累乗で割り、全体の周波数を取得します。これを逆にすると、周期がわかります。
注:私がこの答えを出した今、誰かが同じことをAPLまたはJでコーディングし、それを打ち負かすと確信しています。:(

コード:

d=1,s=prompt().split(",");for(a in s){s[a]=parseFloat(s[a]);while(s[a]*d%1>0)d*=10}g=s[0]*d;for(a in s){u=g;v=s[a]*=d;p=2;q=1;while(u>=p&v>=p)if(u%p|v%p)p++;else{u/=p;v/=p;q*=p}g=q}alert(d/g)

それをテストする:

Input: 50,10
Output: 0.1
Interpretation: One GIF blinks 10 times per second (period = 0.1s) and the other 50 times (period = 0.02s). So a combined GIF would repeat itself in 0.1 seconds.

Input: 2.7,3.4
Output: 10
Interpretation: One blinking at 2.7 times per second will blink 27 times in 10 seconds. One blinking 3.4 times per second will blink 34 times in 10 seconds. So, 10 seconds is a period, and since GCD(27,34)=1, it is the smallest.

Input: 4.8,7.2
Output: 0.4166666666666667
Interpretation: One blinking at 4.8 times per second and the other at 7.2 times per second, gives a frequency of 2.4 times per second, which is a period 0.41666... seconds.

Input: 0.6,12,7.9,4.33
Output: 100
Interpretation: Similar to second case. 60, 1200, 790 and 433 times each 100 seconds. The GCD of these numbers is 1.

Input: 400,200,25,350
Output: 0.04
Interpretation: The slowest is the 25 times per second, which is the overall frequency. 25 times per second is a period of 0.04 seconds.

Input: 440,200,35,360
Output: 0.2
Interpretation: In 0.2 seconds, we have 88, 40, 7 and 72 blinks.

GCD?これは最大公約数なので、常に周波数よりも小さくなります。LCM(最小公倍数)を意味すると思います。
— ジャスティン

@Quincunxいいえ、GCDです。合計期間は、個々の周波数ではなく、個々の期間のLCMです。
— Victor Stafusa 2014

1
ここではAPLがあります:(⊃x÷z)×∨/z←{⍵×10}⍣{⍵≡⌈⍵}x←⎕
— マリナス

コンピュータサイエンスの意味で、有理数または「実数」を使用してテストケースを実行しますか?GCDに基づくアプローチは機能しないと思います。
— DavidC、2014

@DavidCarraher私は周期で周波数を台無しにしましたが、今はすでに修正されています。をに変更しg/dましたd/g。テストケースをいくつか追加します。
— Victor Stafusa 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.