Imprimez-moi une échelle

20

Oh non! J'ai bientôt un test théorique et je ne me souviens pas encore des échelles! Aidez-moi à me souvenir de mes principales échelles en imprimant ce qui suit:

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♭

C'est le code-golf, donc le code le plus court l'emporte. Vous pouvez utiliser des symboles #et bau lieu de et respectivement.

Modifier: si vous utilisez des signes et , vous ne devez les compter que comme un seul octet chacun. Cela ne doit pas donner un désavantage injuste.

ericw31415
la source
1
Une nouvelle ligne de tête dans la sortie est-elle acceptable?
Steadybox
4
Je ne peux pas croire qu'il n'y ait pas encore de réponse Fugue !
leo
Quelle est la rigueur du format de sortie? Pouvons-nous sortir un tableau de lignes? Que diriez-vous d'un tableau 2D avec chaque élément étant une seule note ou un seul caractère?
Shaggy
@Shaggy Je ne sais pas quelle est la norme pour les questions de complexité de Kolmogorov, donc je dirai non.
ericw31415
3
: tant pis pour les polices monospaces dans les éléments de code
Chiel ten Brinke

Réponses:

8

Charbon de bois , 66 65 octets (si vous utilisez # et b)

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

↑⮌…0¦8‖O

Imprimez les caractères 0à 7inverser, puis réfléchissez avec chevauchement. Les listes s'impriment normalement vers le bas, donc l'impression vers le haut imprime en fait vers la droite; nous allons tout faire pivoter à la fin.

⸿×⁷♭M→×⁷♯

Commencez une nouvelle ligne et imprimez 7 appartements et 7 objets tranchants avec un espace entre les deux.

→⸿⸿¹⁵

Laissez une ligne vierge et imprimez 15 -s.

FE⁸﹪⊕⊗ι⁷«

Prenez les nombres de 0 à 7, doublez-les, ajoutez 1, puis réduisez le module 7. Faites une boucle sur le résultat.

⸿⸿✂׳FCGDAEBι⁺¹⁵ι

Laissez une ligne vierge, puis prenez une tranche de 15 caractères de la chaîne de notes tripliquée à partir de la valeur actuelle.

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

Sur la ligne suivante, prenez une tranche de 15 caractères d'appartements, d'espaces et d'objets tranchants, chacun répété 7 fois.

»⟲

Après avoir imprimé toutes les notes, faites tout pivoter en place.

Neil
la source
Vous pouvez compter le et comme 1 octet chacun au lieu de 3.
ericw31415
C'est du génie, je ne peux pas rivaliser avec cette solution.
Charlie
6

Ruby , 113 octets ( 131 126 108 105 avec # et b)

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

Essayez-le en ligne!

Ruby , 116 octets (108 avec # et b)

Essayez-le en ligne!

Ruby , 126 octets (118 avec # et b)

Essayez-le en ligne!

Ruby , 131 octets avec # et b

Essayez-le en ligne!

Level River St
la source
Vous devez imprimer les caractères nets et plats Unicode car Ruby les prend en charge.
Jakob
Je pense que vous devriez passer à la solution de 124 octets. La métrique ici est des octets, pas des caractères!
Jakob
Vous pouvez compter le et comme 1 octet chacun au lieu de 3.
ericw31415
6

Python 3 , 135 octets

comptant ♯ et ♭ comme 1 octet chacun

merci à Zacharý pour -6 octets.

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

Essayez-le en ligne!

ovs
la source
5

GNU sed , 148 144 + 1 = 145 octets

+1 octet pour le -rdrapeau.

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 /

Essayez-le en ligne!

Explication

Insérez d'abord un modèle de tri:

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

Notez l'espace de début et de fin sur la première ligne.

En boucle, prenez le premier nombre de la dernière ligne et remplacez-le par des parties de l'avant-dernière ligne comme ceci:

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

Comme vous pouvez le voir, l'espace initial (capture 2) est utilisé pour remplacer le caractère après le B.

Lorsque le 0est atteint, remplacez l'espace initial par b. La boucle continue, mais au lieu de remplacer #s par des espaces, sur chaque ligne suivante un espace est remplacé par a b.

Enfin, faites un petit nettoyage: supprimez le caractère de tête de chaque ligne et remplacez 0b par 0.

Jordan
la source
4

Befunge, 134 132 130 octets

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

Essayez-le en ligne!

Explication

  • Nous commençons par une boucle extérieure qui compte à rebours de 7 à -7. Nous appellerons cela le numéro de ligne .
  • Pour chaque ligne, nous commençons par écrire '0'+abs(row)(le numéro d'échelle), puis calculons(row>0)+(row!=0) pour rechercher s'il est naturel, net ou plat dans le tableau #b(vous le verrez au début de la troisième ligne de code).
  • Nous calculons ensuite la note de début de l'échelle, n , as 30 + row*4. Ce sera finalement le mod 7, alors pensez-y comme la séquence répétitive 2,5,1,4,0,3,6 (c'est-à-dire CFBEADG).
  • Notre boucle intérieure, i , décompte ensuite de 8 à 1, pour les huit notes de la gamme, en incrémentant n à chaque itération.
  • La lettre de la note est simplement 'A' + n%7 . Que ce soit net ou plat est déterminé en regardant i%7dans une table. Le tableau est initialement tout à fait vrai, car la première échelle est entièrement tranchante.
  • Cependant, après la sortie de chaque ligne, nous mettons à jour la table en basculant une valeur. Lors de la première itération, nous basculerons la valeur au décalage 5, mais à chaque boucle le décalage est ajusté par (offset+3)%7.
  • Sur la première moitié de la sortie, lorsque la ligne est supérieure à zéro, nous basculons ces valeurs de table sur false. Sur la seconde moitié de la sortie, lorsque la ligne est inférieure ou égale à zéro, nous les remettons à true.
James Holderness
la source
1
Seul vous pouvez réellement jouer au golf à Befunge.
Zacharý
3

Bubblegum , 107 octets

Seuil Bubblegum

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

Essayez-le en ligne!

ovs
la source
3

JavaScript (ES6), 130 124 octets

Ou 128 121 octets avec une nouvelle ligne principale.

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
la source
3

C,  212   189   186  185 185 octets

Merci à @Jonathan Frech d'avoir enregistré un octet!

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

Essayez-le en ligne!

Déroulé:

#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
la source
>-peut être +.
Jonathan Frech
@JonathanFrech Merci!
Steadybox
Suggérer i=~!printfau lieu de i=-1,printfet \bau lieu de\10
plafondcat
2

Gelée ,  57 56 55  54 octets

-1 octet grâce à EriktheOutgolfer (utilisé 7ŒRpour remplacer -7r7)

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

Un programme complet imprimant la sortie souhaitée (à l'aide de #, b).

Essayez-le en ligne!

Comment?

_Ṃị“ 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
la source
1
J'ai eu confiance en Jelly pour celui-ci.
Erik the Outgolfer
0

CJAM , 109 106 94 bytes

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

Essayez-le en ligne

Chiel ten Brinke
la source
0

Java 8, 255 octets

Compter ♯ et ♭ comme 1 octet chacun.

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

Explication:

Essayez-le en ligne.

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
la source