Cetak saya skala

20

Oh tidak! Saya memiliki ujian teori segera dan saya belum ingat timbangannya! Bantu saya mengingat skala utama saya dengan mencetak yang berikut:

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♭

Ini kode-golf, jadi kode terpendek menang. Anda dapat menggunakan #dan bsimbol bukan dan masing - masing.

Sunting: Jika Anda menggunakan dan menandatangani, Anda hanya perlu menghitungnya masing-masing sebagai byte tunggal. Ini untuk tidak memberikan kerugian yang tidak adil.

ericw31415
sumber
1
Apakah baris baru dalam output dapat diterima?
Steadybox
4
Aku tidak percaya belum ada jawaban Fugue !
leo
Seberapa ketat format output? Bisakah kita membuka array baris? Bagaimana dengan 2D-array dengan setiap elemen menjadi satu catatan atau karakter?
Shaggy
@ Shaggy Saya tidak tahu apa standar untuk pertanyaan kompleksitas Kolmogorov, jadi saya akan mengatakan tidak.
ericw31415
3
: begitu banyak untuk font monospace dalam elemen kode
Chiel ten Brinke

Jawaban:

8

Arang , 66 65 byte (jika menggunakan # dan b)

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

↑⮌…0¦8‖O

Cetak karakter yang 0akan 7dibalik, lalu refleksikan dengan tumpang tindih. Daftar biasanya mencetak ke bawah, jadi mencetak ke atas sebenarnya mencetak ke kanan; kami akan memutar semuanya ke tempatnya di akhir.

⸿×⁷♭M→×⁷♯

Mulai baris baru dan cetak 7 flat dan 7 benda tajam dengan celah di antaranya.

→⸿⸿¹⁵

Biarkan garis kosong dan cetak 15 -detik.

FE⁸﹪⊕⊗ι⁷«

Ambil angka 0 hingga 7, gandakan, tambahkan 1, lalu kurangi modulo 7. Ulangi hasilnya.

⸿⸿✂׳FCGDAEBι⁺¹⁵ι

Biarkan baris kosong dan kemudian ambil potongan 15 karakter dari string rangkap tiga mulai dari nilai saat ini.

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

Pada baris berikutnya ambil irisan 15 karakter flat, spasi dan benda tajam, masing-masing diulang 7 kali.

»⟲

Setelah mencetak semua catatan, putar semuanya ke tempatnya.

Neil
sumber
Anda dapat menghitung dan sebagai 1 byte masing-masing daripada 3.
ericw31415
Ini jenius, saya tidak bisa bersaing dengan solusi ini.
Charlie
6

Ruby , 113 byte ( 131 126 108 105 dengan # dan b)

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

Cobalah online!

Ruby , 116 byte (108 dengan # dan b)

Cobalah online!

Ruby , 126 byte (118 dengan # dan b)

Cobalah online!

Ruby , 131 byte dengan # dan b

Cobalah online!

Level River St
sumber
Anda perlu mencetak karakter Unicode yang tajam dan rata karena Ruby mendukungnya.
Jakob
Saya pikir Anda harus beralih ke solusi 124-byte. Metrik di sini adalah byte, bukan karakter!
Jakob
Anda dapat menghitung dan sebagai 1 byte masing-masing daripada 3.
ericw31415
6

Python 3 , 135 byte

menghitung ♯ dan ♭ masing-masing 1 byte

terima kasih kepada Zacharý untuk -6 byte.

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:])])

Cobalah online!

ovs
sumber
5

GNU sed , 148 144 + 1 = 145 byte

+1 byte untuk -rbendera.

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 /

Cobalah online!

Penjelasan

Pertama, masukkan template macam:

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

Perhatikan spasi awal dan akhir di baris pertama.

Dalam satu lingkaran, ambil angka pertama dari baris terakhir dan ganti dengan bagian-bagian dari baris kedua ke terakhir seperti:

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

Seperti yang Anda lihat, spasi awal (tangkap 2) digunakan untuk mengganti karakter setelah B.

Ketika 0tercapai, ganti ruang awal dengan b. Lingkaran berlanjut, tetapi alih-alih mengganti #s dengan spasi, pada setiap baris selanjutnya spasi diganti dengan a b.

Akhirnya, lakukan sedikit pembersihan: Hapus karakter utama dari setiap baris dan ganti 0bdengan 0.

Jordan
sumber
4

Befunge, 134 132 130 byte

<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,+

Cobalah online!

Penjelasan

  • Kita mulai dengan loop luar yang menghitung mundur dari 7 hingga -7. Kami akan menyebutnya nomor baris .
  • Untuk setiap baris, kita mulai dengan menuliskan '0'+abs(row)(angka skala), dan kemudian menghitung (row>0)+(row!=0)untuk mencari apakah itu alami, tajam, atau datar dalam tabel #b(Anda akan melihat ini di awal baris kode ketiga).
  • Kami kemudian menghitung catatan awal skala, n , sebagai 30 + row*4. Ini pada akhirnya akan menjadi mod 7, jadi anggap itu sebagai urutan berulang 2,5,1,4,0,3,6 (yaitu CFBEADG).
  • Lingkaran dalam kita, i , kemudian menghitung mundur dari 8 ke 1, untuk delapan not dalam skala, bertambah n pada setiap iterasi.
  • Surat itu sederhana saja 'A' + n%7. Apakah itu tajam atau datar ditentukan dengan melihat ke atas i%7di meja. Tabel awalnya semua benar, karena skala pertama adalah semua benda tajam.
  • Namun, setelah setiap baris ditampilkan, kami memperbarui tabel dengan mengganti satu nilai. Pada iterasi pertama kita akan beralih nilai pada offset 5, tetapi setiap loop offset disesuaikan oleh (offset+3)%7.
  • Pada paruh pertama output, ketika baris lebih besar dari nol, kita beralih nilai tabel ini ke false. Pada bagian kedua dari output, saat baris kurang dari atau sama dengan nol, kami mengaturnya kembali ke true.
James Holderness
sumber
1
Hanya Anda yang bisa bermain golf di Befunge.
Zacharý
3

Bubblegum , 107 byte

Ambang permen karet

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..

Cobalah online!

ovs
sumber
3

JavaScript (ES6), 130 124 byte

Atau 128 121 byte dengan baris baru terkemuka.

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>

Arnauld
sumber
3

C,  212   189   186  185 byte

Terima kasih kepada @Jonathan Frech karena telah menghemat satu byte!

#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}

Cobalah online!

Belum dibuka:

#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
}
Steadybox
sumber
>-bisa +.
Jonathan Frech
@JonathanFrech Terima kasih!
Steadybox
Sarankan i=~!printfalih-alih i=-1,printfdan \bbukannya\10
ceilingcat
2

Jelly ,  57 56 55  54 byte

-1 byte terima kasih kepada EriktheOutgolfer (gunakan 7ŒRuntuk mengganti -7r7)

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

Program lengkap mencetak output yang diinginkan (menggunakan #, b).

Cobalah online!

Bagaimana?

_Ṃị“ 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
Jonathan Allan
sumber
1
Aku memang percaya pada Jelly untuk yang ini.
Erik the Outgolfer
0

CJam , 109 106 94 byte

{_0={_z/}|" b#"=a}:A;15,{X7-_zs\A+" - "+o7,0+{YX+7%65+c"2461357"Y=aiX\-_7,#){;0}&AS++o}fYNo}fX

Cobalah online

Chiel ten Brinke
sumber
0

Java 8, 255 byte

Menghitung ♯ dan ♭ masing-masing 1 byte.

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;}

Penjelasan:

Cobalah online.

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
Kevin Cruijssen
sumber