Clavier de piano ASCII

24

Les touches du piano ont 3 caractères de large et 7 caractères de haut. Cependant, si chaque clé avait 3 caractères de large, il n'y aurait pas assez de place pour les clés noires. C'est pourquoi certaines touches blanches ont des parties découpées. Il existe 3 types de touches blanches.

Clés avec la moitié droite manquante (R):

____
|  |
|  |
|  |
|  |
|   |
|   |
|___|

Clés avec la moitié gauche manquante (L):

 ____
 |  |
 |  |
 |  |
 |  |
|   |
|   |
|___|

Et les touches avec les moitiés gauche et droite manquantes (M):

 ___
 | | 
 | | 
 | | 
 | | 
|   |
|   |
|___|

Sur un vrai clavier, le modèle de ceux-ci se présente comme suit:

RMLRMML, RMLRMML, RMLRMML...

et répète pour un total de 88 touches. Maintenant, vous ne pouvez pas le voir lorsque les clés sont affichées individuellement, mais lorsque vous les rapprochez, vous pouvez voir les touches noires.

_________________________________________________________
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|

Ta tâche

Étant donné un entier positif N , imprimez cet art ASCII d'un piano avec N touches blanches. Vous devriez être capable de gérer n'importe quel N de 1 à 52 inclus (car les vrais pianos à 88 touches ont 52 touches blanches). Voici la sortie de test de 1 à 8, et après cela, le modèle augmente de manière similaire.

1
____
|  |
|  |
|  |
|  |
|   |
|   |
|___|

2
________
|  | | |
|  | | |
|  | | |
|  | | |
|   |   |
|   |   |
|___|___|

3
_____________
|  | | | |  |
|  | | | |  |
|  | | | |  |
|  | | | |  |
|   |   |   |
|   |   |   |
|___|___|___|

4
________________
|  | | | |  |  | 
|  | | | |  |  | 
|  | | | |  |  | 
|  | | | |  |  | 
|   |   |   |   |
|   |   |   |   |
|___|___|___|___|

5
____________________
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|  | | | |  |  | | | 
|   |   |   |   |   |
|   |   |   |   |   |
|___|___|___|___|___|

6
________________________
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|  | | | |  |  | | | | | 
|   |   |   |   |   |   |
|   |   |   |   |   |   |
|___|___|___|___|___|___|

7
_____________________________
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|  | | | |  |  | | | | | |  |
|   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|

8
________________________________ 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|  | | | |  |  | | | | | |  |  | 
|   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|

Enfin, voici une sortie complète de 52 touches:

_________________________________________________________________________________________________________________________________________________________________________________________________________________
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |  | | | | | |  |  | | | |  |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|___|

Les failles standard sont interdites et la réponse la plus courte en octets l'emporte!

DJMcMayhem
la source
Que sont les «failles standard»?
Wildcard
Les espaces de fin sur une / toutes les lignes sont-ils autorisés? Que diriez-vous d'une nouvelle ligne de fuite?
Sok
1
@AlexL. Puisque les vrais pianos à 88 touches ont 55 touches blanches .
DJMcMayhem
1
@BMac> _> Je ne sais pas ... <_ <Je ne sais pas de quoi tu parles. J'ai dit 52, tu vois! Vous pouvez le voir clairement dans le R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ Euh, je veux dire l'état du poste en ce moment! Quoi qu'il en soit, heureusement, cela ne cassera probablement pas les réponses existantes, car la plupart d'entre elles fonctionnent probablement jusqu'à 55+ de toute façon.
DJMcMayhem

Réponses:

4

Pyth, 68 65 63 octets

*lJ:+\|s@Lj;*L" |"_j4536 7*4Q" $"k\_jb+*4]J*2]K+\|*Q"   |":Kd\_

Essayez-le en ligne!

Suite de tests.

Dans cette version, je viens de remplacer les affectations (J et K) à l'intérieur pour économiser 2 octets. Par conséquent, lisez la version ci-dessous.

Version précédente de 65 octets avec explication

J:+\|s@Lj;*L" |"_j4536 7*4Q" $"kK+\|*Q"   |"*lJ\_jb+*4]J*2]K:Kd\_

Essayez-le en ligne!

J:+\|s@Lj;*L" |"_j4536 7*4Q" $"k    This part generates the most irregular line.

        j;*L" |"_j4536 7            Generate the whole line by black magic
      @L                *4Q         Get the first (4*input) characters of it, with wrapping.
  +\|                               Add "|" in front of it (we took away the first "|")
 :                         " $"k    Replace the ending space by nothing
J                                   Store the line to J.


K+\|*Q"   |"      This part generates the line just below the irregular line.
    *Q"   |"      Repeat "   |" input times
 +\|              Prepend "|"
K                 Store to K


*lJ\_     Now we can actually start printing

*  \_     Repeat "_" ...
 lJ                      [the length of J] times
          (and implicitly print it out)


jb+*4]J*2]K

   *4]J             Repeat J 4 times
       *2]K         Repeat K 2 times
  +                 Concatenate them together
jb                  Join with newlines
                    (and implicitly print it out)

:Kd\_

:K      Replace in K
  d                  " "
   \_                    by "_"
        (and implicitly print it out)

Magie noire

We find the irregular line from input=7, and cut out the first "|":
"  | | | |  |  | | | | | |  |"
 2  1 1 1 2  2  1 1 1 1 1 2

j;*L" |"_j4536 7    Black magic.

         j4536 7    4536 converted to base 7: [1,6,1,4,0]
        _           Reverse: [0,4,1,6,1]
  *L" |"            Repeat " |" <each element> times:
                    [""," | | | |"," |"," | | | | | |"," |"]
j;                  Join by whitespace:
                    "  | | | |  |  | | | | | |  |"
Leaky Nun
la source
Je viens de recevoir ta blague. Grognement ...
Neil
11

JavaScript (ES6), 155 149 147 octets

n=>[`_`[r=`repeat`](n*4+(9>>n%7&1)),s=[...Array(n*12/7|0)].map((_,i)=>1998>>i%12&1?` |`:`  |`).join``,s,s,s,s=`   |`[r](n),s,`___|`[r](n)].join`\n|`

\nreprésente le caractère de nouvelle ligne littéral. Exploite le fait que toutes les lignes après le premier début avec un |caractère. Explication:

f=
n=>[                        // Start by building up a list of rows
 `_`[r=`repeat`](n*4+       // 4 underscores per key
  (9>>n%7&1)),              // Third and seventh keys have one extra
 s=[...Array(n*12/7|0)]     // Calculate total of white and black keys
  .map((_,i)=>              // Process each key in turn
   1998>>i%12&1?` |`:`  |`  // Bitmap of narrow and wide keys
  ).join``,                 // Join the keys together
 s,s,s,                     // Repeated 4 times in total
 s=`   |`[r](n),            // Full width part of the white keys
 s,                         // Repeated twice in total
 `___|`[r](n)               // Base of the white keys
].join`\n|`                 // Join the rows together
<input type="number" oninput="o.textContent=f(this.value);"><pre id=o>

Edit: sauvé 2 octets en corrigeant ma lecture erronée de la spécification sur la hauteur des touches.

Neil
la source
2
Vous, monsieur, vous venez de me couper le souffle.
Robbie Coyne
Oh, c'est bien, pouvez-vous ajouter une sorte de procédure pas à pas?
nobe4
Vous devez ajouter un extrait exécutable si vous le pouvez.
Bálint
1

Rubis, 119 octets

->n{puts ?_*(1+n*4+(0<=>-n%7%4)),(0..6).map{|i|("01"+("%b"%[0xAADAAAD,13][i/4]*99)).tr('10',' |_|'[i/6*2,2])[0,1+n*4]}}

Non testé dans le programme de test

f=->n{
  puts ?_*(1+n*4+(0<=>-n%7%4)),           #Draw 1+n*4 _'s for top row (one less if -n%7%4>0, black note), then...
  (0..6).map{|i|                          #Cycle through remaining 7 rows
    ("01"+("%b"%[0xAADAAAD,13][i/4]*99)).   #Generate string version of binary number corresponding to pattern, repeat 99 times.
    tr('10',' |_|'[i/6*2,2]                 #Binary 1-> space or underscore. Binary 0 -> | (These choices ensured no leading 0)
    )[0,1+n*4]                              #truncate to the right amount of keys.
  }
}


10.times{|j|f[j]}
Level River St
la source
1

> <>, 188 182 octets

&0"_"o011.
.\:7%8g95*-"_"o1-:a1@@?.~~~1+:&:&=1+1$
.v~:7=?;ao"|"o1+:0$0$
.>:7%8g"0"-4*:9go1+:9go1+:9go1+9go1+:&:&=3$-1$
 ^
.>"| _"{:}7=?$~::oooo1+:&:&(3*2+1$
>^
^
0120112
  | | | |  |

Le nombre de touches blanches à afficher doit être présent sur la pile au démarrage du programme.

Edit : j'ai réussi à raser quelques octets en combinant la sortie pour les lignes 5/6 et 7. Version précédente:

&0"_"o011.
.\:7%8g95*-"_"o1-:a1@@?.~~~1+:&:&=1+1$
.v~ao"|"o1+:0$0$.
.>:7%8g"0"-4*:9go1+:9go1+:9go1+9go1+:&:&=3$-1$
 ^
.>"|   "oooo1+:&:&(3*2+1$
 ^
 "|___"oooo1+:&:&=?;
0120112
  | | | |  |
Sok
la source
1

PHP, 238 octets

$n=$argv[1];$s=str_repeat;echo'_'.$s($a=$s('_',28),$m=($n-$r=$n%7)/7).substr($a,0,$k=4*$r-($r&&$r!=3))."\n",$g='|'.$s($b='  | | | |  |  | | | | | |  |',$m).substr($b,0,$k)."\n",$g,$g,$g,$h='|'.$s('   |',$n)."\n",$h,'|'.$s('___|',$n)."\n";

Comme d'habitude, ajoutez le code avec <?php, mettez-le dans un fichier PHP (nommons-le keyboard.php) et exécutez-le en utilisant:

$ php -d error_reporting=0 keyboard.php 55

Deux octets supplémentaires peuvent être enregistrés sur PHP7 en pressant l'initialisation de $net $sdans leur première utilisation:

echo'_'.($s=str_repeat)($a=$s('_',28),$m=($n-$r=($n=$argv[1])%7)/7).substr($a,0,$k=4*$r-($r&&$r!=3))."\n",$g='|'.$s($b='  | | | |  |  | | | | | |  |',$m).substr($b,0,$k)."\n",$g,$g,$g,$h='|'.$s('   |',$n)."\n",$h,'|'.$s('___|',$n)."\n";

Le code non golfé, une suite de tests et d'autres goodies peuvent être trouvés sur github .

axiaque
la source
1

Python 3 2, 191 185 180 182 171 171 145 144 133 132 bytes

def k(n):print"\n|".join(["_"*(4*n+(9>>n%7&1))]+[''.join("   ||"[1998>>j%12&1::2]for j in range(n*12/7))]*4+["   |"*n]*2+["___|"*n])

Cela pourrait utiliser du golf, mais j'ai déjà tellement joué avec le code que je ne vois peut-être pas où se trouvent les terrains de golf. Toutes les suggestions de golf sont les bienvenues.

Modifier: mal lu la spécification sur la hauteur des touches. Ce bug a été corrigé.

Edit: emprunté 12 idées clés de Neil à sa réponse Javascript, supprimé certaines parenthèses et basculé sur Python 2 pour économiser 11 octets.

Edit: Beaucoup de changements pour réduire la fonction à unfor boucle.

Modifier: Maintenant un programme au lieu d'une fonction.

Edit: utilise maintenant print"\n|".join()comme suggéré par Neil pour économiser 11 octets. Transformé le programme en une fonction pour enregistrer un octet.

Sherlock9
la source
Je pense que vous pourriez économiser encore 10 octets en utilisant mon "\n|".joinastuce.
Neil
Ah, j'avais oublié de supprimer l'espace entre printet "\n|"!
Neil
0

C # 1683 octets

Donc ... après avoir vu la réponse de Neil ci-dessus, c'est assez embarrassant, mais je le posterai quand même car cela m'a pris un certain temps (bénissez). J'ai utilisé C # pour créer le mien. A l'intérieur de la classe "Fncs", j'ai créé un tableau de l'ordre typique des clés. Ensuite, j'ai créé une fonction qui peut permettre à l'utilisateur d'obtenir un index approprié pour ce tableau en fonction d'un entier donné. Afin d'éditer des lignes individuelles, j'ai créé une classe "PianoKeyboard" qui contient un dictionnaire stockant plusieurs chaînes représentant les lignes individuelles. Enfin, j'ai créé la fonction "DrawKey" qui ajoute le texte approprié aux lignes individuelles et la fonction "GetKeys" qui renvoie la valeur globale de la chaîne.

namespace ASCIIPiano{public enum WhiteKeyType{Left,Middle,Right}public static class Fncs{public static WhiteKeyType[] Order{get{return new WhiteKeyType[]{WhiteKeyType.Left,WhiteKeyType.Middle,WhiteKeyType.Right,WhiteKeyType.Left,WhiteKeyType.Middle,WhiteKeyType.Middle,WhiteKeyType.Right};}}public static PianoKeyboard DrawKey(this PianoKeyboard keyboard, WhiteKeyType type){keyboard.Append(1,"_____");if (type == WhiteKeyType.Left){keyboard.Append( 2,"|  | ");keyboard.Append( 3,"|  | ");keyboard.Append( 4,"|  | ");keyboard.Append( 5, "|  | ");}else if (type == WhiteKeyType.Middle){keyboard.Append(2, " | | ");keyboard.Append(3," | | ");keyboard.Append( 4," | | ");keyboard.Append(5," | | ");}else{keyboard.Append( 2," |  |");keyboard.Append(3, " |  |");keyboard.Append(4," |  |");keyboard.Append(5, " |  |");}keyboard.Append(6,"|   |");keyboard.Append(7,"|   |");keyboard.Append(8,"|___|");return keyboard;}public static int GetWhiteKeyIndex(this int number){return number % 7;}public static string GetKeys(this int quantityofwhitekeys){PianoKeyboard keyboard = new PianoKeyboard();for (int i = 0; i < quantityofwhitekeys; i++){WhiteKeyType key=Fncs.Order[i.GetWhiteKeyIndex()];keyboard.DrawKey(key);}return keyboard.TOTALSTRING;}}public class PianoKeyboard{public PianoKeyboard(){}private Dictionary<int, string> lines = new Dictionary<int, string>();public void Append(int index,string value){if (index > 8 || index < 1){throw new Exception("URGH!");}else{if (lines.Keys.Contains(index)){lines[index] += value;}else{lines.Add(index, value);}}}public string TOTALSTRING{get{string returner = "";foreach (int key in lines.Keys){returner += lines[key] + "\n";}return returner;}}}}
Robbie Coyne
la source
1
Salut, bienvenue chez PPCG! Comme vous l'avez peut-être remarqué, les défis du code-golf consistent à écrire le code le plus court possible. Les langages comme C #, Java et pratiquement n'importe quel langage OO sont donc le plus souvent un mauvais choix. Cependant, cela peut être une bonne pratique d'écrire du code court, donc je n'essaie pas de vous décourager de le faire :) Quant à votre réponse, c'est une bonne façon de résoudre ce problème si vous ne gardez pas la longueur du code dans esprit! Amusez-vous et bonne chance en essayant d'écrire un petit code C # :)
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Merci, je suis en fait nouveau sur ce site (bien sûr). Un peu nouveau pour la programmation aussi mais je ferai de mon mieux ^ _ ^
Robbie Coyne
C'est drôle de voir une réponse de 4 Ko entre toutes les réponses <200 octets. Personnellement, j'aime aussi écrire du code Java aussi court que possible pour ces défis Codegolf, car je n'ai jamais utilisé de langage de codegolf. Bien sûr, Java et C # ne peuvent jamais rivaliser avec d'autres réponses, mais c'est amusant d'essayer de créer du code aussi court que possible. Voici un article qui pourrait vous intéresser: Conseils pour jouer au golf en C # . PS: J'ai copié votre code dans un fichier pour voir la quantité exacte d'octets, qui est: 4,052 . ;) Quoi qu'il en soit, bienvenue chez PPCG!
Kevin Cruijssen
2
Bienvenue à PPCG, mais cette réponse doit être entièrement étudiée. Je vois des espaces et des commentaires qui peuvent être supprimés.
Rɪᴋᴇʀ
1
1 .: Renommez vos variables, donc elles ont 1 caractère de long 2 .: Ajoutez toujours un nombre d'octets correct, il doit être précis en octets
Bálint