Да, вы правильно прочитали название. играть звук пи.
Более конкретно, для каждой цифры числа пи в первой 1000-й сопоставьте ее с музыкальной нотой и выведите полученную мелодию в файл.
По существу, каждая цифра превращается в примечание по шкале мажора (в основном, по обычной шкале). 1 поворачивается к середине C, 2 - к D4, 3 - к E4, 9 - к D5 и так далее.
правила
- Каждая нота должна быть ровно 0,5 секунды.
- Мелодия должна содержать первые 1000 цифр числа Пи, включая начальные 3.
- От 1 до 7 обозначают среднее значение от C до B4, 8 обозначает C5, 9 обозначает D5 и 0 обозначает E5
- Разрешены все хорошо поддерживаемые форматы файлов, если они были созданы до этого испытания.
- Там может быть никаких пауз в любом месте файла, включая начало и конец.
- Играемый инструмент не имеет значения. Это может быть пианино, синусоида, что угодно, если только правильный звук легко услышать.
- Он не должен принимать никаких входных данных и не производить никаких выходных данных, кроме файла. Чтение из других файлов запрещено.
- Стандартные лазейки запрещены.
Пример кода Mathematica:
(*please forgive me for this horrible, horrible mess of code*)
digits = RealDigits[Pi, 10, 1000][[1]] /. {0 -> 10};
weights = {0, 2, 4, 5, 7, 9, 11, 12, 14, 16};
melody = {};
For[i = 1, i < 1001, i++, melody = {melody , Sound[SoundNote[weights[[digits[[i]]]], 0.5]]}]
final = Sound[Flatten[melody]];
Export["C:\\Mathematica Shenanigans\\pi.wav", final];
Пример мелодии, показывающей первые 100 цифр: http://vocaroo.com/i/s0cfEILwYb8M
Для вашего здравого смысла: Таблица высот для каждой ноты и какая нота представляет каждую цифру:
Digit 1: C: 261.63 Hz
Digit 2: D: 293.66 Hz
Digit 3: E: 329.63 Hz
Digit 4: F: 349.23 Hz
Digit 5: G: 392.00 Hz
Digit 6: A: 440.00 Hz
Digit 7: B: 493.88 Hz
Digit 8: C5: 523.25 Hz
Digit 9: D5: 587.33 Hz
Digit 0: E5: 659.25 Hz
code-golf
kolmogorov-complexity
pi
audio
sagiksp
источник
источник
4
-ой октаве. Кроме того, в вашей таблице цифра0
стоит последней (E5
)?Ответы:
Mathematica,
10787 байтСпасибо Мартину Эндеру за сохранение 20 байтов!
#&@@RealDigits[Pi,10,1000]
дает список первых 1000 цифр π.SoundNote[⌊12Mod[#,10,1]/7⌋-1
выдает правильный номер шага (где 0 - средний C по умолчанию) из цифры. ЗатемSoundNote[...,.5]&/@
превращает это название в звуковой объект длительностью 1/2 секунды, которыйSound
собирается в реальный звуковой фрагмент. Наконец,"t.au"~Export~
экспортируется в файл формата Unix Audio Format, в основном потому, что расширение является самым коротким из поддерживаемых, а также потому, что мы можем сделать имя файла пощечиной π !Предыдущее представление:
источник
Python 2, 182 байта
`x`
будет производить31415926...20198L
. ТрейлингL
используется для создания последнего байта сообщения канала через отображение~ord(i)%29
.Выводит один трек Midi-файл типа 1 с именем
p.mid
в текущем рабочем каталоге.источник
царапать , 530 байт
Вдохновленный ответом BookOwl .
Интернет Демонстрация . Воспроизведение начнется немедленно, нажмите spaceдля остановки и сброса. Нажмите на кота, чтобы начать снова.
Редактировать: слегка упал в гольф. Я нашел несколько советов по игре в гольф на официальной вики .
графический:
Использует втулку Rabinowitz Wagon для получения 4 цифр за раз.
источник
R, 450 байт
Использует пакет,
Rmpfr
чтобы получить правильную точность цифр пи. Выводит.wav
файл.С отступом, с новыми строками и комментариями:
источник
C (gcc) 572 байта
Безголовая версия:
Объяснение:
play(float freq)
рутина берет частоту в качестве параметра ноты (жестко закодированной), которую вы хотите воспроизвести, и сохраняет синусоидальную волну в буфере.f()
я сохранил частоты, соответствующие нотам в диапазоне от C4 до E5 вnotes
массиве.pi
значение, за которым следуют 1000 цифр, в буфере. Для этого я установилpi
пакет на свой компьютер и использовал егоpopen
для чтенияpi 1000
и сохранения вchar
буфере.for
цикл,switch
я вызвалplay()
функцию для создания заметок, которые соответствуют каждой цифре вpi
буфере. ,Использование:
./binary_name.o | aplay
в современных дистрибутивах Linux, в старых дистрибутивах вы бы перенаправили его на/dev/audio
источник
switch(foo){...}
на что-то подобноеplay(note[(foo-'1')%10])
. Кроме того, читайте советы по игре в гольф на C