Aproxima el quinto perfecto

10

Comenzando en 1-TET, proporcione temperamentos iguales que tengan una aproximación cada vez mejor del quinto perfecto (solo relación 3/2). ( Secuencia OEIS A060528 )

La descripción formal de la secuencia, copiada del OEIS:

Una lista de temperamentos iguales (divisiones iguales de la octava) cuyos pasos de escala más cercanos son aproximaciones cada vez más cercanas a las proporciones de dos tonos de armonía musical: el 4º perfecto, 4/3 y su complemento el 5º, 3/2 perfecto.

Tenga en cuenta que por simetría, el cuarto perfecto no importa.

Digamos que sabemos que 3 está en la secuencia. Las frecuencias en 3-TET son:

2^0, 2^⅓, 2^⅔

¿Dónde 2^⅔está la aproximación logarítmica más cercana de 3/2.

¿Es 4 en la secuencia? Las frecuencias en 4-TET son:

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

¿Dónde 2^½está la aproximación más cercana de 3/2. Esto no es mejor que 2^⅔, entonces 4 no está en la secuencia.

Por un método similar, confirmamos que 5 está en la secuencia, y así sucesivamente.

Cuando se le da un entero ncomo entrada, la salida debe ser los primeros N números de la secuencia en orden. Por ejemplo, cuándo n = 7, la salida debería ser:

1 2 3 5 7 12 29

Descripción de la secuencia por xnor

La constante irracional se puede aproximar mediante una secuencia de fracciones racionalesIniciar sesión2(3)1.5849625007211563

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

Se incluye una fracción en la secuencia si es la nueva más cercana por distancia absoluta, es decir, más cerca que cualquier otra fracción con un denominador menor o igual.|pqlog2(3) |

Su objetivo es generar los primeros denominadores en orden. Estas son la secuencia A060528 ( tabla ). Los numeradores (no necesarios) están dados por A254351 ( tabla )n

Reglas:

  1. No importe la secuencia A060528 directamente.
  2. El formato no importa siempre que los números sean distinguibles. En el ejemplo anterior, la salida también puede ser:

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

  3. Como se trata de un código de golf, gana el código más corto en bytes.

Dannyu NDos
fuente
55
¡Hola y bienvenido a Code Golf SE! Requerimos que todos los desafíos sean autónomos, por lo que una descripción aquí de la secuencia sería de gran ayuda.
AdmBorkBork
55
Estoy confundido por la descripción de OEIS. También menciona el 4to perfecto (relación 4/3), pero el desafío se trata de los 5tos perfectos (relación 3/2). Creo que también necesita explicación de que los valores de secuencia son los denominadores de las aproximaciones racionales.
xnor
55
Me gusta el desafío, pero encuentro que las cosas agregadas a la descripción siguen siendo confusas, sin saber mucho sobre música. Por ejemplo, no sé qué son 1-TET o 4-TET, y nada parece aparecer en Google. Intentaré escribir una explicación de cómo describiría esta secuencia.
xnor
3
@DannyuNDos Ah sí, el temperamento igual de 12 tonos. Ese es mi instrumento favorito
Jo King
2
@DannyuNDos Gracias. Entonces, la comparación es entre 1/2 y log2 (1.5), no entre 2 ^ (1/2) y 1.5. Eso debería aclararse en el texto
Luis Mendo, el

Respuestas:

5

05AB1E , 19 18 bytes

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

Pruébalo en línea!

µ                      # 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
Mugriento
fuente
1
Buena respuesta, pero todo lo que me pregunto ahora es por qué el ciclo while tiene índices basados ​​en 1 ... S
Kevin Cruijssen
4

Wolfram Language (Mathematica) , 62 60 bytes

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

Pruébalo en línea!

attinat
fuente
¿Cuánta precisión?
Dannyu NDos
@DannyuNDos Esta función utiliza valores exactos, por lo que los cálculos se pueden realizar con precisión arbitraria.
attinat
Tú ganas el desafío.
Dannyu NDos
55
@DannyuNDos ¿por qué aceptar una respuesta tan rápido? También es posiblemente mejor no aceptar una respuesta en absoluto ...
attinat
Con respecto a los errores de coma flotante que sufren otros idiomas, me gustaría presentar un método alternativo de asignación de puntaje. Así que aguanta.
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

Pruébalo en línea!

3.1699250014423122Iniciar sesión2(3)2 * numpy.log2(3)

xnor
fuente
1
Esto le da dos términos adicionales después del 665: ¡ ..., 665, (1995), (4655), 8286, ... Pruébelo en línea!
Pesado el
@ Οurous Sí, eso es casi inevitable tarde o temprano para cualquier idioma sin precisión infinita, aunque me sorprende que apareciera tan pronto con flotantes de 32 bits como Python utiliza. Esperaré a que el escritor del desafío aclare hasta qué punto las respuestas deben funcionar.
xnor
¿no serían menos caracteres para usar en 2 * numpy.log2(3)lugar del número completamente enunciado? (O incluso mejor numpy.log2(9))
JDL
@JDL que requeriría este código: from numpy import*y log2(9).
Jonathan Allan
¡Ah, eso es lo que obtengo por suponer que Python funciona como R y puedes escribir package::functionsin cargar packageprimero!
JDL
2

Limpias , 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)

Pruébalo en línea!

Debería funcionar hasta los límites del Realtipo de doble precisión de 64 bits de.

Οurous
fuente
2

MATL , 27 25 bytes

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

Pruébalo en línea!

Explicación

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
fuente
2

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

Se corrigió el siguiente comentario, se puede mejorar ...

-7 bytes gracias a Grimy

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

Pruébalo en línea!

Nahuel Fouilleul
fuente