Çocuğum için bir merdiven inşa et


25

Geçen gün oğlum benden Lego-ish bloklarını kullanarak bir merdiven yapmamı istedi. Ve şöyle bir şey buldum:

Merdiven

Sonra çocuğum bilgisayar ekranında benzer bir merdiven üreten en az bayt sayısını kullanan bir program istedi. o kadar iyi değilim , bu yüzden yardımına ihtiyacım var. Bir programa ihtiyacım var:

  • Merdivenin sahip olması gereken seviye sayısı ile pozitif bir tamsayı alır.
  • Resimde gördüğünüz desenle, merdiven çizimi çizer.

Çıktı metin biçiminde olacaktır, ancak tuğlalar birbirinden ayırt edilebilir. Örneğin, '█' karakterini yarım blok olarak kullanabilir ve istediğiniz renge boyayabilir veya istediğiniz herhangi bir karakteri seçebilirsiniz.

Kısıtlamalar:

  • Blokların mümkün olduğu kadar uzun süre kullanılacak üç farklı renkte olması gerekir (giriş 1 veya 2 ise, üç rengi de kullanacak kadar blok yoktur). İsterseniz, örneğin '░▒▓' karakterlerini kullanabilir veya yalnızca üç farklı karakter seçebilirsiniz.
  • Tek bir sırada aynı renk veya desende iki blok yan yana olamaz.

Oğlum, bir merdiven çekildiği sürece takip eden boşlukları ya da yeni hatları önemsemiyor.

Örnekler (kötü karakter seçimi için özür dilerim):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

Input: 3
Output:
██
 ▓▓
██░░

Input: 5
Output:
██
 ██
██░░
 ██░░
██░░▓▓

17
Çocuğunuza eğlencenin kendisini inşa etme / programlamada olduğunu söyleyin :-)
Luis Mendo

3
Siteye Hoşgeldiniz! ASCII sanatını ve grafik çıktısını birleştirmek, genellikle iki paralel zorluğa yol açtığı için kaşlarını çattı. Eğer ASCII için giderseniz bazı diller olmayan ASCII karakterleri ile zorluk olabilir gibi Ayrıca, ben, (ben zaten sanıyorsun ama belki de daha açık ve net olması) gerçek ASCII karakterleri kullanılacak sağlayacak
Luis Mendo

2
Bilginize bloklar Duplo denir
caird coinheringaahing

10
@cairdcoinheringaahing duplo'nun yuvarlak düğmeleri yoktur.
Christoph,

3
@cairdcoinheringaahing Sorudaki bloklar Duplo değil, Duplo Lego uyumlu , bunlar Lego Baby . Onlar edildi aslen Duplo Primo denilen ve onlar farklı bir ada olsaydı ya bu ikisinin, ancak teknik olarak Lego ve Duplo hem farklı bir ürünüdür.
Draco18,

Yanıtlar:


5

Jelly ,  21 19  16 bayt

d2SR+%3x2⁶;ṙḂµ€Y

Sonucu basan tam bir program.

Kullanır 00, 11ve 22bloklar olarak.

Çevrimiçi deneyin!

Nasıl?

d2SR+%3x2⁶;ṙḂµ€Y - Main link: number n
             µ€  - for €ach "row" in n (i.e. for row, r = 1 to n inclusive):
d2               -   divmod 2   -> [integer-divide by 2, remainder] i.e. [r/2, r%2]
  S              -   sum        -> r/2 + r%2
   R             -   range      -> [1, 2, 3, ..., r/2 + r%2]
    +            -   add r      -> [r+1, r+2, r+3, ..., r + r/2 + r%2]
     %3          -   modulo 3   -> [r%3+1, r%3+2, r%3+0, ..., (r + r/2 + r%2)%3]
                 -   e.g.: r: 1  , 2  , 3    , 4    , 5      , 6      , 7       , ...
                             [2], [0], [1,2], [2,0], [0,1,2], [1,2,0], [2,0,1,2], ...
       x2        -   times 2 - repeat each twice (e.g. [2,0,1,2] -> [2,2,0,0,1,1,2,2]
         ⁶       -   literal space character
          ;      -   concatenate (add a space character to the left)
            Ḃ    -   r mod 2 (1 if the row is odd, 0 if it is even (1 at the top))
           ṙ     -   rotate (the list) left by (r mod 2)
               Y - join with newlines
                 - implicit print (no brackets printed due to the presence of characters)

11

Python 2,55 bayt

i=2
exec"print(i%2*' '+`2%i*1122`*i)[:i];i+=1;"*input()

Çevrimiçi deneyin!

22, 44Üst sıra hariç, bloklar arasında geçiş yapar 00. Örneğin, 10 numaralı girişte yazdırır

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

i=2,3,..Tek uzunluklar için bir boşluk oluşturarak, desen izamanlarını tekrar ederek ve boyuna keserek artan uzunluktaki satırları yazdırır i. Desen, 2244ilki dışındaki tüm satırlar i=2içindir 0. Bu aritmetik ifadeyle elde edilir 2%i*1122.


1
Dava 3 için sadece iki renk kullanır.
Christoph

Çok akıllıca düzeltme!
Charlie

4

JavaScript (ES6), 80 bayt

n=>eval(`for(s=11,i=1;i++<n;)s+='\\n'+(' '+'2233'.repeat(n)).substr(i%2,i+1);s`)


JavaScript (ES6), 87 bayt

Önceki çözüm

n=>[11,...Array(n).fill(' '+'2233'.repeat(n)).map((r,n)=>r.slice(n%2,n+3+n%2))].join`
`

3

SOGL , 31 28 27 25 bayt

∫³2\@*O"²b“2⁵I%*r*;I»«nKp

Açıklama:

∫                          iterate input times, pushing 1-indexed counter
 ³                         get 3 total copies of it on stack
  2\                       1 if divides by 2, else 0
    @*                     get that many spaces
      O                    output in a new line
       "²b“                push 1122
           2⁵I%*           multiply 1122 by 2%(iteration+1)
                r          convert to string
                 *         multiply by iteration
                  ;I»«     get one iteration variable ontop of stack
                      n    increase, floor divide by 2, multiply by 2 (gets the amount of bricks in a line)
                       Kp  split that multiplied string in pieces of that length

bu tekniği kullanarak
9 için örnek çıktı:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

rekabet etmeyen, 22 bayt

∫³2\@*O"²b“2⁵I%*;I»«mp

Komut m, henüz uygulanmayan 1. SOGL taahhüdünde belgelenmiştir .


3

05AB1E , 22 21 20 18 17 bayt

Bu ilginç gerçeği kullanır 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

F4NÌm5÷bDðì}r·IF,

Çevrimiçi deneyin!

açıklama

F                     # for N in 0...input-1 do
 4                    # push 4
  NÌ                  # push N+2
    m                 # push 4^(N+2)
     5÷               # integer division by 5
       b              # convert to binary
        D             # duplicate
         ðì           # prepend a space to the copy
           }          # end loop
            r         # reverse stack
             ·        # multiply top of stack by 2
              IF      # input times do
                ,     # print with newline

Üzgünüm, cevabımı geliştirdim - yine de güzel bir yöntem!
Jonathan Allan,

@ JonathanathanAlan: Tabii ki yaptın;) Teşekkürler! Cevabınız için girintilemeyi mod2 rotasyonu ile ele almak oldukça hoş bir fikir.
Emigna

2

PHP, 61 59

aa<?for(;++$i<$argn;)echo"
",str_pad(" "[~$i&1],2+$i,bbcc);

Python sürümleri gibi çalışır ancak mümkünse üç rengi de kullanır. Sondaki yeni hat yok.

-2 bytes by @user63956. Thanks !

1
İki bayt ile kaydedebilirsiniz aa<?for....
user63956

1

Pyth , 29 bayt

VQI!%hN2pd)Vh/N2p*2@G%+NH3)pb

Çevrimiçi test edin!

açıklamalar

VQI!%hN2pd)Vh/N2p*2@G%+NH3)pb

VQ                               For N in range(0, input)
  I!%hN2pd)                      If N is odd, print a leading space
           Vh/N2          )      For H in range(0, N / 2 + 1)
                   @G%+NH3       Select the letter at position (N + H) % 3 in the alphabet
                 *2              Then make it a two letters string ("aa" or "bb" or "cc")
                p                Print it
                           pb    End the line by printing a new line

Bu kodu kısaltmanın pek çok yolu olduğuna eminim, ama şu anda yorgun kralım ... Sonra deneyeceğim.


0

Toplu iş, 125 bayt

@set s=█
@for /l %%i in (2,1,%1)do @call:c
:c
@set s= %s:█= %
@set s=%s:▓=█%
@set s=%s:░=▓%
@set s=%s:  =░░%
@echo %s%

Not: Bunu CP437 veya CP850'de veya benzeri bir yerde saklayın. Her seferinde renkleri döndürerek çalışır. Döndürmeyi gerçekleştirmek için dizgiyi eşleyemediğim için, geçici aşama olarak boşlukları kullanarak dört değiştirmeyi kullanıyorum. Bu, aynı zamanda, her satırda bir boşluk eklememe izin verir, böylece iki boşluk yeni bir bloğa dönüşür. Örnek çıktı:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
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.