Finden Sie den Gesamtzeitraum aus einer Liste von Frequenzen

8

Inspiriert von http://xkcd.com/1331/

In diesem xkcd-Comic gibt es mehrere Gifs, die alle mit unterschiedlicher Häufigkeit blinken. Ich möchte wissen, wie der Zeitraum aussehen würde, wenn alles ein einziges GIF wäre. Geben Sie anhand einer Liste von Zahlen, die die einzelnen Frequenzen darstellen, die Periode des gesamten GIF aus.

Formale Definition

Eingang:

N
f1
f2
.
.
.
fN

Ausgabe:

P

Wobei N die Anzahl der Frequenzen ist, fi die i-te Frequenz ist und P die resultierende Periode des gesamten GIF ist.

Sie können ein beliebiges Begrenzungszeichen verwenden (anstelle von \ n) und das N ausschließen, wenn Sie dies wünschen. Dies wird durch die Anzahl der Begrenzer abgeleitet.

Einige Besonderheiten

Frequenzen sind die nächstgelegene Gleitkommadarstellung mit doppelter Genauigkeit der als Eingabe bereitgestellten Zahlen.

Die ausgegebene Periode ist eine 64-Bit-Ganzzahl ohne Vorzeichen, auf das nächste Ganze aufgerundet (auf 0,5 aufgerundet). Jede Eingabe, die einen Zeitraum größer als 2 ^ 64-1 erzeugen würde, wird als undefiniertes Verhalten betrachtet.

Ebenso wird jede Eingabe <= 0 als undefiniertes Verhalten betrachtet.

Gewinnbedingung

Code Golf so kürzester Code gewinnt!

Cruncher
quelle
Möglicher Spoiler ... wäre dies nicht nur das Produkt der gegebenen Frequenzen?
Danmcardle
@crazedgremlin Nein, ist es nicht, aber du bist ziemlich nah.
Victor Stafusa
@crazedgremlin - Wenn A 2s und B 4s ist, wäre die resultierende Periode 4s, nicht 8s.
Digitales Trauma
Ah, ich verstehe, danke. @ Cruncher, was genau meinst du mit "Frequenz"? Wiederholungen pro Sekunde oder wie lange dauert eine Wiederholung? Ich nehme das erstere an, da dies normalerweise die Frequenz bedeutet.
Danmcardle
Hierfür gibt es mindestens zwei Methoden: Nehmen Sie die Gesamtfrequenz als GCD der Eingangsfrequenzen und invertieren Sie sie. Oder nehmen Sie die Eingangsfrequenzen, invertieren Sie sie alle, um die Perioden zu erhalten, und nehmen Sie das LCM als Gesamtperiode. Ich habe die GCD genommen. @ DavidCarraher nahm das LCM. Sie müssen nur mit den Nicht-Ganzzahlen fertig werden.
Victor Stafusa

Antworten:

8

APL, 4

∧/∘÷

ist sowohl logisches UND als auch numerisches LCM (mit Domäne über Ganzzahlen, Gleitkommazahlen, Komplexen, Rationalen, unabhängig davon, welcher Zahlenstapel von der APL-Implementierung unterstützt wird), ebenso ∧/wie das Reduzieren durch LCM oder das Berechnen des LCM eines Arrays.

Monadisch ÷ist numerisch invers. Die Zusammensetzung ∧/∘÷ist also die LCM der Umkehrungen der angegebenen Zahlen.

Die andere Formel, umgekehrt zur GCD, wäre ÷∘(∨/), wo die Klammern benötigt werden, um die Priorität zwischen und festzulegen /.

Sie können es online unter http://tryapl.com/ versuchen.

Beispiele

      ∧/∘÷ .12 .02 3.9 .15 .99
100
      ∧/∘÷ (16÷5)(2÷3)(2.35)(1÷7)
420
Tobia
quelle
Holy bananas!
Cruncher
3
@ Cruncher das wäre †))! in APL.
Tobia
Bravo. Ich denke, wir haben einen Gewinner.
Victor Stafusa
Einfach erstaunlich. Hut ab für Dich.
DavidC
4

Mathematica 43 28

Zweiter Versuch

Mein erster Versuch war nicht korrekt, obwohl er einige der notwendigen Zutaten enthielt (LCM, Rationalize). Die vollständige Lösung erfordert die Berücksichtigung sowohl des Zählers als auch des Nenners jeder Frequenz (ausgedrückt als gemeinsamer Bruch).

l ist die Liste der Frequenzen.

Durch Rationalisierung von 2.35 wird es in den gemeinsamen Bruch 235/100 konvertiert.

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

Angenommen, alle GIFs werden bei t = 0 ausgelöst.

Der folgende Ansatz erfordert nicht, dass die Frequenzen als "reelle Zahlen" ausgedrückt werden, d. H. als Dezimalbrüche. Sie können andere Arten von Brüchen sein. Das folgende Beispiel ist ein Fall, in dem die Brüche in Fünfteln, Dritteln, Hundertsteln und Siebteln angegeben sind.

Wenn zwei oder mehr Frequenzen nicht angemessen sind (in diesem Fall muss mindestens eine eine irrationale Zahl sein), gibt es keine Lösung. Mit anderen Worten, es gibt keinen Zeitpunkt t> 0, zu dem alle Komponenten gleichzeitig ausgelöst werden.

Beispiel 1

f[{50, 10}]

1/10


Beispiel 2

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

420

Wenn wir die kleinste Gesamtperiode mit jeder der Frequenzen multiplizieren, finden wir jeweils eine ganze Anzahl von Zyklen:

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

{1344, 280, 987, 60}

(1344 Hopfen von 16/5 Einheiten) landet bei 420. (280 Hopfen von 2/3 Einheiten) landet bei 420. (987 Hopfen von 2,35 Einheiten) landet bei 420. (60 Hopfen von 7 Einheiten) landet bei 420.

DavidC
quelle
Das richtige Werkzeug für den richtigen Job.
Victor Stafusa
Ich bin mir nicht sicher, ob ich das verstehe. Wenn die Eingänge Frequenzen sind, würde f [{50,10}] den gemeinsamen Signalzyklus bedeuten, der 50 Mal pro Sekunde ausgelöst wird, und einen Zyklus, der 10 Mal pro Sekunde abgelegt wird? Die richtige Antwort wäre 1/10 Sekunde, aber f [{50, 10}] gibt 1 zurück. Tatsächlich geben viele zufällige Dinge eine Antwort von 1 zurück. F [{345345, h}] gibt 1 zurück.
Michael Stern
Mein ursprünglicher Ansatz war unvollständig (und daher falsch). Ich habe es so geändert, dass es auf Ihre Beobachtung eingeht. Die aktuelle Lösung ist auch geometrisch sinnvoll (unter Verwendung von Liniensegmenten gegen die reale Linie).
DavidC
Ich wollte gerade eine solche Lösung veröffentlichen, aber du hast mich geschlagen. Sehr schön.
Jonathan Van Matre
@ Jonathan. Ja, Ihr Ansatz war fast identisch mit meinem. Aber ich sehe keine Notwendigkeit für Round. Werden Rationalize und LCM nicht garantieren, dass die Ergebnisse ganze Zahlen sind?
DavidC
2

Javascript: 191 Zeichen

Das von mir gewählte Eingabeformat (innerhalb der Regeln) sind die durch Kommas getrennten Frequenznummern. Keine Leerzeichen erlaubt und keine Zeilenumbrüche. Das anfängliche N darf nicht angegeben werden. Jede Zahl muss nur eine Serie von mindestens einer [0-9] Stelle mit einem optionalen Punkt irgendwo darin sein. Wenn die Eingabe fehlerhaft ist, ist das Verhalten undefiniert.

Wie es funktioniert:

Die Periode einiger ganzzahliger Frequenzzahlen ist die GCD dieser Zahlen. Wenn die angegebenen Zahlen keine Ganzzahlen sind, werden sie sukzessive mit 10 multipliziert, bis alles als Ganzzahl erhalten wird (dies nutzt die Tatsache aus, dass die nicht ganzzahligen Zahlen in Basis 10 angegeben sind). Nach der Berechnung der GCD wird das Ergebnis durch die Zehnerpotenz dividiert, die zum Multiplizieren der Eingangszahlen und damit zum Ermitteln der Gesamtfrequenz verwendet wird. Wenn wir dies umkehren, erhalten wir die Periode.
Hinweis: Ich bin mir ziemlich sicher, dass jetzt, da ich diese Antwort gegeben habe, jemand dasselbe in APL oder J codiert und es schlägt. :(

Der Code:

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)

Testen:

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.
Victor Stafusa
quelle
GCD? Das ist der größte gemeinsame Teiler, daher wäre er immer kleiner als die Frequenzen. Ich denke du meinst LCM (am wenigsten verbreitetes Vielfaches).
Justin
@ Quincunx Nein, es ist die GCD. Die Gesamtperiode ist die LCM der einzelnen Perioden, nicht der einzelnen Frequenzen.
Victor Stafusa
1
Hier ist die APL:(⊃x÷z)×∨/z←{⍵×10}⍣{⍵≡⌈⍵}x←⎕
Marinus
Würden Sie einen Testfall mit rationalen Zahlen oder "reellen Zahlen" (im Sinne der Informatik) durchführen? Ich denke nicht, dass ein auf GCD basierender Ansatz funktionieren wird.
DavidC
@ DavidCarraher Ich habe die Frequenz mit der Periode durcheinander gebracht, aber jetzt habe ich sie bereits behoben. Geändert nur das g/dzu d/g. Ich werde einige Testfälle hinzufügen.
Victor Stafusa