สถาปัตยกรรมสวน - สไตล์ ASCII


18

เรามีสวนขนาด 10x10 เมตรที่อยู่ด้านนอกบ้านของเรา เราต้องการปลูกหญ้าและทำระเบียง เราได้ตัดสินใจว่าจะแบ่งสวน แต่เรายังไม่ได้ตัดสินใจอัตราส่วนระหว่างปริมาณของหญ้า VS ระเบียง

เราต้องการความช่วยเหลือในการสร้างภาพและ ASCII-art เป็นวิธีที่ดีที่สุดในการทำเช่นนั้น


ท้าทาย:

ใช้จำนวนเต็มในช่วงที่รวม[0, 100] (หรือทศนิยมแบบเลือกได้ [0, 1]) แทนจำนวนสวนที่ควรเป็นระเบียง

หนึ่งตารางเมตรของเทอเรสจะแสดงโดยทั้งเส้นประหรือบาร์- หนึ่งตารางเมตรของหญ้าจะแสดงโดยเครื่องหมายกัญชา|#

  • หากจำนวนระเบียงน้อยกว่าหรือเท่ากับ 50% สวนควรถูกปกคลุมด้วยแท่งโดยเริ่มที่มุมล่างซ้ายและเติมในแนวตั้งจากนั้นเป็นแนวนอน
  • หากปริมาณระเบียงมากกว่า 50% เราต้องการให้พื้นระเบียงเป็นทางอื่น (ขีดคั่นแทนแท่ง) และเริ่มที่มุมล่างซ้ายและเติมในแนวนอนจากนั้นในแนวตั้ง

ตัวอย่าง:

N = 25%
||########
||########
||########
||########
||########
|||#######
|||#######
|||#######
|||#######
|||#######

N = 75%
##########
##########
-----#####
----------
----------
----------
----------
----------
----------
----------

N = 47%
||||######
||||######
||||######
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####

N = 50%
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####
|||||#####

N = 51%
##########
##########
##########
##########
-#########
----------
----------
----------
----------
----------

N = 0%
##########
##########
##########
##########
##########
##########
##########
##########
##########
##########

N = 100%
----------
----------
----------
----------
----------
----------
----------
----------
----------
----------

นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ชนะ กฎมาตรฐานที่เกี่ยวข้องกับ I / O นี่คือ ASCII-art ดังนั้นผลลัพธ์ควรมีลักษณะตามตัวอย่างด้านบน Ie outputting ["|", "|" ...]ไม่เป็นไร

คำอธิบายได้รับการสนับสนุนเช่นเคย :)


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

คำตอบ:


7

APL (Dyalog) 34 ไบต์

ฟังก์ชันนำหน้าแบบไม่ระบุชื่อคาดหวังจำนวนเต็มในช่วง 0–100 ถือว่า⎕IO( I ndex O rigin) 0เป็นค่าเริ่มต้นในหลาย ๆ ระบบ

{'#-|'[⊖⍉⍣s10 10100↑⍵⍴1+s50≥⍵]}

ลองออนไลน์!

{} แลมบ์ดา; คือการโต้แย้ง:

'#-|[…ทำ] ดัชนีสตริงด้วยอาร์เรย์ต่อไปนี้:

50≥⍵ 1 ถ้า 50 มากกว่าหรือเท่ากับอาร์กิวเมนต์ 0 อื่น

s← ร้านค้าใน s (สำหรับห้างสรรพสินค้าs )

1+ การเพิ่มขึ้น

⍵⍴ วนr eshape อาร์กิวเมนต์ยาว

100↑ ใช้จำนวนร้อยอันแรกเติมด้วยศูนย์

10 10⍴r eshape ถึงสิบแถวและสิบคอลัมน์

 ให้ผลผลิตนั้น (แยกsจาก10 10)

⍉⍣s ขนย้ายถ้าเล็ก

 พลิกคว่ำ


1
{'# - |' [⊖ (⍉ + ⍨) ⍣ (⍵≤50) ⊢⍵> ⍎¨∘., ⍨⎕d]})
ngn

1
ใกล้กับแนวทางของฉัน:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
Erik the Outgolfer

@EriktheOutgolfer คุณต้องการเท่านั้น99/'#'
ngn

@ngn โอ้ถูกต้อง
Erik the Outgolfer

1
@ngn มันค่อนข้างแตกต่าง ทำไมคุณไม่โพสต์มัน?
Adám

5

J , 39, 38 37 ไบต์

[:|.>&50|:'#-|'"0{~_10]\100{.]$1+51>]

มันทำงานอย่างไร:

                     _10]\100{.]$1+51>] - prepares a 10x10 array of 0, 1 or 2
                                 1+51>] - 1 if N<=50 otherwise 2
                               ]$       - list of N copies of the above (1 or 2)
                          100{.         - the above list filled to 100 items with 0
                     _10]\              - reshape the list to a 10x10 array
           '#-|'"0                      - constant array of chars
                   {~                   - replaces each digit 0, 1 or 2 with #, - or |     
     >&50                               - is N>50 ? 
         |:                             - if not, transpose the array
                                          (in fact |: here is rearrange axes
                                           0 - transpose
                                           1 - leave it intact)        
 |.@                                    - reverse the order ot the rows

ลองออนไลน์!


{.ด้วยข้อโต้แย้งเกินขอบเขตเป็นเคล็ดลับที่ดี
โยนาห์

2
31 ไบต์:(]|.@|:_10{&'#|-'\100{.1+$)>&50
FrownyFrog

@ FrownyFrog - รหัสที่ยอดเยี่ยม!
Galen Ivanov

@Jonah - ใช่มันมีประโยชน์มากในบางครั้ง ฉันยังพยายาม _100{. ที่จะเติมที่จุดเริ่มต้น แต่จากนั้นฉันต้องย้อนกลับแต่ละแถวดังนั้นฉันจึงยอมแพ้
Galen Ivanov

5

JavaScript (ES6), 84 ไบต์

จะเข้าเป็นจำนวนเต็มใน[0 ... 100]

n=>(y=9,g=x=>~y?'|-#'[[x,y][k=n/51|0]*9+x+y<n?k:2]+[`
`[x-9]]+g(x++-9?x:!y--):'')(0)

กรณีทดสอบ

จัดรูปแบบและแสดงความคิดเห็น

n => (                          // given the terrace percentage n
  y = 9,                        // and starting with y = 9
  g = x =>                      // g = recursive function taking x:
    ~y ?                        //   if y is greater than or equal to 0:
      '|-#'[                    //     pick the relevant character:
        [x, y][k = n / 51 | 0]  //       using k = 1 if n > 50, 0 otherwise
        * 9 + x + y             //       and comparing either 10 * x + y or 10 * y + x
        < n ?                   //       with n; if we're located over the terrace area:
          k                     //         append either '|' or '-'
        :                       //       else:
          2                     //         append '#'
      ] +                       //     end of character insertion
      [`\n`[x - 9]] +           //     append a linefeed if x == 9
      g(x++ - 9 ? x : !y--)     //     update (x, y) and do a recursive call
    :                           //   else:
      ''                        //     stop recursion
)(0)                            // initial call to g with x = 0


4

เยลลี่ 23 ไบต์

<©51ị⁾|-ẋḷ"”#ẋ³¤s⁵Z®¡ṚY

ลองออนไลน์!

เปลี่ยนหมายเลขก่อนหน้าÇในส่วนท้ายเพื่อเปลี่ยนอินพุต ทำงานเป็นลิงค์เอกในโปรแกรมโดยไม่ขัดแย้งบรรทัดคำสั่งที่ได้รับอนุญาต


คำตอบที่ดีมาก +1 23 ไบต์เป็นลิงก์แบบ monadic ( ȷ2-> ³)
Mr. Xcoder

ฉันจัดการเพื่อรับ24 ไบต์ด้วยคิดว่ามันอาจเป็นแรงบันดาลใจที่นี่ด้วย
Mr. Xcoder

@ Mr.Xcoder ฉันคิดอย่างนั้น แต่ฉันไม่แน่ใจจริงๆว่าฉันจะสามารถคิดสิ่งต่าง ๆ (จะทำงานในโปรแกรม niladic เท่านั้นใช่มั้ยอืม ... )
Erik the Outgolfer


3

SWI Prolog ขนาด 249 ไบต์

p(X):-write(X).
r(X,Y,G):-G=<50,10*X-Y+1=<G,p('|').
r(_,_,G):-G=<50,p('#').
r(X,Y,G):-(10-Y)*10+X>G,p('#').
r(_,_,_):-p('-').
l(_,11,_):-nl.
l(X,Y,G):-r(Y,X,G),Z is Y+1,l(X,Z,G).
a(10,G):-l(10,1,G).
a(Y,G):-l(Y,1,G),Z is Y+1,a(Z,G).
s(G):-a(1,G),!.

การแก้ปัญหาค่อนข้างตรงไปตรงมา ขั้นตอนaสร้างแถวlเขียนตัวอักษรไปยังคอลัมน์ในแถวและrตัดสินใจว่าควรพิมพ์อักขระใด


2
G<51G<=50ควรจะทำงานแทน
Laikoni

3

MATL , 26 ไบต์

'|-#'100:i>~o10eG50>?!E]P)

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

'|-#'     % Push this string
100:      % Push array [1 2 ... 100]
i         % Input a number and push it
>~        % Less than or equal (element-wise)? This transforms the
          % array into [true ... true false ... false]
o         % Convert to double. True becomes 1, false becomes 0
10e       % Rehaspe into 10-row matrix, in column-major order
G         % Push input
50>       % Greater than 50?
?         % If so
  !       %   Transpose
  E       %   Multiply by 2 (element-wise). So 0 remains as 0, and
          %   1 becomes 2
]         % End
P         % Flip vertically
)         % Index into string, modularly. So 1 corresponds to '|',
          % 2 to '-', and 0 to '#'
          % Implicitly display

3

Python 2 , 85 ไบต์

T=j=10
n=input()+T
while j:print([(n-j)/T*'|',min(n-T*j,T)*'-'][n>60]+'#'*T)[:T];j-=1

ลองออนไลน์!

ในทั้งสองกรณีแต่ละบรรทัดมีการบุด้านขวาโดย#ความยาว 10 ซึ่งช่วยให้เราแบ่งปันรหัสนั้นระหว่างสองกรณี หมายเลข 10 ถูกใช้บ่อยพอที่การสร้างสมนามจะT=10บันทึกจำนวนไบต์ที่เหมาะสม


ไม่ถูกต้อง! จากอินพุต51และหลังจากนั้นจะพลาดแถว
Erik the Outgolfer

@EriktheOutgolfer กรณีขอบเหล่านั้น
xnor

@EriktheOutgolfer ขอบคุณฉันคิดว่านี่จะแก้ไขได้หรือไม่
xnor

ดูเหมือนว่าจะได้รับการแก้ไข
Erik the Outgolfer

2

Ruby , 92 82 ไบต์

->n{puts (r=0..9).map{|y|r.map{|x|n>(n>50?100-y*10+x:x*10+9-y)?"|-"[n/51]:?#}*''}}

ลองออนไลน์!

มันทำงานอย่างไร:

ทุกเซลล์ในตารางมีจำนวนโปรเกรสซีเริ่มต้นจากมุมซ้ายล่างและดำเนินการในแนวนอนหรือแนวตั้งขึ้นอยู่กับค่าของ n:

ถ้าn>50ตัวเลขเป็น100-y*10+xอย่างอื่นมันx*10+9-y


2

ถ่าน 25 ไบต์

NθGTχ#↶F÷θχ⟦χ⟧﹪θχ¿›θ⁵⁰‖T↖

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ                          Input integer into q
  G                         Draw filled polygon
   T                        Directions Right, Down, Left
    χ                       Size 10
     #                      Filled with `#`
      ↶                     Rotate cursor left (now points up)
       F÷θχ                 Repeat q/10 times (integer divide)
           ⟦χ⟧              Print 10 `|`s and move to the next column
              ﹪θχ           Print (q mod 10) `|`s
                 ¿›θ⁵⁰      If q > 50
                      ‖T↖   Reflect diagonally

1
@StewieGriffin อ๊ะผิดขวาง ขออภัยที่ไม่ได้ตรวจสอบ
Neil

ที่จริงแล้วมี 25 ตัวอักษรแต่ 61 ไบต์ใช่ไหม
ZeroOne

@ZeroOne ถ่านใช้ของตัวเองหน้ารหัส
Neil

อ้อเข้าใจแล้ว! ขอบคุณสำหรับคำอธิบาย :)
ZeroOne

2

Husk , 24 ไบต์

↔?T†▼'-≤50⁰S↑C10+R⁰'|∞'#

ลองออนไลน์!

คำอธิบาย

↔?T†▼'-≤50⁰S↑C10+R⁰'|∞'#  Input is a number, say n=12
                     ∞'#  Infinite string of #s: "#######...
                +         Prepend to it
                   '|     the character |
                 R⁰       repeated n times: "||||||||||||####...
             C10          Cut to pieces of length 10: ["||||||||||","||##########","##..
           S↑             Take first 10 pieces.
 ?     ≤50⁰               If n is at most 50,
  T                       then transpose,
   †▼'-                   else take minimum with '-' for each character.
↔                         Reverse, implicitly print separated by newlines.

1

SOGL V0.12 , 21 ไบต์

┐* #M*+Mm√H.M»>?H§┐┌ŗ

ลองที่นี่!

คำอธิบาย:

┐*                     push a vertical bar repeated input times
   #M*                 push "#" repeated 100 times
      +                add the two together
       Mm              mold to a length of 100
         √             convert to a square
          H            rotate clockwise
           .M»>?       if the input is greater than 50
                H        rotate the array clockwise again
                 §       reverse it horizontally
                  ┐┌ŗ    replace "|" with "-"


1

APL (Dyalog Classic) , 33 ไบต์

f←{'#-|'[⊖(⍉+⍨)⍣(⍵≤50)⊢⍵>⍎¨∘.,⍨⎕d]}

ลองออนไลน์!

ตามคำตอบของAdám

⎕d เป็นสตริง '0123456789'

∘., ผลิตภัณฑ์คาร์ทีเซียน

ด้วยตัวเอง

⍎¨ ประเมินแต่ละครั้ง - รับเมทริกซ์ 10x10 ที่ 0..99

⍵> บูลีนเมทริกซ์ที่อาร์กิวเมนต์ มีค่ามากกว่า

ทำหน้าที่เป็นตัวคั่น

(⍉+⍨)⍣(⍵≤50)ถ้า⍵≤50เมทริกซ์สองเท่า ( +กับตัวมันเอง) และการย้าย ( )

ย้อนกลับแนวตั้ง

'#-|'[ ]จัดทำดัชนีสตริง'#-|'ด้วยองค์ประกอบของเมทริกซ์แต่ละตัว


คำอธิบายนี้ยอดเยี่ยมมาก
Adam


1

เรติน่า72 72ไบต์

.+
$*|
T`|`-`.{51,}
$
100$*#
M!10`.{10}
O$s`(?<!-.*)\S
$.%`
O`

ลองออนไลน์! ลิงค์มีกรณีทดสอบ แก้ไข: บันทึก 10 ไบต์ด้วยความช่วยเหลือจาก @MartinEnder คำอธิบาย:

.+
$*|

ทำซ้ำ|ตามจำนวนครั้งที่กำหนด

T`|`-`.{51,}

แต่ถ้าอินพุตมีอย่างน้อย 51 ให้เปลี่ยนเป็น-s

$
100$*#

ผนวก 100 #วิ

M!10`.{10}

แบ่งออกเป็น 10 กลุ่ม 10 กลุ่มทิ้งสิ่งที่เหลืออยู่

O$s`(?<!-.*)\S
$.%`

หากอินพุตเป็นอย่างน้อย 51 ให้ย้ายผลลัพธ์

O`

เรียงลำดับผลลัพธ์

ทางเลือกอื่น ๆ เช่น 62 ไบต์:

.+
$*|
T`|`-`.{51,}
$
100$*#
M!10`.{10}
O`
O$^s`\S(?!.*-)
$.%`

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


คุณไม่จำเป็นต้อง#ในครั้งแรกOบนเวทีเพราะจะเป็นที่มากที่สุด$.%` 9นอกจากนี้คุณยังสามารถบันทึกไบต์โดยหลีกเลี่ยงการวนซ้ำที่ค่าใช้จ่ายของขั้นตอนการเรียงลำดับอื่นในตอนท้ายเช่น: tio.run/##K0otycxL/ ......อาจมีวิธีที่สั้นกว่าในการจัดเรียงผลลัพธ์ของMระยะนั้นเป็นรูปร่างสุดท้าย .
Martin Ender

ตัวอย่างเช่นคุณสามารถย้ายOเวทีธรรมดาไปทางขวาหลังจากMเวทีเพื่อให้คุณสามารถใช้ lookahead แทน lookbehind
Martin Ender

@MartinEnder ขอบคุณสำหรับคำแนะนำของคุณ; ฉันสามารถเล่นกอล์ฟได้อีกไม่กี่ไบต์
Neil


0

PHP, 119 + 1 ไบต์

$r=str_pad("",100,"#");for($x=50<$n=$argn;$n--;)$r[90+($x?$n%10*2-$n:$n/10-$n%10*10)]="|-"[$x];echo chunk_split($r,10);

ทำงานเป็นท่อที่มี-nRหรือลองออนไลน์


0

เยลลี่ 24 ไบต์

³<51
ȷ2Ḷ<s⁵ZḤ$Ç¡Ṛị“-|#”Y

ลองออนไลน์!

มันทำงานอย่างไร

ฉันใช้ตัวยกมากเกินไป ...

³<51 ~ Helper link.

³    ~ The input.
 <   ~ Is smaller than
  51 ~ 51?
     ~ Yields 1 for truthy, 0 for falsy.

ȷ2Ḷ<s⁵ZḤ$Ç¡Ṛị“-|#”Y ~ Main link.

ȷ2                  ~ 1e2 (i.e compressed 100).
  Ḷ                 ~ Lowered range. Yields [0, 100) ∩ ℤ.
   <                ~ Is smaller than the input? (element-wise).
    s⁵              ~ Split into sublists of length 10.
         Ç¡         ~ Repeat <last link as a monad> times (either 1 or 0 times).
      ZḤ$           ~ Zip (transpose) and unhalve element-wise.
           Ṛ        ~ Reverse.
            ị       ~ Modular, 1-based indexing into...
             “-|#”  ~ The literal string "-|#".
                  Y ~ Join by newlines.

0

R , 102 ไบต์

n=scan();m=matrix("#",y<-10,y);m[0:n]="if"(n<51,"|","-");write("if"(n>50,m[,y:1],t(m[y:1,])),"",y,,"")

ลองออนไลน์!

อ่าน nจาก stdin และพิมพ์สวนเป็น stdout

คำอธิบาย:

n=scan()               # read from stdin
m=matrix("#",10,10)               # create 10x10 matrix of "#"
m[0:n]="if"(n<51,"|","-")         # set the first n entries in m to the appropriate character
m="if"(n>50,                      # prepare for printing using write
       m[,10:1],                  # reverse m left to right
       t(m[10:1,]))               # flip m top to bottom and transpose
write(m,"",10,,"")                # write m to stdout in 10 columns with no separator

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