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