เศษส่วนของปราสาท Minecraft


18

ค้นพบวิดีโอ youtubeจากผู้ใช้ PPCG คน ...

คุณท้าทายคือการใช้ ASCII- ศิลปะวาดกำแพงปราสาท Minecraft ของ Andesite และ Diorite รูปร่างของผนังเป็นชุดต้นเสียง สำหรับการอ้างอิงชุดคันทอร์ทำโดยการทำซ้ำNครั้งต่อไปนี้:

  • สามขั้นตอนปัจจุบัน
  • แทนที่ตรงกลางด้วยช่องว่าง
  • เพิ่มบรรทัดเต็มด้านล่าง

สิ่งนี้จะสร้างสิ่งต่อไปนี้สำหรับสี่ขั้นตอนแรก:

*

* *
***

* *   * *
***   ***
*********

* *   * *         * *   * *
***   ***         ***   ***
*********         *********
***************************

อย่างไรก็ตามความท้าทายของคุณไม่ง่ายอย่างนั้น คุณเห็นไหมว่าหลังจากที่ชุดต้นเสียงใหญ่ขึ้นจริง ๆ แล้วมันน่าเบื่อมากที่ได้ดูตัวละครเดิมซ้ำแล้วซ้ำอีก ดังนั้นเรากำลังจะมีการเปลี่ยนแปลงว่าด้วยการซ้อนทับชุดสลับดอกจันและสัญญาณปอนด์* #คุณควรสลับอักขระทุกตัวในแนวนอนและทุกแนวตั้ง (แน่นอนว่าเว้นช่องว่างไว้เหมือนเดิม) ตัวอย่างเช่นตัวอย่างที่สองจะกลายเป็น:

* *
###

และตัวอย่างที่สามจะกลายเป็น:

* *   * *
###   ###
***###***

เพื่อความสมบูรณ์นี่คือตัวอย่างสี่และห้า:

#4
* *   * *         * *   * *
###   ###         ###   ###
***###***         ***###***
###***###***###***###***###

#5
* *   * *         * *   * *                           * *   * *         * *   * *
###   ###         ###   ###                           ###   ###         ###   ###
***###***         ***###***                           ***###***         ***###***
###***###***###***###***###                           ###***###***###***###***###
***###***###***###***###***###***###***###***###***###***###***###***###***###***

และตัวอย่างเด่นครั้งที่หนึ่งการทำซ้ำครั้งที่ 6:

* *   * *         * *   * *                           * *   * *         * *   * *                                                                                 * *   * *         * *   * *                           * *   * *         * *   * * 
###   ###         ###   ###                           ###   ###         ###   ###                                                                                 ###   ###         ###   ###                           ###   ###         ###   ###
***###***         ***###***                           ***###***         ***###***                                                                                 ***###***         ***###***                           ***###***         ***###***
###***###***###***###***###                           ###***###***###***###***###                                                                                 ###***###***###***###***###                           ###***###***###***###***###
***###***###***###***###***###***###***###***###***###***###***###***###***###***                                                                                 ***###***###***###***###***###***###***###***###***###***###***###***###***###***
###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###***###

ความท้าทาย

คุณต้องเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบที่รับจำนวนเต็มบวกสำหรับอินพุทและส่งออกเศษส่วนปราสาท minecraft รุ่นที่N คุณสามารถนำเข้าและส่งออกด้วยวิธีการที่เหมาะสมและคุณไม่ต้องกังวลเกี่ยวกับอินพุตที่ไม่ถูกต้อง (เช่นตัวเลขที่น้อยกว่า 1, ตัวเลขจุดลอยตัว, ไม่ใช่ตัวเลข ฯลฯ )

คำตอบที่สั้นที่สุดวัดเป็นไบต์ชนะ!


คำตอบ:


5

เจลลี่ , 43 36 35 ไบต์

ḶṚ3*µ5B¤xЀṁ€Ṁ×\Ṛ©1,‘xS$¤ṁ×®ị“*# ”Y

เพิ่งเริ่มต้นฉันแน่ใจว่านี่อาจสั้นกว่านี้

ลองออนไลน์!

* สำหรับn > 5 เบราว์เซอร์ของคุณอาจตัดการแสดงผล แต่ถ้าคุณคัดลอกวางลงในตัวแก้ไขที่ไม่ตัดคำคุณจะเห็นผลลัพธ์ที่ถูกต้อง

คำอธิบาย

ḶṚ3*µ5B¤xЀṁ€Ṁ×\Ṛ©1,‘xS$¤ṁ×®ị“*# ”Y  Input: integer n
Ḷ                                    Create the range [0, n)
 Ṛ                                   Reverse it
  3*                                 Raise 3 to the power of each
    µ                                Begin a new monadic chain on the powers of 3
     5B¤                             Nilad. Get the binary digits of 5 = [1, 0, 1]
        xЀ                          Duplicate each of [1, 0, 1] to a power of 3 times
             Ṁ                       Get the maximum of the powers of 3
           ṁ€                        Reshape each to a length of that value
              ×\                     Cumulative products
                Ṛ©                   Reverse and save the result
                  1,‘xS$¤            Niladic chain.
                  1                    Start with 1
                    ‘                  Increment it
                   ,                   Pair them to get [1, 2]
                       $               Operate on [1, 2]
                      S                  Sum it to get 3
                     x                   Repeat each 3 times to get [1, 1, 1, 2, 2, 2]
                         ṁ           Reshape that to the saved table
                          ×®         Multiply elementwise with the saved table
                            ị“*# ”   Use each to as an index to select from "*# "
                                  Y  Join using newlines
                                     Return and print implicitly

3

JavaScript (ES7), 132 125 ไบต์

n=>[...Array(n)].map((_,i)=>[...Array(3**~-n)].map((_,j)=>/1/.test((j/3**i|0).toString(3))?" ":`*#`[j/3+i&1]).join``).join`\n`

ในกรณีที่\nหมายถึงการขึ้นบรรทัดใหม่ characer อักษร รุ่น ES6 สำหรับ 141 ไบต์:

f=
n=>[...Array(n)].map((_,i)=>[...Array(Math.pow(3,n-1))].map((_,j)=>/1/.test((j*3).toString(3).slice(0,~i))?" ":`*#`[j/3+i&1]).join``).join`
`
;
<input type=number min=1 oninput=o.textContent=f(+this.value)><pre id=o>


2

Python 2, 142 138 136 ไบต์

r=range
def f(n):
 for i in r(n+1):
  s="";d=i%2<1
  for k in r(3**i):s+="#*"[(6+d-1+k*(d*2-1))%6<3]
  exec"s+=len(s)*' '+s;"*(n-i);print s

นี่คือส่วนหนึ่งของรหัสจากที่นี่แล้วแก้ไขสำหรับความท้าทายนี้

จะโพสต์คำอธิบายในภายหลัง

นอกจากนี้ BTW สองช่องว่างคือแท็บ

แก้ไข 1: 4 ไบต์บันทึกด้วย @DJMcMayhem

แก้ไข 2: 2 ไบต์บันทึกด้วย @daHugLenny


1
เนื่องจากเป็น Python 2 คุณไม่สามารถลบวงเล็บได้exec("s+=len(s)*' '+s;"*(n-i))ใช่ไหม
acrolith

@daHugLenny Ah ใช่ขอบคุณ! (ขออภัยที่ไม่ตอบกลับเร็ว ๆ นี้)
clismique

1

ทับทิม, 115 103 102 ไบต์

->n{g=->{T.tr"*#","#*"}
*s=?*
(n-1).times{|i|T=s[-1]
s=s.map{|l|l+' '*3**i+l}+[i<1??#*3:g[]+T+g[]]}
s}

ขึ้นอยู่กับวิธีการแก้ปัญหาของ jsvnm กับมาตรฐานต้นเสียงชุดกอล์ฟ

-12 ไบต์ขอบคุณจอร์แดน


g=->{T.tr"*#","#*"}
Jordan

นอกจากนี้แทนs.map!{...} s=s.map{...};s
Jordan

@Jordan s.map! จะต้องมีการ+เปลี่ยนเป็น<<และมันจะสิ้นสุดความยาวเดียวกัน ฉันเชื่อว่าsยังคงมีความจำเป็นในตอนท้ายทั้งสองวิธี - แผนที่อยู่ใน.timesวง
m-chrzan

อ่าใช่มั้ย
Jordan

1

J, 47 45 ไบต์

' *#'{~3(]*$@]$1 2#~[)(,:1)1&(,~],.0&*,.])~<:

ขึ้นอยู่กับโซลูชันของฉันต่อความท้าทายของคันทอร์

การใช้

   f =: ' *#'{~3(]*$@]$1 2#~[)(,:1)1&(,~],.0&*,.])~<:
   f 1
*
   f 2
* *
###
   f 3
* *   * *
###   ###
***###***

คำอธิบาย

' *#'{~3(]*$@]$1 2#~[)(,:1)1&(,~],.0&*,.])~<:  Input: n
                                           <:  Decrement n
                      (,:1)                    A constant [1]
                           1&(           )~    Repeating n-1 times on x starting
                                               with x = [1]
                                        ]        Identity function, gets x
                                   0&*           Multiply x elementwise by 0
                                      ,.         Join them together by rows
                                ]                Get x
                                 ,.              Join by rows
                           1  ,~                 Append a row of 1's and return
       3                                       The constant 3
        (                 )                    Operate on 3 and the result
                    [                          Get LHS = 3
               1 2                             The constant [1, 2]
                  #~                           Duplicate each 3 times
                                               Forms [1, 1, 1, 2, 2, 2]
           $@]                                 Get the shape of the result
              $                                Shape the list of [1, 2] to
                                               the shape of the result
         ]                                     Get the result
          *                                    Multiply elementwise between the
                                               result and the reshaped [1, 2]
' *#'                                        The constant string ' *#'
     {~                                       Select from it using the result
                                             as indices and return

1

PHP, 159 ไบต์

for($r=($n=--$argv[1])?["* *","###"]:["*"];++$i<$n;$r[]=$a.$b.$a){$a=strtr($b=end($r),"#*","*#");foreach($r as&$s)$s.=str_pad("",3**$i).$s;}echo join("\n",$r);

ชำรุด

for(
    $r=($n=--$argv[1])  // pre-decrease argument, initialize result
    ?["* *","###"]      // shorter than handling the special iteration 2 in the loop
    :["*"]              // iteration 1
    ;
    ++$i<$n             // further iterations:
    ;
    $r[]=$a.$b.$a       // 3. concatenate $a, $b, $a and add to result
)
{
                        // 1. save previous last line to $b, swap `*` with `#` to $a
    $a=strtr($b=end($r),"#*","*#"); 
                        // 2. duplicate all lines with spaces of the same length inbetween
    foreach($r as&$s)$s.=str_pad("",3**$i).$s;  # strlen($s)==3**$i
}
// output
echo join("\n",$r);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.