Bana bir ölçek yazdır


20

Oh hayır! Yakında bir teori testim var ve henüz ölçekleri hatırlamıyorum! Aşağıdakileri yazdırarak ana ölçeklerimi hatırlamama yardımcı olun:

7♯ - C♯ D♯ E♯ F♯ G♯ A♯ B♯ C♯
6♯ - F♯ G♯ A♯ B  C♯ D♯ E♯ F♯
5♯ - B  C♯ D♯ E  F♯ G♯ A♯ B
4♯ - E  F♯ G♯ A  B  C♯ D♯ E
3♯ - A  B  C♯ D  E  F♯ G♯ A
2♯ - D  E  F♯ G  A  B  C♯ D
1♯ - G  A  B  C  D  E  F♯ G
0  - C  D  E  F  G  A  B  C
1♭ - F  G  A  B♭ C  D  E  F
2♭ - B♭ C  D  E♭ F  G  A  B♭
3♭ - E♭ F  G  A♭ B♭ C  D  E♭
4♭ - A♭ B♭ C  D♭ E♭ F  G  A♭
5♭ - D♭ E♭ F  G♭ A♭ B♭ C  D♭
6♭ - G♭ A♭ B♭ C♭ D♭ E♭ F  G♭
7♭ - C♭ D♭ E♭ F♭ G♭ A♭ B♭ C♭

Bu kod golf, bu yüzden en kısa kod kazanır. Sırasıyla ve yerine #ve bsembolleri kullanabilirsiniz .

Düzenleme: ve işaretlerini kullanıyorsanız , bunları yalnızca tek bir bayt olarak saymanız gerekir. Bu haksız bir dezavantaj vermemektir.


1
Çıktının önde gelen yeni satırı kabul edilebilir mi?
Steadybox

4
Henüz Fugue cevabı olmadığına inanamıyorum !
leo

Çıktı formatı ne kadar katı? Bir dizi diziyi kesebilir miyiz? Her öğenin tek bir not veya karakter olduğu bir 2D diziye ne dersiniz?
Shaggy

@Shaggy Kolmogorov karmaşıklık soruları için standardın ne olduğunu bilmiyorum, bu yüzden hayır diyeceğim.
ericw31415

3
: kod öğelerindeki tek aralıklı yazı tipleri için çok fazla
Chiel ten Brinke

Yanıtlar:


8

Kömür , 66 65 bayt (# ve b kullanılıyorsa)

↑⮌…0¦8‖O⸿×⁷♭M→×⁷♯→⸿⸿¹⁵FE⁸﹪⊕⊗ι⁷«⸿⸿✂׳FCGDAEBι⁺¹⁵ι→⸿✂⭆♭ ♯×⁷κι⁺¹⁵ι»⟲

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

↑⮌…0¦8‖O

Karakterleri yazdır 0için 7ters sonra örtüşme ile yansıtmaktadır. Listeler normalde aşağı doğru yazdırılır, bu nedenle yukarı doğru yazdırmak aslında sağa yazdırır; sonunda her şeyi yerinde döndüreceğiz.

⸿×⁷♭M→×⁷♯

Yeni bir çizgi başlatın ve aralarında boşluk olacak şekilde 7 düz ve 7 keskin baskı yapın.

→⸿⸿¹⁵

Boş bir satır bırakın ve 15 -s yazdırın .

FE⁸﹪⊕⊗ι⁷«

0'dan 7'ye kadar olan sayıları alın, iki katına çıkarın, 1 ekleyin, sonra modulo 7'yi azaltın. Sonuç üzerinde döngü yapın.

⸿⸿✂׳FCGDAEBι⁺¹⁵ι

Boş bir satır bırakın ve ardından geçerli değerden başlayarak üç haneli not dizisini alın.

→⸿✂⭆♭ ♯×⁷κι⁺¹⁵ι

Bir sonraki satırda, her biri 7 kez tekrarlanan 15 karakterlik bir daire, boşluk ve keskinlik dilimi alın.

»⟲

Tüm notları yazdırdıktan sonra, her şeyi yerine çevirin.


Sen sayılabilir ve 1 bayt her yerine 3. olarak
ericw31415

Bu dahi, bu çözümle rekabet edemiyorum.
Charlie

6

Yakut , 113 bayt ( 131 126 108 # ve b 105)

-7.upto(7){|i|print i.abs," ♭♯"[i<=>0]," - ",(4..11).map{|j|("FCGDAEB"*3)[k=j*2%7-i]+"♭♯ "[~k/7]}*" ",$/}

Çevrimiçi deneyin!

Ruby , 116 bayt (# ve b ile 108)

Çevrimiçi deneyin!

Ruby , 126 bayt (118, # ve b ile)

Çevrimiçi deneyin!

Ruby , # ve b ile 131 bayt

Çevrimiçi deneyin!


Unicode keskin ve düz karakterleri yazdırmanız gerekir, çünkü Ruby bunları destekler.
Jakob

Sanırım 124 baytlık çözüme geçmelisiniz. Buradaki metrik karakter değil bayttır!
Jakob

Sen sayılabilir ve 1 bayt her yerine 3. olarak
ericw31415

6

Python 3 , 135 bayt

♯ ve ♭ değerlerini her biri 1 bayt olarak sayma

-6 bayt için Zacharý'ya teşekkürler .

for i in range(15):k=' ♯♭'[(i<7)-(i>7)]+' -';print(str(i-7)[-1]+k,*[v+k[a+8>i>a]for a,v in zip([1,3,5,0,2,4,6,1],('CDEFGAB'*8)[i*3:])])

Çevrimiçi deneyin!


5

GNU sed , 148144 + 1 = 145 bayt

-rBayrak için +1 bayt .

s/^/ 7# - C# D# E# F# G# A# B# \n65432101234567/
:
s/((.).(. - )((\S..){3})([^-]+)..\n)([0-7])/\1\2\7\3\6\2 \4\n/
s/ 0#/b0b/
t
s/^.//gm
s/0b/0 /

Çevrimiçi deneyin!

açıklama

İlk olarak, bir çeşit şablon ekleyin:

 7# - C# D# E# F# G# A# B# 
65432101234567

İlk satırın başındaki ve sondaki boşluğa dikkat edin.

Bir döngüde, son satırdaki ilk sayıyı alın ve aşağıdaki gibi ikinci-son satırın bölümleriyle değiştirin:

 7# - C# D# E# F# G# A# B# 
│ └┬─┘└───┬───┘└───┬────┘
2  3      4        6
│  │      └────────│──┐
├──│────────────┐  │  │
│  │      ┌─────│──┘  │
│ ┌┴─┐┌───┴────┐│ ┌───┴───┐
 6# - F# G# A# B  C# D# E# 

Gördüğünüz gibi, ilk boşluk (yakalama 2), karakterinden sonra karakteri değiştirmek için kullanılır B.

Zaman 0ulaşılır, ile ilk boşluk yerine b. Döngü devam eder, ancak #s'yi boşluklarla değiştirmek yerine, sonraki her satırda bir boşluk a ile değiştirilir b.

Nihayet biraz temizlik yapmak: Her satırından lider karakterini çıkarıp yerine 0bsahip 0.


4

Befunge, 134 132 130 bayt

<v:,,," - ",g2+!!\`0::,+*86*-1*2`0::p00:<75
@>4*65*+81v>55+,$$\:00g0`!\9p3+7%\1-:8+#^_
 b#"A"%7:\_^#:-1,*84,g2*+1`0g00!!g9%7:\+1,+

Çevrimiçi deneyin!

açıklama

  • Dış döngü 7'den -7'ye kadar geri saymaya başlıyoruz. Buna satır numarası diyeceğiz .
  • Her satır için, '0'+abs(row)(ölçek numarası) yazarak başlarız ve sonra (row>0)+(row!=0)tabloda doğal, keskin veya düz olup olmadığını aramak için hesap #byaparız (bunu üçüncü kod satırının başında görürsünüz).
  • Ardından ölçeğin başlangıç ​​notunu n , as olarak hesaplarız 30 + row*4. Bu sonuçta mod 7 olacaktır, bu yüzden onu tekrarlayan dizi 2,5,1,4,0,3,6 (yani CFBEADG) olarak düşünün.
  • İç döngümüz i , daha sonra ölçeğin sekiz notası için 8'den 1'e kadar geri sayar ve her yinelemede n'yi artırır .
  • Notun mektubu basittir 'A' + n%7. Keskin veya düz olup olmadığı i%7bir tabloya bakarak belirlenir . İlk ölçek tamamen keskin olduğu için tablo başlangıçta doğrudur.
  • Bununla birlikte, her satır çıktılandıktan sonra, bir değeri değiştirerek tabloyu güncelliyoruz. İlk yinelemede, ofset 5'te değeri değiştiririz, ancak ofsetin her döngüsü ayarlanır (offset+3)%7.
  • Çıktının ilk yarısında, satır sıfırdan büyük olduğunda, bu tablo değerlerini false olarak değiştiririz. Çıktının ikinci yarısında, satır sıfıra eşit veya daha küçük olduğunda, bunları tekrar doğru değerine getiririz.

1
Sadece Befunge'de golf oynayabilirsiniz.
Zacharý

3

Sakız , 107 bayt

Sakız eşiği

00000000: 4dca a90d 0301 1443 41ee 2a9e f4b1 a5ec  M......CA.*.....
00000010: 8d73 f7e1 fe8b 48a0 e968 aec1 3c87 d7f0  .s....H..h..<...
00000020: 1e3e c377 b80f 8ff9 a3ce c165 74d4 31b8  .>.w.......et.1.
00000030: 8c8a da07 1751 4fdb e022 ea69 1d5c 443d  .....QO..".i.\D=
00000040: 2d83 8ba8 a71b b888 7a5a 828b 524f 6b70  -.......zZ..ROkp
00000050: 51fa 690b 2e4b 47ed c165 e9a8 23b8 2c1d  Q.i..KG..e..#.,.
00000060: 7506 97a5 a3ae e0b2 74d4 0f              u.......t..

Çevrimiçi deneyin!


3

JavaScript (ES6), 130 124 bayt

Veya önde gelen bir yeni satıra sahip 128 121 bayt .

f=(y=14,x=8)=>x?f(y,x-1)+' '+'BCDEFGA'[(y*3+x)%7]+'# b'[(x*5%7+y)/7|0]:(y?f(y-1)+`
`:'')+`${y<7?7-y+'#':y>7?y-7+'b':'0 '} -`

O.innerText = f()
<pre id=O style="font-size:11px"></pre>


3

Cı,  212   189   186  185 bayt

@Jonathan Frech'e bir bayt tasarrufu için teşekkürler!

#define N n>0?35:98:32);
f(i,n){for(n=8;--n+8;puts(""))for(i=-1,printf("%d%c -",abs(n),n?N++i<8;)printf(" %c%c",(n*4+65+i)%7+65,"\377\277\273\233\231\211\10\0@Ddfv\367\377"[n+7]&1<<i?N}

Çevrimiçi deneyin!

unrolled:

#define N n>0 ? 35 : 98 : 32);
f(i, n)
{
    for (n=8; --n+8; puts(""))
        for (i=-1, printf("%d%c -", abs(n), n?N ++i<8;)
            printf(" %c%c",
                (n*4+65+i)%7 + 65,
                "\377\277\273\233\231\211\10\0@Ddfv\367\377"[n+7] & 1<<i ? N
}

>-olabilir +.
Jonathan Frech

@JonathanFrech Teşekkürler!
Steadybox

Öner i=~!printfyerine i=-1,printfve \byerine\10
ceilingcat

2

Jöle ,  57 56 55  54 bayt

EriktheOutgolfer sayesinde -1 bayt ( 7ŒRdeğiştirmek için kullanın-7r7 )

_Ṃị“ b#”
=”B+\Çż
×3⁵+€ịØAḣ7¤ḊḊÇ€Z
7ŒRµṠÑżAW€żÇj€”-UK€Y

İstenen çıktıyı yazdırmak için tam bir program ( # , b).

Çevrimiçi deneyin!

Nasıl?

_Ṃị“ b#” - Link 1, getSharpsFlatsOrSpaces: list of integers
 Ṃ       - minimum (of the input list)
_        - subtract (from the input list) -- for our purposes this resets whatever our
         -       1st value is to 0, since our inputs are always monotonically increasing
   “ b#” - literal list of characters = [' ', 'b', '#']
  ị      - index into (1-based and modular)

=”B+\Çż - Link 2, addSharpsFlatsOrSpaces: list of characters  e.g."CFBEADGCFBEADGC"
 ”B     - literal character 'B'
=       - equals? (vectorises)                      [0,0,1,0,0,0,0,0,0,1,0,0,0,0,0]
    \   - cumulative reduce with:
   +    -   addition                                [0,0,1,1,1,1,1,1,1,2,2,2,2,2,2]
     Ç  - call the last link (1) as a monad                       "##       bbbbbb"
      ż - zip (with input) ["#C","#F"," B"," E",...," F","bB","bE","bA","bD","bG","bC"]

×3⁵+€ịØAḣ7¤ḊḊÇ€Z - link 3, getNoteLetters: list of integers          e.g. [-7,-6,...,6,7]
×3               - multiply by three       [-21,-18,-15,-12,-9,-6,-3,0,3,6,9,12,15,18,21]
  ⁵              - literal ten                                                         10
   +€            - add for €ach (in [1,10])   [[-20,...,22],[-19,...,23],...,[-11,...31]]
          ¤      - nilad followed by link(s) as a nilad:
      ØA         -   yield uppercase alphabet                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        ḣ7       -   head to index seven                                        "ABCDEFG"
     ị           - index into ["ADGCFBEADGCFBEA","BEADGCFBEADGCFB","CFBEADGCFBEADGC",...]
           Ḋ     - dequeue    ["BEADGCFBEADGCFB","CFBEADGCFBEADGC","DGCFBEADGCFBEAD",...]
            Ḋ    - dequeue    ["CFBEADGCFBEADGC","DGCFBEADGCFBEAD","EADGCFBEADGCFBE",...]
             Ç€  - call the last link(2) as a monad for €ach
                 -    [[["#C","#F"," B"," E",...," F","bB","bE","bA","bD","bG","bC"],...]
               Z - transpose           [["#C","#D",...,"#C"],["#F",..." B",...,"#F"],...]

7ŒRµṠÑżAW€żÇj€”-UK€Y - Main link: no arguments
7ŒR                  - absolute range of seven     [-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7]
   µ                 - start a new monadic chain (call that r)
    Ṡ                - sign (of r)                 [-1,-1,-1,-1,-1,-1,-1,0,1,1,1,1,1,1,1]
     Ñ               - call the next link (1) as a monad                "####### bbbbbbb"
       A             - absolute value (of r)              [7,6,5,4,3,2,1,0,1,2,3,4,5,6,7]
      ż              - zip                      [[7,'#'],[6,'#'],...,[0,' '],...,[7,'b']]
        W€           - wrap €ach        [[[7,'#']],[[6,'#']],...,[[0,' ']],...,[[7,'b']]]
           Ç         - call the last link (3) as a monad (with r)      see link 3 example
          ż          - zip                     [[[['#',7]],["#C","#D",...,"#C"]],
                                                [[['#',6]],["#F",...," B",..."#F"]], ...]
              ”-     - literal character '-'
            j€       - join for €ach            [[['#',7],'-',"#C","#D",..."#C"],
                                                 [['#',6],'-',"#F",...," B",..."#F"],...]
                U    - upend (reverse each)     [[[7,'#'],'-',"C#","D#",..."C#"],
                                                 [[6,'#'],'-',"F#",...,"B ",..."F#"],...]
                 K€  - join €ach with spaces            [[7+"# - C# D# ... C#"],
                                                         [6+"# - F# ... B  ... F#"], ...]
                   Y - join with newlines
                     - implicit print to STDOUT

1
Bunun için Jelly'e inancım vardı.
Outgolfer Erik


0

Java 8, 255 bayt

♯ ve ♭ değerlerinin her biri 1 bayt olarak sayılır.

v->{String r="",t="GABCDEF";for(int i=-8;++i<8;r+="\n"){r+=(i<0?-i+"♯":i>0?i+"♭":"0 ")+" - ";for(String c:((t=t.substring(3)+t.substring(0,3))+t.charAt(0)).split(""))r+=c+("BEADGCF".substring(i<0?7+i:i).contains(c)?i<0?"♯":" ":i>0?"♭":" ")+" ";}return r;}

Açıklama:

Çevrimiçi deneyin.

v->{                   // Method with empty unused parameter and String return-type
  String r="",         //  Result-String, starting empty
         t="GABCDEF";  //  Temp-String `t`, starting at "GABCDEF"
  for(int i=-8;++i<8;  //  Loop from -7 to 7 (inclusive); range (-8;8) == [-7;7]
      r+="\n"){        //    After every iteration: append the result with a new-line
    r+=                //   Append the result-String with:
       (i<0?           //    If `i` is negative:
         -i+"♯"        //     Append the absolute value of `i` + a literal "♯"
        :i>0?          //    Else-if `i` is positive:
         i+"♭"         //     Append `i` + a literal "♭"
        :              //    Else (`i` is 0):
         "0 ")         //     Append a literal "0" + space
     +" - ";           //   And then append a literal " - "
  for(String c:((t=t.substring(3)+t.substring(0,3))
                       //  Split String `t` in the middle,
                       //  and swap the two parts (i.e. "GABCDEF" becomes "CDEFGAB")
                +t.charAt(0))
                       //  Then append the first character
                .split(""))
                       //  And loop over each character:
     r+=c+             //   Append the result-String with this character, plus:
          ("BEADGCF".substring(i<0?
                       //    If `i` is negative
            7+i        //     Take the last `-i` characters of "BEAFGCF"
           :           //    Else (`i` is 0 or positive)
            i)         //     Take the last `7-i` characters of "BEAFGCF"
          .contains(c)?//    And if these last characters contain the current character:
            i<0?       //     And `i` is negative:
             "♯"       //      Append a literal "♯"
            :          //     Else (`i` is 0 or positive)
             " "       //      Append a space
          :i>0?        //    Else-if `i` is positive
            "♭"        //     Append a literal "♭"
          :            //    Else:
           " ")        //     Append a space
      +" ";}           //   And then append a space
  return r;}           //  Return the result-String
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.