Aproximado do quinto perfeito

10

Começando no 1-TET, forneça temperamentos iguais que tenham uma melhor e melhor aproximação do quinto perfeito (apenas proporção 3/2). ( Sequência OEIS A060528 )

A descrição formal da sequência, copiada do OEIS:

Uma lista de temperamentos iguais (divisões iguais da oitava) cujos passos de escala mais próximos são aproximações cada vez mais próximas das proporções de dois tons de harmonia musical: o 4º perfeito, 4/3 e seu complemento, o 5º perfeito, 3/2.

Observe que, por simetria, o quarto perfeito não importa.

Digamos que sabemos que 3 está na sequência. As frequências no 3-TET são:

2^0, 2^⅓, 2^⅔

Onde 2^⅔é a aproximação logarítmica mais próxima de 3/2.

É 4 na sequência? As frequências no 4-TET são:

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

Onde 2^½é a aproximação mais próxima de 3/2. Isso não é melhor do que 2^⅔, então 4 não está na sequência.

Por método semelhante, confirmamos que 5 está na sequência e assim por diante.

Quando um número inteiro é fornecido ncomo entrada, a saída deve ser os primeiros N números da sequência em ordem. Por exemplo, quando n = 7, a saída deve ser:

1 2 3 5 7 12 29

Descrição da sequência por xnor

A constante irracional log2(3)1.5849625007211563 pode ser aproximada por uma sequência de frações racionais

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

|pqlog2(3) |

n

Regras:

  1. Não importe a sequência A060528 diretamente.
  2. O formato não importa, desde que os números sejam distinguíveis. No exemplo acima, a saída também pode ser:

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

  3. Como este é um código-golfe, o código mais curto em bytes vence.

Dannyu NDos
fonte
5
Olá e bem-vindo ao Code Golf SE! Exigimos que todos os desafios sejam independentes; portanto, uma descrição aqui da sequência seria uma grande ajuda.
AdmBorkBork 24/09/19
5
Estou confuso com a descrição do OEIS. Também menciona a 4ª perfeita (relação 4/3), mas o desafio é sobre a 5ª perfeita (relação 3/2). Eu acho que também precisa ser explicado que os valores de sequência são os denominadores das aproximações racionais.
xnor
5
Gosto do desafio, mas acho as coisas adicionadas à descrição ainda confusas, sem saber muito sobre música. Por exemplo, não sei o que é 1-TET ou 4-TET e nada parece aparecer no Google. Vou tentar escrever uma explicação de como descreveria essa sequência.
xnor
3
@DannyuNDos Ah sim, o temperamento de 12 tons iguais. Esse é o meu instrumento favorito
Jo rei
2
@DannyuNDos Thanks. Portanto, a comparação é entre 1/2 e log2 (1,5), não entre 2 ^ (1/2) e 1,5. Isso deve ficar mais claro no texto
Luis Mendo

Respostas:

5

05AB1E , 19 18 bytes

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

Experimente 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
Grimmy
fonte
11
Resposta agradável, mas tudo o que eu estou querendo saber agora é por que o laço while tem 1 baseados em índices ..: S
Kevin Cruijssen
4

Wolfram Language (Mathematica) , 62 60 bytes

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

Experimente online!

attinat
fonte
Quanta precisão?
Dannyu NDos 25/09/19
@DannyuNDos Esta função usa valores exatos, para que os cálculos possam ser feitos com precisão arbitrária.
attinat 25/09/19
Você vence o desafio.
Dannyu NDos 25/09/19
5
@DannyuNDos por que aceitar uma resposta tão rapidamente? É também, sem dúvida, melhor não aceitar uma resposta em tudo ..
attinat
Com relação aos erros de ponto flutuante que outros idiomas estão sofrendo, eu gostaria de apresentar um método alternativo de atribuição de pontuação. Então espere.
Dannyu NDos 25/09/19
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

Experimente online!

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

xnor
fonte
11
Isso dá dois termos extras após o 665: ..., 665, (1995), (4655), 8286, ... Experimente online!
Οurous
@ Οurous Sim, isso é inevitável, mais cedo ou mais tarde, para qualquer idioma sem precisão infinita, embora eu esteja surpreso que ele tenha aparecido tão cedo com flutuadores de 32 bits, como o Python usa. Vou esperar que o escritor do desafio esclareça até que ponto as respostas precisam funcionar.
xnor
não haveria menos caracteres para usar 2 * numpy.log2(3)do que o número totalmente escrito? (Ou melhor ainda numpy.log2(9))
JDL
@JDL que exigiria este código: from numpy import*e log2(9).
Jonathan Allan
ah, é o que recebo ao assumir que o python funciona como R e você pode escrever package::functionsem carregar packageprimeiro!
JDL
2

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

Experimente online!

Deve funcionar até os limites do Realtipo de precisão dupla de 64 bits.

Furioso
fonte
2

MATL , 27 25 bytes

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

Experimente online!

Explicação

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

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

Corrigido o seguinte comentário, pode ser melhorado ...

-7 bytes graças ao Grimy

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

Experimente online!

Nahuel Fouilleul
fonte
aqui está 71
Grimmy