Gitar sekmeleri mi üretiyorsunuz?


24

Girdi olarak verilen akorlar için gitar sekmeleri üreten en kısa programı yazınız.

Böylece, aranızdaki gitaristlerin bir avantaja sahip olmaması ve onu deterministik hale getirmesi (ve kodlanmasının daha kolay olması), işte yetkili akorların sadece formları:

Major chords:

  E   F   F#  G   G#  A   A#  B   C   C#  D   D#
e 0---1---2---3---4---0---1---2---3---4---5---6---
B 0---1---2---3---4---2---3---4---5---6---7---8---
G 1---2---3---4---5---2---3---4---5---6---7---8---
D 2---3---4---5---6---2---3---4---5---6---7---8---
A 2---3---4---5---6---0---1---2---3---4---5---6---
E 0---1---2---3---4---0---1---2---3---4---5---6---

Minor chords:

  Em  Fm  F#m Gm  G#m Am  A#m Bm  Cm  C#m Dm  D#m
e 0---1---2---3---4---0---1---2---3---4---5---6---
B 0---1---2---3---4---1---2---3---4---5---6---7---
G 0---1---2---3---4---2---3---4---5---6---7---8---
D 2---3---4---5---6---2---3---4---5---6---7---8---
A 2---3---4---5---6---0---1---2---3---4---5---6---
E 0---1---2---3---4---0---1---2---3---4---5---6---

Her serideki ilk 5 akorun ve son 7 akorun farklı biçimlerde olduğuna dikkat edin.

Tüm akorlar basit majör veya minör akorlardır (7. veya başka varyasyon yok).

Sen de dairelere dikkat etmelisin. Hatırlatma:

A# = Bb
C# = Db
D# = Eb
F# = Gb
G# = Ab

B#, Cb, E# and Fb are not used

Çıktı , yukarıda gösterildiği gibi, kablo adlarına sahip ilk sütunu içermelidir . Üzerine akor adını dahil etmek zorunda değildir . Akorlar -yukarıda gösterildiği gibi 3 ile ayrılmalıdır . Son 3 -isteğe bağlıdır.

Giriş, boşluklarla ayrılmış, akor adlarından oluşan bir dizedir.

Örnek bir giriş:

Bm Gb A E G D Em F#

ve karşılık gelen çıktı:

e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

... ve yan soru: örnek şarkı nedir? :)
Jules Olléon

5
Hotel California: P
Matthew

Evet, sen kazandın! :)
Jules Olléon

İyi fikir. Oynamak için zamanım olsaydı!
Igby Largeman,

Yanıtlar:


9

JavaScript, 297 277 262 235 223 karakter

Golf edilen versiyonda hiçbir araba dönüşü önemli değildir; Onlar sadece cevabı okunabilir hale getirmek için oradalar. Noktalı virgüller önemlidir.

Düzenleme: Dışını mapbir süre döngüsü ve diğer düzenlemelerle değiştirdi. Nihayet 2 × içinde Golfscript sürümünün boyutu (şimdilik)!

Düzenleme:indexOf Matematik ile değiştirildi, arama tablosunu kırdı, diğer küçük geliştirmeler.

Düzenleme: Başka mapiçin forve son bir sergiliyordu \nI gereksiz yere yeme edilmişti. Nihayet Jules Python versiyonunun içinde.

i=prompt(o='').split(' ');for(r=6;o+=' EADGBe'[r]+' ',r--;o+='\n')
for(j=0;n=i[j++];o+=(([84,13,52,5][2*/m/.test(n)+x]*8>>2*r&3)+y-7*x)+'---')
y=n.charCodeAt(0),y=(2*y-(y>66)-(y>69)+(n[1]<'$')-(n[1]=='b')+2)%12,x=y>6;alert(o)

Çıktı artık izlemenin ---isteğe bağlı olmasından faydalanmıyor :

e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

Kahretsin, ben javascript peen-gıpta düşünüyorum. Güzel bitti.
kekekela

7

Golfscript, 136 karakter

[["eBGDAE"{[]+" "+}/]]\" "/{.-2\{"bm#A B C D E F G"?.)!!*(+}/14%.3>-.8>-.7/@109?0>2*+[963 780 882 753]{3base(;}%=\7%{+'---'+}+%}%+zip n*

Tam 23 karakter (% 17.5), her çıkış satırının başlangıcında bu iki karakterle ilgilidir.

Örnek çıktı, kenar kasaların test edilmesi:

$ golfscript.rb tabs.gs <<<"E G# Ab A Db D# Em G#m Abm Am D#m"
e 0---4---4---0---4---6---0---4---4---0---5---
B 0---4---4---2---6---8---0---4---4---1---6---
G 1---5---5---2---6---8---0---4---4---2---7---
D 2---6---6---2---6---8---2---6---6---2---7---
A 2---6---6---0---4---6---2---6---6---0---5---
E 0---4---4---0---4---6---0---4---4---0---5---

Bu konuda sadece bir saat geçirdim, bu yüzden muhtemelen en az 5 ila 10 karakter azaltılabilir. Kavramsal olarak, DocMax'ın çözümüne oldukça benzer olduğu ortaya çıkıyor: dört vaka için arama tablosu, daha sonra bir ofset artırma ve dizeleri doğru sırayla birleştirme.


+1: Man Golfscript'i seviyorum! Bugün birkaç kez kodumu düzeltecek yerler buldum, ancak% 50 değil! Kullanışlı bir tercüman yok: Eb için D # döndürüyor mu?
DocMax

BTW, örneğinizdeki son not C # m ile eşleşse de komut satırında D # m gösterilir. Yazım hatası mı, böcek mi?
DocMax

@DocMax, böcek. Neden sadece D # m'yi etkilediğini ve D # 'yi etkilediğini anlamıyorum - bu hata ayıklama için ilginç olacak. Her şeyi yeniden sıralıyorum çünkü ilk önce 7 bloğun olması uygun, bu yüzden Eb gerçekten kenar davası değil.
Peter Taylor

Sonuncunun dahil edildiğine, arama tablosunda bulunmamasının, değeri bir harfin eşdeğeri tarafından aşağıya çektiğini ortaya koydu.
Peter Taylor

4

Bunu kodladıktan sonra, daha akıllıca yapabileceğimi farkettim ... belki başka bir giriş yapabilirim. Umarım en hızlı olduğum için puan alırım!

Her neyse, 962 karakter Perl var.

%c =(B=>{E=>0,F=>1,Gb=>2,G=>3,Ab=>4,A=>2,Bb=>3,B=>4,C=>5,Db=>6,D=>7,Eb=>8,Em=>0,Fm=>1,Gbm=>2,Gm=>3,Abm=>0,Am=>1,Bbm=>2,Bm=>3,Cm=>4,Dbm=>5,Dm=>6,Ebm=>7},G=>{E=>1,F=>2,Gb=>3,G=>4,Ab=>5,A=>2,Bb=>3,B=>4,C=>5,Db=>6,D=>7,Eb=>8,Em=>0,Fm=>1,Gbm=>2,Gm=>3,Abm=>4,Am=>2,Bbm=>3,Bm=>4,Cm=>5,Dbm=>6,Dm=>7,Ebm=>8},D=>{E=>2,F=>3,Gb=>4,G=>5,Ab=>6,A=>2,Bb=>3,B=>4,C=>5,Db=>6,D=>7,Eb=>8,Em=>2,Fm=>3,Gbm=>4,Gm=>5,Abm=>6,Am=>2,Bbm=>3,Bm=>4,Cm=>5,Dbm=>6,Dm=>7,Ebm=>8},A=>{E=>2,F=>3,Gb=>4,G=>5,Ab=>6,A=>0,Bb=>1,B=>2,C=>3,Db=>4,D=>5,Eb=>6,Em=>2,Fm=>3,Gbm=>4,Gm=>5,Abm=>6,Am=>0,Bbm=>1,Bm=>2,Cm=>3,Dbm=>4,Dm=>5,Ebm=>6},E=>{E=>0,F=>1,Gb=>2,G=>3,Ab=>4,A=>0,Bb=>1,B=>2,C=>3,Db=>4,D=>5,Eb=>6,Em=>0,Fm=>1,Gbm=>2,Gm=>3,Abm=>4,Am=>0,Bbm=>1,Bm=>2,Cm=>3,Dbm=>4,Dm=>5,Ebm=>6});
%b=('A#'=>'Bb','C#'=>'Db','D#'=>'Eb','F#'=>'Gb','G#'=>'Ab');
foreach(qw(e B G D A E)){p($_,@ARGV)}
sub p{$s = shift;print "$s ";$s = uc($s);foreach(@_){while(($h,$f)=each(%b)){s/$h/$f/}print "$c{$s}->{$_}---"}print "\n"}

İşte karşılık gelen çıktı.

dhrasmus:Desktop standage$ perl guitar Bm Gb A E G D Em F#
e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

4

Daha kısa çözümler zaten verildiğinden (kahrolası GolfScript!), İşte benimki:

Python, 229 karakter

s=[("E EmF FmF#GbG GmG#AbA AmA#BbB BmC CmC#DbD DmD#Eb".find("%-02s"%s[:2])/4,s[-1]!='m')for s in raw_input().split()]
for c in range(6):
 l='eBGDAE'[c]+' '
 for(i,M)in s:x=i>4;l+=`i-5*x+2*(2<c+x<5)+(M+x)*(c==2-x)`+"---"
 print l

Çıktı:

> echo "Bm Gb A E G D Em F#" | python guitar.py
e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

3

Python, 449 karakter

z=int
f=str
r=range
j=''.join
n='E F F# G G# A A# B C C# D D#'.split()
n+=[x+'m'for x in n]
c=[j([f(z(x)+i)for x in'001220'])for i in r(5)]+[j([f(z(x)+i)for x in'022200'])for i in r(7)]
c+=[x[:2]+f(z(x[2])-1)+x[3:]for x in c[:5]]+[x[0]+f(z(x[1])-1)+x[2:]for x in c[5:]]
a=[c[n.index((chr(ord(i[0])-1)+'#'+i[2:]).replace('@','G')if len(i)-1 and i[1]=='b'else i)]for i in raw_input().split()] 
for i in r(6):print'eBGDAE'[i],j([x[i]+'-'*3 for x in a])

3

C99 - 231 karakter

Akorlar, komut satırında, akor başına bir argüman olarak verilir ve tabii ki hiçbir şekilde giriş doğrulaması yoktur.

#include<stdio.h>
int main(int c,char**v){for(char*o="e0)B2)G2*D2+A0+E0)",i,m;*o;o+=3,v-=c,puts(""))for(printf("%c ",*o);*++v;printf("%c---",i-(i>2)-i/9+o[1+i/8]-(*o-66-i/8*5?0:m?m+2[*v]>99:0)))m=1[*v],i=(**v*2-4+m/35-m/98*3)%14;}

Örnek çalışma:

$ ./a.out Bm Gb A E G D Em F#
e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

Un-golfed

#include<stdio.h>
int main(int c,char**v){
     // o points to three characters per output line:
     //   string name, number for A, adjusted number for E (ASCII code minus 7)
     char* o="e0)B2)G2*D2+A0+E0)",
          i, // chord: A=0, A#=1, ..., G#=13, allowing also 3="E#" and 9="B#"
          m; // second character in chord name
     for (; *o; o+=3) {
          printf("%c ", *o);
          for (; *++v; ) {
               m = 1[*v],
               i = (**v*2-4+m/35-m/98*3)%14; // parse & adjust for sharp, flat
               printf("%c---",
                      i-(i>2)-i/9 // eliminate "E#", "B#"
                      +o[1+i/8] // get the number for a major chord
                      // adjust for minor...
                      -(*o-66-i/8*5
                        ? 0
                        : m ? m+2[*v]>99 : 0));
          }
          v -= c; // rewind argument pointer
          puts("");
     }
}

Standart D olmayan C - 206 karakter

Dil özelliklerini önemsemezsek, GCC, C99 değişken bildirimlerini K&R tarzı argüman bildirimi (ve basılı bir bildirim) ile karıştırsa bile, aşağıdaki tek astarı işlevsel bir ikilide derleyebilir.

main(c,v)char**v;{for(char*o="e0)B2)G2*D2+A0+E0)",i,m;*o;o+=3,v-=c,puts(""))for(printf("%c ",*o);*++v;printf("%c---",i-(i>2)-i/9+o[1+i/8]-(*o-66-i/8*5?0:m?m+2[*v]>99:0)))m=1[*v],i=(**v*2-4+m/35-m/98*3)%14;}

2

C ++ 432

#include <cmath>
#include <iostream>
F(int c){c-=65;return c*1.6+sin(c/5.+.3);}
T(int a,int s){if(s)return(a=(T(a,s-1)+2)%3)-=(a==1&s>2);return(a<7)*2;}
#define c(a,b) while(*(++j)==a)b;--j; 
#define O std::cout<<
main(int a,char*p[]){
int P=2;for(int i=-1;++i<6;P=2){O p[1][i];O" ";while(P<a){char*j=p[P++];
int f=F(*j);c('#',++f)c('b',--f)
int t=T(f,i)*3.5;if(*(++j)!='m'){--j;t+=(t==3);}
O(f-F(p[1][i])+t+24)%12;O"---";
}O'\n';}}

Bunun, ilk parametre olarak gitar tuning gerektirdiğini unutmayın. (Standart olmayan ayarların çoğu size saçma sapan sonuçlar verir, ancak standart ayardan memnun olduğunuzu sanırım.)

Hotel California için yapabilirsiniz $./a.out EBGDAE Cbm Gb Bbb Fb G D Em F# Bm F# G## D## F## C## D##m E##. Sonuç:

E 2---2---0---0---3---5---0---2---2---2---5---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---3---2---5---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---4---3---6---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---4---4---7---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---2---4---7---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---2---2---5---0---3---5---0---2---

Üst dört dizgiyi küçük üçlilere ayarlamak, pek çok inversiyonda, üç veya dört telli akorları açık teller olmadan ve dokunmadan bir telin üzerine "parmak" koymak zorunda kalmadan çalmayı çok kolaylaştırır. DFG # B karakter dizilerini kullanarak, "Bbm F Bbm Gb Db Ebm Db F Bbm F F7 Bbm" (Denizkızı Şarkısı) gibi bir akor dizisi çok kolay çalışır. Sadece bir perde yukarı ve aşağı kaydırmak için gereklidir. Yarım adımda bir anahtar değişimi var, ancak bu sadece perdeyi kaldırmak anlamına geliyor. Yine de, diğer iki dizeyle ne yapılacağını çözemedim.
supercat

@supercat: ilginç, yarın gitarda bunu deneyeceğim ...
saat

Ne düşündüğünü duymak isterim. Birkaç yıl, birkaç yıl sonra bir gitar aldım ve pes ettim, çünkü parmaklar hem keyfi hem de garip görünüyordu. Sonra ayarların basit parmaklara ne izin vereceğini düşündüm. Kapalı formlu akorlar, küçük bir üçte birden mükemmel bir dördüncüye kadar değişen aralıklara sahip olduklarından, dizeleri küçük üçte birine ayarlamak, her bir dizinin aşağıdaki dizeden daha düşük olmayan bir noktada sönümleneceği anlamına gelir. Solak bir gitarı deneyebilirsem, dize düzeninin tersine döndüğü mükemmel dördüncüleri deneyebilirim, çünkü benzer.
supercat

Olduğu gibi, küçük üçte birine ayarlamak, en düşük ipteki ilk parmağın her bir pozisyonu için, üç ana akor inversiyonu ve üç küçük akor inversiyonu olacağı anlamına gelir. Biri, ikinci parmağı üstteki üç dizenin üzerine yerleştirerek de bir yedinci akor çalabilir. Mermaid Song için, üçüncü perdeye başlayın ve F-Bb-DF'yi çalın (1-3-3-4 parmaklarıyla). Sonra F, FACF'dir (1-2-2-4). Gb perdelidir, 1-2-2-4 parmaklı (F gibi). Db, 1-3-4-4 arasında bir perdeye geri döndü. EBM geri döndü, 1-2-4-4.
supercat

Uygun akor notalarının ne olması gerektiğini bir klavye yardımıyla çalıştıktan sonra bazı parçaları (yukarıda belirtilen Denizkızı Şarkısı dahil) sorunsuz bir şekilde çalabildiğim noktaya gelmem sadece birkaç saatimi aldı. Bu tarzı bir kez denediğimde, kendimi inanılmaz derecede doğal hissettim ve birinin, her büyük ve küçük akorun üç inversiyonunu da kullanma şeklini seviyorum. Biri sadece büyük ve küçük akorlar isterse, F-Ab-B-Eb-Gb-D gibi bir ayar teorik olarak altı parmak büyük ve küçük akorlara kolay parmaklama ile izin verebilir (1-2-2-3-4-4 veya 1 -1-2-3-3-4) fakat ters çevrimler olmadan.
supercat

2

390 345 340

Gitar pragmatik bir yaklaşımla sadeleştirilmiştir (E şekli, sadece bir parmağınızı değiştiren bir ipten aşağı kaydırılan A şeklinin bir varyasyonudur). Kodlanmış dize fikrini diğer cevaplardan ödünç aldım.

[/p{print}/x{exch}/e{cvx exec}/d{dup 0
get}/f{forall}(A0#1B2C3D5E7F8G:b;){}forall/m{dup
4 2 copy get 1 sub put}109{m 48}/+{[3 1 roll x{1
index add x}f]}/*{[0 0 2 2 2 0 0]x{load e 48 sub
+}f d 12 gt{-12 +}if d 6 gt{m -7 + 1}{0}ifelse 6
getinterval}>>begin[ARGUMENTS{*}f][(E)(A)(D)(G)(B)(e)]6{[x
e p( )p]x[x{[x e( )cvs p(---)p]}f]x()=}repeat

Önceden:

450 442 418

Bununla çıkış formatını da düzelttim. (Önceki sürümler "e" yerine "E ---" ile başladı.)

<</i{index}/a{add}/p{pop}/x{exch}/g{getinterval}/r{print}/f{forall}/e{exec}>>begin<<65[0
2 3 5 -5 -4 -2]{1 i 1 a}f p 35{1 a}98{1 sub}109{x dup
4 20 put x}>>begin[ARGUMENTS{[x[0 5 12 17 21 24 29
0]x{load e}f x{1 i a x}f]dup 0 get 0 ge{0}{1}ifelse 7
g[0 -5 -10 -15 -19 -24 -29]0 1 6{2 copy get 3 i 2 i
get a 3 copy put p p}for x p 0 6
g}f][(E)(A)(D)(G)(B)(e)]6{[x cvx e r( )r]x[x{[x cvx
e( )cvs r(---)r]}f]x(\n)r}repeat

Nasıl çalıştırılır: gsnd -q -- tab.ps Bm Gb A E G D Em F\#(Keskinliği kabuktan gizleyin).

Un-golfed versiyonu neredeyse daha zor golfed olandan oldu. Ama ayrıntılı olmaya çalıştım. Düzenleme: hileci-bit hakkında bir kaç daha yorum.

%!PS
<<    %axioms and operations
/t{2 2 1}    %major tetrachord
/m{t t 2}    %mixolydian mode
/u{2 1 2}    %minor tetrachord
/a{u u}      %aolian mode
/s{m m t}    %2.5-octave mixolydian intervals
/r{3 1 roll}
/${[exch 0 exch{1 index add}forall]}    %running sum: convert (relative)intervals to (abstract)fretstops
/+{[r exch{1 index add exch}forall pop]}    %scale array by scalar
/@{[r{2 copy get r pop}forall pop]}    %select array elements from array of indices
/&{0 1 3 index length 1 sub{    %array2 += array1
    2 copy get 3 index 2 index get add 3 copy put pop pop}for exch pop}
>>begin<<    %map ascii values to scaling functions
65[a]$    %generate fretstops of the A aolian scale to assign scalars to note names
[0 0 0 0 -12 -12 -12]&    %drop E F and G down an octave
{[exch/+ cvx]cvx 1 index 1 add}forall pop    %generate the pairs 'A'->{0 +}, 'B'->{2 +}
35{1 +}     %'#'-> scale up by one
98{-1 +}    %'b'-> scale down by one
109{dup 4 2 copy get 1 sub put}     %'m'-> tweak the 'third' down by one
%generate chord pattern from (string)
/*{[s]$       %generate fretstops of the E mixolydian scale
  [1 4 8 11 13 15 18]    %A-shape figured bass: IV chord of E mixolydian
  -1 +       %convert scale degrees to array indices
  @       %generate chord template by selecting indices from mixolydian scale
  exch{load exec}forall       %execute ascii values, scaling the pattern
  dup 0 get 0 ge{0}{1}ifelse 6 getinterval    %discard first note if it has fallen off the bottom
  [0 -5 -10 -15 -19 -24]&}    %subtract the string offsets
>>begin    %activate definitions
%(A)* pstack()= clear    %[0 0 2 2 2 0]
%(B)* pstack()= clear    %[2 2 4 4 4 2]
%(F#)* pstack()= clear    %[2 4 4 3 2 2]
%(Abm)* pstack()=    %[4 6 6 4 4 4]
[ARGUMENTS{*}forall]    %convert array of strings to array of patterns
[(E)(A)(D)(G)(B)(e)]    %array of string names
6{    %for each "string"
    [exch cvx exec print( )print]    %pop string name and print with space
    exch       %put names behind numbers
    [exch{     %for each "chord"
        [exch cvx exec( )cvs print(---)print]    %pop number, convert, print with trailing hyphens
    }forall]    %zip up chord array for next iteration
    ()=         %print a newline
    exch        %put numbers behind names
}repeat

Peki ya test olarak Yükselen Güneş Evi'ne ne dersiniz ?

04:51 PM:~ 0> gsnd -q -- tabb.ps Em G A C Em G B B Em G A C Em B Em B|sed 's/^/    /'
e 0---3---0---3---0---3---2---2---0---3---0---3---0---2---0---2---
B 0---3---2---5---0---3---4---4---0---3---2---5---0---4---0---4---
G 0---4---2---5---0---4---4---4---0---4---2---5---0---4---0---4---
D 2---5---2---5---2---5---4---4---2---5---2---5---2---4---2---4---
A 2---5---0---3---2---5---2---2---2---5---0---3---2---2---2---2---
E 0---3---0---3---0---3---2---2---0---3---0---3---0---2---0---2---

Bu kodun bir yorumunu burada başka bir cevapta yazdım .
kullanıcı kullanımı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.