Bahçe mimarisi - ASCII tarzı


18

Evimizin dışında 10x10 metre kare büyüklüğünde bir bahçemiz var. Çim dikmek ve teras yapmak istiyoruz. Bahçeyi nasıl böleceğimize karar verdik , ancak çim ve teras arasındaki orana karar vermedik.

Görselleştirmek için yardıma ihtiyacımız var ve ASCII-art bunu yapmanın en iyi yoludur.


Meydan okuma:

Bahçenin yüzde kaçının teras olması gerektiğini gösteren kapsayıcı aralıkta [0, 100] (veya isteğe bağlı olarak ondalık [0, 1]) bir tam sayı alın .

Bir metrekarelik teras bir çizgi -veya bir çubukla temsil edilecektir |. Bir metrekarelik çim bir karma işareti ile temsil edilecektir #.

  • Teras miktarı% 50'den az veya buna eşitse, bahçe sol alt köşeden başlayarak çubuklarla kaplanmalı ve önce dikey, sonra yatay olarak doldurulmalıdır.
  • Teras miktarı% 50'den fazla ise, döşemenin başka bir şekilde (çubuklar yerine tire) olmasını ve sol alt köşeden başlamasını ve yatay, ardından dikey olarak doldurmasını istiyoruz.

Örnekler:

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

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

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

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

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

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

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

Bu yani bayt en kısa kod kazanmak. I / O ile ilgili standart kurallar. Bu ASCII sanatıdır, bu nedenle çıktı yukarıdaki örneklere benzemelidir. Yani çıktısı ["|", "|" ...]TAMAM değil.

Açıklamalar her zaman olduğu gibi teşvik edilmektedir :)


2
İlk izlenimim, iki vakanın sadece iki ayrı golf görevini çözmek anlamına geleceği idi, ancak aralarında kod paylaşmaya değer yapan ortak bir yapı var.
xnor

Yanıtlar:


7

APL (Dyalog) , 34 bayt

0-100 aralığında tamsayı bekleyen anonim önek işlevi. Devraldı ⎕IO( Ben nDex Ç rigin) olmak 0üzere birçok sistem üzerine varsayılan olan.

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

Çevrimiçi deneyin!

{} Lambda; argüman:

'#-|[] Dizeyi aşağıdaki diziyle dizine ekler:

50≥⍵ 1, 50 bağımsız değişkenden büyük veya ona eşitse, 0

s← s deposu için ( s merkezi)

1+ artım

⍵⍴ çevrimsel r bağımsız değişken uzunlukta eshape

100↑ ilk yüzünü al, sıfırlarla doldur

10 10⍴r , on satıra ve on sütuna dönüşür

 verim ki (ayırır sgelen 10 10)

⍉⍣s küçükse devrik

 baş aşağı çevir


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

1
Benim yaklaşımım çok yakın:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
Outgolfer Erik

Sadece ihtiyacınız olan 99/'#'
@EriktheOutgolfer

@ngn oh right,
Outgolfer Erik

1
@ngn Bu oldukça farklı. Neden göndermiyorsun?
Adam

5

J , 39, 38 37 bayt

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

Nasıl çalışır:

                     _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

Çevrimiçi deneyin!


{.sınırları aşan bir tartışma ile güzel bir hile.
Jonah

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

@ FrownyFrog - Harika kod!
Galen Ivanov

@Jonah - Evet, bazen çok kullanışlı. _100{. Hangi dolguları başlangıçta koyduğumu da denedim , ama sonra her satırı tersine çevirmem gerekiyordu, bu yüzden vazgeçtim.
Galen Ivanov

5

JavaScript (ES6), 84 bayt

Girdiyi [0 ... 100] ' de bir tamsayı olarak alır .

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)

Test senaryoları

Biçimlendirilmiş ve yorumlanmış

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

Jöle , 23 bayt

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

Çevrimiçi deneyin!

Girişi değiştirmek için Çaltbilgideki önceki sayıyı değiştirin. İzin verilen komut satırı bağımsız değişkenleri olmayan bir programda monadik bağlantı olarak çalışır .


Çok güzel cevap +1. Monadik bir bağlantı olarak 23 bayt ( ȷ2-> ³)
Bay Xcoder

Ben de 24 bayt almayı başardım , burada da bir ilham kaynağı olabileceğini düşündüm.
Bay Xcoder

@ Mr.Xcoder Bunu düşündüm, ama böyle bir şey kabul edip edemeyeceğimden emin değilim (sadece niladik programlarda çalışır mıydı? Hmm ...)
Outgolfer Erik

Dennis'le yaptığım bu tartışmaya bakın .
Bay Xcoder

3

SWI Prolog, 249 bayt

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

Çözüm oldukça basittir. Yordam asatırlar oluşturur, lkarakterleri arka arkaya sütunlara yazar ve rhangi karakterin yazdırılacağına karar verir.


2
G<51yerine çalışmalı G<=50.
Laikoni

3

MATL , 26 bayt

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

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

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

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

Çevrimiçi deneyin!

Her iki durumda da, her satır sağda #10 uzunluğa kadar doldurulur , bu da bu kodu iki durum arasında paylaşmamızı sağlar. 10 sayısı, takma adın T=10makul sayıda bayt kurtarması için yeterince kullanıldı .


Geçersiz! Girdi 51ve sonrası, bir satırı kaçırır.
Outgolfer Erik

@EriktheOutgolfer Bu uç durumlar.
xnor

@EriktheOutgolfer Teşekkürler, sanırım bu sorunu düzeltir mi?
xnor

Düzeltilmiş gibi görünüyor.
Outgolfer Erik

2

Yakut , 92 82 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır:

Izgaradaki her hücrenin sol alt köşeden başlayan ve n değerine bağlı olarak yatay veya dikey olarak ilerleyen bir aşamalı numarası vardır:

Eğer n>50, sayı 100-y*10+xaksi takdirde varx*10+9-y


2

Kömür , 25 bayt

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

Çevrimiçi deneyin! Bağlantı, kodun ayrıntılı versiyonudur. Açıklama:

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 Hata! Çapraz köşegen. Kontrol etmediğim için üzgünüm.
Neil

Bu aslında 25 karakter , ancak 61 bayt , değil mi?
ZeroOne

@ZeroOne Charcoal kendi kod sayfasını kullanır .
Neil

Ah anlıyorum! Açıklama için teşekkürler. :)
ZeroOne

2

Kabuk , 24 bayt

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

Çevrimiçi deneyin!

açıklama

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

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

Buradan Deneyin!

Açıklama:

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

[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

Çevrimiçi deneyin!


1

APL (Dyalog Klasik) , 33 bayt

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

Çevrimiçi deneyin!

Adám'ın cevabına dayanarak

⎕d dize '0123456789'

∘., Kartezyen ürün

kendisiyle

⍎¨ her birini değerlendirin - 10x10 0.10 matris elde edin

⍵>argümanın daha büyük olduğu için boole matrisi

ayırıcı görevi görür

(⍉+⍨)⍣(⍵≤50)Eğer ⍵≤50 çift (matris +kendisi ile birlikte) ve devrik ( )

dikey ters

'#-|'[ ]dizeyi '#-|'matrisin her bir elemanı ile indeksler


Bu açıklama mükemmel, imho.
Adam

1

q , 51 bayt

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

1

Retina , 72 62 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Düzenleme: @MartinEnder yardımı ile 10 bayt kaydedildi. Açıklama:

.+
$*|

|Verilen sayıda tekrarlayın

T`|`-`.{51,}

Ancak giriş en az 51 ise, bunları -s olarak değiştirin .

$
100$*#

100 #s ekleyin .

M!10`.{10}

10'luk 10 gruba bölün ve kalan her şeyi atın.

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

Giriş en az 51 ise, sonucu aktarın.

O`

Sonucu sıralayın.

Alternatif çözüm, ayrıca 62 bayt:

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

Transpozisyondan önce sıralama, transpozisyon için bir bayt tasarrufuna izin verir, ancak sonucu doğru sırayla almak için bir bayt maliyeti.


#İlk Oaşamada ihtiyacınız yok , çünkü $.%`en fazla olacak 9. Sonunda başka bir sıralama aşamasının pahasına döngüden kaçınarak da biraz bayt kaydedebilirsiniz, örneğin: tio.run/##K0otycxL/… Bu Maşamanın sonucunu son şekle yeniden düzenlemenin muhtemelen daha kısa bir yolu vardır. .
Martin Ender

Ah evet, örneğin düz Osahneyi sahnenin hemen sonrasına taşıyabilirsiniz M, böylece gözetleme yerine bir gözetleme kullanmaya devam edebilirsiniz.
Martin Ender

@MartinEnder İpuçlarınız için teşekkürler; Birkaç bayt daha golf başardı.
Neil


0

PHP, 119 + 1 bayt

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

Pipo ile çalıştırın -nRveya çevrimiçi deneyin .


0

Jöle , 24 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

Çok fazla üst simge kullanıyorum ...

³<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 bayt

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

Çevrimiçi deneyin!

Stdin'den okur nve bahçeyi stdout'a yazdırır.

Açıklama:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.