Klawiatura fortepianowa ASCII

24

Klawisze fortepianu mają 3 znaki szerokości i 7 znaków wysokości. Gdyby jednak każdy klawisz miał 3 znaki szerokości, nie byłoby wystarczającej ilości miejsca dla czarnych klawiszy. Dlatego niektóre białe klucze mają wycięte części. Istnieją 3 rodzaje białych klawiszy.

Klucze z brakującą prawą połówką (R):

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

Klucze bez lewej połowy (L):

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

I brakuje klawiszy z lewą i prawą połówką (M):

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

Na prawdziwej klawiaturze ich wzór wygląda następująco:

RMLRMML, RMLRMML, RMLRMML...

i powtarza się dla 88 kluczy. Teraz nie możesz tego zobaczyć, gdy klawisze są pokazywane indywidualnie, ale kiedy je wepchniesz razem, zobaczysz czarne klawisze.

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

Twoje zadanie

Biorąc pod uwagę dodatnią liczbę całkowitą N , wydrukuj tę sztukę ASCII fortepianu z N białymi klawiszami. Powinieneś być w stanie obsłużyć dowolny N od 1 do 52 włącznie (ponieważ prawdziwe 88-klawiszowe fortepiany mają 52 białe klawisze). Oto wynik testu od 1 do 8, a następnie wzorzec rośnie w podobny sposób.

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

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

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

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

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

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

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

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

I na koniec, oto pełne 52 kluczowe dane wyjściowe:

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

Standardowe luki są zakazane, a najkrótsza odpowiedź w bajtach wygrywa!

DJMcMayhem
źródło
Co to są „standardowe luki”?
Wildcard
Czy dozwolone są spacje na dowolnych / wszystkich liniach? Co powiesz na końcowy znak nowej linii?
Sok
1
@AlexL. Ponieważ prawdziwe 88-klawiszowe fortepiany mają 55 białych klawiszy .
DJMcMayhem
1
@BMac> _> Nie ... <_ <Nie mam pojęcia o czym mówisz. I powiedział 52, zobacz! Możesz to wyraźnie zobaczyć w R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o̶r̶y̶ Uh, mam teraz na myśli stan tego wpisu! Tak czy siak, na szczęście to prawdopodobnie nie złamie żadnych istniejących odpowiedzi, ponieważ większość z nich prawdopodobnie i tak działa w wieku powyżej 55 lat.
DJMcMayhem

Odpowiedzi:

4

Pyth, 68 65 63 bajtów

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

Wypróbuj online!

Zestaw testowy.

W tej wersji właśnie zastąpiłem przypisania (J i K) wewnątrz, aby zaoszczędzić 2 bajty. Dlatego przeczytaj poniższą wersję.

Poprzednia 65-bajtowa wersja z wyjaśnieniem

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

Wypróbuj 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)

Czarna magia

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
źródło
Właśnie dostałem twój żart. Jęk ...
Neil
11

JavaScript (ES6), 155 149 147 bajtów

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

Gdzie \nreprezentuje dosłowny znak nowej linii. Wykorzystuje fakt, że wszystkie linie po pierwszym zaczynają się od |znaku. Wyjaśnienie:

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>

Edycja: Zapisałem 2 bajty, naprawiając moje błędne odczytanie specyfikacji na wysokości klawiszy.

Neil
źródło
2
Panie, po prostu oszalałem.
Robbie Coyne
Och, to dobrze, czy możesz dodać jakiś przewodnik?
nobe4
Jeśli to możliwe, dodaj fragment, który można uruchomić.
Bálint
1

Ruby, 119 bajtów

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

Niegolfowany w programie testowym

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
źródło
1

> <>, 188 182 bajtów

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

Liczba białych klawiszy do wyświetlenia powinna znajdować się na stosie podczas uruchamiania programu.

Edycja : Udało mi się ogolić kilka bajtów, łącząc dane wyjściowe dla linii 5/6 i 7. Poprzednia wersja:

&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
źródło
1

PHP, 238 bajtów

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

Jak zwykle, dodaj kod za pomocą <?php, umieść go w pliku PHP (nazwijmy go keyboard.php) i uruchom za pomocą:

$ php -d error_reporting=0 keyboard.php 55

Dwa kolejne bajty można zapisać na PHP7, ściskając inicjalizację $ni $sdo pierwszego użycia:

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

Niegolfowany kod, zestaw testowy i inne gadżety można znaleźć na github .

aksjomat
źródło
1

Python 3 2, 191 185 180 182 171 145 144 133 132 132 bajtów

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

Przydałoby się trochę gry w golfa, ale już tak dużo bawiłem się kodem, że mogę nie wiedzieć, gdzie są pola do gry w golfa. Wszelkie sugestie dotyczące gry w golfa są mile widziane.

Edycja: źle odczytano specyfikację na wysokości klawiszy. Ten błąd został naprawiony.

Edycja: pożyczył 12 kluczowych pomysłów Neila z odpowiedzi na Javascript, usunął niektóre nawiasy i przeszedł na Python 2, aby zaoszczędzić 11 bajtów.

Edycja: Wiele zmian, aby sprowadzić funkcję do jednej forpętli.

Edycja: teraz program zamiast funkcji.

Edycja: Teraz używa print"\n|".join()zgodnie z sugestią Neila, aby zapisać 11 bajtów. Przekształcił program z powrotem w funkcję zapisywania bajtu.

Sherlock9
źródło
Myślę, że możesz zaoszczędzić kolejne 10 bajtów, używając mojej "\n|".joinsztuczki.
Neil
Ach, zapomniałem usunąć przestrzeń pomiędzy printi "\n|"!
Neil,
0

C # 1683 bajtów

Więc .... po zobaczeniu odpowiedzi Neila powyżej jest to dość zawstydzające, ale i tak opublikuję to, ponieważ zajęło mi to trochę czasu (błogosław). Użyłem C # do stworzenia mojego. Wewnątrz klasy „Fncs” stworzyłem tablicę typowej kolejności kluczy. Następnie utworzyłem funkcję, która pozwala użytkownikowi uzyskać odpowiedni indeks dla tej tablicy na podstawie podanej liczby całkowitej. Aby edytować poszczególne linie, stworzyłem klasę „PianoKeyboard”, która zawiera słownik przechowujący wiele ciągów reprezentujących poszczególne linie. Na koniec utworzyłem funkcję „DrawKey”, która dołącza odpowiedni tekst do poszczególnych linii, oraz funkcję „GetKeys”, która zwraca ogólną wartość ciągu.

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
źródło
1
Cześć, witamy w PPCG! Jak zapewne zauważyłeś, wyzwania związane z golfem polegają na napisaniu możliwie najkrótszego kodu. Języki takie jak C #, Java i w zasadzie każdy język OO są najczęściej złym wyborem. Jednak pisanie krótkiego kodu może być świetną praktyką, więc nie próbuję cię zniechęcać :) Jeśli chodzi o twoją odpowiedź, to dobry sposób na rozwiązanie tego problemu, jeśli nie zachowasz długości kodu umysł! Miłej zabawy i powodzenia w pisaniu małego kodu C # :)
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Dzięki, naprawdę jestem nowy na tej stronie (oczywiście). Trochę też nowości w programowaniu, ale dam z siebie wszystko ^ _ ^
Robbie Coyne
Zabawnie jest widzieć odpowiedź 4KB między wszystkimi odpowiedziami <200 bajtów. Osobiście lubię pisać kod Java w możliwie najkrótszym czasie dla tych wyzwań Codegolf, ponieważ nigdy nie używałem żadnego języka codegolf. Oczywiście Java i C # nigdy nie mogą konkurować z innymi odpowiedziami, ale fajnie jest spróbować stworzyć kod tak krótki, jak to możliwe. Oto post, który może Cię zainteresować: Wskazówki do gry w golfa w C # . PS: Skopiowałem twój kod do pliku, aby zobaczyć dokładną liczbę bajtów, czyli: 4,052 . ;) W każdym razie witamy w PPCG!
Kevin Cruijssen
2
Witamy w PPCG, ale ta odpowiedź musi być w pełni golfa. Widzę spacje i komentarze, które można usunąć.
Rɪᴋᴇʀ
1
1 .: Zmień nazwy zmiennych, aby miały długość 1 znaku 2 .: Zawsze dodawaj odpowiednią liczbę bajtów, musi być precyzyjna w bajtach
Bálint