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|pq−log2⁡(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.