Architettura del giardino - stile ASCII


18

Abbiamo un giardino quadrato di 10x10 metri fuori dalla nostra casa. Vogliamo piantare erba e creare una terrazza. Abbiamo deciso come dividere il giardino, ma non abbiamo deciso il rapporto tra quantità di erba e terrazza.

Abbiamo bisogno di aiuto per visualizzarlo e ASCII-art è chiaramente il modo migliore per farlo.


Sfida:

Prendi un numero intero compreso nell'intervallo [0, 100] (o eventualmente decimale [0, 1]) che rappresenta la percentuale del giardino che dovrebbe essere terrazza.

Un metro quadrato di terrazza sarà rappresentato da un trattino -o una barra |. Un metro quadrato di erba sarà rappresentato da un segno di hash #.

  • Se la quantità di terrazza è inferiore o uguale al 50%, il giardino dovrebbe essere coperto di barre, a partire dall'angolo in basso a sinistra, e riempire in verticale, quindi in orizzontale.
  • Se la quantità di terrazza è superiore al 50%, vogliamo che il decking sia nell'altro modo (trattini anziché barre), iniziando nell'angolo in basso a sinistra e riempiendo in orizzontale, quindi in verticale.

Esempi:

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

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

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

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

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

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

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

Questo è quindi vince il codice più breve in byte. Regole standard relative all'I / O. Questa è arte ASCII, quindi l'output dovrebbe assomigliare agli esempi sopra. Vale a dire che l'output ["|", "|" ...]non è OK.

Le spiegazioni sono incoraggiate come sempre :)


2
La mia prima impressione è stata che i due casi significherebbero solo risolvere due compiti di golf separati, ma c'è una struttura comune da trovare che vale la pena condividere il codice tra di loro.
xnor

Risposte:


7

APL (Dyalog) , 34 byte

Funzione prefisso anonimo in attesa di un numero intero compreso tra 0 e 100. Assume ⎕IO( I NDICE O rigine) di essere 0, che è di default su molti sistemi.

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

Provalo online!

{... } lambda; è argomento:

'#-|[... ] indicizza la stringa con il seguente array:

50≥⍵ 1 se 50 è maggiore o uguale all'argomento, altrimenti 0

s← store in s (per centro commerciale s )

1+ incremento

⍵⍴ ciclicamente r eshape all'argomento lunghezza

100↑ prendine i primi cento, riempiendo di zeri

10 10⍴r eshape di righe e colonne dieci dieci

 cedere che (separa sda 10 10)

⍉⍣s trasporre se piccolo

 capovolgere


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

1
Molto vicino al mio approccio:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
Erik the Outgolfer,

@EriktheOutgolfer ti serve solo99/'#'
ngn

@ngn oh giusto,
Erik the Outgolfer,

1
@ngn È abbastanza diverso. Perché non lo pubblichi?
Adám,

5

J , 39, 38 37 byte

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

Come funziona:

                     _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

Provalo online!


{.con un argomento oltre i limiti è un bel trucco.
Giona

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

@ FrownyFrog - Ottimo codice!
Galen Ivanov,

@Jonah - Sì, a volte è molto utile. Ho anche provato _100{. che mette i riempimenti all'inizio, ma poi ho dovuto invertire ogni riga, quindi ho rinunciato.
Galen Ivanov,

5

JavaScript (ES6), 84 byte

Accetta l'input come numero intero in [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)

Casi test

Formattato e commentato

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

Gelatina , 23 byte

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

Provalo online!

Modificare il numero prima Çnel piè di pagina per modificare l'input. Funziona come un collegamento monadico in un programma senza argomenti della riga di comando, che è consentito .


Molto bella risposta +1. 23 byte come collegamento monadico ( ȷ2-> ³)
Mr. Xcoder

Sono riuscito a ottenere anche 24 byte , ho pensato che potesse essere una fonte di ispirazione anche qui.
Mr. Xcoder,

@ Mr.Xcoder Ci ho pensato, ma non sono davvero sicuro di poter supporre una cosa del genere (funzionerebbe solo con programmi niladici? Hmm ...)
Erik the Outgolfer,

Vedi questa discussione che ho avuto con Dennis.
Mr. Xcoder,

3

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

La soluzione è piuttosto semplice. La procedura acrea righe, lscrive caratteri in colonne in una riga e rdecide quale carattere deve essere stampato.


2
G<51dovrebbe funzionare invece di G<=50.
Laikoni,

3

MATL , 26 byte

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

Provalo online! O verifica tutti i casi di test .

Spiegazione

'|-#'     % 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 byte

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

Provalo online!

In entrambi i casi, ogni riga è riempita a destra #di lunghezza 10, il che ci consente di condividere quel codice tra i due casi. Il numero 10 è stato usato abbastanza spesso che l'aliasing ha T=10salvato un numero decente di byte.


Non valido! Dall'input 51e dopo, manca una riga.
Erik the Outgolfer,

@EriktheOutgolfer Quei casi limite.
xnor

@EriktheOutgolfer Grazie, penso che questo risolva il problema?
xnor

Sembra che sia stato risolto.
Erik the Outgolfer

2

Rubino , 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]:?#}*''}}

Provalo online!

Come funziona:

Ogni cella nella griglia ha un numero progressivo che parte dall'angolo in basso a sinistra e procede in senso orizzontale o verticale a seconda del valore di n:

In caso contrario n>50, il numero è 100-y*10+xaltrimentix*10+9-y


2

Carbone , 25 byte

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

Provalo online! Il collegamento è alla versione dettagliata del codice. Spiegazione:

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 Oops, diagonale sbagliata. Ci scusiamo per non aver controllato.
Neil,

Sono in realtà 25 caratteri , ma 61 byte , non è vero?
ZeroOne,

@ZeroOne Charcoal utilizza una propria tabella codici .
Neil,

Oh, capisco! Grazie per la spiegazione. :)
ZeroOne,

2

Buccia , 24 byte

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

Provalo online!

Spiegazione

↔?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 byte

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

Provalo qui!

Spiegazione:

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

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

Provalo online!


1

APL (Dyalog Classic) , 33 byte

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

Provalo online!

basato sulla risposta di Adám

⎕d è la stringa '0123456789'

∘., prodotto cartesiano

con se stesso

⍎¨ valuta ciascuno - ottieni una matrice 10x10 di 0..99

⍵>matrice booleana per cui l'argomento è maggiore

funge da separatore

(⍉+⍨)⍣(⍵≤50)se ⍵≤50 raddoppia la matrice ( +con se stesso) e traspone ( )

retromarcia verticale

'#-|'[ ]indicizza la stringa '#-|'con ciascun elemento della matrice


Questa spiegazione è eccellente, imho.
Adám,

1

q , 51 byte

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

1

Retina , 72 62 byte

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

Provalo online! Il link include casi di test. Modifica: salvato 10 byte con l'aiuto di @MartinEnder. Spiegazione:

.+
$*|

Ripeti |il numero di volte indicato

T`|`-`.{51,}

Ma se l'input era almeno 51, cambiali in -s.

$
100$*#

Aggiungi 100 #s.

M!10`.{10}

Dividi in 10 gruppi di 10, scartando tutto ciò che è rimasto.

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

Se l'ingresso era almeno 51, trasporre il risultato.

O`

Ordina il risultato.

Soluzione alternativa, anche 62 byte:

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

L'ordinamento prima della trasposizione consente un risparmio di byte sulla condizione per la trasposizione, ma costa un byte per ottenere il risultato nell'ordine corretto.


Non è necessario #al primo Ostadio, perché $.%`lo sarà al massimo 9. Puoi anche salvare qualche byte evitando il loop al costo di un altro stadio di ordinamento alla fine, in questo modo: tio.run/##K0otycxL/… Probabilmente c'è anche un modo più breve per ridisporre il risultato di quello Mstadio nella forma finale .
Martin Ender,

Ah sì, ad esempio puoi spostare il Opalcoscenico normale subito dopo il Mpalco, in modo da poter continuare a utilizzare un lookahead anziché un lookbehind.
Martin Ender,

@MartinEnder Grazie per i tuoi suggerimenti; Sono stato in grado di giocare a golf qualche byte in più.
Neil,


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

Esegui come pipe -nRo provalo online .


0

Gelatina , 24 byte

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

Provalo online!

Come funziona

Uso troppi apici ...

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

Provalo online!

Legge nda stdin e stampa il giardino su stdout.

Spiegazione:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.