ASCII-Klaviertastatur

24

Die Klaviertasten sind 3 Zeichen breit und 7 Zeichen hoch. Wenn jedoch jeder Schlüssel 3 Zeichen breit wäre, gäbe es nicht genug Platz für die schwarzen Schlüssel. Aus diesem Grund sind einige der weißen Tasten teilweise ausgeschnitten. Es gibt 3 Arten von weißen Tasten.

Schlüssel mit der rechten Hälfte fehlen (R):

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

Schlüssel, bei denen die linke Hälfte fehlt (L):

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

Und Schlüssel mit der linken und rechten Hälfte fehlen (M):

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

Auf einer echten Tastatur sieht das Muster so aus:

RMLRMML, RMLRMML, RMLRMML...

und wiederholt sich für insgesamt 88 Tasten. Jetzt können Sie es nicht sehen, wenn die Tasten einzeln angezeigt werden, aber wenn Sie sie zusammenschieben, können Sie die schwarzen Tasten sehen.

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

Deine Aufgabe

Bei einer positiven Ganzzahl N drucken Sie diese ASCII-Grafik eines Klaviers mit N weißen Tasten. Sie sollten in der Lage sein, jedes N von 1 bis einschließlich 52 zu verarbeiten (da echte Klaviere mit 88 Tasten 52 weiße Tasten haben). Hier ist die Testausgabe von 1 bis 8, und danach nimmt das Muster auf ähnliche Weise zu.

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

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

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

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

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

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

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

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

Und last but not least gibt es hier eine Ausgabe mit 52 Tasten:

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

Standardlücken sind verboten und die kürzeste Antwort in Bytes gewinnt!

DJMcMayhem
quelle
Was sind "Standardlücken"?
Wildcard
Sind Leerzeichen in allen Zeilen erlaubt? Wie wäre es mit einer nachgestellten Newline?
Sok
1
@AlexL. Da echte 88-Tasten-Klaviere 55 weiße Tasten haben .
DJMcMayhem
1
@BMac> _> Ich weiß nicht ... <_ <Ich habe keine Ahnung, wovon Sie sprechen. Ich sagte 52, verstehe! Sie können es deutlich im R thee̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ sehen. Äh, ich meine den Status der Post im Moment! Wie auch immer, zum Glück wird das wahrscheinlich keine existierenden Antworten zerstören, da die meisten von ihnen wahrscheinlich sowieso auf 55+ funktionieren.
DJMcMayhem

Antworten:

4

Pyth, 68 65 63 Bytes

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

Probieren Sie es online!

Testsuite.

In dieser Version habe ich nur die Zuweisungen (J und K) ersetzt, um 2 Bytes zu sparen. Lesen Sie daher die unten stehende Version.

Vorherige 65-Byte-Version mit Erläuterung

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

Probieren Sie es online!

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)

Schwarze Magie

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:
                    "  | | | |  |  | | | | | |  |"
Undichte Nonne
quelle
Ich habe gerade erst deinen Witz verstanden. Stöhnen ...
Neil
11

JavaScript (ES6), 155 149 147 Byte

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

Wobei \ndas wörtliche Zeilenumbruchzeichen darstellt. Nutzt die Tatsache, dass alle Zeilen nach dem ersten |Zeichen beginnen. Erläuterung:

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: 2 Bytes gespart, indem ich mein falsches Lesen der Spezifikation auf der Höhe der Tasten korrigiert habe.

Neil
quelle
2
Sie, Sir, haben mich einfach umgehauen.
Robbie Coyne
Oh, das ist gut. Können Sie eine Art Komplettlösung hinzufügen?
Nobe4
Sie sollten ein ausführbares Snippet hinzufügen, wenn Sie können.
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]}}

Ungolfed im Testprogramm

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

> <> 188 182 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
  | | | |  |

Die Anzahl der anzuzeigenden weißen Tasten sollte beim Programmstart auf dem Stapel vorhanden sein.

Bearbeiten : Ich habe es geschafft, ein paar Bytes durch Kombinieren der Ausgabe für die Zeilen 5/6 und 7 zu sparen. Vorherige Version:

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

Stellen Sie den Code wie üblich voran, fügen <?phpSie ihn in eine PHP-Datei ein (nennen wir ihn keyboard.php) und führen Sie ihn aus:

$ php -d error_reporting=0 keyboard.php 55

Zwei weitere Bytes können auf PHP7 gespeichert werden, indem die Initialisierung von $nund $sin ihre erste Verwendung gedrückt wird :

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

Der ungolfed Code, eine Testsuite und andere Goodies sind auf Github zu finden .

Axiac
quelle
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])

Dies könnte ein wenig Golfen gebrauchen, aber ich habe bereits so viel mit dem Code herumgespielt, dass ich möglicherweise nicht sehe, wo sich die Golfplätze befinden. Anregungen zum Golfen sind willkommen.

Bearbeiten: Misread die Spezifikation auf der Höhe der Schlüssel. Dieser Fehler wurde behoben.

Edit: Borrowed Neils 12 Schlüsselidee aus seiner Javascript-Antwort, entfernte einige Klammern und wechselte zu Python 2, um 11 Bytes zu sparen.

Bearbeiten: Viele Änderungen, um die Funktion auf eins zu reduzierenfor Schleife reduzieren.

Bearbeiten: Jetzt ein Programm anstelle einer Funktion.

Bearbeiten: Verwenden Sie jetzt print"\n|".join()wie von Neil vorgeschlagen, um 11 Bytes zu sparen. Verwandelte das Programm wieder in eine Funktion zum Speichern eines Bytes.

Sherlock9
quelle
Ich denke, Sie könnten mit meinem "\n|".joinTrick weitere 10 Bytes einsparen .
Neil
Ah, ich hatte vergessen, das Leerzeichen zwischen printund zu entfernen "\n|"!
Neil
0

C # 1683 Bytes

Also ... nachdem ich Neils Antwort oben gesehen habe, ist das ziemlich peinlich, aber ich werde es trotzdem posten, weil ich eine Weile gebraucht habe (Segen). Ich habe meine mit C # erstellt. In der Klasse "Fncs" habe ich ein Array mit der typischen Reihenfolge der Schlüssel erstellt. Dann habe ich eine Funktion erstellt, mit der der Benutzer anhand einer bestimmten Ganzzahl einen geeigneten Index für dieses Array abrufen kann. Um einzelne Zeilen zu bearbeiten, habe ich eine "PianoKeyboard" -Klasse erstellt, die ein Wörterbuch enthält, in dem mehrere Zeichenfolgen für die einzelnen Zeilen gespeichert sind. Schließlich habe ich die Funktion "DrawKey" erstellt, mit der der entsprechende Text an die einzelnen Zeilen angehängt wird, und die Funktion "GetKeys", mit der der Gesamtwert der Zeichenfolge zurückgegeben wird.

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
quelle
1
Hallo, willkommen bei PPCG! Wie Sie vielleicht bemerkt haben, geht es bei Code-Golf-Herausforderungen darum, den kürzestmöglichen Code zu schreiben. Sprachen wie C #, Java und grundsätzlich jede OO-Sprache sind daher meistens eine schlechte Wahl. Es kann jedoch eine großartige Übung sein, kurzen Code zu schreiben, damit ich Sie nicht davon abhalten kann Verstand! Viel Spaß und viel Glück beim Schreiben von kleinem C # -Code :)
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Danke, ich bin eigentlich neu auf dieser Seite (natürlich). Ein bisschen neu in der Programmierung, aber ich werde mein Bestes geben ^ _ ^
Robbie Coyne
Es ist lustig, eine 4-KB-Antwort zwischen allen <200-Byte-Antworten zu sehen. Ich persönlich schreibe auch gerne Java-Code für diese Codegolf-Herausforderungen so kurz wie möglich, da ich überhaupt keine Codegolf-Sprache verwendet habe. Natürlich können Java und C # nie mit anderen Antworten konkurrieren, aber es macht Spaß, so kurzen Code wie möglich zu erstellen. Hier ist ein Beitrag, den Sie vielleicht interessieren: Tipps zum Code-Golfen in C # . PS: Ich habe Ihren Code in eine Datei kopiert, um die genaue Anzahl der Bytes zu ermitteln, nämlich 4.052 . ;) Wie auch immer, willkommen bei PPCG!
Kevin Cruijssen
2
Willkommen bei PPCG, aber diese Antwort muss vollständig ausgereift sein. Ich sehe Leerzeichen und Kommentare, die entfernt werden können.
4.
1
1 .: Benennen Sie Ihre Variablen um, so dass sie 1 Zeichen lang sind. 2 .: Fügen Sie immer eine richtige Byteanzahl hinzu, es muss tk bytegenau sein
Bálint