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.

{'#-|'[⊖⍉⍣s⊢10 10⍴100↑⍵⍴1+s←50≥⍵]}

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.