Mükemmel beşinci yaklaşık


10

1-TET'ten başlayarak, mükemmel beşinci daha iyi ve daha iyi yaklaşıma sahip eşit mizaçlar verin (sadece 3/2 oranı). ( OEIS dizisi A060528 )

OEIS'ten kopyalanan dizinin resmi açıklaması:

En yakın ölçek basamakları iki ton müzikal uyum oranlarına daha yakın ve daha yakın olan eşit mizaçların (oktavın eşit bölümleri) bir listesi: mükemmel 4., 4/3 ve tamamlayıcısı mükemmel 5., 3/2.

Simetri ile mükemmel dördün önemli olmadığını unutmayın.

Diyelim ki 3 sırada. 3-TET'teki frekanslar şunlardır:

2^0, 2^⅓, 2^⅔

2^⅔En yakın logaritmik yaklaşımı nerede 3/2.

4 sırayla mı? 4-TET'teki frekanslar:

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

2^½En yakın yaklaşım nerede 3/2. Bu daha iyi değil 2^⅔, bu yüzden 4 sırada değil.

Benzer yöntemle, 5'in dizide olduğunu teyit ederiz, vb.

nGiriş olarak bir tamsayı verildiğinde , çıktı sırayla sekansın ilk N sayısı olmalıdır. Örneğin n = 7, çıktı ne zaman olmalıdır:

1 2 3 5 7 12 29

Xnor tarafından dizi açıklaması

İrrasyonel sabit bir dizi rasyonel yaklaşık olarak tahmin edilebilirlog2(3)1.5849625007211563

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

Mutlak mesafeye göre en yakın olanı diziye bir kesir dahil ediliryani daha küçük veya eşit paydaya sahip diğer tüm kesirlerden daha yakındır.|pqlog2(3) |

Amacınız ilk paydaları sırayla çıkarmaktır. Bunlar A060528 sekansıdır ( tablo ). Paylar ( gerekli değil) A254351 tarafından verilmiştir ( tablo )n

Kurallar:

  1. A060528 sekansını doğrudan içe aktarmayın.
  2. Sayılar ayırt edilebilir olduğu sürece biçim önemli değildir. Yukarıdaki örnekte, çıktı ayrıca şunlar da olabilir:

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

  3. Bu bir kod golf olduğundan, bayttaki en kısa kod kazanır.


5
Merhaba ve Code Golf SE'ye hoş geldiniz! Tüm zorlukların kendi kendine yetmesini gerektiririz, bu nedenle dizinin açıklaması çok yardımcı olacaktır.
AdmBorkBork

5
OEIS'in tanımından kafam karıştı. Mükemmel 4.'den de (oran 4/3) bahsediyor, ancak zorluk yaklaşık 5'inci (oran 3/2). Bence sekans değerlerinin rasyonel yaklaşımların paydaları olduğunu da açıklamak gerekiyor.
xnor

5
Ben meydan okumayı seviyorum, ama açıklamaya eklenen şeyleri hala kafa karıştırıcı buluyorum, müzik hakkında çok şey bilmiyorum. Örneğin, 1-TET veya 4-TET'in ne olduğunu bilmiyorum ve Google'da hiçbir şey görünmüyor. Bu diziyi nasıl tarif edeceğime dair bir açıklama yazmaya çalışacağım.
xnor

3
@DannyuNDos Ah evet, 12 tonlu eşit mizaç. Bu benim en sevdiğim enstrüman
Jo King

2
@DannyuNDos Teşekkürler. Dolayısıyla karşılaştırma 1/2 ve log2 (1.5) arasındadır, 2 ^ (1/2) ve 1.5 arasında değildir. Bu metinde daha
açıklığa

Yanıtlar:


5

05AB1E , 19 18 bayt

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

Çevrimiçi deneyin!

µ                      # 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
Güzel cevap, ama şu anda merak ettiğim tek şey, while döngüsü neden 1 tabanlı endekslere sahip ..: S
Kevin Cruijssen

4

Wolfram Dili (Mathematica) , 62 60 bayt

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

Çevrimiçi deneyin!


Kaç hassasiyet?
Dannyu NDos

@DannyuNDos Bu işlev kesin değerler kullanır, bu nedenle hesaplamalar keyfi hassasiyet için yapılabilir.
attinat

Sen meydan kazanmak.
Dannyu NDos

5
@DannyuNDos bu soruyu neden hızlı bir şekilde kabul ediyorsunuz? Bir cevabı hiç kabul etmemek de tartışmasız daha iyi ..
attinat

Kayan nokta hataları ile ilgili olarak, diğer diller acı çekiyor, puan ayırmak için alternatif bir yöntem sunmak istiyorum. Bekle.
Dannyu NDos


2

Python 2 , 92 bayt

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

Çevrimiçi deneyin!

Sabitini kullanır 3.169925001442312için2log2(3). Kaç basamak doğruluk rakamı gerektiğinden emin değildim, çünkü yanlışlık sonunda diziyi kıracak, bu yüzden tam şamandıra hassasiyetini kullandım 2 * numpy.log2(3).


1
Bu, 665'ten sonra iki ekstra terim verir: ..., 665, (1995), (4655), 8286, ... Çevrimiçi deneyin!
19:31

@ Οurous Evet, bu er ya da geç sonsuz hassasiyet olmadan herhangi bir dil için hemen hemen kaçınılmazdır. Meydan okuma yazarının cevapların ne kadar çalışması gerektiğini netleştirmesini bekleyeceğim.
xnor

2 * numpy.log2(3)Tamamen hecelenen sayıdan ziyade daha az karakter kullanmak olmaz mıydı ? (Ya da daha iyisi, numpy.log2(9))
JDL

@JDL için şu kod gerekir: from numpy import*ve log2(9).
Jonathan Allan

ah, Python'un R gibi çalıştığını varsayarak aldığım şey budur ve önce package::functionyüklemeden yazabilirsiniz package!
JDL

2

Temiz , 128 111 108 bayt

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)

Çevrimiçi deneyin!

Real64-bit çift kesinlikli tip sınırlarına kadar çalışmalıdır .


2

MATL , 27 25 bayt

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

Çevrimiçi deneyin!

açıklama

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.