Perkirakan kelima sempurna


10

Mulai dari 1-TET, berikan temperamen yang sama yang memiliki perkiraan yang lebih baik dan lebih baik dari kelima sempurna (rasio hanya 3/2). ( Urutan OEIS A060528 )

Deskripsi formal urutan, disalin dari OEIS:

Daftar temperamen yang sama (pembagian yang sama dari oktaf) yang langkah skala terdekatnya mendekati dan mendekati perkiraan rasio dua nada harmoni musik: nada ke-4, 4/3 dan pelengkap nada ke-5, 3/2 yang sempurna.

Perhatikan bahwa dengan simetri, keempat sempurna tidak masalah.

Katakanlah kita tahu bahwa 3 ada dalam urutan. Frekuensi dalam 3-TET adalah:

2^0, 2^⅓, 2^⅔

Di mana perkiraan logaritmik2^⅔ terdekat .3/2

Apakah 4 berurutan? Frekuensi dalam 4-TET adalah:

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

Di mana 2^½perkiraan terdekat dari 3/2. Ini tidak lebih baik daripada 2^⅔, jadi 4 tidak berurutan.

Dengan metode yang sama, kami mengkonfirmasi bahwa 5 ada dalam urutan, dan seterusnya.

Ketika diberi bilangan bulat nsebagai input, output harus menjadi nomor N pertama dari urutan secara berurutan. Misalnya, kapan n = 7, output harus:

1 2 3 5 7 12 29

Deskripsi urutan oleh xnor

Konstanta irasional dapat didekati dengan urutan fraksi rasionallog2⁡(3)≈1.5849625007211563…

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

Sebagian kecil dimasukkan dalam urutan jika yang baru terdekat dengan jarak absolut, yaitu, lebih dekat daripada fraksi lain dengan penyebut yang lebih kecil atau sama.|pq−log2⁡(3) |

Tujuan Anda adalah untuk output pertama penyebut dalam rangka. Ini adalah urutan A060528 ( tabel ). Pembilang (tidak wajib) diberikan oleh A254351 ( tabel )n

Aturan:

  1. Jangan mengimpor urutan A060528 secara langsung.
  2. Formatnya tidak masalah asalkan angkanya dapat dibedakan. Pada contoh di atas, outputnya juga bisa:

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

  3. Karena ini adalah kode-golf, kode terpendek dalam byte akan menang.


5
Hai dan selamat datang di Code Golf SE! Kami mengharuskan semua tantangan mandiri, sehingga uraian di sini tentang urutannya akan sangat membantu.
— AdmBorkBork

5
Saya bingung dengan deskripsi dari OEIS. Ia menyebutkan angka 4 sempurna (rasio 4/3), tetapi tantangannya adalah angka 5 sempurna (rasio 3/2). Saya pikir itu juga perlu penjelasan bahwa nilai-nilai urutan adalah penyebut dari pendekatan rasional.
— xnor

5
Saya suka tantangan, tetapi saya menemukan hal-hal yang ditambahkan ke deskripsi masih membingungkan, tidak tahu banyak tentang musik. Misalnya, saya tidak tahu apa itu 1-TET atau 4-TET, dan sepertinya tidak ada yang muncul di Google. Saya akan mencoba menulis penjelasan tentang bagaimana saya menggambarkan urutan ini.
— xnor

3
@DannyuNDos Ah ya, temperamennya sama 12-nada. Itu instrumen favorit saya
— Jo King

2
@DannyuNDos Terima kasih. Jadi perbandingannya adalah antara 1/2 dan log2 (1.5), bukan antara 2 ^ (1/2) dan 1.5. Itu harus diperjelas dalam teks
— Luis Mendo

Jawaban:


5

05AB1E , 19 18 byte

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

Cobalah 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

1
Jawaban yang bagus, tetapi semua yang saya
— pikirkan

4

Bahasa Wolfram (Mathematica) , 62 60 byte

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

Cobalah online!


Berapa presisi?
— Dannyu NDos

@DannyuNDos Fungsi ini menggunakan nilai yang tepat, sehingga perhitungan dapat dilakukan untuk presisi yang sewenang-wenang.
— attinat

Anda memenangkan tantangan.
— Dannyu NDos

5
@DannyuNDos mengapa menerima jawaban ini dengan cepat? Mungkin juga lebih baik tidak menerima jawaban sama sekali ..
— attinat

Mengenai kesalahan floating-point bahasa lain menderita, saya ingin menyajikan metode alternatif pemberian skor. Jadi tunggu sebentar.
— Dannyu NDos


2

Python 2 , 92 byte

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

Cobalah online!

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


1
Ini memberikan dua ketentuan tambahan setelah 665: ..., 665, (1995), (4655), 8286, ... Cobalah online!
— Οurous

@ Οurous Ya, itu cukup cepat atau lambat tidak bisa dihindari untuk bahasa apa pun tanpa ketepatan tak terbatas, meskipun saya terkejut itu muncul begitu cepat dengan pelampung 32-bit seperti yang digunakan Python. Saya akan menunggu penulis tantangan untuk menjelaskan seberapa jauh jawaban perlu bekerja.
— xnor

bukankah lebih sedikit karakter yang digunakan 2 * numpy.log2(3)daripada angka yang dieja sepenuhnya? (Atau lebih baik lagi, numpy.log2(9))
— JDL

@JDL yang membutuhkan kode ini: from numpy import*dan log2(9).
— Jonathan Allan

ah, itu yang saya dapat dengan asumsi python bekerja seperti R dan Anda bisa menulis package::functiontanpa memuat packagedulu!
— JDL

2

Bersih , 128 111 108 byte

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)

Cobalah online!

Harus bekerja hingga batas Realtipe presisi ganda 64-bit.


2

MATL , 27 25 byte

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

Cobalah online!

Penjelasan

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.