Architektura ogrodowa - styl ASCII

18

Przed domem mamy kwadratowy ogród o wymiarach 10 x 10 metrów. Chcemy sadzić trawę i zrobić taras. Zdecydowaliśmy, jak podzielić ogród, ale nie zdecydowaliśmy o stosunku między ilością trawy a tarasem.

Potrzebujemy pomocy w jej wizualizacji, a ASCII-art jest zdecydowanie najlepszym sposobem na zrobienie tego.


Wyzwanie:

Weź liczbę całkowitą z zakresu obejmującego [0, 100] (lub opcjonalnie dziesiętnego [0, 1]) reprezentującego, ile procent ogrodu powinien stanowić taras.

Jeden metr kwadratowy tarasu będzie reprezentowany przez myślnik -lub bar |. Jeden metr kwadratowy trawy będzie reprezentowany znakiem skrótu #.

  • Jeśli ilość tarasu jest mniejsza lub równa 50%, ogród należy przykryć prętami, zaczynając od lewego dolnego rogu i wypełnić pionowo, a następnie poziomo.
  • Jeśli ilość tarasu jest większa niż 50%, chcemy, aby poszycie było w drugą stronę (kreski zamiast prętów) i rozpoczynające się w lewym dolnym rogu i wypełniające się poziomo, a następnie pionowo.

Przykłady:

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

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

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

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

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

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

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

To jest więc wygrywa najkrótszy kod w bajtach. Standardowe zasady dotyczące I / O. To jest sztuka ASCII, więc wynik powinien wyglądać jak w powyższych przykładach. Oznacza to, że wysyłanie ["|", "|" ...]nie jest prawidłowe .

Wyjaśnienia zachęcamy jak zawsze :)

Stewie Griffin
źródło
2
Moje pierwsze wrażenie było takie, że te dwa przypadki oznaczałyby rozwiązanie dwóch oddzielnych zadań golfowych, ale istnieje wspólna struktura, która sprawia, że ​​warto dzielić kod między nimi.
xnor

Odpowiedzi:

7

APL (Dyalog) , 34 bajty

Anonimowa funkcja przedrostka oczekująca liczby całkowitej w zakresie 0–100. Przyjmuje się ⎕IO( I ndex O rigin) 0, co jest domyślne w wielu systemach.

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

Wypróbuj online!

{} Lambda; jest argumentem:

'#-|[] Indeksuj ciąg za pomocą następującej tablicy:

50≥⍵ 1, jeśli 50 jest większy lub równy argumentowi, w przeciwnym razie 0

s← przechowywać w (dla s mall)

1+ przyrost

⍵⍴ cyklicznie r eshape do argumentu długości

100↑ weź pierwszą setkę tego, wypełnianie zerami

10 10⍴r eshape do dziesięciu wierszach i kolumnach dziesięciu

 dochód, (wydzielane sz 10 10)

⍉⍣s transponuj, jeśli są małe

 odwróć do góry nogami

Adám
źródło
1
{'# - |' [⊖ (⍉ + ⍨) ⍣ (⍵≤50) ⊢⍵> ⍎¨∘., ⍨⎕d]}
ngn
1
Bardzo blisko mojego podejścia:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
Erik the Outgolfer
@EriktheOutgolfer, którego potrzebujesz99/'#'
ngn
@ng oh racja
Erik the Outgolfer
1
@ngn To całkiem inne. Dlaczego tego nie opublikujesz?
Adám
5

J , 39, 38 37 bajtów

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

Jak to działa:

                     _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

Wypróbuj online!

Galen Iwanow
źródło
{.z argumentem przekraczania granic to fajna sztuczka.
Jonasz
2
31 bajtów:(]|.@|:_10{&'#|-'\100{.1+$)>&50
FrownyFrog
@ FrownyFrog - Świetny kod!
Galen Iwanow
@Jonah - Tak, czasami jest to bardzo przydatne. Próbowałem również, _100{. który umieszcza wypełnienia na początku, ale potem musiałem odwrócić każdy wiersz, więc zrezygnowałem.
Galen Iwanow
5

JavaScript (ES6), 84 bajtów

Pobiera dane wejściowe jako liczbę całkowitą w [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)

Przypadki testowe

Sformatowane i skomentowane

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
źródło
4

Python 2 , 121 117 116 bajtów

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)

Wypróbuj online!

TFeld
źródło
1
Myślę, że [i*10:-~i*10]może być [i*10:][:10].
Jonathan Frech
@JonathanFrech Thanks :)
TFeld
4

Galaretka , 23 bajty

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

Wypróbuj online!

Zmień liczbę Çw stopce, aby zmienić dane wejściowe. Działa jako monadyczne łącze w programie bez argumentów wiersza poleceń, co jest dozwolone .

Erik the Outgolfer
źródło
Bardzo ładna odpowiedź +1. 23 bajty jako łącze monadyczne ( ȷ2-> ³)
Pan Xcoder
Udało mi się też uzyskać 24 bajty , pomyślałem, że może to być również źródło inspiracji.
Pan Xcoder
@ Mr.Xcoder Myślałem o tym, ale nie jestem pewien, czy mogę coś takiego założyć (działałoby tylko w programach niladycznych? Hmm ...)
Erik Outgolfer,
Zobacz tę dyskusję, którą przeprowadziłem z Dennis.
Pan Xcoder,
3

SWI Prolog, 249 bajtów

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

Rozwiązanie jest dość proste. Procedura atworzy wiersze, lzapisuje znaki w kolumnach w rzędzie i rdecyduje, jaki znak powinien zostać wydrukowany.

Jan Drozen
źródło
2
G<51powinien działać zamiast G<=50.
Laikoni
3

MATL , 26 bajtów

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

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

'|-#'     % 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
źródło
3

Python 2 , 85 bajtów

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

Wypróbuj online!

W obu przypadkach każda linia jest dopełniona z prawej strony #do długości 10, co pozwala nam dzielić ten kod między dwiema przypadkami. Liczba 10 była używana wystarczająco często, aby aliasing T=10zaoszczędził przyzwoitą liczbę bajtów.

xnor
źródło
Nieważny! Z danych wejściowych 51i później brakuje wiersza.
Erik the Outgolfer
@EriktheOutgolfer Te przypadki krawędzi.
xnor
@EriktheOutgolfer Dzięki, myślę, że to naprawia?
xnor
Wygląda na to, że jest naprawiony.
Erik the Outgolfer
2

Rubin , 92 82 bajtów

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

Wypróbuj online!

Jak to działa:

Każda komórka w siatce ma numer progresywny rozpoczynający się od lewego dolnego rogu i przebiegający poziomo lub pionowo w zależności od wartości n:

Jeśli n>50jest 100-y*10+xinaczej, to jestx*10+9-y

GB
źródło
2

Węgiel , 25 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

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
źródło
1
@StewieGriffin Ups, zła przekątna. Przepraszam, że nie sprawdzam.
Neil
To właściwie 25 znaków , ale 61 bajtów , prawda?
ZeroOne
@ZeroOne Charcoal używa własnej strony kodowej .
Neil
Rozumiem! Dziękuję za wyjaśnienie. :)
ZeroOne,
2

Łuska , 24 bajty

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

Wypróbuj online!

Wyjaśnienie

↔?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
źródło
1

SOGL V0.12 , 21 bajtów

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

Wypróbuj tutaj!

Wyjaśnienie:

┐*                     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
źródło
1

dc , 210 197 bajtów

[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

Wypróbuj online!

R. Kap
źródło
1

APL (Dyalog Classic) , 33 bajty

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

Wypróbuj online!

na podstawie odpowiedzi Adáma

⎕d jest ciąg '0123456789'

∘., Produkt kartezjański

z samym sobą

⍎¨ oceń każdy - uzyskaj macierz 10x10 0..99

⍵>macierz boolowska, dla której argument jest większy

działa jak separator

(⍉+⍨)⍣(⍵≤50)jeśli ⍵ ≤50 podwój matrycę ( +z samym sobą) i transponuj ( )

pionowy rewers

'#-|'[ ]indeksuj ciąg '#-|'każdego elementu macierzy

ngn
źródło
To wyjaśnienie jest doskonałe, imho.
Adám
1

q , 51 bajtów

{-1@'reverse$[i;::;flip]10 10#@[100#"#";til x;:;"|-"i:x>50];}
skeevey
źródło
1

Siatkówka , 72 62 bajty

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

Wypróbuj online! Link zawiera przypadki testowe. Edycja: Zapisano 10 bajtów przy pewnej pomocy @MartinEnder. Wyjaśnienie:

.+
$*|

Powtórz |podaną liczbę razy

T`|`-`.{51,}

Ale jeśli wartość wejściowa wynosiła co najmniej 51, zmień je na -s.

$
100$*#

Dołącz 100 #s.

M!10`.{10}

Podziel na 10 grup po 10, odrzucając wszystko, co pozostało.

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

Jeśli wartość wejściowa wynosiła co najmniej 51, transponuj wynik.

O`

Posortuj wynik.

Alternatywne rozwiązanie, również 62 bajty:

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

Sortowanie przed transpozycją pozwala zaoszczędzić bajty pod warunkiem transpozycji, ale kosztuje bajt, aby uzyskać wynik we właściwej kolejności.

Neil
źródło
Na #pierwszym Oetapie nie potrzebujesz , bo $.%`będzie co najwyżej 9. Możesz także zaoszczędzić trochę bajtu, unikając pętli kosztem innego etapu sortowania na końcu, na przykład: tio.run / ##K0otycxL/ ... Prawdopodobnie istnieje jeszcze krótszy sposób, aby zmienić wynik tego Metapu na ostateczny kształt .
Martin Ender
Ach tak, na przykład możesz przenieść zwykłą Oscenę na scenę tuż za nią M, abyś mógł nadal korzystać z perspektywy zamiast z perspektywy.
Martin Ender
@MartinEnder Dziękujemy za podpowiedzi; Byłem w stanie zagrać w golfa jeszcze kilka bajtów.
Neil
0

PHP, 119 + 1 bajtów

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

Uruchom jako potok z -nRlub spróbuj online .

Tytus
źródło
0

Galaretka , 24 bajty

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

Wypróbuj online!

Jak to działa

Używam zbyt wielu indeksów górnych ...

³<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.
Pan Xcoder
źródło
0

R , 102 bajty

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

Wypróbuj online!

Czyta nze standardowego wejścia i drukuje ogród na standardowe wyjście.

Wyjaśnienie:

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
źródło