흰색 열쇠에 피아노 화음


9

배경 이야기 [사실이 아님]

피아노는 다음과 같이 설정됩니다 :

! [http://www.piano-lessons-made-simple.com/images/2-Octave-Labled.gif

그러나 피아노에서 모든 검은 건반이 고장났습니다!

그래도 여전히 깨진 피아노에서 코드를 연주하고 싶습니다.

음악에서 화음은 함께 연주되는 음표 그룹입니다. 코드 입력을 허용하기 위해 먼저 반음이 무엇인지 정의하겠습니다.

반음이란 무엇입니까?

반음은 서양 음악에서 가장 작은 거리입니다. 피아노의 상단 부분을 보면 보통 검은 색 키에서 흰색 키로 또는 그 반대로 이동할 수 있습니다. 그러나, 사이 BCEF더 블랙 키가 없습니다.

화음이란?

이 챌린지의 목적을 위해, 우리는 코드 사이에 특정 수의 반음이있는 음표로 코드를 정의합니다. 예를 들어, 4-3-3시작 하는 코드를 들겠습니다 C(음악 사용자의 경우 F 장조 의 V 7 코드). 우리는에서 시작 C합니다. 우리는 4 개 반음을 계산 : C#, D, D#, E. 다음 주입니다 E, 우리는 그 후 3 개 반음을 계산 : F, F#, G. 다음 주입니다 G, 우리는 그 후 3 개 반음을 계산 : G#, A, Bb. 그래서 우리는 얻는다 C-E-G-Bb. 예이! 그러나 잠깐 만요 ... Bb검은 열쇠이며 그 열쇠가 깨졌습니다 ... 그러나 우리가 시작하면 우리 G는 얻습니다 G-B-D-F! 예이!

입력

입력은 적절한 형식의 정수 목록으로 제공됩니다. 이것은 위에서 설명한 코드를 나타냅니다.

산출

출력은 흰색 키만 사용하기 시작할 수있는 메모 목록이어야합니다. 모든 키 이름은 하나의 문자이므로 최대 7 개 음표의 문자열 일 수도 있습니다. 빈 출력도 처리 할 수 ​​있어야합니다.

테스트 사례

input -> output // comments
4 3 -> C F G // this is a major triad
3 4 -> D E A // this is a minor triad
4 3 3 -> G // this is the major-minor seventh chord
3 3 3 -> [empty output] // this is the diminished-diminished seventh chord. All of them use black keys
4 4 -> [empty output] // this is an augmented triad
3 3 -> B // this is a diminished triad
1 -> B E // this is just a minor second
11 -> C F // this is just a major seventh

다른 사양

  • 금지 된 표준 허점
  • 입력에 적어도 하나의 정수가 있다고 가정 할 수 있습니다
  • 모든 정수가 음이 아니고 12보다 작은 것으로 가정 할 수 있습니다 (피아노가 12 개의 음마다 반복되기 때문에)
  • 출력 순서는 상관 없습니다

승리 기준

4 월 15 일 현재 최단 유효 제출이 접수됩니다.


"음이 아닌 12보다 작음"을 가정 할 수 있습니다. "긍정적이고 12보다 작거나 같지 않아야합니까?"
Jonathan Allan

@JonathanAllan 근본적으로 차이는 없습니다. 내 방법은 Perfect Unison을 허용하지만 Perfect Octave는 허용하지 않습니다. 당신의 반대의 경우도 마찬가지입니다. 이론적으로는 제한이 더 의미가 있지만 이미 답변이 있고 근본적으로 도전을 변경하지 않기 때문에 변경하지 않아야한다고 생각합니다.
HyperNeutrino

답변:


3

젤리 , 25 바이트

236ḃ2ṙЀ7+\€Ṭ
+\ịþ¢Ạ€TịØA

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오

어떻게?

236ḃ2ṙЀ7+\€Ṭ - Link 1, white-note-offsets: no arguments
236ḃ2         - 236 in bijective base 2 [2, 2, 1, 2, 2, 1, 2] - semitones G->A, A->B ...
     ṙЀ7     - rotate left by, mapped over [1,2,3,4,5,6,7] - i.e. as above for each
                    starting white key (1st one A->B,B->C,...; 2nd B->C,C->D,...; etc)
         +\€  - reduce €ach with addition - i.e. absolute number of semitones: [[2,3,5,7,8,10,12],[1,3,5,6,8,10,12],[2,4,5,7,9,11,12],[2,3,5,7,9,10,12],[1,3,5,7,8,10,12],[2,4,6,7,9,11,12],[2,4,5,7,9,10,12]]
            Ṭ - untruth (vectorises) - make lists with 1s at those indexes: [[0,1,1,0,1,0,1,1,0,1,0,1],[1,0,1,0,1,1,0,1,0,1,0,1],[0,1,0,1,1,0,1,0,1,0,1,1],[0,1,1,0,1,0,1,0,1,1,0,1],[1,0,1,0,1,0,1,1,0,1,0,1],[0,1,0,1,0,1,1,0,1,0,1,1],[0,1,0,1,1,0,1,0,1,1,0,1]]

+\ịþ¢Ạ€TịØA - Main link: list of semitone gap integers (even negatives will work)
+\          - reduce by addition - gets the absolute semitone offsets needed
    ¢       - last link (1) as a nilad
   þ        - outer product with:
  ị         -     index into - 7 lists, each with 1s for white and 0s for black keys hit
                      note that indexing is modular and all the lists are length 12
                      so any integer is a valid absolute offset, not just 0-11 inclusive
     Ạ€     - all truthy for €ach - for each get a 1 if all keys are white ones, else 0
       T    - truthy indexes - get the valid starting white keys as numbers from 1 to 7
        ị   - index into:
         ØA -     the uppercase alphabet

6

MATL , 31 바이트

수정 해 주신 Jonathan Allan 에게 감사드립니다 .

'BAGFEDC'"GYs12X\110BQX@YSYsm?@

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

설명

이 패턴 2 2 1 2 2 2 1은 연속적인 흰색 키 사이의 간격을 지정합니다. 프로그램은 각 키를 입력 코드의 가장 낮은 음표로 테스트하기 위해이 순환 패턴을이 기본 패턴에 적용하는 루프를 사용합니다. 각 시프트에 대해 패턴의 누적 합이 구해집니다. 예를 들어, B가장 낮은 음표로 패턴이 이동 1 2 2 1 2 2 2되었으며 누적 합은 1 3 5 6 8 10 12입니다.

이제 이것이 4 3 3코드를 지원할 수 있는지 확인하기 위해 코드 간격의 누적 합을 계산합니다 4 7 10. 1 기반 모듈로 12를 통해 그것을 14줄 입니다 (간격 이 줄 것입니다 2). 해당 숫자가 모두 허용 된 값의 구성원인지 확인하십시오 1 3 5 6 8 10 12. 이 예에서는 그렇지 않습니다. 이 경우 문자를 출력합니다 B.

사이 클릭 쉬프트와 출력 문자의 대응은 문자열로 정의됩니다 'BAGFEDC'. 이는 'B'(첫 번째 문자)가 다음에 의해 순환 시프트에 해당함을 나타냅니다 1. 'A'(두 번째 문자)는 2등 으로 순환 이동에 해당합니다 .

'BAGFEDC'  % Push this string
"          % For each character from the string
  G        %   Push input array
  Ys       %   Cumulative sum
  12X\     %   1-based modulo 12, element-wise (1,12,13,14 respectively give 1,12,1,2)
  110BQ    %   Push 110, convert to binary, add 1 element-wise: gives [2 2 1 2 2 2 1]
  X@       %   Push current iteration index, starting at 1
  YS       %   Cyclic shift to the right by that amount
  Ys       %   Cumulative sum
  m        %   Ismember. Gives an array of true of false entries
  ?        %   If all true
    @      %     Push current character
           %   End (implicit)
           % End (implicit)
           % Display (implicit)

5

Mathematica, 110 바이트 (ISO 8859-1 인코딩)

±i_:=#&@@@Select["A#BC#D#EF#G#"~StringTake~{Mod[#,12,1]}&/@#&/@(Accumulate[i~Prepend~#]&/@Range@12),FreeQ@"#"]

±정수 목록을 입력으로 사용 하는 단항 함수 를 정의하고 (실제로 정수의 크기 나 부호에 대한 제한은 없음) 한 문자 문자열 목록을 리턴합니다. 예를 ±{3,4}들어을 반환합니다 {"A","D","E"}.

"A#BC#D#EF#G#"~StringTake~{Mod[#,12,1]}&/@#정수 목록을 해당 음표 이름으로 바꾸는 기능입니다 #. 이는 각각의 소자에인가되는 Accumulate[i~Prepend~#]&/@Range@12우리 포함 그러한 주 이름리스트 걸러 1 내지 12 각각의 가능한 주에서 시작하여 주 간격 목록 입력리스트에서 참고 값의리스트를 구축, "#"사용을 Select[...,FreeQ@"#"]하고 를 사용하여 나머지 각 목록의 첫 번째 메모를 반환하십시오 #&@@@.


좋은 제출!
HyperNeutrino

질문 : Mathematica는 자체 바이트 시스템을 사용합니까? 이것은 110 자이지만 UTF-8에서는 +/-기호로 인해 111 바이트 입니다.
HyperNeutrino

할당을 완전히 제거하고 함수를 "암시 적으로 반환"할 수 있습니다.
wizzwizz4

@ wizzwizz4 : Accumulate[i~Prepend~#]&그렇지 않으면 카레 충돌이 있기 때문에 변수 이름을 지정해야한다는 것을 알았습니다 . 그래도 해결 방법을 찾으십시오!
Greg Martin

@HyperNeutrino : UTF-8이 표준 인코딩 인 것이 맞지만 Mathematica는 (일반적으로) ISO 8859-1 인코딩에서도 작동 할 수 있습니다. 나는 게시물에서 그것을 지적했다.
Greg Martin

3

파이썬 2, 159 155 바이트

(이보다 짧은 유효한 제출이 있는지 확인한 후 게시)

import numpy
s='C.D.EF.G.A.B'
def k(y):return lambda x:s[(x+y)%12]
for i in range(12):
    if s[i]!='.'and'.'not in map(k(i),numpy.cumsum(input())):print s[i]

사소한 해결책 일뿐입니다. 정수 목록으로 입력하고 각 줄에 각 문자를 사용하여 출력합니다.

불필요한 변수를 제거하여 -4 바이트


3

자바 스크립트 (ES6), 72 71 68 바이트

a=>[..."C1D1EF1G1A1B"].filter((c,i,b)=>!+c>a.some(e=>+b[i+=e,i%12]))

검은 색 키를 생략 한 각 키를 반복 한 다음 누적 반음 합계가 검은 색 키에 도달하지 않는지 확인합니다.

편집 : @Arnauld 덕분에 3 바이트가 절약되었습니다.


4
가독성?! 당신이 올바른 사이트에 확신하십니까? :-)
wizzwizz4
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.