Arquitetura de jardim - estilo ASCII

18

Temos um jardim quadrado de 10x10 metros fora de nossa casa. Queremos plantar grama e fazer um terraço. Decidimos como dividir o jardim, mas ainda não decidimos a relação entre quantidade de grama e terraço.

Precisamos de ajuda para visualizá-lo, e a arte ASCII é claramente a melhor maneira de fazê-lo.


Desafio:

Pegue um número inteiro no intervalo inclusivo [0, 100] (ou opcionalmente decimal [0, 1]) representando quantos por cento do jardim deve ser terraço.

Um metro quadrado de terraço será representado por um traço -ou um bar |. Um metro quadrado de grama será representado por uma marca de hash #.

  • Se a quantidade de terraço for menor ou igual a 50%, o jardim deve ser coberto com barras, começando no canto inferior esquerdo e preenchido verticalmente e horizontalmente.
  • Se a quantidade de terraço for superior a 50%, queremos que o deck seja para o outro lado (traços em vez de barras), começando no canto inferior esquerdo e preenchendo horizontalmente e verticalmente.

Exemplos:

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

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

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

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

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

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

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

Isso é então o código mais curto em bytes vence. Regras padrão sobre E / S. Isso é arte ASCII, portanto a saída deve se parecer com os exemplos acima. Ou seja, a saída ["|", "|" ...]não está OK.

As explicações são incentivadas como sempre :)

Stewie Griffin
fonte
2
Minha primeira impressão foi que os dois casos significariam resolver duas tarefas separadas de golfe, mas há uma estrutura comum a ser encontrada que faz valer a pena compartilhar código entre eles.
Xnor

Respostas:

7

APL (Dyalog) , 34 bytes

Função de prefixo anônimo esperando número inteiro no intervalo de 0 a 100. Assume ⎕IO( I ndex O rigin) como sendo 0, o padrão em muitos sistemas.

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

Experimente online!

{... } lambda;é argumento:

'#-|[...]  Indexe a sequência com a seguinte matriz:

50≥⍵ 1 se 50 for maior que ou igual ao argumento, caso contrário 0

s← loja em s (para shopping s )

1+ incremento

⍵⍴ ciclicamente r eshape ao argumento de comprimento

100↑ pegue a primeira centena disso, preenchendo com zeros

10 10⍴r eshape para dez linhas e dez colunas

 rendimento que (separa sde 10 10)

⍉⍣s transpor se pequeno

 virar de cabeça para baixo

Adão
fonte
1
{'# - |' [⊖ (⍉ + ⍨) ⍣ (⍵≤50) ⊢⍵> ⍎¨∘., ]D]}
ngn
1
Muito perto da minha abordagem:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
Erik the Outgolfer
@EriktheOutgolfer você só precisa99/'#'
ngn
@ngn oh right,
Erik the Outgolfer
1
@ngn Isso é bem diferente. Por que você não publica?
Adám 25/11/19
5

J , 39, 38 37 bytes

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

Como funciona:

                     _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

Experimente online!

Galen Ivanov
fonte
{.com um argumento sobre os limites é um bom truque.
Jonah
2
31 bytes:(]|.@|:_10{&'#|-'\100{.1+$)>&50
FrownyFrog
@ FrownyFrog - Ótimo código!
Galen Ivanov
@ Jonah - Sim, às vezes é muito útil. Eu também tentei o _100{. que coloca os preenchimentos no começo, mas então eu precisava reverter cada linha, então desisti.
Galen Ivanov
5

JavaScript (ES6), 84 bytes

Recebe a entrada como um número inteiro em [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)

Casos de teste

Formatado e comentado

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
fonte
4

Python 2 , 121 117 116 bytes

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)

Experimente online!

TFeld
fonte
1
Eu acho que [i*10:-~i*10]pode ser [i*10:][:10].
precisa
@JonathanFrech Thanks :) #
TFeld
4

Gelatina , 23 bytes

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

Experimente online!

Altere o número anterior Çno rodapé para alterar a entrada. Funciona como um link monádico em um programa sem argumentos de linha de comando, o que é permitido .

Erik, o Outgolfer
fonte
Resposta muito boa +1. 23 bytes como um link monádico ( ȷ2-> ³)
Sr. Xcoder
Também consegui obter 24 bytes , achei que poderia ser uma fonte de inspiração aqui também.
Mr. Xcoder
@ Mr.Xcoder Eu pensei nisso, mas não tenho muita certeza se posso assumir uma coisa dessas (só funcionaria em programas niládicos? Hmm ...)
Erik o Outgolfer
Vejo esta discussão que tive com Dennis.
Mr. Xcoder
3

Prolog SWI, 249 bytes

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 solução é bem direta. O procedimento acria linhas, lgrava caracteres nas colunas em uma linha e rdecide qual caractere deve ser impresso.

Jan Drozen
fonte
2
G<51deve funcionar em vez de G<=50.
Laikoni
3

MATL , 26 bytes

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

Experimente online! Ou verifique todos os casos de teste .

Explicação

'|-#'     % 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
fonte
3

Python 2 , 85 bytes

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

Experimente online!

Nos dois casos, cada linha é preenchida à direita pelo #comprimento 10, o que nos permite compartilhar esse código entre os dois casos. O número 10 foi usado com frequência suficiente para que o alias T=10salvasse um número decente de bytes.

xnor
fonte
Inválido! De entrada 51e depois, ele perde uma linha.
Erik the Outgolfer
@EriktheOutgolfer Esses casos extremos.
Xnor
@EriktheOutgolfer Obrigado, acho que isso corrige?
Xnor
Parece que está consertado.
Erik, o Outgolfer
2

Ruby , 92 82 bytes

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

Experimente online!

Como funciona:

Cada célula na grade tem um número progressivo começando no canto inferior esquerdo e prosseguindo na horizontal ou na vertical, dependendo do valor de n:

Se n>50o número for 100-y*10+xdiferente, éx*10+9-y

GB
fonte
2

Carvão , 25 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

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
fonte
1
@StewieGriffin Ops, diagonal errada. Desculpe por não verificar.
Neil
Na verdade, são 25 caracteres , mas 61 bytes , não é?
ZeroOne 24/11
O @ZeroOne Charcoal usa sua própria página de código .
Neil
Ah eu vejo! Obrigada pelo esclarecimento. :)
ZeroOne
2

Casca , 24 bytes

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

Experimente online!

Explicação

↔?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
fonte
1

SOGL V0.12 , 21 bytes

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

Experimente aqui!

Explicação:

┐*                     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
fonte
1

dc , 210 197 bytes

[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

Experimente online!

R. Kap
fonte
1

APL (Dyalog Classic) , 33 bytes

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

Experimente online!

com base na resposta de Adám

⎕d é a string '0123456789'

∘., produto cartesiano

consigo mesmo

⍎¨ avalie cada um - obtenha uma matriz 10x10 de 0..99

⍵>matriz booleana para onde o argumento é maior

atua como separador

(⍉+⍨)⍣(⍵≤50)se ⍵≤50 dobrar a matriz ( +com ela mesma) e transpor ( )

reverso vertical

'#-|'[ ]indexe a string '#-|'com cada elemento da matriz

ngn
fonte
Esta explicação é excelente, imho.
Adám 26/11/17
1

q , 51 bytes

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

Retina , 72 62 bytes

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

Experimente online! O link inclui casos de teste. Editar: salvou 10 bytes com alguma ajuda de @MartinEnder. Explicação:

.+
$*|

Repita |o número especificado de vezes

T`|`-`.{51,}

Mas se a entrada tiver pelo menos 51, altere-a para -s.

$
100$*#

Anexar 100 #s.

M!10`.{10}

Divida em 10 grupos de 10, descartando tudo o que resta.

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

Se a entrada tiver pelo menos 51, transponha o resultado.

O`

Classifique o resultado.

Solução alternativa, também 62 bytes:

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

A classificação antes da transposição permite uma economia de bytes na condição da transposição, mas custa um byte para obter o resultado na ordem correta.

Neil
fonte
Você não precisa #no primeiro Oestágio, porque $.%`será no máximo 9. Você também pode economizar algum byte evitando o loop ao custo de outro estágio de classificação no final, como este: tio.run/##K0otycxL/… Provavelmente, existe uma maneira ainda mais curta de reorganizar o resultado desse Mestágio para a forma final .
Martin Ender
Ah, sim, por exemplo, você pode mover o Opalco simples para logo após o Mpalco, para que você possa continuar usando um lookahead em vez de um lookbehind.
Martin Ender
@MartinEnder Obrigado por suas dicas; Consegui jogar mais alguns bytes de golfe.
Neil
0

Python 2 , 106 103 bytes

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

Experimente online!

ovs
fonte
0

PHP, 119 + 1 bytes

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

Execute como pipe -nRou experimente online .

Titus
fonte
0

Gelatina , 24 bytes

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

Experimente online!

Como funciona

Eu uso muitos sobrescritos ...

³<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.
Mr. Xcoder
fonte
0

R , 102 bytes

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

Experimente online!

n de stdin e imprime o jardim em stdout.

Explicação:

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
fonte