Przybliż idealną piątą

10

Zaczynając od 1-TET, dawaj równe temperamenty, które mają coraz lepsze przybliżenie idealnej piątej (tylko stosunek 3/2). ( Sekwencja OEIS A060528 )

Formalny opis sekwencji, skopiowany z OEIS:

Lista równych temperamentów (równe podziały oktawy), których najbliższe kroki skali są coraz bliższe stosunkom dwóch tonów muzycznej harmonii: idealnej 4., 4/3 i jej uzupełnienia idealnej 5., 3/2.

Zauważ, że dzięki symetrii idealny czwarty nie ma znaczenia.

Powiedzmy, że wiemy, że 3 jest w sekwencji. Częstotliwości w 3-TET to:

2^0, 2^⅓, 2^⅔

Gdzie 2^⅔jest najbliższe logarytmiczne przybliżenie 3/2.

Czy 4 w sekwencji? Częstotliwości w 4-TET to:

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

Gdzie 2^½jest najbliższe przybliżenie 3/2. Nie jest to lepsze niż 2^⅔, więc 4 nie ma w sekwencji.

Podobną metodą potwierdzamy, że 5 jest w sekwencji i tak dalej.

Gdy podana jest liczba całkowita njako dane wejściowe, wyjściem musi być pierwsze N ​​liczb w sekwencji w kolejności. Na przykład, kiedy n = 7dane wyjściowe powinny być:

1 2 3 5 7 12 29

Opis sekwencji według xnor

Stałą irracjonalną można aproksymować sekwencją ułamków wymiernychlog2)(3))1.5849625007211563

2)1,3)2),53),85,117,1912,4629,

Ułamek jest zawarty w sekwencji, jeśli jest to nowy najbliższy według odległości bezwzględnej, czyli bliżej niż jakakolwiek inna frakcja o mniejszym lub równym mianowniku.|pq-log2)(3)) |

Twoim celem jest wyprowadzenie pierwszych mianowników w kolejności. Są to sekwencje A060528 ( tabela ). Liczniki ( nie wymagane) są podane przez A254351 ( tabela )n

Zasady:

  1. Nie importuj bezpośrednio sekwencji A060528.
  2. Format nie ma znaczenia, dopóki liczby są rozróżnialne. W powyższym przykładzie dane wyjściowe mogą być również:

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

  3. Ponieważ jest to golfowy kod, wygrywa najkrótszy kod w bajtach.

Dannyu NDos
źródło
5
Witaj w Code Golf SE! Wymagamy, aby wszystkie wyzwania były samowystarczalne, więc opis sekwencji byłby bardzo pomocny.
AdmBorkBork
5
Jestem zdziwiony opisem z OEIS. Wspomina także o doskonałej czwartej pozycji (stosunek 4/3), ale wyzwanie dotyczy idealnej piątej pozycji (stosunek 3/2). Myślę, że należy również wyjaśnić, że wartości sekwencji są mianownikami racjonalnych przybliżeń.
xnor
5
Lubię wyzwanie, ale uważam, że elementy dodane do opisu są nadal mylące, nie wiedząc wiele o muzyce. Na przykład nie wiem, co to są 1-TET lub 4-TET i nic nie wydaje się pojawiać w Google. Spróbuję napisać wyjaśnienie, jak opisałbym tę sekwencję.
xnor
3
@DannyuNDos Ach tak, 12-tonowy równy temperament. To mój ulubiony instrument
Jo King
2
@DannyuNDos Dzięki. Porównanie jest więc między 1/2 a log2 (1,5), a nie między 2 ^ (1/2) a 1,5. Należy to wyjaśnić w tekście
Luis Mendo

Odpowiedzi:

5

05AB1E , 19 18 bajtów

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

Wypróbuj online!

µ                      # 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
Ponury
źródło
1
Dobra odpowiedź, ale teraz zastanawiam się, dlaczego pętla while ma indeksy oparte na 1 ..: S
Kevin Cruijssen
4

Wolfram Language (Mathematica) , 62 60 bajtów

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

Wypróbuj online!

attinat
źródło
Ile precyzji?
Dannyu NDos
@DannyuNDos Ta funkcja używa dokładnych wartości, więc obliczenia można wykonywać z dowolną dokładnością.
attinat
Wygrywasz wyzwanie.
Dannyu NDos
5
@DannyuNDos, dlaczego akceptują odpowiedź tak szybko? Prawdopodobnie lepiej w ogóle nie przyjmować odpowiedzi ..
attinat
Jeśli chodzi o błędy zmiennoprzecinkowe, na które cierpią inne języki, chciałbym przedstawić alternatywną metodę przydzielania punktów. Więc trzymaj się.
Dannyu NDos
2

Python 2 , 92 bajty

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

Wypróbuj online!

Wykorzystuje stałą 3.169925001442312dla2)log2)(3)). Nie byłem pewien, ile cyfr dokładności jest wymaganych, ponieważ niedokładność ostatecznie złamie sekwencję, więc użyłem pełnej precyzji zmiennoprzecinkowej 2 * numpy.log2(3).

xnor
źródło
1
Daje to dwa dodatkowe warunki po 665: ..., 665, (1995), (4655), 8286, ... Wypróbuj online!
Οurous,
@ Οurous Tak, prędzej czy później jest to nieuniknione dla każdego języka bez nieskończonej precyzji, choć jestem zaskoczony, że pojawił się tak wcześnie z 32-bitowymi zmiennoprzecinkowymi wersjami, jak używa Python. Poczekam, aż autor wyzwania wyjaśni, jak daleko muszą zadziałać odpowiedzi.
xnor
czy nie byłoby mniej znaków do użycia 2 * numpy.log2(3)niż pełna liczba? (Lub nawet lepiej numpy.log2(9))
JDL
@JDL, który wymagałby tego kodu: from numpy import*i log2(9).
Jonathan Allan,
ach, to jest to, co otrzymuję za założenie, że python działa jak R i możesz pisać package::functionbez ładowania packagenajpierw!
JDL
2

Czysty , 128 111 108 bajtów

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)

Wypróbuj online!

Powinien działać do granic Real64-bitowego typu podwójnej precyzji.

Obrzydliwe
źródło
2

MATL , 27 25 bajtów

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

Wypróbuj online!

Wyjaśnienie

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
Luis Mendo
źródło
2

Perl 5 ( -MPOSIX=log2 -M5.01 -n), 73 , 78 , 71 bajtów

Naprawiono następujący komentarz, można poprawić ...

-7 bajtów dzięki Grimy

$o=abs$d-(0|.5+($d=log2 3)*++$;)/$;;$@=$o,$_-=say$;if!$@|$o<$@;$_&&redo

Wypróbuj online!

Nahuel Fouilleul
źródło
oto 71
Grimmy