ASCII piyano klavyesi


24

Piyano tuşları 3 karakter genişliğinde ve 7 karakter uzunluğundadır. Ancak, her bir anahtar 3 genişlikte olsaydı, siyah anahtarlar için yeterli alan olmazdı. Bu yüzden beyaz tuşlardan bazıları bir kısmı kesip atıyor. 3 tip beyaz tuş vardır.

Sağ yarısı eksik olan tuşlar (R):

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

Sol yarısı eksik olan tuşlar (L):

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

Ve sol ve sağ yarıları eksik olan tuşlar (M):

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

Gerçek bir klavyede, bunların düzeni şöyledir:

RMLRMML, RMLRMML, RMLRMML...

ve toplamda 88 anahtar için tekrar eder. Şimdi tuşlar ayrı ayrı gösterildiğinde bunu göremezsiniz, ancak bunları birlikte kıpırdatırken siyah tuşları görebilirsiniz.

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

Senin görevin

Tamsayı pozitif Verilen N , bir piyanonun bu ASCII sanatı yazdırmak N beyaz tuşlar. Herhangi işlemek gerekir N 1'den 52 Anin (gerçek 88 tuşlu piyano 52 beyaz tuşları var çünkü) için. Burada 1'den 8'e kadar olan test çıktısı verilmiştir ve bundan sonra model benzer şekilde artmaktadır.

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

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

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

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

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

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

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

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

Ve son fakat en az değil, işte tam 52 anahtar çıktı:

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

Standart boşluklar yasaklandı ve bayt cinsinden en kısa cevap kazanıldı!


"Standart boşluklar" nedir?
Joker


Herhangi bir satırda / tüm satırlarda sondaki boşluklara izin var mı? Sondaki yeni hat hakkında nasıl?
Sok,

1
@AlexL. 88 tuşlu piyanoların gerçek 55 beyaz tuşu var .
DJMcMayhem

1
@BMac> _> Bilmiyorum ... <_ <Neden bahsettiğin hakkında hiçbir fikrim yok. Ben söylediğim bkz 52! Bunu açıkça görüyorsun, R̶e̶v̶i̶s̶i̶o̶n̶ ̶H̶i̶s̶t̶o ,r̶y̶ Uh, şu an gönderinin durumunu kastediyorum! Her neyse, çok şükür ki, muhtemelen cevapları bozmayacak, çünkü çoğu zaten 55'ten fazla çalışıyor.
DJMcMayhem

Yanıtlar:


4

Pyth, 68 65 63 bayt

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

Çevrimiçi deneyin!

Test odası.

Bu sürümde, sadece 2 bayt kaydetmek için içerideki atamaları (J ve K) değiştirdim. Bu nedenle, aşağıdaki sürümü okuyunuz.

Açıklama ile önceki 65 bayt versiyonu

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

Çevrimiçi deneyin!

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)

Kara büyü

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

Sadece şaka yaptım. Groan ...
Neil

11

JavaScript (ES6), 155 149 147 bayt

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

Nerede \nliteral satır karakteri temsil eder. İlk satırdan sonraki tüm satırların bir |karakterle başlamasından yararlanır . Açıklama:

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>

Düzenleme: 2 byte'lık tuşların yüksekliğine göre yanlış okunmamı düzelterek kaydedildi.


2
Siz bayım, aklımı başımdan aldın.
Robbie Coyne

Ah, bu iyi, bir çeşit adım ekleyebilir misin?
nobe4

Mümkünse çalıştırılabilir bir snippet eklemelisiniz.
Bálint

1

Ruby, 119 bayt

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

Test programında Ungolfed

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

1

> <>, 188 182 bayt

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

Görüntülenecek beyaz tuşların sayısı program başlangıcında yığında bulunmalıdır.

Düzenleme : 5/6 ve 7 satırları için çıktıyı birleştirerek birkaç baytı tıraş etmeyi başardım. Önceki sürüm:

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

1

PHP, 238 bayt

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

Her zaman olduğu gibi, kodu hazırlayın, <?phpbir PHP dosyasına koyun (haydi isimlendirin keyboard.php) ve kullanarak çalıştırın:

$ php -d error_reporting=0 keyboard.php 55

İki tane daha bayt başlatılması sıkarak PHP7 üzerinde kaydedilebilir $nve $silk kullanıma:

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

Ungolfed kodu, bir test paketi ve diğer güzellikler bulunabilir github .


1

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

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

Bu biraz golf oynayabilir ancak kodları çok fazla değiştirdim, zaten golf sahalarının nerede olduğunu göremedim. Herhangi bir golf önerisi açıktır.

Düzenle: Tuşların yüksekliğindeki özellikleri yanlış oku. Bu sorun çözüldü.

Düzenleme: Borçlu Neil'in 12 anahtar fikri Javascript cevabından aldı, bazı parantezleri kaldırın ve 11 bayt'ı kurtarmak için Python 2'ye geçti.

Düzenleme: Fonksiyonu bire indirmek için birçok değişiklikfor döngüye .

Düzenle: Şimdi bir işlev yerine bir program.

Düzenleme: Şimdi print"\n|".join()Neil tarafından 11 byte tasarruf etmek için önerilen şekilde kullanılıyor . Bir bayttan tasarruf etmek için programı tekrar fonksiyona çevirin.


Numaramı kullanarak 10 byte daha kurtarabilirsin "\n|".join.
Neil

Ah, printve arasındaki boşluğu kaldırmayı unuttum "\n|"!
Neil,

0

C # 1683 bayt

Yani .... Neil'in yukarıdaki cevabını gördükten sonra bu oldukça utanç verici, ama yine de göndereceğim çünkü beni biraz zaman aldı (korusun). Benimkini oluşturmak için C # kullandım. "Fncs" sınıfının içinde tipik bir anahtar sırasının bir dizisini yarattım. Sonra, kullanıcının verilen bir tamsayıyı temel alarak bu dizi için uygun bir indeks elde etmesini sağlayan bir fonksiyon yarattım. Tek tek satırları düzenlemek için, tek tek satırları temsil eden birden çok dizeyi saklayan bir sözlük içeren bir "PianoKeyboard" sınıfı oluşturdum. Sonunda, uygun metni ayrı ayrı satırlara ekleyen "DrawKey" işlevini ve genel dize değerini döndüren "GetKeys" işlevini oluşturdum.

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

1
Merhaba, PPCG'ye hoş geldiniz! Fark etmiş olabileceğiniz gibi, kod golf zorlukları mümkün olan en kısa kodu yazmakla ilgilidir. C #, Java gibi diller ve temel olarak herhangi bir OO dili çoğunlukla kötü bir seçimdir. Ancak, kısa kod yazmak için harika bir uygulama olabilir, bu yüzden sizi böyle yapmaktan caydırmaya çalışmıyorum :) Cevabınıza gelince, kodun uzunluğunu korumazsanız bu sorunu çözmenin güzel bir yolu mind! İyi eğlenceler ve iyi şanslar küçük C # kodu yazmaya çalışıyor :)
Bassdrop Cumberwubwubwub 4:16

@BassdropCumberwubwubwub Teşekkürler, bu siteye gerçekten yeniyim (tabii ki). Programlamada biraz yeni ama elimden gelenin en iyisini yapacağım ^ _ ^
Robbie Coyne

Tüm <200 baytlık cevaplar arasında 4 KB'lık bir cevap görmek komik. Ben şahsen Java kod yazmayı bu Codegolf zorlukları için mümkün olduğu kadar kısa sürede yazmayı seviyorum, çünkü hiçbir zaman kod dili kullanmadım. Tabii ki Java ve C # hiçbir zaman diğer cevaplarla rekabet edemez, ancak mümkün olduğunca kısa kod oluşturmayı denemek eğlencelidir. İşte ilginç bulabileceğiniz bir yazı: C # kod-golf için ipuçları . PS: Kodunuzu, baytların tam miktarını görmek için bir dosyaya kopyaladım: 4.052 . ;) Neyse, PPCG'ye hoş geldiniz!
Kevin Cruijssen

2
PPCG'ye hoş geldiniz, ancak bu cevabın tamamen golf oynaması gerekiyor. Kaldırılabilir boşlukları ve yorumları görüyorum.
Rɪᴋᴇʀ

1
1 .: Değişkenlerinizi yeniden adlandırın, bu yüzden 1 karakter uzunluğunda olurlar 2: Her zaman uygun bir bayt sayısı ekleyin, baytın kesin olması gerekir
Bálint
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.