Вывести список музыкальных нот


27

Это простое задание: написать программу или функцию, которая выводит список всех музыкальных нот (используя английские названия нот) от A ♭ до G♯.

На всех нотах без названия, состоящих из одной буквы (т.е. черных нот на музыкальной клавиатуре), их имя должно быть напечатано дважды, один раз как резкая нота, один раз как плоская единица. Резкие или плоские ноты, которые можно описать одной буквой, например, B♯ (C) или F ♭ (E), не должны выводиться.

Вот пример вывода:

Ab, A, A#, Bb, B, C, C#, Db, D, D#, Eb, E, F, F#, Gb, G, G#

Характеристики

  • Программа или функция не должны принимать никаких данных.

  • Примечания могут быть напечатаны в любом порядке и в любом списке вывода, разрешенного нашими стандартными правилами ввода-вывода

  • Острые и плоские символы Юникода (♯ / ♭) можно заменить на b и#

  • Как всегда, стандартные лазейки запрещены.

  • Поскольку это , выигрывает самая маленькая программа в байтах.



1
Можем ли мы выводить "C "вместо "C"?
Арно

1
@Arnauld да, вы можете
TheOnlyMrCat

7
Кстати, B # существует в нотной записи; это, например, в ключевой подписи для ключа C #, где он служит в качестве ведущего тона.
Каз

2
Я не знаю, такое ощущение, что Cb отсутствует здесь;)
AJFaraday

Ответы:


13

Malbolge , 482 370 353 байта

R1: Удалены запятые между ними (как не требуется для испытания)

R2: сбрить несколько байтов

('<;_#!=6Z|{8xUwvt,PrqonKmk)"FhCUTdb?`+<;:[Z7YtVU2T|/g-O+i(gJrHc#EC~B{@zZxw:tt'r5Qo"!l/K-hUfe?bP``_Lo~[}|X2VCTR3Q+N`_^9+7Hji3ffdAc~w|u;]\wpon4VUSSQ.PONcb(JI^]#DCYX|@?>=<:u9NMRKo32MFj.C,Ae)>'<%:^"!~5:3WxwwuRts0q(Lnml)"Fhgfe"y?a`_zyxq7YXWlUj0RgfkjMb(JI^c\[Z~BAV?T=Rv987Mq44310FEi-,G@)>b&%#"8=6Z{{yyw/Sut1*)('Km$k(!Efe{zyx>`uz]r8ZXnm3TTih.PkNchg`&HFF[DY}Az

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


12

Сборка CP-1610 ( Intellivision ), 31 DECLEs 1 = 39 байт

Подпрограмма, принимающая выходной указатель в R4 и записывающая туда заметки, разделенные пробелами. В примере кода мы пишем прямо на экран.

Шестнадцатеричный дамп (только рутина)

275 001 2BD 03C 048 1DB 2B8 012 044 2A9 2BA 108 078 201 003 262
261 263 2FA 008 37A 140 225 00B 089 22C 011 2B7 018 210 000

Полный источник

                ROMW    10              ; use 10-bit ROM width
                ORG     $4800           ; map this program at $4800

                ;; ------------------------------------------------------------- ;;
                ;;  test code                                                    ;;
                ;; ------------------------------------------------------------- ;;
4800            SDBD                    ; set up an interrupt service routine
4801            MVII    #isr,     R0    ; to do some minimal STIC initialization
4804            MVO     R0,       $100
4806            SWAP    R0
4807            MVO     R0,       $101

4809            EIS                     ; enable interrupts

480A            MVII    #$200,    R4    ; R4 = backtab pointer
480C            CALL    notes           ; invoke our routine

480F            DECR    R7              ; loop forever

                ;; ------------------------------------------------------------- ;;
                ;;  ISR                                                          ;;
                ;; ------------------------------------------------------------- ;;
      isr       PROC

4810            MVO     R0,       $0020 ; enable display

4812            CLRR    R0
4813            MVO     R0,       $0030 ; no horizontal delay
4815            MVO     R0,       $0031 ; no vertical delay
4817            MVO     R0,       $0032 ; no border extension
4819            MVII    #$D,      R0
481B            MVO     R0,       $0028 ; light-blue background
481D            MVO     R0,       $002C ; light-blue border

481F            JR      R5              ; return from ISR

                ENDP

                ;; ------------------------------------------------------------- ;;
                ;;  routine                                                      ;;
                ;; ------------------------------------------------------------- ;;
      notes     PROC

4820            PSHR    R5              ; save return address

4821            SDBD                    ; R5 = pointer to @@chr
4822            MVII    #@@chr,   R5
4825            CLRR    R3              ; R3 = 0 (space)
4826            MVII    #$12,     R0    ; R0 = bitmask = $12
4828            SWAP    R0,       2     ; extend it to $1212

4829  @@loop    MVI@    R5,       R1    ; R1 = next symbol
482A            MVII    #('A'-32)*8, R2 ; R2 = 'A' character

482C  @@note    SARC    R0              ; right shift the bitmask
482D            BC      @@next          ; skip this note if the carry is set

482F            MVO@    R2,       R4    ; append the note
4830            MVO@    R1,       R4    ; append the symbol
4831            MVO@    R3,       R4    ; append a space

4832  @@next    ADDI    #8,       R2    ; advance to the next note
4834            CMPI    #('H'-32)*8, R2 ; is it now a 'H'?
4836            BLT     @@note          ; if not, process the inner loop

4838            TSTR    R1              ; was the symbol a space?
4839            BNEQ    @@loop          ; if not, process the outer loop

483B            PULR    R7              ; return

483C  @@chr     DECLE   ('#'-32)*8      ; '#'
483D            DECLE   ('b'-32)*8      ; 'b'
483E            DECLE   0               ; space

                ENDP

Выход

выход

скриншот из jzIntv


1. Код операции CP-1610 кодируется 10-битным значением, известным как «DECLE». Длина этой процедуры составляет 31 DECLE, начиная с 4820 долларов США и заканчивая 483 долларами США (в комплекте).


9

Python 3 , 50 байт

print(*map(''.join,zip(3*'ADGBCEF',7*' '+5*'#b')))

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

Python 2: 48 байт

Этот код можно настроить так, чтобы он включал B # и Cb, без каких-либо дополнительных байтов. Это может быть достигнуто путем замены 5на 6.


Кроме того, он (наконец) короче, чем просто вывод простой строки:

Python 3 , 51 байт

exit('Ab A A# Bb B C C# Db D D# Eb E F F# Gb G G#')

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

Python 2: 50 байтов


2
Это очень креативное решение
TheOnlyMrCat

7

05AB1E , 16 15 13 байт

Au…b #âŽ7×bûÏ

-2 байта благодаря @maxb .

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

Выводится в виде списка, где заметки с одним символом имеют завершающий пробел.

Объяснение:

Au             # Push the lowercase alphabet, and uppercase it
  b #         # Push string "b #"
      â        # Take the cartesian product of both strings to create all possible pairs:
               #  ["Ab","A ","A#","Bb","B ","B#",...,"Zb","Z ","Z#"]
       Ž7×     # Push compressed integer 1999
          b    # Convert it to a binary string "11111001111"
           û   # Palindromize it to "111110011111110011111"
            Ï  # Only leave the notes in the list at the truthy values (1), (the trailing
               # items beyond the length of this binary string are also discarded)
               # (after which the result is output implicitly)

Посмотрите эту подсказку 05AB1E (раздел Как сжать большие целые числа? ), Чтобы понять, почему Ž7×это так 1999.

Ž7×в качестве альтернативы может быть ₄·<(1000, удвоение, уменьшение на 1) для того же количества байтов.


3
Это действительно необходимо? Кажется, отлично работает без него.
максимум

6

Желе , 18? * 20 байт

ØAḣ7µp⁾b#Żs6ḣ€4ẎḊ;W€

Монадическая ссылка, возвращающая список списков символов.

* Если допустим смешанный список из (а) списков символов и (б) символов, уберите завершающий список W€для 18

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

Как?

ØAḣ7µp⁾b#Żs6ḣ€4ẎḊ;W€ - Link: no argument
ØA                   - list of characters     [A-Z]
  ḣ7                 - head to 7              "ABCDEFG"
    µ                - new monadic link (call that X)
      ⁾b#            - list of characters     "b#"
     p               - Cartesian product      ["Ab","A#","Bb","B#","Cb","C#","Db","D#","Eb","E#","Fb","F#","Gb","G#"]
         Ż           - prepend a zero       [0,"Ab","A#","Bb","B#","Cb","C#","Db","D#","Eb","E#","Fb","F#","Gb","G#"]
          s6         - split into sixes    [[0,"Ab","A#","Bb","B#","Cb"],["C#","Db","D#","Eb","E#","Fb"],["F#","Gb","G#"]]
            ḣ€4      - head each to 4      [[0,"Ab","A#","Bb"],["C#","Db","D#","Eb"],["F#","Gb","G#"]]
               Ẏ     - tighten              [0,"Ab","A#","Bb","C#","Db","D#","Eb","F#","Gb","G#"]
                Ḋ    - dequeue                ["Ab","A#","Bb","C#","Db","D#","Eb","F#","Gb","G#"]
                  W€ - wrap each (of X)       ["A","B","C","D","E","F","G"]
                 ;   - concatenate            ["Ab","A#","Bb","C#","Db","D#","Eb","F#","Gb","G#","A","B","C","D","E","F","G"]

@mirabilos это 20 байтов исходного кода, каждый из символов Unicode представляет собой байт исходного кода - см. кодовую страницу, связанную словом bytesв заголовке.
Джонатан Аллан

5

Сетчатка 0.8.2 , 33 байта


ABCDEFG
.
 $&b $& $&#
 [BE]#...

Попробуйте онлайн! Объяснение:


ABCDEFG

Вставьте имена базовых нот.

.
 $&b $& $&#

Разверните каждую заметку, чтобы включить плоскую и резкую версии.

 [BE]#...

Удалить B#, E#а также примечания, следующие за ними ( Cbи Eb).


5

Perl 6 , 41 байт

{S:g/[E|B]\#...//}o{'A'..'G'X~'b #'.comb}

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

Простое перекрестное произведение примечаний и острых предметов / квартир, с последующим удалением лишних недействительных примечаний. Это блок анонимного кода, который создает строку:

Ab A  A# Bb B   C  C# Db D  D# Eb E   F  F# Gb G  G#

4

R , 50 байтов

cat("Ab,A,A#,Bb,B,C,C#,Db,D,D#,Eb,E,F,F#,Gb,G,G#")

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

Скучный ответ.

R , 60 байтов

cat(outer(LETTERS[1:7],c("#","","b"),paste0)[-c(2,5,17,20)])

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


1
Я думаю, что список примеров избыточных заметок не является исчерпывающим - в выходных данных примера также опускается Cbи E#.
Несвязанная строка

4

Древесный уголь , 21 байт

Φ⪪⭆…α⁷⭆b #⁺ι벧↨⊖⊘φ²κ

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

    α                   Predefined variable uppercase alphabet
   … ⁷                  First 7 letters i.e. `ABCEDFG`
  ⭆                     Map over characters and join
       b #              Literal string `b #`
      ⭆                 Map over characters and join
          ⁺ιλ           Concatenate outer and inner characters
 ⪪           ²          Split back into substrings of length 2
Φ                       Filter where nonzero
                  φ     Predefined variable 1000
                 ⊘      Halved i.e. 500
                ⊖       Decremented i.e 499
               ↨   ²    Converted to base 2 i.e. [1, 1, 1, 1, 1, 0, 0, 1, 1]
              §     κ   Cyclically indexed by outer index
                        Implicitly print matching values on separate lines

3

Japt , 23 22 байта

;B¯7
ï"b #" fÏÄ %9%8<6

Попытайся

;B          Alphabet
  ¯7        First seven characters ("ABCDEFG")
            Assign to U
ï"b #"       Cartesian product with "b #" ("Ab,A ,A#,Bb,B ,B#,Cb,C ,C#,Db,D ,D#,Eb,E ,E#,Fb,F ,F#,Gb,G ,G#")
f           Filter:
 ÏÄ           Is index + 1
   %9%8       Mod 9 Mod 8
     <6       Less than 6
            End filter ("Ab,A ,A#,Bb,B ,C ,C#,Db,D ,D#,Eb,E ,F ,F#,Gb,G ,G#")

Ваш код содержит, <6но это <5в объяснении.
TheOnlyMrCat

@TheOnlyMrCat Отредактировано
Воплощение Невежества



2

Рубин , 43 байта

p (2..18).map{|i|"FCGDAEB"[i%7]+"b #"[i/7]}

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

С диапазоном 0..20это напечатало бы массив, содержащий все квартиры, все натуральные и все острые предметы. Нежелательные Fb Cb E# B#опускаются при использовании диапазона2..18

Примечания распечатываются в порядке, указанном https://en.wikipedia.org/wiki/Circle_of_fifths , или, другими словами, каждый раз по возрастанию на 7 полутонов (отношение частот почти точно равно 1,5).

Это приводит к указанному порядку букв в ноте, в котором каждая нота на пять градусов включительно (известная как «пятая») выше предыдущей. Например, F->CэтоFGABC


Мне нравится, что ты поднимаешься на пятые. Ницца.
Уэйн Конрад


2

Zsh , 36 байт

<<<${${(F):-{A..G}{b,,#}}//[BE]#???}

Ужасное решение, но оно сохраняет два символа. (F)присоединяет список к новым строкам и //[BE]#???удаляет части строки, которые нам нужны.

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


Зш , 38 байт

<<<${${:-{A..G}{b,,#}}:#([BE]#|[CF]b)}

Мне всегда нравится, когда Zsh побеждает Perl (надеюсь, я не говорю слишком рано ...).

<<<${${:-{A..G}{b,,#}}:#([BE]#|[CF]b)}
     ${:-             }                 # empty-fallback, basically an anonymous parameter expansion
         {A..G}{b,,#}                   # Cross product range A-G with b,(nothing),#
   ${                 :#             }  # Remove matching elements
                        ([BE]#|[CF]b)   # B#, E#, Cb, Fb
<<<                                     # Print to stdout

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



1

Брахилог , 36 байт

"#b"ẹ,Ẹ↺;Ṇh₇ᵗ↔{∋ᵐc}ᶠ⟨h₅ct₁₄⟩⟨h₁₂ct₅⟩

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

В настоящее время я нахожусь в процессе грубого форсирования индекса powerset, который позволил бы мне избавиться ⟨h₅ct₁₄⟩⟨h₁₂ct₅⟩(и, следовательно , от того , что выходные данные не обязательно должны быть в том же порядке, что и выходные данные примера), но это занимает довольно много времени. в то время как ... может быть, я должен отложить минуту, чтобы на самом деле выяснить, в каком порядке создаются подсписки, и таким образом вычислить индекс ...



1

PHP , 65 байт

Составляет список с помощью цикла. Элементы разделяются _с помощью конечного разделителя.

for(;$l=ABCDEFG[$i++];)echo$l._.[$a="$l#_",$a.$b=$l.b_,$b][$i%3];

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


PHP , 43 байта

PHP выводит все как есть, когда нет внутри <?phpи ?>тегов.

Ab,A,A#,Bb,B,C,C#,Db,D,D#,Eb,E,F,F#,Gb,G,G#

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


1

Pyth , 23 21 байт

s<R7c.>*<r1G7"b #"2 9

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

s<R7c.>*<r1G7"b #"2 9   Implicit: G=lowercase alphabet
         r1G            Convert G to upper case
        <   7           First 7 characters
       *     "b #"      Cartesian product with "b #"
     .>           2     Rotate the above 2 places to the right
    c               9   Chop into pieces of length 9
 <R7                    Trim each to length 7
s                       Flatten, implicit print

Изменить: Частичная перезапись, чтобы сохранить 2 байта, предыдущая версия: s%2c*<r1G7"b #"xLG"fhoq Попробуйте онлайн!


1

Commodore C64 / TheC64 Mini (возможно, другие 8-битные варианты BASIC Commodore) - 52 байта с токенами BASIC

 0?"{CTRL+N}Ab A A# Bb B C C# Db D D# Eb E F F# Gb GG#

Нажатие CTRLклавиши плюс Nна клавиатуре C64 переходит в «бизнес-режим» на наборе символов для символов верхнего / нижнего регистра. Мы можем распечатать это в виде строки в один байт / токен; и поскольку у нас есть 40 столбцов, пространство от G до G # не требуется.

Нам не нужно закрывать строку в этом случае, так как это не многостраничная строка с :разделителем.

Как это выглядит на экране Commodore C64 (и совместимых), показано ниже.

Commodore 64 музыкальных нот



0

APL (Dyalog Unicode) , 45 байт

2↓(,¨⎕A)⎕R', &''AbAA#BbBCC#DbDD#EbEFF#GbGG#'

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

Простая ⎕Rоперация замены, добавление ,к каждому элементу в строке, которая соответствует каждой букве в ⎕Aалфавите, затем удаление первых 2 символов, которые есть ,.




0

бред , 255 115 байт

--[----->+<]>-----[<+>>+>+<<-]>>+<<<-[->+++<]>+++[->>>+>+<
<<<]>>>>--->+++++++[-<<<<.>.>>.<<<.>>>.<<<.>>.>.<<<+>>>>]

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


1
Я бы за это проголосовал, но это неправильно. Там нет черной ноты между B и C, или между E и F. Так что вы не должны выводить. B #, Cb, E # или Fb. Кроме того, я не вижу в спецификации ничего, что можно использовать строчные буквы.
Уровень Река St

@LevelRiverSt В конкурсе нигде не говорилось, что у нас нет заметок между B и C & E и F
Кшиштоф Шевчик

All notes without a name consisting of a single letter (i.e. black notes on a musical keyboard) should have their name printed twice, once as the sharp of a note, once as the flat of one. Sharp or flat notes that can be described with a single letter, like B♯ (C) or F♭ (E) should not be outputted.Это кажется мне достаточно ясным, и я не вижу истории изменений на OP на моем экране.
Уровень Река St



0

T-SQL, 124 байта

SELECT value+a
FROM STRING_SPLIT('A-B-C-D-E-F-G','-')
    ,(VALUES('b'),(''),('#'))b(a)
WHERE value+a NOT IN ('B#','E#','Cb','Fb')

Разрывы строки предназначены только для отображения.

Длиннее, но гораздо интереснее, чем тривиальная версия (50 байт) :

PRINT'Ab,A,A#,Bb,B,C,C#,Db,D,D#,Eb,E,F,F#,Gb,G,G#'

0

Z80Golf , 31 29 байт

00000000: 9d5b dc6d df7f 0603 3e40 d13c cb3a 3008  .[.m....>@.<.:0.
00000010: fff5 7b2f ffaf fff1 20f1 10ec 76         ..{/.... ...v

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

Пояснение :

Z80Golf - это просто фантастическая машина на базе 8-битного процессора Z80. Программа загружается в ячейку памяти 0x0000, а остальная часть памяти заполняется нулями. Вывод осуществляется путем вызова 0x8000, который выведет значение регистра A в виде символа.

Программа начинается с данных, которые будут обработаны, всего 6 байтов. Каждая пара байтов задает суффикс примечания и битовую маску, управляющую тем, какие буквы можно комбинировать с этим примечанием. Для сохранения байтов символ суффикса инвертируется ( xor 0xff) - это позволяет выполнять данные в виде инструкций с небольшими побочными эффектами, что позволяет удалить скачок, пропускающий эти данные:

               ;    GFEDCBA
    db 0xff^'b', 0b01011011 ; Ab Bb Db Eb Gb
    db 0xff^'#', 0b01101101 ; A# C# D# F# G#
    db 0xff^' ', 0b01111111 ; A  B  C  D  E  F  G
skip_data:

Вот как процессор декодирует это:

    sbc a, l  ; a subtraction with carry on registers we don't care about
    ld e, e   ; put the E register back into itself. This instruction is useless
              ; but still exists to make the encoding regular.
    call c, 0xdf6d ; if the carry flag is set, call a function. The carry flag isn't set
              ; because of the initial register values (all zeroes) when the sbc above
              ; was executed
    ld a, a   ; as above, put A back into itself.

Эти данные считываются по два байта за раз в пару регистров DE. Указатель стека используется для указания на следующий элемент. Он начинается с 0, и поскольку Z80 использует полный нисходящий стек, все всплывающие окна будут считывать следующую пару данных - все операции стека являются 16-разрядными.

Внешний цикл реализован с уменьшающимся счетчиком в регистре B, для которого Z80 предоставляет специальную поддержку в виде djnzинструкции:

    ld b, 3
process_pair:
    ...
    djnz process_pair
    halt

Текущее письмо хранится в регистре А. Поскольку приращение хорошо подходит в начале цикла, мы загружаем на единицу меньше, чем фактическое начальное значение A:

process_pair:
    ld a, 'A'-1
    pop de ; D = bitmask, E = suffix character
process_note:
    inc a
    srl d ; put the current bitmask bit in the carry flag
          ; also sets the zero flag if this is the last note in the pair
    jr nc, skip
    ; Print the note. Note that we need to preserve the zero flag to check it in the
    ; loop condition later.
    rst $38 ; Short encoding of call $0038.
            ; Because the program is so short, the memory in the 0038..8000 range
            ; is filled with zeroes, which happens to be the encoding for a no-op.
            ; The execution will therefore fall-through to the character-print hook.
    push af ; Save the letter on the stack (which will be just to the left of the
            ; unprocessed data) to free up A for printing other characters.
            ; (only 16-bit register pairs can be saved, so we also push the flags)
    ld a, e
    cpl     ; Undo the inversion used to make the execution fall-through the data.
            ; Done again each iteration because it takes less bytes to operate
            ; on the A register.
    rst $38 ; Print the suffix.
    xor a   ; Standard assembly practice of setting a register to zero by XORing it
            ; with itself. Saves a byte over a simple `ld a, 0`.
    rst $38 ; Print a null byte as a separator.
    pop af  ; Restore the current letter from the stack.
skip:
    jr nz, process_note ; If the zero flag (last changed at the srl d) is not set,
                        ; loop once again
    djnz process_pair
    halt
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.