Приблизительно идеальная пятая

10

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

Формальное описание последовательности, скопированное из OEIS:

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

Обратите внимание, что по симметрии идеальный четвертый не имеет значения.

Допустим, мы знаем, что 3 в последовательности. Частоты в 3-ТЕТ:

2^0, 2^⅓, 2^⅔

Где 2^⅔ближайшее логарифмическое приближение 3/2.

4 в последовательности? Частоты в 4-ТЕТ:

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

Где 2^½находится ближайшее приближение 3/2. Это не лучше, чем 2^⅔4, поэтому не в последовательности.

Аналогичным способом мы подтверждаем, что 5 находится в последовательности, и так далее.

Когда в nкачестве входных данных задано целое число , выходные данные должны быть по порядку первыми N числами последовательности. Например, когда n = 7результат должен быть:

1 2 3 5 7 12 29

Описание последовательности от xnor

Иррациональная константа может быть аппроксимирована последовательностью рациональных дробейжурнал2(3)1,5849625007211563...

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

Фракция включается в последовательность, если она является новой ближайшей по абсолютному расстояниюто есть ближе, чем любая другая дробь с меньшим или равным знаменателем.|пQ-журнал2(3) |

Ваша цель - вывести первые знаменателей по порядку. Это последовательность A060528 ( таблица ). Числители (не обязательно) даны в A254351 ( таблица )N

Правила:

  1. Не импортируйте последовательность A060528 напрямую.
  2. Формат не имеет значения, пока цифры различимы. В приведенном выше примере выходные данные также могут быть:

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

  3. Поскольку это код-гольф, выигрывает самый короткий код в байтах.

Dannyu NDos
источник
5
Привет и добро пожаловать в Code Golf SE! Мы требуем, чтобы все проблемы были автономными, поэтому описание этой последовательности будет очень полезным.
AdmBorkBork
5
Я смущен описанием от OEIS. В нем также упоминается идеальный 4-й (соотношение 4/3), но задача о идеальных 5-х (соотношение 3/2). Я думаю, что также необходимо объяснить, что значения последовательности являются знаменателями рациональных приближений.
xnor
5
Мне нравится этот вызов, но я нахожу вещи, добавленные в описание, по-прежнему запутывающими, не очень разбираясь в музыке. Например, я не знаю, что такое 1-TET или 4-TET, и, похоже, в Google ничего не появляется. Я попытаюсь написать объяснение того, как я описал бы эту последовательность.
xnor
3
@DannyuNDos Ах да, 12-тональный равный темперамент. Это мой любимый инструмент
Джо Кинг,
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
Grimmy
источник
1
Хороший ответ, но сейчас меня интересует только то, почему цикл while имеет индексы, основанные на 1 ..: S
Кевин Круйссен,
4

Wolfram Language (Mathematica) , 62 60 байт

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

Попробуйте онлайн!

attinat
источник
Сколько точности?
Dannyu NDos
@DannyuNDos Эта функция использует точные значения, поэтому вычисления можно выполнять с произвольной точностью.
attinat
Вы выиграли испытание.
Dannyu NDos
5
@DannyuNDos почему принять ответ так быстро? Также, возможно, лучше вообще не принимать ответ ..
attinat
Что касается ошибок с плавающей запятой, от которых страдают другие языки, я хотел бы представить альтернативный метод распределения оценки. Так что держись.
Dannyu NDos
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).

XNOR
источник
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).
Джонатан Аллан
ах, это то, что я получаю, полагая, что python работает как R, и вы можете писать package::functionбез предварительной загрузки package!
JDL
2

Чисто , 128 111 108 байт

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)

Попробуйте онлайн!

Должен работать до пределов Real64-битного типа с двойной точностью.

Οurous
источник
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
Луис Мендо
источник
2

Perl 5 ( -MPOSIX=log2 -M5.01 -n), 73 , 78 , 71 байт

Исправлено после комментария, может быть улучшено ...

-7 байт благодаря Грими

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

Попробуйте онлайн!

Науэль Фуйе
источник
вот 71
Grimmy