สร้างบันไดสำหรับลูกของฉัน


25

วันก่อนลูกชายของฉันขอให้ฉันสร้างบันไดให้เขาโดยใช้บล็อกเลโก้ - ไอช และฉันมาพร้อมกับสิ่งนี้:

บันได

จากนั้นลูกของฉันขอให้ฉันใช้โปรแกรมโดยใช้จำนวนไบต์น้อยที่สุดที่สร้างบันไดที่คล้ายกันในหน้าจอคอมพิวเตอร์ ฉันไม่ค่อยเก่งเรื่องดังนั้นฉันต้องการความช่วยเหลือจากคุณ ฉันต้องการโปรแกรมที่:

  • รับจำนวนเต็มบวกพร้อมจำนวนระดับที่บันไดจำเป็นต้องมี
  • แสดงผลการวาดของบันไดด้วยรูปแบบที่คุณเห็นในภาพ

เอาท์พุทจะอยู่ในรูปแบบข้อความ แต่ก้อนอิฐสามารถแยกออกจากกันได้ ตัวอย่างเช่นคุณอาจใช้อักขระ '█' เป็นครึ่งบล็อกและวาดสีตามที่คุณต้องการหรือเพียงแค่เลือกตัวละครที่คุณต้องการ

ข้อ จำกัด :

  • บล็อกต้องมีสามสีที่แตกต่างกันซึ่งจะถูกใช้ให้นานที่สุดเท่าที่จะเป็นไปได้ (ถ้าอินพุต 1 หรือ 2 มีบล็อกไม่เพียงพอที่จะใช้ทั้งสามสี) หากคุณต้องการคุณสามารถใช้อักขระ '░▒▓' หรือเลือกอักขระที่แตกต่างกันสามตัว
  • ไม่มีบล็อกสองอันที่มีสีหรือลวดลายเดียวกันสามารถวางเรียงกันได้

ลูกชายของฉันไม่สนใจเกี่ยวกับช่องว่างต่อท้ายหรือบรรทัดใหม่ตราบใดที่มีการวาดบันได

ตัวอย่าง (ขออภัยสำหรับตัวเลือกที่ไม่ถูกต้อง):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

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

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

17
บอกลูกของคุณว่าความสนุกกำลังอยู่ในการสร้าง / เขียนโปรแกรมด้วยตัวเอง :-)
หลุยส์เมนโด

3
ยินดีต้อนรับสู่เว็บไซต์! การรวมศิลปะ ASCII และเอาท์พุทกราฟิกมักจะขมวดคิ้วเพราะมันส่งผลให้เกิดความท้าทายสองขนาน นอกจากนี้ถ้าคุณไปหา ASCII ฉันจะอนุญาตให้ใช้อักขระ ASCII จริง (ฉันคิดว่าคุณทำไปแล้วแต่อาจชัดเจนกว่า) เนื่องจากบางภาษาอาจมีปัญหากับอักขระที่ไม่ใช่ ASCII
Luis Mendo

2
FYI บล็อกนี้เรียกว่า Duplo
caird coinheringaahing

10
@cairdcoinheringaahing duplo ไม่มีปุ่มกลม
Christoph

3
@cairdcoinheringaahing บล็อกในคำถามที่ยังไม่ได้ Duplo, Duplo เป็นเลโก้เข้ากันได้ , ผู้ที่มีเลโก้เด็ก ตอนแรกพวกเขาถูกเรียกว่า Duplo Primo และฉันหวังว่าพวกเขาจะมีชื่อที่แตกต่างจากทั้งสองอย่างนี้
Draco18s

คำตอบ:


5

เยลลี่ ,  21 19  16 ไบต์

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

โปรแกรมเต็มรูปแบบการพิมพ์ผล

การใช้งาน00, 11และ22เป็นบล็อก

ลองออนไลน์!

อย่างไร?

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 ไบต์

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

ลองออนไลน์!

รอบระหว่างบล็อกของยกเว้นแถวบนสุดคือ22, 44 00ตัวอย่างเช่นในการป้อนข้อมูล 10 พิมพ์

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

พิมพ์แถวของความยาวที่เพิ่มขึ้นi=2,3,..โดยการสร้างพื้นที่สำหรับความยาวแปลกซ้ำรูปแบบiครั้งและ trunctating iความยาว รูปแบบเป็น2244แถวทั้งหมดยกเว้นคนแรกที่มันเป็นi=2 นี่คือความสำเร็จกับการแสดงออกทางคณิตศาสตร์02%i*1122


1
ใช้สองสีเท่านั้นสำหรับกรณีที่ 3
Christoph

การแก้ไขที่ฉลาดมาก!
Charlie

4

JavaScript (ES6), 80 ไบต์

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


JavaScript (ES6), 87 ไบต์

วิธีแก้ไขก่อนหน้า

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 ไบต์

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

คำอธิบาย:

∫                          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

ใช้เทคนิคนี้
ตัวอย่างผลลัพธ์สำหรับ 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

ไม่ใช่การแข่งขัน 22 ไบต์

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

คำสั่งmได้รับการบันทึกไว้ในการมอบหมาย SOGL ครั้งที่ 1แล้ว แต่ไม่ได้ดำเนินการ


3

05AB1E , 22 21 20 18 17 ไบต์

ใช้ข้อเท็จจริงที่น่าสนใจที่ 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

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

ลองออนไลน์!

คำอธิบาย

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

ขออภัยฉันปรับปรุงคำตอบของฉัน - วิธีการที่ดี!
Jonathan Allan

@ JonathanAllan: แน่นอนคุณทำ;) ขอบคุณ! ความคิดที่ยอดเยี่ยมในการจัดการการเยื้องกับการหมุน mod2 ในคำตอบของคุณ
Emigna

2

PHP, 61 59

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

ใช้งานได้ดีเหมือนเวอร์ชันงูใหญ่ แต่ใช้ทั้งสามสีถ้าเป็นไปได้ ไม่มีการขึ้นบรรทัดใหม่

-2 bytes by @user63956. Thanks !

1
aa<?for...คุณสามารถบันทึกไบต์ที่สองด้วย
user63956

1

Pyth , 29 ไบต์

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

ทดสอบออนไลน์!

คำอธิบาย

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

ฉันแน่ใจว่ามีหลายวิธีในการย่อรหัสนั้น แต่ฉันเป็นราชาแห่งความเหนื่อยล้าในตอนนี้ ... จะลองใหม่ภายหลัง


0

แบตช์ 125 ไบต์

@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%

หมายเหตุ: บันทึกใน CP437 หรือ CP850 หรือบางอย่างเช่น ทำงานโดยการหมุนสีในแต่ละครั้ง เนื่องจากฉันไม่สามารถแมปบนสายอักขระเพื่อทำการหมุนฉันจึงใช้การแทนที่สี่ครั้งโดยใช้ช่องว่างเป็นระยะชั่วคราว นี่ก็ช่วยให้ฉันสามารถนำหน้าช่องว่างทุกบรรทัดเพื่อให้ทั้งสองช่องว่างกลายเป็นบล็อกใหม่ ตัวอย่างผลลัพธ์:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.