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.|pqlog2(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.

Dannyu NDos
sumber
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
Grimmy
sumber
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!

attinat
sumber
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
4

JavaScript (V8) , 81 80 78 byte

-2 byte terima kasih Arnauld!

n=>{for(d=g=1;w=Math.log2(3),w+=~(w*g-.5)/g,n--;g++)w*w<d?d=print(g)||w*w:n++}

Cobalah online!

Shieru Asakoto
sumber
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)

Tidak
sumber
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.

Suram
sumber
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
Luis Mendo
sumber
2

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

Memperbaiki komentar berikut, dapat ditingkatkan ...

-7 byte terima kasih kepada Grimy

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

Cobalah online!

Nahuel Fouilleul
sumber
inilah 71
Grimmy