Ungefähr das perfekte Fünftel


10

Geben Sie ab 1-TET gleiche Temperamente an, die sich immer besser dem perfekten Fünftel annähern (nur Verhältnis 3/2). ( OEIS-Sequenz A060528 )

Die formale Beschreibung der Sequenz, kopiert aus dem OEIS:

Eine Liste gleicher Temperamente (gleiche Teilungen der Oktave), deren nächste Tonleiterschritte immer näher an die Verhältnisse zweier Töne musikalischer Harmonie heranreichen: das perfekte 4., 4/3 und dessen Ergänzung das perfekte 5., 3/2.

Beachten Sie, dass aus Symmetriegründen der perfekte vierte keine Rolle spielt.

Nehmen wir an, wir wissen, dass 3 in der Sequenz ist. Die Frequenzen in 3-TET sind:

2^0, 2^⅓, 2^⅔

Wo 2^⅔ist die nächste logarithmische Näherung von 3/2.

Ist 4 in der Sequenz? Die Frequenzen in 4-TET sind:

2^0, 2^¼, 2^½, 2^¾

Wo 2^½ist die nächste Annäherung von3/2 . Dies ist nicht besser als 2^⅔, also ist 4 nicht in der Reihenfolge.

Mit einer ähnlichen Methode bestätigen wir, dass 5 in der Sequenz enthalten ist, und so weiter.

Wenn eine Ganzzahl nals Eingabe angegeben wird, muss die Ausgabe die ersten N Zahlen der Sequenz in der angegebenen Reihenfolge sein. Zum Beispiel, wenn n = 7die Ausgabe sein sollte:

1 2 3 5 7 12 29

Sequenzbeschreibung von xnor

Die irrationale Konstante log2(3)1.5849625007211563 kann durch eine Folge rationaler Brüche angenähert werden

21,32,53,85,117,1912,4629,

Ein Bruch ist in der Sequenz enthalten, wenn es sich um den neuen handelt, der dem absoluten Abstand | am nächsten kommt p|pqlog2(3) |das heißt, näher als jeder andere Bruch mit einem kleineren oder gleichen Nenner.

Ihr Ziel ist es, die ersten n Nenner der Reihe nach auszugeben . Dies ist die Sequenz A060528 ( Tabelle ). Die Zähler (nicht erforderlich) sind in A254351 ( Tabelle ) angegeben.

Regeln:

  1. Importieren Sie die Sequenz A060528 nicht direkt.
  2. Das Format spielt keine Rolle, solange die Zahlen unterscheidbar sind. Im obigen Beispiel kann die Ausgabe auch sein:

    [1,2,3,5,7,12,29]

  3. Da dies ein Code-Golf ist, gewinnt der kürzeste Code in Bytes.


5
Hallo und willkommen bei Code Golf SE! Wir fordern, dass alle Herausforderungen in sich geschlossen sind, daher wäre eine Beschreibung der Sequenz hier eine große Hilfe.
AdmBorkBork

5
Die Beschreibung von OEIS verwirrt mich. Es wird auch der perfekte 4. Platz erwähnt (Verhältnis 4/3), aber die Herausforderung besteht in perfekten 5. Platzierungen (Verhältnis 3/2). Ich denke, es bedarf auch einer Erklärung, dass die Sequenzwerte die Nenner der rationalen Approximationen sind.
xnor

5
Ich mag die Herausforderung, aber ich finde das, was der Beschreibung hinzugefügt wurde, immer noch verwirrend, da ich nicht viel über Musik weiß. Zum Beispiel weiß ich nicht, was 1-TET oder 4-TET sind, und bei Google scheint nichts zu erscheinen. Ich werde versuchen, eine Erklärung zu schreiben, wie ich diese Sequenz beschreiben würde.
xnor

3
@DannyuNDos Ah ja, das 12-Ton-Temperament ist gleich. Das ist mein Lieblingsinstrument
Jo King

2
@DannyuNDos Danke. Der Vergleich liegt also zwischen 1/2 und log2 (1.5), nicht zwischen 2 ^ (1/2) und 1.5. Das sollte im Text klarer gemacht werden
Luis Mendo

Antworten:


5

05AB1E , 19 18 Bytes

µ¯ßNLN/3.²<αßDˆ›D–

Probieren Sie es online aus!

µ                      # repeat until counter == input
 ¯                     #  push the global array
  ß                    #  get the minimum (let's call it M)
   N                   #  1-based iteration count
    L                  #  range 1..N
     N/                #  divide each by N
       3.²             #  log2(3)
          <            #  -1
           α           #  absolute difference with each element of the range
            ß          #  get the minimum
             Dˆ        #  add a copy to the global array
               ›       #  is M strictly greater than this new minimum?
                D–     #  if true, print N
                       #  implicit: if true, add 1 to the counter

1
Schöne Antwort, aber alles, was ich mich gerade frage, ist, warum die while-Schleife 1-basierte Indizes hat ..: S
Kevin Cruijssen

4

Wolfram Language (Mathematica) , 62 60 Bytes

Denominator@NestList[Rationalize[r=Log2@3,Abs[#-r]]&,2,#-1]&

Probieren Sie es online aus!


Wie viel Präzision?
Dannyu NDos

@DannyuNDos Diese Funktion verwendet exakte Werte, sodass Berechnungen mit beliebiger Genauigkeit durchgeführt werden können.
Attinat

Sie gewinnen die Herausforderung.
Dannyu NDos

5
@DannyuNDos warum eine Antwort so schnell annehmen? Es ist wohl auch besser, überhaupt keine Antwort zu akzeptieren.
Attinat

In Bezug auf die Gleitkommafehler, unter denen andere Sprachen leiden, möchte ich eine alternative Methode zur Zuordnung der Punktzahl vorstellen. Also warte.
Dannyu NDos


2

Python 2 , 92 Bytes

E=k=input()
n=0
while k:
 n+=1;e=abs((3.169925001442312*n-1)%2-1)/n
 if e<E:print n;E=e;k-=1

Probieren Sie es online aus!

3.1699250014423122log2(3)2 * numpy.log2(3)


1
Dies ergibt zwei zusätzliche Begriffe nach 665: ..., 665, (1995), (4655), 8286, ... Probieren Sie es online aus!
ousurous

@ Οurous Ja, das ist früher oder später für jede Sprache ohne unendliche Präzision ziemlich unvermeidlich, obwohl ich überrascht bin, dass es mit 32-Bit-Floats so früh aufgetaucht ist, wie Python es verwendet. Ich werde warten, bis der Herausforderungsschreiber geklärt hat, wie weit die Antworten funktionieren müssen.
xnor

Wäre es nicht weniger Zeichen 2 * numpy.log2(3)als die vollständig buchstabierte Zahl? (Oder noch besser numpy.log2(9))
JDL

@JDL, für die dieser Code erforderlich wäre: from numpy import*und log2(9).
Jonathan Allan

Ah, das ist es, was ich bekomme, wenn ich davon ausgehe, dass Python wie R funktioniert und Sie schreiben können, package::functionohne packagevorher zu laden !
JDL

2

Sauber , 128 111 108 Bytes

import StdEnv
c=ln 3.0/ln 2.0
?d=abs(toReal(toInt(c*d))/d-c)
$i=take i(iterate(\d=until((>)(?d)o?)inc d)1.0)

Probieren Sie es online aus!

Sollte bis zu den Grenzen des Real64-Bit-Typs mit doppelter Genauigkeit funktionieren .


2

MATL , 27 25 Bytes

1`@:@/Q3Zl-|X<hY<tdzG-}df

Probieren Sie es online aus!

Erläuterung

1       % Push 1. This initiallizes the vector of distances
  `     % Do...while
  @:    %   Range [1, 2, ..., k], where k is the iteration index, staring at 1
  @/    %   Divide by k, element-wise. Gives [1/k, 2/k, ..., 1]
  Q     %   Add 1, element-wise. Gives [(k+1/k, (k+2)/k, ..., 2]
  3Zl   %   Push log2(3)
  -|    %   Absolute difference, element-wise
  X<    %   Minimum
  h     %   Concatenate with vector of previous distances
  Y<    %   Cumulative minimum
  t     %   Duplicate
  dz    %   Consecutive differences, number of nonzeros. This tells how many
        %   times the cumulative minimum has decreased
  G-    %   Subtract input n. This is the loop condition. 0 means we are done
}       % Finally (execute on loop exit)
  d     %   Consecutive differences (of the vector of cumulative differences)
  f     %   Indices of nonzeros. This is the final result
        % End. A new iteration is executed if the top of the stack is nonzero
        % Implicit display

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.