주요한 이분법


15

코드 목록이 있으면 'Major'또는 'Minor'로 레이블이 지정됩니다.

입력

입력은 한 줄에 하나씩 코드 목록으로, 공백으로 구분 된 3 개의 음으로 구성됩니다. 각 노트는 대문자 ( A- G) 로 된 노트 이름 과 우발적 ( #또는 b)으로 구성됩니다. 코드는 반전 될 수 있습니다 (즉, 음표는 임의 순서 일 수 있음).

산출

코드가 메이저이면 'Major'를 출력합니다. 코드가 작 으면 'Minor'를 출력하십시오. 코드가 메이저 또는 마이너가 아닌 경우 빈 줄을 출력합니다.

입력

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

산출

Major
Minor

Minor
Major
Minor
Major

테스트 스크립트

지난 몇 가지 질문과 마찬가지로, JoeyVentero 가 원래 만든 몇 가지 테스트 스크립트를 다시 한 번 도살 하여이 질문에 대한 테스트 사례를 제공했습니다.

용법: ./test [your program and its arguments]

보상

사양을 충족하고 테스트를 통과했으며 골프를 시도한 것으로 보이는 모든 항목은 저에게 공감대를받습니다 (답변에 사용 지침을 제공하십시오). 2012 년 10 월 13 일까지 가장 짧은 솔루션이 승자로 인정됩니다.

작은 이론

음악 이론 지식이없는 사람들을 위해 여기에 당신이 경쟁 할 수있는 충분한 정보가 있습니다.

메이저 또는 마이너 코드는 특정 패턴의 반음으로 분리 된 3 개의 음으로 구성됩니다. 코드의 근음 (하단 음표)을 0으로 간주하면 주요 코드는 패턴 0-4-7이고 작은 코드는 패턴 0-3-7입니다. 일부 음표는 반음이 분리되고 일부는 음조가 분리되어 있기 때문에 상황이 더 어색합니다. 반음의 확산에서이 Ab- G#다음과 같습니다 :

G#/Ab A A#/Bb B/Cb B#/C C#/Db D D#/Eb E/Fb E#/F F#/Gb G G#/Ab
  0   1   2    3     4    5   6   7    8     9    10  11  12

G#/Ab는와 G#같은 메모 임을 의미합니다 Ab. 이것으로부터 우리는 화음 Ab C Eb이 큰 화음 임을 알 수 있습니다 Ab Cb Eb.

복잡한 더 중요하기 위해, 코드는 Eb Cb Ab같은 것으로 간주됩니다 Ab Cb Eb, Cb Eb Ab그리고 Cb Ab Eb등등. 이러한 모든 변형은 여전히 ​​작은 코드입니다.


2
bash 테스터에 입력이 필요하고 예상 답변이 바뀌 었다고 생각합니다.
flodel

@flodel 예, 그렇습니다. 죄송합니다. 지금 수정했습니다. Powershell 테스트 스크립트에도 같은 문제가 없는지 확인해야합니다.
Gareth

답변:


3

GolfScript, 83 자

n%{' '%{1\{'A#BC D EF G'?+}/.}%$(+2/{~- 12%}%.(+.(+]$0=.$]10,7>?'MMaijnoorr

'>2%}%

이것은 빠른 첫 번째 해결책입니다. 이것이 더 골프를 칠 수 있다고 확신합니다. 코멘트에서 flodel이 지적한 버그를 수정 한 후 bash 테스트 스위트를 전달합니다.

편집 1 : 표준화 된 메이저 및 마이너 코드 패턴을 인식하는 짧은 방법으로 5자를 저장했습니다.

편집 2 : grc 솔루션에서 영감을 얻은 더 작은 출력 인코딩으로 2 문자를 더 절약했습니다. (감사합니다!) 부작용으로, 코드는 이제 출력 후에 여분의 빈 줄을 인쇄하지만 테스트 하네스는 그것을 받아들이는 것처럼 보이므로 괜찮습니다. :)

작동 방식은 다음과 같습니다.

  • 외부 루프 n%{ }%n*는 입력을 줄로 나누고 각 줄의 중괄호 안에 코드를 실행하고 결과를 줄 바꿈과 결합합니다.

  • ' '%각 줄을 여러 음표로 나눕니다. 그런 다음 각 음 1\{'A#BC D EF G'?+}/에 대해 문자열에서 각 문자를 검색 'A#BC D EF G'하고 위치를 추가하여 (이를 포함하여 문자열에서 찾을 수없는 문자의 경우 -1이 됨) 해당 음을 반음으로 변환합니다 b. (난 확실히 내가 이전에 사용이 트릭을 본 적이있다.) 마지막으로,이 .입력은 예를 들어, 루프의 끝에서, 있도록, 각 숫자를 중복 F Ab C으로 전환되었습니다 [9 9 0 0 4 4].

  • 그런 다음 노트를로 정렬하고 $첫 번째 노트를로 끝까지 이동 한 (+다음 배열을와 쌍으로 나누면 2/이제 예와 같이 보입니다 [[9 0] [0 4] [4 9]]. 그런 다음 {~- 12%}%각 노트 쌍을 차이 모듈로 12에 매핑하여 예제 배열을로 바꿉니다 [9 8 7].

  • 그런 다음 .(+배열을 복사하고 해당 요소를 한 위치 왼쪽으로 회전합니다. 이 작업을 두 번 수행하고를 사용하여 복사본으로 배열을 수집 ]하므로 이제 예제는 다음과 같습니다 [[9 8 7] [8 7 9] [7 9 8]].

  • 그런 다음이 배열 배열을 정렬 $하고 첫 번째 요소 (이 경우)를로 [7 9 8]사용 0=합니다. 그런 다음이 배열의 복사본 ( .) 을 만들고 정렬 ( )하고 정렬 $되지 않은 배열과 정렬되지 않은 배열을 다른 배열의 배열 ( ]) 로 모은 다음 배열의 첫 번째 항목 [7 8 9]( 10,7>두 문자를 저장하도록 작성 됨) 을 검색합니다. ) 안에 있습니다.

  • 이것은 0(정렬되지 않은 배열이 [7 8 9]이고 따라서 코드가 주요한 경우), 1(정렬되지 않은 배열이 순열 인 경우 [7 8 9], 첫 번째 요소가 가장 작을 경우에만 [7 9 8]코드를 작게 만들 수 있음 ) 또는 -1(정렬 된 배열조차도 같지 않은 경우 [7 8 9]).

  • 그런 다음이 숫자는 문자열의 시작 색인으로 사용되며 "MMaijnoorr\n\n"( \ns는 코드에서 실제 줄 바꿈으로 제공됨) 해당 문자와 ​​그 이후의 모든 문자를 출력으로 사용합니다. 색인이 -1이면 문자열의 마지막 문자 (줄 바꿈)에서 시작합니다.


좋은 설명입니다. 나는 항상 GolfScript에서와 같은 어려움을 겪고 있습니다. 테스트 할 때 한 번에 한 줄씩 호출 할 수는 echo "G# B# Eb" | ruby golfscript.rb ilmari.gs있지만 테스트 스크립트를 어떻게 실행합니까? 시도 ./test ruby golfscript.rb ilmari.gs했지만 아무것도 없었습니다. (분명히 효과가 있기 때문에 이미 +1을 주었지만 호기심이 많습니다)
Gareth

1
@Gareth : bash 테스트 스크립트의 버그 인 것처럼 보입니다. 여러 인수를 올바르게 처리하지 못합니다. 이 문제를 해결하려면, 교체 args="$@"args=("$@")got=$("$cmd" "$args")함께 got=$("$cmd" "${args[@]}"). (또는 그냥 golfscript.rb실행 파일로 만들어서 실행하십시오 ./test ./golfscript.rb chords.gs.)
Ilmari Karonen

4

파이썬, 160

f='A#BC D EF G3453543'.find
try:
 while 1:x,y,z=sorted(map(lambda x:f(x[0])+f(x[1:])+1,raw_input().split()));print'MMianjoorrr'[f(`y-x`+`z-y`)/14:-1:2]
except:0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.