मैंने अभी क्या खेला? गिटार फिंगरिंग को कॉर्ड में अनुवाद करें


22

संबंधित: संगीत: इस राग में क्या है? , नोटों को प्रकाशित करने के लिए , गिटार टैब उत्पन्न करना? , गिटार नोटों के लिए नंबर जोड़े का अनुवाद करें

एक गिटार को देखते हुए, कॉर्ड का प्रतिनिधित्व करता है। आप मानक इनपुट और आउटपुट का उपयोग कर सकते हैं, या एक फ़ंक्शन लिख सकते हैं जो एक स्ट्रिंग लौटाता है।

इनपुट फ़िंगरिंग्स को निम्नलिखित में से एक के रूप में वर्गीकृत किया जाएगा, जिसे निम्नानुसार व्यक्त किया जा सकता है (यदि मूल नोट C थे):

  • प्रमुख त्रय: C
  • मामूली त्रय: Cm
  • (प्रमुख) सातवें: C7
  • मामूली सातवें: Cm7

कॉर्ड उलटा हो सकता है, इसलिए आप सबसे कम नोट के मूल होने पर भरोसा नहीं कर सकते। न ही आप इस पर भरोसा कर सकते हैं कि यह वास्तविक दुनिया में एक आसान या आम छूत है। आम तौर पर, आपके प्रोग्राम के आउटपुट को पिचों के ऑक्टेव्स को नजरअंदाज करना चाहिए, और समान रूप से समान संगीत नोट (यानी A) के अनुरूप सभी पिचों का इलाज करना चाहिए ।

यह , इसलिए बाइट्स में सबसे छोटा कोड जीत जाता है।

इनपुट प्रारूप

इनपुट 6 मानों की एक श्रृंखला है जो इंगित करता है, मानक ट्यूनिंग (ईएडीजीबीई) में 6-स्ट्रिंग गिटार के प्रत्येक स्ट्रिंग के लिए , जो उस स्ट्रिंग को झल्लाहट में खेला जाएगा। यह भी संकेत दे सकता है कि स्ट्रिंग बिल्कुल भी नहीं खेली गई है। "ज़रोथ" झल्लाहट को खुली स्थिति के रूप में भी जाना जाता है, और झल्लाहट संख्याओं को वहां से गिना जाता है। मान लें कि गिटार में 21 झल्लाहट की स्थिति है, जैसे कि उच्चतम झल्लाहट संख्या 20 है।

उदाहरण के लिए, इनपुट का X 3 2 0 1 0अर्थ है गिटार की गर्दन के शीर्ष पर निम्नलिखित स्थानों पर अपनी उंगलियां रखना:

(6th) |---|---|---|---|---
      |-X-|---|---|---|---
      |---|---|---|---|---
      |---|-X-|---|---|---
      |---|---|-X-|---|---
(1st) |---|---|---|---|---

और 6 वें तार के माध्यम से 2 को झकझोरना। यह इस ASCII टैब से मेल खाती है :

e |-0-|
B |-1-|
G |-0-|
D |-2-|
A |-3-|
E |---|

आप जिस तरह का इनपुट चाहते हैं उसे चुनने में कुछ लचीलापन है: प्रत्येक झल्लाहट स्थिति को एक स्ट्रिंग, या एक संख्या के रूप में व्यक्त किया जा सकता है। गिटार के तार जो नहीं बजाए जाते हैं, उन्हें आमतौर पर एक के साथ इंगित किया जाता है X, लेकिन आप एक अलग प्रहरी मूल्य चुन सकते हैं यदि यह आपके लिए आसान बना देता है (जैसे -1कि आप संख्याओं का उपयोग कर रहे हैं)। 6 झल्लाहट पदों की श्रृंखला किसी भी सूची, सरणी, या अनुक्रम प्रकार, एकल स्थान-पृथक स्ट्रिंग, या मानक इनपुट के रूप में इनपुट हो सकती है - एक बार फिर, आपकी पसंद।

आप ऊपर वर्णित 4 राग प्रकारों में से एक के अनुरूप इनपुट पर भरोसा कर सकते हैं।

कृपया अपनी पोस्ट में बताएं कि आपके समाधान का क्या रूप है।

आउटपुट स्वरूप

आपको या तो मानक आउटपुट के लिए वापस लौटना होगा या प्रिंट करना होगा, जिस तार के लिए तार का वर्णन है। यह तार दो भागों से मिलकर बना होता है। पूंजीकरण मामलें। अनुगामी व्हाट्सएप की अनुमति है।

पहले भाग को इंगित करता है मूल नोट , में से एक A, A#/ Bb, B, C, C#/ Db, D, D#/ Eb, E, F, F#/ Gb, Gया G#/ Ab। (मैं उपयोग कर रहा हूँ #के बजाय , और bके बजाय , यूनिकोड की आवश्यकता होती है से बचने के लिए।) जड़ नोटों कि उनके बिना व्यक्त किया जाना चाहिए एक तेज या फ्लैट के बिना व्यक्त किया जा सकता (कभी नहीं उत्पादन B#, Fbया Dbb); उन है कि एक भी तेज या फ्लैट प्रतीक के साथ (यानी या तो नहीं व्यक्त किया जाना चाहिए कर सकते हैं C#या Db, लेकिन कभी नहीं B##)। दूसरे शब्दों में, आपको नोट के नाम में दुर्घटना की संख्या (तेज या फ्लैट) को कम करना चाहिए।

दूसरा भाग कॉर्ड के प्रकार को इंगित करता है, या तो प्रमुख ट्रायड के लिए खाली होता है, mमामूली ट्रायड के 7लिए, प्रमुख सातवें के लिए, या m7मामूली सातवें के लिए। तो एक जी प्रमुख आउटपुट के रूप में है G, जबकि एक डी मामूली सातवें D#m7या तो उत्पादन किया जा सकता है Ebm7। परीक्षण के मामलों में अंत में अधिक उदाहरण पाए जा सकते हैं।

सिद्धांत और संकेत

संगीत के नोट्स

क्रोमैटिक स्केल में 12 पिच प्रति ऑक्टेव हैं। जब समान स्वभाव के लिए ट्यून किया जाता है, तो इनमें से प्रत्येक पिच अपने पड़ोसियों 1 से समान रूप से दूर होती है । 12 सेमी (एक सप्तक) को अलग करने वाले पिचों को एक ही संगीत नोट माना जाता है। इसका मतलब है कि हम पूर्णांक मॉडुलो 12 जैसे नोटों का इलाज कर सकते हैं, 0 से 11 तक। इनमें से सात को अक्षर नाम 2 से ए से जी दिया गया है। यह सभी 12 पिचों को नाम देने के लिए पर्याप्त नहीं है, लेकिन दुर्घटना फिक्स को जोड़ना: a जोड़ना एक नोट में शार्प) इसे एक सेमीटोन अधिक बनाता है, और एक flat (फ्लैट) जोड़ने से यह एक सेमीटोन कम होता है।

कॉर्ड्स

एक राग 2 या अधिक नोट्स एक साथ खेले जाते हैं। कॉर्ड का प्रकार नोटों के बीच संबंधों पर निर्भर करता है, जो उनके बीच की दूरी से निर्धारित किया जा सकता है। एक कॉर्ड में एक रूट नोट है, जैसा कि पहले उल्लेख किया गया है। हम इन उदाहरणों में 0 के रूप में रूट नोट को मानेंगे, लेकिन यह मनमाना है, और इस चुनौती में सभी मायने रखता है कि मोडुलो अंकगणित में नोटों के बीच की दूरी है। उत्तर के लिए हमेशा एक अनोखा राग प्रकार होगा, या तो त्रय या सातवाँ राग । रूट नोट हमेशा सबसे कम-आवृत्ति वाली पिच नहीं होगी; रूट नोट को चुनें जैसे कि आप कॉर्ड को चार कॉर्ड प्रकारों में से एक के रूप में वर्णित कर सकते हैं:

  • एक प्रमुख त्रय नोटों के साथ एक राग है 0 4 7
  • एक मामूली त्रय नोटों के साथ एक राग है 0 3 7
  • एक प्रमुख (या प्रमुख / मामूली) सातवें राग में नोट्स होते हैं 0 4 7 10
  • एक नाबालिग (या नाबालिग / नाबालिग) सातवें राग के नोट्स हैं 0 3 7 103

गिटार ट्यूनिंग

6-स्ट्रिंग गिटार पर मानक ट्यूनिंग सबसे कम स्ट्रिंग पर ई के साथ शुरू होती है, और फिर 5, 5, 5, 4 के अंतराल पर नोटों को मारती है, फिर 5 सेमीटाउन स्ट्रिंग्स को ऊपर जा रहे हैं। सबसे कम E को 0 के रूप में लेते हुए, इसका मतलब है कि गिटार के सभी तारों को झटके से आपको गिने हुए टुकड़े मिलते हैं 0 5 10 15 19 24, जो कि modulo 12 के बराबर है 0 5 10 3 7 0, या नोट्स हैं E A D G B E

काम के उदाहरण

यदि आपका इनपुट है 0 2 2 0 0 0, तो यह नोटों से मेल खाता है E B E G B E, इसलिए सिर्फ E, B, और G. ये कॉर्ड बनाते हैं Em, जिन्हें हमें ई के रूप में रूट के साथ क्रमबद्ध करके देखा जा सकता है 0 3 7। (परिणाम उसी के लिए X 2 X 0 X 0, या होगा 12 14 14 12 12 12।)

यदि आपका इनपुट है 4 4 6 4 6 4, तो C 7 0 7 10 4 7, की जड़ के साथ इनका अंकन करना , या 0 4 7 10, इसलिए उत्तर है C#7(या Db7)। यदि इसके बजाय 4 4 6 4 5 4, नंबरिंग देना होगा 7 0 7 10 3 7, या 0 3 7 10, जो C#m7(या Dbm7) है।

परीक्षण के मामलों

X 3 2 0 1 0  --->  C
0 2 2 0 0 0  --->  Em
X 2 X 0 X 0  --->  Em
4 4 6 4 6 4  --->  C#7  (or Db7)
4 4 6 4 5 4  --->  C#m7 (or Dbm7)
0 2 2 1 0 0  --->  E
0 0 2 2 2 0  --->  A
X X 4 3 2 2  --->  F#   (or Gb)
3 2 0 0 0 1  --->  G7
X X 0 2 1 1  --->  Dm7
3 3 5 5 5 3  --->  C
4 6 6 5 4 4  --->  G#   (or Ab)
2 2 4 4 4 5  --->  B7
0 7 5 5 5 5  --->  Am7
7 6 4 4 X X  --->  B
8 6 1 X 1 3  --->  Cm
8 8 10 10 9 8 -->  Fm
0 19 5 16 8 7 -->  Em
6 20 0 3 11 6 -->  A#   (or Bb)
X 14 9 1 16 X -->  G#m  (or Abm)
12 14 14 12 12 12 --> Em
15 14 12 12 12 15 --> G
20 X 20 20 20 20  --> Cm7
X 13 18 10 11 10  --> A#7 (or Bb7)

1 उनकी आवृत्तियों के लघुगणक द्वारा

2 या, solfège में , do, re, mi जैसे नाम हैं । इस चुनौती में, अक्षर नामों का उपयोग करें।

3 इसे रूट नोट की एक अलग पसंद के साथ एक प्रमुख छठी राग भी कहा जा सकता है। इस चुनौती में, इसे अपने मामूली सातवें नाम से पुकारें।


3
बड़ी चुनौती!
लुइस मेंडो

1
मेरी भविष्य की चुनौती से एक
ठग के रूप में बंद होने के लिए प्रेरित

क्या आउटपुट स्ट्रिंग में अनुगामी व्हाट्सएप की अनुमति है?
लुइस मेंडो

@LuisMendo सुनिश्चित; कोई बात नहीं।
दान गेट्ज़

1
@officialaimm नहीं, आपको किसी भी अन्य स्थितियों को संभालने की आवश्यकता नहीं है। आप मान सकते हैं कि यह हमेशा उन 4 कॉर्ड प्रकारों में से एक होगा। दूसरे शब्दों में, आपका कोड आप जो चाहें (त्रुटि सहित या गलत उत्तर दे सकते हैं) कर सकते हैं यदि वह एक अलग राग मिलता है।
डैन गेट्ज़

जवाबों:


9

MATL , 115 114 बाइट्स

[OAXICO]+tZN~)Y@!"@t1)XH- 12\XzXJK7hm?O.]JI7hm?'m'.]J[KCX]m?'7'.]J[ICX]m?'m7'.]]'FF#GG#AA#BCC#DD#E'l2741B~QY{HX)wh

इनपुट प्रारूप है [N 3 2 0 1 0], जहां Nअप्रयुक्त स्ट्रिंग को इंगित करता है।

आउटपुट स्ट्रिंग हमेशा उपयोग करता है #, नहीं b

इसे ऑनलाइन आज़माएं! या ऑनलाइन कंपाइलर टाइमिंग से बचने के लिए, दो भागों में सभी परीक्षण मामलों को सत्यापित करें:

व्याख्या

[OAXICO]            % Push [0 5 10 3 7 0]. This represents the pitch of each open
                    % string relative to the lowest string, modulo 12
+                   % Add to implicit input. May contain NaN's, for unused strings
tZN~)               % Remove NaN's
Y@!                 % Matrix of all permutations, each in a column
"                   % For each column
  @                 %   Push current column
  t1)               %   Duplicate and get first entry
  XH                %   Copy into clipboard H
  - 12\             %   Subtract. This amounts to considering that the first note
                    %   of the current permutation is the root, and computing
                    %   all intervals with respect to that
  12\               %   Modulo 12
  Xz                %   Remove zeros
  XJ                %   Copy into clipboard J
  K7hm?             %   Are all intervals 4 or 7? If so: it's a major chord
    O               %     Push 0 (will become space when converted to char)
    .               %     Break for loop
  ]                 %   End if
  J                 %   Push array of nonzero intervals again
  I7hm?             %   Are all intervals 3 or 7? If so: it's a minor chord
    'm'             %     Push this string
    .               %     Break for loop
  ]                 %   End if
  J                 %   Push array of nonzero intervals again
  [KCX]m?           %   Are all intervals 4, 7 or 10? If so: it's a dominant-7th
                    %   chord
    '7'             %     Push this string
    .               %     Break for loop
  ]                 %   End if
  J                 %   Push array of nonzero intervals again
  [ICX]m?           %   Are all intervals 3, 7 or 10? If so: it's a minor 7th chord
    'm7'            %     Push this string
    .               %     Break for loop
  ]                 %   End if
]                   % End for. The loop is always exited via one of the 'break'
                    % statements. When that happens, the stack contains 0, 'm',
                    % '7' or 'm7', indicating the type of chord; and clipboard H
                    % contains a number that tells the root note using the lowest 
                    % string as base (1 is F, 2 is F# etc)
'FF#GG#AA#BCC#DD#E' % Push this string. Will be split into strings of length 1 or 2
l                   % Push 1
2741B~Q             % Push [1 2 1 2 1 2 1 1 2 1 2 1] (obtained as 2741 in binary,
                    % negated, plus 1)
Y{                  % Split string using those lengths. Gives a cell array of
                    % strings: {'F', 'F#', ..., 'E'}
H                   % Push the identified root note
X)                  % Index into cell array of strings
wh                  % Swap and concatenate. Implicitly display

4

MS-DOS .COM फ़ाइल (179 बाइट्स)

फ़ाइल (यहाँ HEX के रूप में प्रदर्शित):

fc be 81 00 bf 72 01 31 db b9 06 00 51 e8 73 00
59 e2 f9 b9 0c 00 be 48 01 ad 39 c3 74 0d 40 75
f8 d1 fb 73 03 80 c7 08 e2 ec c3 31 db 88 cb 8a
87 59 01 e8 42 00 8a 87 65 01 e8 3b 00 81 c6 08
00 ac e8 33 00 ac eb 30 91 00 89 00 91 04 89 04
ff ff 00 00 6d 00 37 00 6d 37 42 41 41 47 47 46
46 45 44 44 43 43 00 23 00 23 00 23 00 00 23 00
23 00 04 09 02 07 0b 04 84 c0 74 06 b4 02 88 c2
cd 21 c3 8a 0d 47 ac 3c 20 76 fb 30 ed 3c 41 73
22 2c 30 72 0b 86 c5 b4 0a f6 e4 00 c5 ac eb ed
88 e8 00 c8 30 e4 b1 0c f6 f1 88 e1 b8 01 00 d3
e0 09 c3

इनपुट कमांड लाइन के माध्यम से दिया जाता है। अमान्य इनपुट से अमान्य प्रोग्राम व्यवहार हो जाएगा!

कोडांतरक कोड इस तरह दिखता है:

.text
.code16
ComFileStart:
    cld
    mov $0x81, %si
    mov $(TuneTable-ComFileStart+0x100), %di
    xor %bx, %bx
    # 6 strings: Build the mask of played tones
    mov $6, %cx
NextStringRead:
    push %cx
    call InsertIntoMask
    pop %cx
    loop NextStringRead

    # Check all base tones...
    mov $12, %cx
TestNextTone:
    mov $0x100+ChordTable-ComFileStart, %si
TestNextChord:
    lodsw
    # Is it the chord we are searching for?
    cmp %ax, %bx
    je FoundChord 
    # Is it the end of the table?
    inc %ax
    jnz TestNextChord
    # Transpose the chord we really play
    # and go to the next tone
    # This code rotates the low 12 bits of
    # BX one bit right
    sar $1, %bx
    jnc NoToneRotated
    add $8, %bh
NoToneRotated:
    loop TestNextTone
EndOfProgram:
    ret

FoundChord:
    # Get and print the tone name
    xor %bx, %bx
    mov %cl, %bl
    mov (ToneNamesTable+0x100-1-ComFileStart)(%bx),%al
    call printChar
    mov (ToneNamesTable+0x100+12-1-ComFileStart)(%bx),%al
    call printChar
    # Get the chord name suffix and print it
    add $(ChordNamesTable-ChordTable-2),%si
    lodsb
    call printChar
    lodsb
    # Note: Under MS-DOS 0x0000 is the first word on
    # the stack so the "RET" of printChar will jump
    # to address 0x0000 which contains an "INT $0x21"
    # (end of program) instruction
    jmp printChar

ChordTable:
    # Major, Minor, Major-7, Minor-7
    .word 0x91, 0x89, 0x491, 0x489, 0xFFFF
ChordNamesTable:
    .byte 0,0,'m',0,'7',0,'m','7'
ToneNamesTable:
    .ascii "BAAGGFFEDDCC"
    .byte 0,'#',0,'#',0,'#',0,0,'#',0,'#',0
TuneTable:
    .byte 4,9,2,7,11,4

#
# Subfunction: Print character AL;
#              Do nothing if AL=0
#
printChar:
    test %al, %al
    jz noPrint
    mov $2, %ah
    mov %al, %dl
    int $0x21
noPrint:
    ret

#
# Subfunction: Get one finger position
#              and insert it into a bit mask
#              of tones being played
#
# Input:
#
#   [DS:DI] = 
#        Tuning of current string (0=C, 1=C#, ..., 11=B)
#        Actually only 2=D, 4=E, 7=G, 9=A and 11=B are used
#
#   DS:SI = Next character to read
#
#   DF = Clear
#
# Input and Output:
#
#    BX = Bit mask
#    DI = Will be incremented
#
# Destroys nearly all registers but SI and BX
#
InsertIntoMask:
    mov (%di), %cl
    inc %di
SkipSpaces:
    lodsb
    cmp $' ', %al
    jbe SkipSpaces
# Now evaluate each digit
    xor %ch, %ch
GetNextDigit:
    # Number = 10*Number+Digit
    cmp $'A', %al
    jae DigitIsX
    sub $'0', %al
    jb DigitsDone
    xchg %al, %ch
    mov $10, %ah
    mul %ah
    add %al, %ch
    lodsb
    jmp GetNextDigit
DigitsDone:
    # Add the tune of the string
    # and perform modulus 12
    mov %ch, %al
    add %cl, %al
    xor %ah, %ah
    mov $12, %cl
    div %cl
    mov %ah, %cl
    mov $1, %ax
    shl %cl, %ax
    or %ax, %bx
DigitIsX:
    ret

परीक्षण के मामलों:

6 20 0 3 11 6 -->  A#   (or Bb)

मैंने पहले से ही दो पियानो खिलाड़ियों को एक पियानो पर "चार हाथ" एक साथ बजाते हुए देखा था।

यह परीक्षण मामला पहली बार मैंने ऐसा करने वाले गिटार खिलाड़ियों के बारे में पढ़ा है!

दाएं हाथ के दोहन के साथ भी आप इस तरह से एक कॉर्ड नहीं खेल सकते हैं!


हम्म, शायद एक विद्रूप उस राग को खेल सकता है? मुझे लगता है कि यह उन लोगों में से एक है जिन्हें मैंने यादृच्छिक खोज से पाया था ताकि कुछ "कठिन" परीक्षण मामले हो सकें।
डैन गेट्ज़

3

रूबी, 129 बाइट्स

पिछले संस्करण के रूप में लेकिन पार्सिंग स्टेप और आउटपुट स्टेप के बीच अनुक्रम के लिए टर्नरी ऑपरेटर के साथ एक लूप का उपयोग करता है। इस काम को करने के लिए कुछ अन्य छोटे संशोधनों की आवश्यकता थी।

->a{r=0
18.times{|j|j<6?a[j]&&r|=8194<<(6--~j%5+a[j]*7)%12:(r/=2)&11==3&&puts("CGDAEBF"[j%7]+?#*(j/13)+['',?m,?7,'m7'][r>>9&3])}}

रूबी, 136 बाइट्स

ललामदा फ़ंक्शन एक संख्या के एक नंबर को एक तर्क के रूप में स्वीकार करता है और stdout को आउटपुट करता है। अप्रयुक्त स्ट्रिंग को एक मिथ्या मान द्वारा दर्शाया जाता है (माणिक में केवल मिथ्या मूल्य हैं nilऔर false)।

->a{r=0
6.times{|j|a[j]&&r|=4097<<(6--~j%5+a[j]*7)%12}
12.times{|j|r&11==3&&puts("FCGDAEB"[j%7]+?#*(j/7)+['',?m,?7,'m7'][r>>9&3]);r/=2}}

व्याख्या

मैं पंद्रहवें चक्र के आधार पर 12 पिचों के प्रतिनिधित्व का उपयोग करता हूं । इसका मतलब है कि प्रत्येक पिच को क्रम देने के बाद पिच 7 सेमिटोन्स (या 5 सेमीटोन कम) से अधिक है F C G D A E B F# C# G# D# A#। इसके 2 फायदे हैं। एक यह कि सभी शार्प एक साथ दिखाई देते हैं। दूसरा यह है कि 5 स्ट्रिंग बास के खुले-स्ट्रिंग नोट एक साथ दिखाई देते हैं: जीडीएईबी (गिटार संबंधित है लेकिन थोड़ा अधिक जटिल है, नीचे देखें)।

पहला लूप 6 बार चलता है। अभिव्यक्ति 6--~j%5(समतुल्य 6-(j+1)%5) खुले तार के लिए नोट मान देता है E=5 A=4 D=3 G=2 B=6 E=5:। इसके लिए हम fret संख्या को 7 से गुणा करते हैं (जैसा कि ऊपर देखा जा सकता है, एक सेमीटोन जोड़कर हमें अनुक्रम में 7 स्थान आगे बढ़ाता है।) फिर हम पूरी चीज़ को मोडुलो 12 लेते हैं और मौजूद नोटों का एक बिटमैप बनाते हैं (हम) 4097<<note valueलगातार 2 ऑक्टेव देने के लिए उपयोग करें।)

बिटमैप की रचना करने के बाद, हम कॉर्ड को खोजने और इसे आउटपुट करने के लिए तैयार हैं।

हम निम्नलिखित नोटों में रुचि रखते हैं:

Note       position in      position in             Note      position in 
           semitone domain  circle of fifths                  circle of fifths 
Root       0                0                       Root      0
Minor 3rd  3                9                       Fifth     1
Major 3rd  4                4                       Sixth     3
Fifth      7                1                       Major 3rd 4
Sixth      9                3                       Minor 3rd 9
Minor 7th  10               10                      Minor 7th 10

कॉर्ड एफ के लिए जाँच करके शुरू, हम यह देखने के लिए परीक्षण करते हैं कि क्या जड़ और पांचवें मौजूद हैं: बिट्स 0 और 1 (कम से कम महत्वपूर्ण: 1 और 2 के बिट्स गिनते हुए।) छठी chords को अस्वीकार करने के लिए हमें उस छठे को भी जांचना होगा। अनुपस्थित है: बिट 3 (8 का बिट।) तो हम जाँचते हैं कि r&&11==3और यदि हम कॉर्ड को प्रिंट करते हैं।

हम प्रमुख तीसरे की उपेक्षा करते हैं, और कॉर्ड प्रकार का पता लगाने के लिए पूरी तरह से बिट 9 (मामूली तीसरे) और बिट 10 (मामूली 7 वें) पर भरोसा करते हैं। r>>9&3किसी सरणी से सही कॉर्ड प्रकार चुनने के लिए अभिव्यक्ति का उपयोग किया जाता है।

लूप के अंत में, हम r/=2अनुक्रम में संभावित कॉर्ड जड़ों का परीक्षण करने के लिए बिटमैप को एक बिट में स्थानांतरित करते हैं F C G D A E B F# C# G# D# A#:।

परीक्षण कार्यक्रम में अपराजित

f=->a{                            #Accept array of 6 numbers as argument.
  r=0                             #Setup an empty bitmap.

  6.times{|j|                     #For each string
    a[j]&&                        #if the fret value is truthy (not nil or false)
    r|=4097<<(6--~j%5+a[j]*7)%12  #calculate the note value in the circle of fifths and add to the bitmap.
  }

  12.times{|j|                    #For each possible root note
    r&11==3&&                     #if root and fifth are present (bits 0 and 1) and sixth is absent (bit 3) 
    puts("FCGDAEB"[j%7]+?#*(j/7)+ #output the note name and a sharp symbol if necessary, followed by
    ['',?m,?7,'m7'][r>>9&3])      #m and/or 7 as indicate by bits 9 and 10.
    r/=2
  }
}

print 1;f[[nil,3,2,0,1,0]]       #  C
print 2;f[[0,2,2,0,0,0]]         #  Em
print 3;f[[nil,2,nil,0,nil,0]]   #  Em
print 4;f[[4,4,6,4,6,4]]         #  C#7 
print 5;f[[4,4,6,4,5,4]]         #  C#m7 
print 6;f[[0,2,2,1,0,0]]         #  E
print 7;f[[0,0,2,2,2,0]]         #  A
print 8;f[[nil,nil,4,3,2,2]]     #  F#  
print 9;f[[3,2,0,0,0,1]]         #  G7
print 10;f[[nil,nil,0,2,1,1]]    #  Dm7
print 11;f[[3,3,5,5,5,3]]        #  C
print 12;f[[4,6,6,5,4,4]]        #  G#  
print 13;f[[2,2,4,4,4,5]]        #  B7
print 14;f[[0,7,5,5,5,5]]        #  Am7
print 15;f[[7,6,4,4,nil,nil]]    #  B
print 16;f[[8,6,1,nil,1,3]]      #  Cm
print 17;f[[8,8,10,10,9,8]]      #  Fm
print 18;f[[0,19,5,16,8,7]]      #  Em
print 19;f[[6,20,0,3,11,6]]      #  A#  
print 20;f[[nil,14,9,1,16,nil]]  #  G#m 
print 21;f[[12,14,14,12,12,12]]  #  Em
print 22;f[[15,14,12,12,12,15]]  #  G
print 23;f[[20,nil,20,20,20,20]] #  Cm7
print 24;f[[nil,13,18,10,11,10]] #  A#7

2

जावास्क्रिप्ट (ईएस 6), 335 333 बाइट्स

इस चुनौती और पीपीसीजी एसई से प्यार करें! यह मेरा पहला गोल्फ है - सुझावों का स्वागत है क्योंकि मुझे यकीन है कि इसमें बहुत सुधार किया जा सकता है। (2 बाइट्स खटखटाईं क्योंकि मैंने गिनती में f = को शामिल किया था)

फ़ंक्शन fस्ट्रिंग की एक सरणी लेता है, संख्याओं और 'X' का प्रतिनिधित्व करता है, जैसे f(['X','3','2','0','1','0'])कॉर्ड (प्राकृतिक या तेज) को लौटाता है और पसंद करता है E#m7। स्पष्टता के लिए जोड़े गए समाचार (बाइट गिनती में शामिल नहीं)

f=c=>[s=new Map([[435,''],[345,'m'],[4332,7],[3432,'m7']]),
n=[...new Set(c.map((e,i)=>e?(+e+[0,5,10,3,7,0][i])%12:-1)
.filter(e=>++e).sort((a,b)=>a>b))],d=[...n,n[0]+12].reduce(
(a,c,i)=>i?[...a,(c-n[i-1]+12)%12]:[],0).join``.repeat(2),
m=+d.match(/(34|43)(5|32)/g)[0],'E0F0F#0G0G#0A0A#0B0C0C#0D0D#'
.split(0)[n[d.indexOf(m)]]+s.get(m)][4]

उपयोग उदाहरण:

console.log(f(['0','2','2','0','0','0'])); // Em

परीक्षण मामलों को चलाने के लिए:

tests=`X 3 2 0 1 0 ---> C
0 2 2 0 0 0 ---> Em
X 2 X 0 X 0 ---> Em
4 4 6 4 6 4 ---> C#7 (or Db7)
4 4 6 4 5 4 ---> C#m7 (or Dbm7)`; // and so on...

tests.split`\n`.forEach(e=>{
    console.log(`Test: ${e}
      Result: ${f(e.split(' ').slice(0,6))}`)
})

स्पष्टीकरण के साथ अनगुल्ड संस्करण:

f = (c) => {
    s = new Map([
        [435,''], [345,'m'], [4332,7], [3432,'m7'] 
    ]) /* Each key in s describes the intervals (semitones)
          between consecutive notes in a chord, when it is
          reduced to a single octave, including the interval
          from highest back to lowest. The values describe
          the corresponding chord suffix. E.g. C-E-G has
          intervals C-4-E-3-G-5-C. 435=major=no suffix. */

    n = [ ...new Set(
        c.map( 
         (e,i) => e ? ( +e + [0,5,10,3,7,0][i] )%12 : -1 
         ).filter( (e) => ++e ).sort( (a,b) => a>b )
        ) ] /* take the input array, c, and transform each fret
               position into a note. remove non-notes (-1), sort
               in tone order, remove duplicates. An input of
               positions X 13 18 10 11 10 becomes notes
               (-1) 6 4 1 6 10 then 1 4 6 10. */

    d = [ ...n, n[0] + 12 ].reduce(
        (a,c,i) => i ? [ ...a, (c - n[i-1] + 12)%12 ] : [], 0
    ).join``.repeat(2)
    /* convert the note array, n, into an interval string, d,
       including the lowest note repeated above it to capture
       all intervals. Repeat it twice so that, regardless of the
       inversion played, the intervals will appear in root order
       somewhere. E.g. notes 1-4-6-10 and 13 (1+12)
       become intervals 3 2 4 3, and string for searching
       32433243 */

    m = +d.match( /(34|43)(5|32)/g )[0];
      /* m is the matched chord pattern. In this case, 4332. */

    return 'E0F0F#0G0G#0A0A#0B0C0C#0D0D#'.split(0)[
    n[ d.indexOf(m) ]
    /* get the position in the interval string where the root
       interval first occurs. this corresponds to the position
       of the chord root note in the note array, n. convert this
       number 0-12 to a note name E - D# */
    ] + s.get(m)
       /* add the suffix corresponding to the matched
       chord interval pattern */
}

1
साइट पर आपका स्वागत है! आपको यह सुनकर खुशी हुई। :) दुर्भाग्य से, मैं तो मैं कोई सुझाव नहीं है किसी भी जे एस पता नहीं है, लेकिन आप कुछ खोजने के लिए सक्षम हो सकता है यहां
DJMcMayhem
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.