Приблизно ідеальна п’ята частина


10

Починаючи з 1-TET, дайте рівні темпераменти, які мають кращу та кращу наближення до ідеальної п’ятої (справедливе співвідношення 3/2). ( Послідовність OEIS A060528 )

Офіційний опис послідовності, скопійованої з OEIS:

Перелік рівних темпераментів (рівних поділів октави), найближчі до яких масштабні кроки - це все ближче та ближче наближення до співвідношень двох тонів музичної гармонії: ідеального 4-го, 4/3 та його доповнення досконалого 5-го, 3/2.

Зауважте, що за симетрією ідеальний четвертий не має значення.

Скажімо, ми знаємо, що 3 є в послідовності. Частоти в 3-TET:

2^0, 2^⅓, 2^⅔

Де 2^⅔найближче логарифмічне наближення 3/2.

Чи 4 у послідовності? Частоти в 4-TET:

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

Де 2^½найближче наближення 3/2. Це не краще ніж 2^⅔, тому 4 не в послідовності.

Аналогічним методом ми підтверджуємо, що 5 знаходиться в послідовності тощо.

Якщо задано ціле число nяк вхід, вихід повинен бути першими N числами послідовності в порядку. Наприклад, коли n = 7, вихід повинен бути:

1 2 3 5 7 12 29

Опис послідовності по xnor

Ірраціональна константа log2(3)1.5849625007211563 можна наблизити послідовністю раціональних дробів

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

Частка включається в послідовність, якщо це нова найближча за абсолютною відстані |pqlog2(3) |, тобто ближче, ніж будь-який інший дріб з меншим або рівним знаменником.

Ваша мета - вивести перший nзнаменники по порядку. Це послідовність A060528 ( таблиця ). Чисельники (не обов'язково) задаються A254351 ( таблиця )

Правила:

  1. Не імпортуйте послідовність A060528 безпосередньо.
  2. Формат не має значення, якщо номери відрізняються. У наведеному вище прикладі вихід також може бути:

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

  3. Оскільки це код-гольф, виграє найкоротший код у байтах.


5
Привіт і ласкаво просимо до Code Golf SE! Ми вимагаємо, щоб усі виклики були самостійними, тому опис послідовності тут був би чудовою підмогою.
AdmBorkBork

5
Мене бентежить опис від OEIS. Тут також згадується ідеальний 4-й (співвідношення 4/3), але проблема полягає в ідеальних 5-х (співвідношення 3/2). Я думаю, що це також потребує пояснення, що значення послідовностей є знаменниками раціональних наближень.
xnor

5
Мені подобається виклик, але я вважаю, що додані до опису речі все ще плутають, не знаючи багато про музику. Наприклад, я не знаю, що таке 1-TET або 4-TET, і ніби нічого не відображається в Google. Я спробую написати пояснення, як я описав би цю послідовність.
xnor

3
@DannyuNDos Ага так, 12-тонний темперамент рівний. Це мій улюблений інструмент
Jo King,

2
@DannyuNDos Спасибі Отже порівняння між 1/2 і log2 (1.5), а не між 2 ^ (1/2) та 1.5. Це має бути зрозумілішим у тексті
Луїс Мендо,

Відповіді:


5

05AB1E , 19 18 байт

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

Спробуйте в Інтернеті!

µ                      # 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
Приємна відповідь, але все, що мені зараз цікаво, це те, чому цикл while має 1-й індекс ..: S
Кевін Круїссен

4

Мова Вольфрама (Mathematica) , 62 60 байт

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

Спробуйте в Інтернеті!


Скільки точності?
Dannyu NDos

@DannyuNDos Ця функція використовує точні значення, тому обчислення можна проводити з довільною точністю.
attinat

Ви виграєте виклик.
Dannyu NDos

5
@DannyuNDos чому швидко прийняти відповідь на це? Можливо, також краще взагалі не приймати відповідь ..
attinat

Щодо помилок з плаваючою комою страждають інші мови, я хотів би представити альтернативний метод розподілу балів. Тож тримайся.
Данью НДо


2

Python 2 , 92 байти

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

Спробуйте в Інтернеті!

Використовує константу 3.169925001442312для2журнал2(3). Я не був впевнений, скільки цифр точності потрібно, оскільки неточність порушить послідовність з часом, тому я використав повну точність поплавця 2 * numpy.log2(3).


1
Це дає два додаткові умови після 665: ..., 665, (1995), (4655), 8286, ... Спробуйте в Інтернеті!
Οurous

@ Οurous Так, це набагато неминуче рано чи пізно для будь-якої мови без нескінченної точності, хоча я здивований, що вона з'явилася так рано 32-бітовими плавцями, як використовує Python. Я зачекаю, коли письменник-виклик уточнить, наскільки потрібні відповіді.
xnor

не було б менше символів для використання, 2 * numpy.log2(3)а не цілком прописане число? (Або ще краще, numpy.log2(9))
JDL

@JDL, який потребує цього коду: from numpy import*і log2(9).
Джонатан Аллан

ах, це те, що я отримую, якщо припустити, що пітон працює як R, і ви можете писати, package::functionне завантажуючи packageспочатку!
JDL


2

MATL , 27 25 байт

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

Спробуйте в Інтернеті!

Пояснення

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.