รูปแบบสลับ


16

ในคำถามสแต็คโอเวอร์โฟลว์ที่ถูกลบตอนนี้มีคนโพสต์สิ่งต่อไปนี้:

เขียนโปรแกรมหรือฟังก์ชั่นการพิมพ์รูปแบบสลับ*และอยู่บนพื้นฐานของจำนวนเต็มรับ# nตัวอย่างบางส่วน:

อินพุต: n=1
เอาต์พุต:

*

อินพุตn=5
เอาต์พุต:

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

อินพุต: n=8
เอาต์พุต:

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

เนื่องจากมันดูเหมือนความท้าทายในการเล่นรหัสกอล์ฟที่ยอดเยี่ยมนี่คือ

รูปแบบเหล่านี้สร้างได้อย่างไร

บรรทัดแรกเริ่มต้นด้วยการเป็นหนึ่งเดียว*ตามปริมาณของต่อท้ายn-1 บรรทัดที่สองแล้วมีสองกับปริมาณของชั้นนำ บรรทัดที่สามเริ่มต้นด้วยสามตามด้วยปริมาณของต่อท้าย เป็นต้น#
*n-2#
*n-3#

เมื่อเรามาถึงตรงกลาง ( n/2) เราจะนับกลับอีกครั้งด้วยจำนวน*ซึ่งสามารถเห็นได้ในตัวอย่างด้านบน

โปรดทราบว่าสำหรับตัวเลขที่ป้อนผิดคู่ของคู่สายที่ถูกผกผัน (ดังนั้นก่อนและสุดท้าย; สองและถัดจากสุดท้าย; ฯลฯ ) จะเหมือนกันทุกประการ ในn=5ตัวอย่างบรรทัดแรกและบรรทัดสุดท้ายคือ*####; ###**ที่สองและถัดจากบรรทัดสุดท้ายจะ
สำหรับหมายเลขอินพุทแม้จะมีคู่ของสายที่ถูกผกผันจะกลับรายการ ในn=8ตัวอย่างบรรทัดแรกและบรรทัดสุดท้ายคือ*#######และ#######*; บรรทัดที่สองและถัดจากบรรทัดสุดท้ายคือ######**และ**######; เป็นต้น

กฏท้าทาย:

  • คุณสามารถใช้ใด ๆ ที่แตกต่างกันสองพิมพ์ตัวอักษรแทนและ* #คุณสามารถใช้AและB; 3และ7; <และ>; ฯลฯ โปรดระบุคำตอบของคุณในสิ่งที่คุณใช้
  • คุณสามารถสันนิษฐานได้ว่าnจะเป็นจำนวนเต็มบวก ( >= 1)
  • คุณได้รับอนุญาตให้ส่งออกรายการ / อาร์เรย์ของสตริงสำหรับแต่ละบรรทัดหรือเมทริกซ์ 2D ของตัวอักษรแทนที่จะพิมพ์ลงใน STDOUT

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาที่ใช้รหัสกอล์ฟกีดกันคุณไม่ให้โพสต์คำตอบด้วยภาษาที่ไม่ได้เป็น codegolfing พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้ขอแนะนำให้เพิ่มคำอธิบายสำหรับคำตอบของคุณ

กรณีทดสอบ ( n=1ผ่านครั้งแรกn=10)

*

*#
#*

*##
#**
*##

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

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

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

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

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

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

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

" คุณสามารถใช้อักขระสองตัวที่แตกต่างกันแทน * และ #. " - ต้องพิมพ์ได้หรือไม่ เราสามารถใช้ NUL และ SOH (รหัส ASCII 0 และ 1) ได้หรือไม่?
ngn

@ngn ขออภัยตัวอักษรที่พิมพ์ได้เท่านั้น จะอธิบายในคำอธิบายการท้าทาย
Kevin Cruijssen

คำตอบ:



17

Python 2 , 62 ไบต์

lambda n:["%*s"%(i%2*2*n-n,"x"*min(i+1,n-i))for i in range(n)]

ลองออนไลน์!

การใช้งานxและพื้นที่

แถวถูกคำนวณดังนี้:

"%-5s" % "x"      == "x    "
"%5s"  % "xx"     == "   xx"
"%-5s" % "xxx"    == "xxx  "
"%5s"  % "xx"     == "   xx"
"%-5s" % "x"      == "x    "

ใช้%*sระบุให้เลือกระหว่างและn-n



6

MATL, 34 31 18 ไบต์

:t!>tPY|!"@X@oQ&P!

ลองใช้กับ MATL Online

ใช้ 0 สำหรับ * และ 1 สำหรับ # ขึ้นอยู่กับลินน์คำตอบของวุ้น


คำตอบเก่ากว่า 31 ไบต์:

2/tk:wXk:Ph"X@ot~XHh@Gy-hHQ&PY"

ลองใช้กับ MATL Online

ใช้ 1 สำหรับ * และ 0 สำหรับ #

         % implicit input, say 5
2/       % divide input number by 2 [2.5]
tk       % make a copy and floor that [2.5, 2]
:        % create range 1 to the floored value [2.5, [1, 2]]
wXk      % bring out the division result and this time ceil it
         %  [[1, 2], 3]
:        % create range 1 to that [[1, 2], [1, 2, 3]]
Ph       % flip the last array and concatenate horizontally 
         %  [[1, 2, 3, 2, 1]]
"        % loop through the array
  X@o    % Is the current loop index odd? 1 for odd, 0 for even
  t~     % duplicate and logical negate that
  XH     % copy that value to clipboard H
  h      % and concatenate the values ([1 0] on odd iterations, [0 1] on even) 
  @      % push current value from array (say 2, then stack is [[0 1], 2)
  G      % push input again
  y-     % subtract current array value from input [[0 1], 2, 3]
  h      % concatenate those two [[0 1], [2, 3]]
  H      % get the stored value from clipboard H (1 for even iterations, 0 for odd) 
  Q      % increment that
  &P     % flip the array in that dimension: in even iterations, this flips
         %   across columns and hence inverts the two values. [[0 1], [3, 2]]
         %   in odd iterations, it's a no-op
  Y"     % run-length decoding - repeat the element from first array the number of times
         %  specified in the second array
         % implicit loop end, implicit output

6

APL (Dyalog Classic)ขนาด 18 ไบต์

a[↑⊢∘⌽\(⊂>⊢⌊⌽)⍳⎕]

ลองออนไลน์!

เอาท์พุทABแทน*#

อินพุตที่ประเมินแล้ว

⍳⎕ เวกเตอร์ 0 1 ... n-1

⊢⌊⌽ขั้นต่ำ ( ) ระหว่างตัวเอง ( ) และสิ่งที่ตรงกันข้าม ( ) - ดูรถไฟ

⊂>⊢⌊⌽โดยที่เวกเตอร์ทั้งหมด ( ) น้อยกว่าแต่ละอัน⊢⌊⌽- ส่งคืนเวกเตอร์บูลีน (0/1)

⊢∘⌽\ ย้อนกลับเวกเตอร์อื่น ๆ

ผสมเป็นเมทริกซ์

⎕aตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่'AB...Z'

⎕a[ ]แทนที่0 1ด้วย'A' 'B'


หมดความอยากรู้ จะมีกี่ไบต์ที่จะส่งออกเมทริกซ์ของ 0s และ 1s โดยไม่มีช่องว่าง ฉันสมมติ⎕a[...}แปลงให้AและBไม่มีช่องว่างสั้นกว่าทำให้พวกเขาเป็น0และ1ไม่มีช่องว่างพิจารณาคุณเคยใช้ แต่เพียงแค่อยากรู้ว่ามีความแตกต่างมากในไบต์ถ้าคุณให้พวกเขาเป็นและ0 1
Kevin Cruijssen

1
@KevinCruijssen ตราบใดที่ฉันสามารถเล่นกอล์ฟมันจะมีความยาวเท่ากันไม่ว่าจะเป็น⎕d[... ]หรือ⊃¨⍕¨... ในนิพจน์หลัง⍕¨คือ "ฟอร์แมตแต่ละอัน" - เปลี่ยนตัวเลขแต่ละตัวให้เป็นเวกเตอร์อักขระซ้อนดังนั้นเราต้อง "ก่อน "( ⊃¨) เพื่อให้ได้สเกลาร์ชาร์ตเท่านั้น(ดังนั้นจึงไม่มีช่องว่างเมื่อพิมพ์)
ngn

5

ถ่าน 21 ไบต์

≔⮌…⁰NθEθ⭆蛧⟦μλ⟧κ⌊⟦κι

ลองออนไลน์! การใช้ประโยชน์และ0 1การเชื่อมโยงคือการใช้รหัสรุ่นที่ละเอียดและรวม§*#เอาการแปลผลลัพธ์เป็น*และ#ในคำถาม คำอธิบาย:

    N                   Input number
  …⁰                    Range from 0
 ⮌                      Reversed
≔    θ                  Assign to `q`
      Eθ                Map over reversed range
        ⭆θ              Map over reversed range and join
           §⟦μλ⟧κ       Alternate between range and reversed range column
                 ⌊⟦κι   Minimum of range and reversed range row
          ›             Greater
                        Implicitly print each row on its own line

5

เจลลี่ ,  12  15 ไบต์

+3 แก้ไขn=1บั๊กของตัวกล่อง :(

R«Ṛ$‘r⁸ṬUÐe0YE?

โปรแกรมเต็มรับจำนวนเต็มซึ่งพิมพ์ผลลัพธ์ตามที่กำหนดใน OP โดยใช้0และ1สำหรับ*และ#ตามลำดับ

ลองออนไลน์!

อย่างไร?

R«Ṛ$‘r⁸ṬUÐe0YE? - Main Link: integer, n
R               - range -> [1,2,3,4,...,n]
   $            - last two links as a monad:
  Ṛ             -   reverse -> [n,...,4,3,2,1]
 «              -   minimum (vectorises) -> [1,2,3,4,...,4,3,2,1]
    ‘           - increment (vectorises) -> [2,3,4,5,...,5,4,3,2]
      ⁸         - chain's left argument, n
     r          - inclusive range (vectorises) -> [[2,3,...,n],[3,4,...n],[4,5,...n],[5,...n],...,[5,...n],[4,5,...n],[3,4,...n],[2,3,...,n]]
       Ṭ        - untruth (vectorises) -> [[0,1,1,...,1],[0,0,1,1,...,1],[0,0,0,1,...,1],[0,0,0,0,1,...,1],...,[0,0,0,0,1,...,1],[0,0,0,1,...,1],[0,0,1,1,...,1],[0,1,1,...,1]]
         Ðe     - apply to entries with even indices:
        U       -   upend              -> [[0,1,1,...,1],[1,1,...,1],[0,0,0,1,...,1],[1,...,1,0,0,0,0],...]
              ? - if...
             E  - ...condition: all equal? (only true when n=1, where we have [1,1])
           0    - ...then: zero
            Y   - ...else: join with newline characters
                - implicit print

ดูเหมือนว่านี่เป็นอัลกอริทึมของฉัน แต่การใช้งานที่แตกต่างกันซึ่งเอาท์พุท 0 แทน 1s และในทางกลับกัน
Erik the Outgolfer

ใช่มีประสิทธิภาพเหมือนกัน ... และฉันไม่ได้อัปเดตโพสต์เพื่อแสดงการแก้ไขที่ฉันทำ
Jonathan Allan


4

Java 10, 145 ไบต์

n->{var r=new char[n][n];for(int j=0,k;j<n;++j)for(k=0;k<n;)r[j][k]=k++<(j<n/2?j%2<1?j+1:n+~j:j%2>0?j:n-j)?j%2<1?'*':'#':j%2>0?'*':'#';return r;}

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

Ungolfed:

n -> { // lambda taking an integer as output and returning a char[][]
    var r = new char[n][n]; // the output array; we make use of Java 10's var here (replace with char[][] for another 4 bytes to make this work in Java 8)
    for(int j = 0, k; j < n; ++j) // iterate over the lines
        for(k = 0; k < n; )       // iterate over the j'th line
            r[j][k] = // set the current character
                      k++ < // determine if we're in the first or second portion of the line:
                            (j < n/2 ? // for the first half of the output:
                                 j%2 < 1  // on even lines ...
                                 ? j + 1  // ... print the first symbol j+1 times ...
                                 : n + ~j // ... on odd lines, print it n-j-1 times.
                             : j%2 > 0 ?  // for the second half of the output, on odd lines ...
                                 j :      // ... print the first symbol j times ...
                                 n - j)   // ... on even lines, print it n-j times.
                      ? j%2 < 1 ? '*' : '#'  // for the first part of the line, use '*' on even lines, '#' otherwise
                      : j%2 > 0 ? '*' : '#'; // for the second part of the line, use '*' on odd lines, '#' otherwise
    return r; // return the completed array
}

Java 8 11, 179 127 ไบต์

n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}

ลองออนไลน์ได้ที่นี่ (TIO ยังไม่มี Java 11 ดังนั้นวิธีนี้ใช้วิธีการที่กำหนดเองซึ่งส่งผลให้นับเป็นไบต์เดียวกันString#repeat())

ขอบคุณที่ Kevin Cruijssenสำหรับการเล่นกอล์ฟขนาด 52 ไบต์!

Ungolfed:

n -> { // lambda taking an int argument and returning a String
    String r = "", // the output String
           a,      // temporary String containing the '*'s
           b;      // temporary String containing the '#'s
    for(int j = 0; j < n; // loop over the lines
        b = "#".repeat( // repeat the '#' character ...
            j < n/2 ? n + ~j // ... n-j-1 times in the first half of the output ...
            : j), // ... j times in the second half
        r += (j++ % 2 < 1 ? a + b : b + a) + "\n") // assemble the j'th line and append it to the output: on even lines, the '*'s go first; on odd lines, the '#'s go first
        a = "*".repeat( // repeat the '*' character ...
              j < n/2 ? j + 1 // ... j+1 times in the first half of the output ...
              : n - j); // n-j times in the second half
    return r; // return the completed output
}

3
หากคุณเปลี่ยนเป็น Java 11 คุณสามารถเล่นกอล์ฟได้ถึง 127 ไบต์โดยใช้"*".repeat(...)และ"#".repeat(...)(รวมถึงส่งคืนสตริงแทนการพิมพ์โดยตรงและเล่นกอล์ฟn-j-1เป็นn+~j):n->{String r="",a,b;for(int j=0;j<n;b="#".repeat(j<n/2?n+~j:j),r+=(j++%2<1?a+b:b+a)+"\n")a="*".repeat(j<n/2?j+1:n-j);return r;}
Kevin Cruijssen

ขอบคุณนั่นคือการบันทึกที่ดีในหน่วยไบต์ ฉันจัดการเพื่อสร้าง 145-byte version สำหรับ Java 10 โดยใช้ลูปซ้อนกัน - ไม่สามารถรอการเปิดตัว Java 11 ได้นั่นrepeat()เป็นวิธีที่ดีมากสำหรับการเล่นกอล์ฟ
OOBalance

4

Lua ,  148  133 ไบต์

function(n)t,a,b={},".","#"for i=1,n do r=i<n/2+1 and i or-~n-i s=a:rep(r)..b:rep(n-r)t[i]=i%2<1 and s:reverse()or s end return t end

ลองออนไลน์!

-15 ไบต์ขอบคุณ @KevinCruijssen และ @JoKing

function(n)
   t = {}; a = "."; b = "#"          -- initialize variables, output is in table
                                     -- strings are needed in variables for
                                     --   the str:rep and str:reverse syntax

   for i = 1, n do                          -- build the rows of the table
      r = i<=(n+1)/2 and i or n-i+1         -- logic used to count up then down
      str = a:rep(r)..b:rep(n-r)            -- append correct number of '.'s, fill
                                            --   in the rest with '#'s
      t[i]=i%2==0 and str:reverse() or str  -- logic used to control reversing
   end
   return t                                 -- return table
end

2
ฉันไม่รู้จัก Lua เหมือนกัน แต่ดูเหมือนว่าคุณสามารถบันทึกได้ห้าไบต์: (n+1)/2ถึง-~n/2; or n-i+1ถึงor-~n-i; i%2==0ถึงi%2<1; และเพื่อreverse() or reverse()orนอกจากนี้เวอร์ชัน TIO และจำนวนไบต์ของคุณทั้งสองยังมีเครื่องหมายเซมิโคลอนต่อท้ายซึ่งดูเหมือนว่าไม่จำเป็น คำตอบแรกที่ดีแม้ว่า +1 จากฉัน และยินดีต้อนรับสู่ PPCG! :)
Kevin Cruijssen

2
คุณไม่ต้องการเซมิโคลอนใด ๆเลย 133 ไบต์รวมถึงข้อเสนอแนะของเควิน
Jo King

@KevinCruijssen ขอบคุณ! ฉันขอ-~nคำแนะนำจากคุณได้ไหม? มันใช้งานได้ดี แต่ฉันไม่เข้าใจว่าทำไม
Azure Heights

1
@ AzureHeights แน่นอน ~เป็นตัวดำเนินการปฏิเสธ bitary unary อย่างไรก็ตามสิ่งที่สำคัญสำหรับ codegolfing ก็คือ~iมีคุณค่าเช่น-i-1เดียวกัน ดังนั้นเราจึงสามารถใช้-~iแทนi+1และแทน~-i i-1นี้จะเป็นประโยชน์ในกรณีที่สองซึ่งผมทั้งสามารถใช้ในคำตอบของคุณ: การกำจัดวงเล็บเพราะ-และ~มีความสำคัญมากกว่าผู้ประกอบการดำเนินการทางคณิตศาสตร์อื่น ๆ ดังนั้นจึงสามารถ(n+1)/2 -~n/2และส่วนที่เป็นประโยชน์อื่น ๆ or-~n-iคือการกำจัดของช่องว่างในบางกรณีที่ผมทำกับ
Kevin Cruijssen

1
นี่คือเคล็ดลับสองที่เกี่ยวข้องถ้าคุณต้องการที่จะอ่านอีกเล็กน้อยเกี่ยวกับมันใช้เอก~สำหรับx+1และx-1และใช้เอก~สำหรับa-b-1a+b+1และ เคล็ดลับทั่วไปทั้งหมดรวมถึงเคล็ดลับเฉพาะภาษา ( เคล็ดลับสำหรับการเล่นกอล์ฟใน Luaในกรณีนี้) อาจเป็นเรื่องที่น่าสนใจสำหรับการอ่าน :)
Kevin Cruijssen




3

C (GCC) , 118 108 ไบต์

อันนี้จะไม่ชนะ แต่มันเป็นวิธีการที่แตกต่างกัน (หรืออย่างน้อยฉันคิดอย่างนั้น!) แทนที่จะใช้การจัดการสตริงฉันใช้ประโยชน์จากความจริงที่ว่า 10x-1 เกิน [1 ..n]={9,99,999,...}ซึ่งสามารถนำมาคูณเพื่อให้ได้รูปแบบที่เหมาะสม printf()จากนั้นจะทำการ zero-padding สำหรับการจัดชิดขวา

น่าเศร้าintมีเพียงช่วงที่เพียงพอในการทำสูงสุด 9 หลัก (บนแพลตฟอร์ม 32 บิต) ดังนั้นคุณต้องไปlongหารูปแบบที่มีขนาดใหญ่กว่า ภาษาที่ใช้ในการคำนวณ MP แบบดั้งเดิมอาจใช้สิ่งนี้ได้

ขอบคุณสำหรับคำแนะนำ

h,j,k;p(h){h=h?10*p(--h):1;}f(i){for(j=0,h=i++;k=++j>i/2?i-j:j,j<i;printf("%0*d\n",h,~-p(k)*p(j%2*(h-k))));}

ลองออนไลน์!


หลักฐานของแนวคิดที่ใช้งานได้กับเลขคณิต MP:

C # (คอมไพเลอร์ Mono C #) , 187 165 ไบต์

(143 ไบต์ + 22 ไบต์สำหรับusing System.Numerics;ส่วนหัว)

q=>{var r="";for(int j=0,h=q+1,k;j<q;r+=((BigInteger.Pow(10,k)-1)*BigInteger.Pow(10,j%2*(q-k))).ToString("D"+q)+"\n")k=++j>h/2?h-j:j;return r;}

ลองออนไลน์!


1
พิสูจน์แนวคิดด้วยตัวเลขนอกช่วงจำนวนเต็มสูงสุด (โดยใช้ C # และ BigIntegers): ลองออนไลน์!
ErikF

3

เป็นกลุ่ม 99 การกดแป้น

มันน่าสนใจอยู่เสมอที่จะลองเป็นกลุ่มด้วยอาร์กิวเมนต์ที่ป้อนเข้า มันผิดธรรมชาติมากดังนั้นมันจะไม่สั้นอย่างน่าอัศจรรย์ อาจมีวิธีการที่ดีอื่น ๆ

อินพุตถูกสันนิษฐานว่าเป็นของตัวเองในบัฟเฟอร์ การลงทะเบียนจะถือว่าว่างเปล่า ตัวแก้ไขจะถือว่าสูงพอที่จะเก็บผลลัพธ์โดยไม่ต้องเลื่อน

"nD@ni<cr><esc>MmaGddM
<c-v>'aI*<esc>qwgvjokoI*<esc>@wq@w<esc>
:set ve=all<cr>@nlh<c-v>@nkr#
:%s/ /#/g<cr>o<esc>
2Gqqdt#$p2j0@qq@q

คำอธิบาย

 | Buffer state (odd and even case):
 | 5                    6

"nD              read input into register n
@ni<cr><esc>     add n newlines
MmaGddM<c-v>'a   visual block select center row(s)
I*<esc>          prepend a column of *
qw               record macro w
  gvjoko         expand selection up and down
  I*<esc>
  @w             recurse
q
@w<esc>          run macro w and exit visual block select

 | Buffer state:
 | *                    *
 | **                   **
 | ***                  ***
 | **                   ***
 | *                    **
 |                      *

:set ve=all<cr>  move anywhere!
@nlh<c-v>@nkr#   add last column of #s

 | Buffer state:
 | *   #                *    #
 | **  #                **   #
 | *** #                ***  #
 | **  #                ***  #
 | *   #                **   #
 |                      *    #

:%s/ /#/g<cr>      replace spaces with #

 | Buffer state:
 | *####                *#####
 | **###                **####
 | ***##                ***###
 | **###                ***###
 | *####                **####
 |                      *#####

o<esc>2G           prep and jump to line 2
qqdt#$p2j0@qq@q    (effectively) flip every other onward

 | Buffer state:
 | *####                *#####
 | ###**                ####**
 | ***##                ***###
 | ###**                ###***
 | *####                **####
 |                      #####*

และใน base64 ที่มีอักขระจริง (ใส่อินพุตinputและกดแป้นในkeysและเรียกใช้โดยใช้vim -u NONE -s keys input)

Im5EQG5pDRtNbWFHZGRNFidhSSobcXdndmpva29JKhtAd3FAdxs6c2V0IHZlPWFsbA1AbmxoFkBua3IjOiVzLyAvIy9nDW8bMkdxcWR0IyRwMmowQHFxQHE=

2

R , 75 ไบต์

function(n)outer(1:n,1:n,function(x,y,a=x<y|x>n-y+1)+ifelse(x%%2,a,rev(a)))

ลองออนไลน์!

  • แรงบันดาลใจจาก @Lynn คำตอบ
  • ฟังก์ชันรับnเป็นพารามิเตอร์และส่งกลับเมทริกซ์0/1ซึ่ง0ตรงกับ'*'และ1สอดคล้องกับ'#'

2

K (ngn / k) , 22 ไบต์

{"*#"i|:/'i>/:i&|i:!x}

ลองออนไลน์!

{ } ฟังก์ชั่นที่มีข้อโต้แย้ง x

!xรายการ(0;1;...;x-1)

i: มอบหมายให้ i

i&|iminima ( &) จากiและ reverse ( |)

i>/:เปรียบเทียบกับมากกว่า ( >) iกับแต่ละองค์ประกอบจากรายการทางด้านขวา (/: ) - ส่งคืนเมทริกซ์บูลีน (รายการของรายการ)

i|:/'สำหรับแต่ละ ( ') j ในi, ย้อนกลับ ( |:- เราจำเป็นต้อง:บังคับ|ให้เป็นเอกภาพ) องค์ประกอบ j ที่สอดคล้องกัน ( n f/ xใช้f nเวลาเปิดx) อย่างมีประสิทธิภาพย้อนกลับทุกแถวอื่น ๆ

"*#" ใช้องค์ประกอบเมทริกซ์เป็นดัชนีในสตริง "*#"

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