Teclado de piano ASCII

24

Las teclas del piano tienen 3 caracteres de ancho y 7 caracteres de alto. Sin embargo, si cada tecla tuviera 3 caracteres de ancho, no habría suficiente espacio para las teclas negras. Es por eso que algunas de las teclas blancas tienen partes de ellas cortadas. Hay 3 tipos de teclas blancas.

Claves con la mitad derecha faltante (R):

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

Claves con la mitad izquierda faltante (L):

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

Y teclas con las mitades izquierda y derecha faltantes (M):

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

En un teclado real, el patrón de estos es el siguiente:

RMLRMML, RMLRMML, RMLRMML...

y se repite para un total de 88 teclas. Ahora no puede verlo cuando las teclas se muestran individualmente, pero cuando las junta, puede ver las teclas negras.

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

Tu tarea

Dado un número entero positivo N , imprima este arte ASCII de un piano con N teclas blancas. Debería poder manejar cualquier N de 1 a 52 inclusive (dado que los pianos de 88 teclas reales tienen 52 teclas blancas). Aquí está la salida de prueba de 1 a 8, y después de eso el patrón aumenta de manera similar.

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

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

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

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

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

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

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

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

Y por último, pero no menos importante, aquí hay una salida completa de 52 teclas:

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

Las lagunas estándar están prohibidas, ¡y la respuesta más corta en bytes gana!

DJMcMayhem
fuente
¿Qué son las "lagunas estándar"?
Comodín
¿Se permiten espacios finales en alguna / todas las líneas? ¿Qué tal una nueva línea final?
Sok
1
@AlexL. Dado que los pianos de 88 teclas reales tienen 55 teclas blancas .
DJMcMayhem
1
@BMac> _> No ... <_ <No tengo idea de lo que estás hablando. Yo dije 52, ver! Puedes verlo claramente en el R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ Uh, me refiero al estado de la publicación en este momento. De todos modos, afortunadamente, eso probablemente no romperá ninguna respuesta existente, ya que la mayoría de ellos probablemente trabajen hasta 55+ de todos modos.
DJMcMayhem

Respuestas:

4

Pyth, 68 65 63 bytes

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

Pruébalo en línea!

Banco de pruebas.

En esta versión, simplemente sustituí las asignaciones (J y K) dentro para guardar 2 bytes. Por lo tanto, lea la versión a continuación.

Versión anterior de 65 bytes con explicación

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

Pruébalo en línea!

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)

Magia negra

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:
                    "  | | | |  |  | | | | | |  |"
Monja permeable
fuente
Acabo de recibir tu broma. Groan ...
Neil
11

JavaScript (ES6), 155 149 147 bytes

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

Donde \nrepresenta el carácter literal de nueva línea. Aprovecha el hecho de que todas las líneas después del primer comienzo con un |personaje. Explicación:

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>

Editar: ahorré 2 bytes al corregir mi lectura incorrecta de la especificación en la altura de las teclas.

Neil
fuente
2
Usted, señor, me dejó alucinado.
Robbie Coyne
Oh, esto es bueno, ¿puedes agregar algún tipo de tutorial?
nobe4
Debería agregar un fragmento ejecutable si puede.
Bálint
1

Ruby, 119 bytes

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

Sin golf en el programa de prueba

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
fuente
1

> <>, 188182 bytes

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

El número de teclas blancas para mostrar debe estar presente en la pila al inicio del programa.

Editar : Me las arreglé para reducir algunos bytes mediante la combinación de la salida para las líneas 5/6 y 7. Versión anterior:

&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
fuente
1

PHP, 238 bytes

$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";

Como de costumbre, anteponga el código <?php, póngalo en un archivo PHP (nombremos keyboard.php) y ejecútelo usando:

$ php -d error_reporting=0 keyboard.php 55

Se pueden guardar dos bytes más en PHP7 apretando la inicialización $ny $sen su primer uso:

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

El código no protegido, un conjunto de pruebas y otras cosas se pueden encontrar en github .

axiac
fuente
1

Python 3 2, 191 185 180 182 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])

Esto podría usar algo de golf, pero ya he jugado tanto con el código que es posible que no vea dónde están los puntos de golf. Cualquier sugerencia de golf es bienvenida.

Editar: lee mal la especificación sobre la altura de las teclas. Este error se ha corregido.

Editar: tomó prestada la idea clave de Neil de su respuesta de Javascript, eliminó algunos paréntesis y cambió a Python 2 para guardar 11 bytes.

Editar: muchos cambios para reducir la función a un forbucle.

Editar: ahora un programa en lugar de una función.

Editar: ahora usando print"\n|".join()como lo sugiere Neil para guardar 11 bytes. Volvió el programa a una función para guardar un byte.

Sherlock9
fuente
Creo que podría guardar otros 10 bytes utilizando mi "\n|".jointruco.
Neil
¡Ah, me había olvidado de quitar el espacio entre printy "\n|"!
Neil
0

C # 1683 bytes

Entonces ... después de ver la respuesta de Neil arriba, esto es bastante vergonzoso, pero lo publicaré de todos modos porque me tomó un tiempo (bendición). Usé C # para crear el mío. Dentro de la clase "Fncs", creé una matriz del orden típico de las teclas. Luego, creé una función que puede permitir al usuario obtener un índice apropiado para esta matriz en función de un número entero dado. Para editar líneas individuales, creé una clase "PianoKeyboard" que contiene un diccionario que almacena múltiples cadenas que representan las líneas individuales. Finalmente, creé la función "DrawKey" que agrega el texto apropiado a las líneas individuales y la función "GetKeys" que devuelve el valor general de la cadena.

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
fuente
1
Hola, bienvenido a PPCG! Como habrás notado, los desafíos del código de golf consisten en escribir el código más corto posible. Los lenguajes como C #, Java y básicamente cualquier lenguaje OO son, por lo tanto, una mala elección. Sin embargo, puede ser una buena práctica escribir código corto, así que no estoy tratando de desanimarte de hacerlo :) En cuanto a tu respuesta, es una buena manera de resolver este problema si no mantienes la longitud del código en ¡mente! Diviértete y buena suerte tratando de escribir un pequeño código C # :)
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Gracias, en realidad soy nuevo en este sitio (por supuesto). Un poco nuevo en la programación también, pero lo haré lo mejor que pueda ^ _ ^
Robbie Coyne
Es divertido ver una respuesta de 4KB entre todas las respuestas de <200 bytes. Personalmente, también me gusta escribir código Java lo más breve posible para estos desafíos de Codegolf, ya que nunca usé ningún lenguaje de codegolf. Por supuesto, Java y C # nunca pueden competir con otras respuestas, pero es divertido intentar crear código lo más breve posible. Aquí hay una publicación que puede resultarle interesante: Consejos para jugar golf en código en C # . PD: Copié su código en un archivo para ver la cantidad exacta de bytes, que es: 4,052 . ;) De todos modos, bienvenido a PPCG!
Kevin Cruijssen
2
Bienvenido a PPCG, pero esta respuesta debe ser completa. Veo espacios en blanco y comentarios que se pueden eliminar.
Rɪᴋᴇʀ
1
1 .: Cambie el nombre de sus variables, por lo que tienen 1 carácter de largo 2 .: Agregue siempre un recuento de bytes adecuado, necesita ser tte byte preciso
Bálint