Arsitektur taman - gaya ASCII

18

Kami memiliki taman 10x10 meter persegi di luar rumah kami. Kami ingin menanam rumput dan membuat teras. Kami telah memutuskan bagaimana membagi kebun, tetapi kami belum memutuskan rasio antara jumlah rumput dan teras.

Kami butuh bantuan memvisualisasikannya, dan ASCII-art jelas merupakan cara terbaik untuk melakukannya.


Tantangan:

Ambil bilangan bulat dalam rentang inklusif [0, 100] (atau desimal opsional [0, 1]) yang mewakili berapa persen dari taman yang seharusnya teras.

Teras seluas satu meter persegi akan diwakili oleh tanda hubung -atau bar |. Satu meter persegi rumput akan diwakili oleh tanda pagar #.

  • Jika jumlah teras kurang dari atau sama dengan 50%, maka taman harus ditutup dengan jeruji, mulai dari sudut kiri bawah, dan isi secara vertikal, kemudian secara horizontal.
  • Jika jumlah teras lebih dari 50%, maka kami ingin penghiasan menjadi sebaliknya (strip bukan bar), dan mulai di sudut kiri bawah, dan isi secara horizontal, kemudian secara vertikal.

Contoh:

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

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

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

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

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

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

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

Ini adalah sehingga kode terpendek dalam byte menang. Aturan standar tentang I / O. Ini adalah ASCII-art, jadi outputnya harus seperti contoh di atas. Yaitu keluaran ["|", "|" ...]tidak OK.

Penjelasan didorong seperti biasa :)

Stewie Griffin
sumber
2
Kesan pertama saya adalah bahwa kedua kasus itu hanya berarti menyelesaikan dua tugas bermain golf yang terpisah, tetapi ada struktur umum yang dapat ditemukan yang membuatnya layak untuk membagikan kode di antara mereka.
xnor

Jawaban:

7

APL (Dyalog) , 34 byte

Fungsi awalan anonim mengharapkan bilangan bulat di kisaran 0-100. Diasumsikan ⎕IO( I ndex O rigin) 0, yang merupakan default pada banyak sistem.

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

Cobalah online!

{... } lambda; adalah argumen:

'#-|[... ] mengindeks string dengan array berikut:

50≥⍵ 1 jika 50 lebih besar dari atau sama dengan argumen, kalau tidak 0

s← store in s (for s mall)

1+ kenaikan

⍵⍴ siklis r eshape argumen-panjang

100↑ ambil seratus pertama itu, padding dengan nol

10 10⍴r eshape menjadi sepuluh baris dan sepuluh kolom

 hasilkan itu (terpisah sdari 10 10)

⍉⍣s transpos jika kecil

 flip terbalik

Adm
sumber
1
{'# - |' [⊖ (⍉ + ⍨) ⍣ (⍵≤50) ⊢⍵> ⍎¨∘., ⍨⎕d]}
ngn
1
Sangat dekat dengan pendekatan saya:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
Erik the Outgolfer
@EriktheOutgolfer Anda hanya perlu99/'#'
ngn
@ngn oh benar,
Erik the Outgolfer
1
@ Ngn Itu sangat berbeda. Mengapa Anda tidak mempostingnya?
Adám
5

J , 39, 38 37 byte

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

Bagaimana itu bekerja:

                     _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

Cobalah online!

Galen Ivanov
sumber
{.dengan argumen over the bounds adalah trik yang bagus.
Jonah
2
31 byte:(]|.@|:_10{&'#|-'\100{.1+$)>&50
FrownyFrog
@ FrownyFrog - Kode hebat!
Galen Ivanov
@Jonah - Ya, terkadang sangat berguna. Saya juga mencoba _100{. yang mengisi awal, tapi kemudian saya perlu membalik setiap baris, jadi saya menyerah.
Galen Ivanov
5

JavaScript (ES6), 84 byte

Mengambil input sebagai integer dalam [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)

Uji kasus

Diformat dan dikomentari

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
Arnauld
sumber
4

Python 2 , 121 117 116 byte

def f(n):
 s=[('-|'[n<51]*n+'#'*100)[i*10:][:10]for i in range(10)]
 for l in[s,zip(*s)][n<51][::-1]:print''.join(l)

Cobalah online!

TFeld
sumber
1
Saya pikir [i*10:-~i*10]bisa [i*10:][:10].
Jonathan Frech
@JonathanFrech Terima kasih :)
TFeld
4

Jelly , 23 byte

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

Cobalah online!

Ubah nomor sebelum Çdi footer untuk mengubah input. Berfungsi sebagai tautan monadik dalam suatu program tanpa argumen baris perintah, yang diizinkan .

Erik the Outgolfer
sumber
+1 sangat bagus. 23 byte sebagai tautan monadik ( ȷ2-> ³)
Tn. Xcoder
Saya berhasil mendapatkan 24 byte juga, saya pikir itu mungkin menjadi sumber inspirasi di sini juga.
Tn. Xcoder
@ Mr.Xcoder saya memang memikirkan hal itu, tetapi saya tidak begitu yakin apakah saya dapat menganggap hal seperti itu (hanya akan bekerja dalam program niladik? Hmm ...)
Erik the Outgolfer
Lihat diskusi ini dengan Dennis.
Tn. Xcoder
3

Prolog SWI, 249 byte

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),!.

Solusinya cukup mudah. Prosedur amembuat baris, lmenulis karakter ke kolom dalam satu baris dan rmemutuskan karakter apa yang harus dicetak.

Jan Drozen
sumber
2
G<51harus bekerja G<=50.
Laikoni
3

MATL , 26 byte

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

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

'|-#'     % 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
Luis Mendo
sumber
3

Python 2 , 85 byte

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

Cobalah online!

Dalam kedua kasus, setiap baris diisi di sebelah kanan dengan #panjang 10, yang memungkinkan kami berbagi kode di antara dua kasus tersebut. Angka 10 digunakan cukup sering sehingga aliasing T=10menghemat jumlah byte yang layak.

Tidak
sumber
Tidak valid! Dari input 51dan sesudahnya, ia melewatkan satu baris.
Erik the Outgolfer
@EriktheOutgolfer Kasus tepi itu.
xnor
@EriktheOutgolfer Terima kasih, saya pikir ini memperbaikinya?
xnor
Sepertinya sudah diperbaiki.
Erik the Outgolfer
2

Ruby , 92 82 byte

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

Cobalah online!

Bagaimana itu bekerja:

Setiap sel dalam kisi memiliki angka progresif mulai dari sudut kiri bawah dan berjalan secara horizontal atau vertikal tergantung pada nilai n:

Jika n>50, angkanya 100-y*10+xsebaliknyax*10+9-y

GB
sumber
2

Arang , 25 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:

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
Neil
sumber
1
@StewieGriffin Ups, diagonal salah. Maaf karena tidak memeriksa.
Neil
Itu sebenarnya 25 karakter , tetapi 61 byte , bukan?
ZeroOne
@ZeroOne Charcoal menggunakan halaman kode sendiri .
Neil
Oh begitu! Terima kasih untuk penjelasannya. :)
ZeroOne
2

Sekam , 24 byte

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

Cobalah online!

Penjelasan

↔?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.
Zgarb
sumber
1

SOGL V0.12 , 21 byte

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

Coba Di Sini!

Penjelasan:

┐*                     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 "-"
dzaima
sumber
1

dc , 210 197 byte

[256r^1-255/]sx?dddI/dsT9r-sYI%ddIr-sqdsesm-I/sN[[lNlxx124*PIlN-lxx35*PIPlq1-dsq0<o]dsoxlN1+sNledsq0<oq]sJ50!<J[Ilxx35*PIPlY1-dsY0<E]sElY0<E[lmlxx45*PIlm-lxx35*PIP]sClTI>C[Ilxx45*PIPlT1-dsT0<Z]dsZx

Cobalah online!

R. Kap
sumber
1

APL (Dyalog Classic) , 33 byte

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

Cobalah online!

berdasarkan jawaban Adám

⎕d adalah string '0123456789'

∘., Produk Cartesian

dengan dirinya sendiri

⍎¨ mengevaluasi masing-masing - dapatkan 10x10 matriks 0,99

⍵>matriks boolean untuk tempat argumen lebih besar

bertindak sebagai pemisah

(⍉+⍨)⍣(⍵≤50)jika ⍵≤50 gandakan matriks ( +dengan sendirinya) dan transpos ( )

membalikkan vertikal

'#-|'[ ]indeks string '#-|'dengan setiap elemen dari matriks

ngn
sumber
Penjelasan ini bagus sekali, imho.
Adám
1

q , 51 byte

{-1@'reverse$[i;::;flip]10 10#@[100#"#";til x;:;"|-"i:x>50];}
skeevey
sumber
1

Retina , 72 62 byte

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

Cobalah online! Tautan termasuk kasus uji. Sunting: Disimpan 10 byte dengan bantuan dari @MartinEnder. Penjelasan:

.+
$*|

Ulangi |beberapa kali

T`|`-`.{51,}

Tetapi jika inputnya setidaknya 51, ubah ke -s.

$
100$*#

Tambahkan 100 #s.

M!10`.{10}

Dibagi menjadi 10 kelompok yang terdiri dari 10, membuang apa pun yang tersisa.

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

Jika inputnya minimal 51, transpos hasilnya.

O`

Sortir hasilnya.

Solusi alternatif, juga 62 byte:

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

Penyortiran sebelum transposing memungkinkan penghematan byte pada kondisi untuk transposisi tetapi biaya satu byte untuk mendapatkan hasil dalam urutan yang benar.

Neil
sumber
Anda tidak perlu #pada Otahap pertama , karena $.%`akan paling banyak 9. Anda juga dapat menyimpan beberapa byte dengan menghindari loop dengan mengorbankan tahap pengurutan lainnya di akhir, seperti ini: tio.run / ##K0otycxL/... Mungkin bahkan ada cara yang lebih pendek untuk mengatur ulang hasil Mtahap itu ke dalam bentuk akhir. .
Martin Ender
Ah ya, misalnya, Anda dapat memindahkan Opanggung polos ke kanan setelah Mpanggung, sehingga Anda dapat terus menggunakan lookahead bukannya lookbehind.
Martin Ender
@ MartinEnder Terima kasih atas petunjuk Anda; Saya dapat bermain golf beberapa byte lagi.
Neil
0

Python 2 , 106 103 byte

n=input();x=n>50;k=x*81+10
while k>0:s='';exec"s+='|-##'[x::2][n<k];k+=x or 10;"*10;print s;k+=x*81-101

Cobalah online!

ovs
sumber
0

PHP, 119 +1 byte

$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);

Jalankan sebagai pipa dengan -nRatau coba online .

Titus
sumber
0

Jelly , 24 byte

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

Cobalah online!

Bagaimana itu bekerja

Saya menggunakan terlalu banyak superskrip ...

³<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.
Tuan Xcoder
sumber
0

R , 102 byte

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,,"")

Cobalah online!

Membaca ndari stdin dan mencetak taman ke stdout.

Penjelasan:

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

Giuseppe
sumber