Садова архітектура - стиль ASCII


18

У нас є сад 10х10 метрів біля нашого будинку. Ми хочемо посадити траву і зробити терасу. Ми вирішили, як розділити сад, але ми не визначили співвідношення між кількістю трави та терасою.

Нам потрібна допомога щодо її візуалізації, а ASCII-мистецтво - це, очевидно, найкращий спосіб зробити це.


Виклик:

Візьміть ціле число в діапазоні включень [0, 100] (або необов'язково десятковий [0, 1]), який представляє, скільки відсотків саду повинна мати тераса.

Один квадратний метр тераси буде представлений або тире, -або бар |. Один квадратний метр трави буде представлений знаком хешу #.

  • Якщо кількість тераси менше або дорівнює 50%, то сад слід накрити брусками, починаючи з нижнього лівого кута, і заповнити вертикально, потім горизонтально.
  • Якщо кількість тераси більше 50%, тоді ми хочемо, щоб настил був іншим способом (тире замість брусків), починаючи з нижнього лівого кута, і заповнюючи горизонтально, потім вертикально.

Приклади:

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

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

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

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

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

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

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

Це тому найкоротший код у байтах виграє. Стандартні правила щодо вводу / виводу. Це ASCII-art, тому висновок повинен виглядати як наведені вище приклади. Тобто виведення ["|", "|" ...]не в порядку.

Пояснення заохочуються як завжди :)


2
Перше моє враження було, що два випадки означатимуть вирішення двох окремих завдань з гольфу, але існує загальна структура, яка дозволяє обмінюватися кодом.
xnor

Відповіді:


7

APL (Dyalog) , 34 байти

Функція анонімного префікса, що очікує ціле число в діапазоні 0–100. Передбачає, що ⎕IO( I ndex O rigin) бути 0, що є типовим для багатьох систем.

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

Спробуйте в Інтернеті!

{} Лямбда; є аргументом:

'#-|[] Індексувати рядок із наступним масивом:

50≥⍵ 1, якщо 50 більше аргументу або дорівнює, інакше 0

s← зберігати в s (для s mall)

1+ приріст

⍵⍴ циклічно r змінюється до довжини аргументу

100↑ візьміть першу сотню цього, набивши нулями

10 10⍴r змініть на десять рядків і десять стовпців

 урожай, який (відокремлюється sвід 10 10)

⍉⍣s перенести, якщо невеликий

 перевернути догори дном


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

1
Дуже близький до мого підходу:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
Ерік Атголфер

@EriktheOutgolfer вам потрібно лише99/'#'
ngn

@ngn oh right,
Erik the Outgolfer

1
@ngn Це зовсім інше. Чому ви не опублікуєте це?
Адам

5

J , 39, 38 37 байт

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

Як це працює:

                     _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

Спробуйте в Інтернеті!


{.з аргументом понад межі - приємна хитрість.
Йона

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

@ FrownyFrog - Чудовий код!
Гален Іванов

@Jonah - Так, іноді це дуже зручно. Я також спробував _100{. заповнити заповнення на початку, але потім мені потрібно було змінити кожен ряд, тому я відмовився від нього.
Гален Іванов

5

JavaScript (ES6), 84 байти

Приймає вхід як ціле число в [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)

Тестові справи

Відформатовано та прокоментовано

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

Желе , 23 байти

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

Спробуйте в Інтернеті!

Змініть номер раніше Çу нижньому колонтитулі, щоб змінити вхід. Працює як монадичне посилання в програмі без аргументів командного рядка, що дозволено .


Дуже приємна відповідь +1. 23 байти як монадичне посилання ( ȷ2-> ³)
Містер Xcoder

Мені також вдалося отримати 24 байти , подумав, що це може бути джерелом натхнення і тут.
Містер Xcoder

@ Mr.Xcoder Я про це думав, але я не дуже впевнений, чи можу я припустити таке (працював би лише в програмах з ніладиків? Хм ...)
Ерік Атголфер

Дивіться цю дискусію, яку я мав з Деннісом.
Містер Xcoder

3

SWI Prolog, 249 байт

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створює рядки, lзаписує символи в стовпці підряд і rвирішує, який символ слід роздрукувати.


2
G<51повинен працювати замість G<=50.
Лайконі

3

MATL , 26 байт

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

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

'|-#'     % 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 байт

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

Спробуйте в Інтернеті!

В обох випадках кожен рядок розміщено праворуч #на довжину 10, що дозволяє нам поділити цей код між двома справами. Число 10 використовувалося досить часто, щоб псевдонім T=10зберігав пристойну кількість байтів.


Недійсний! Після введення 51та після цього пропускає рядок.
Ерік Аутгольфер

@EriktheOutgolfer Ці крайні випадки.
xnor

@EriktheOutgolfer Спасибі, я думаю, це це виправляє?
xnor

Схоже, це виправлено.
Ерік Аутгольфер

2

Рубі , 92 82 байт

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

Спробуйте в Інтернеті!

Як це працює:

Кожна комірка в сітці має прогресивне число, починаючи з нижнього лівого кута і продовжуючись горизонтально або вертикально, залежно від значення n:

Якщо n>50, число 100-y*10+xінакше цеx*10+9-y


2

Вугілля деревне , 25 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

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 На жаль, неправильна діагональ. Вибачте, що не перевірили.
Ніл

Це насправді 25 символів , але 61 байт , чи не так?
ZeroOne

@ZeroOne Деревне вугілля використовує власну кодову сторінку .
Ніл

О Я бачу! Дякую за пояснення. :)
ZeroOne

2

Лушпиння , 24 байти

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

Спробуйте в Інтернеті!

Пояснення

↔?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 байт

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

Спробуйте тут!

Пояснення:

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

APL (Dyalog Classic) , 33 байти

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

Спробуйте в Інтернеті!

на основі відповіді Адама

⎕d - це рядок '0123456789'

∘., Декартовий продукт

з самим собою

⍎¨ оцініть кожен - отримайте 10x10 матрицю 0..99

⍵>булева матриця, де аргумент більше

виконує роль сепаратора

(⍉+⍨)⍣(⍵≤50)якщо ⍵≤50 подвоїти матрицю ( +з собою) і перенести ( )

вертикальний зворотний

'#-|'[ ]індексувати рядок '#-|'з кожним елементом матриці


Це пояснення відмінне, імхо.
Адам


1

Сітківка , 72 62 байти

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

Спробуйте в Інтернеті! Посилання включає тестові випадки. Редагувати: збережено 10 байт за допомогою довідки @MartinEnder. Пояснення:

.+
$*|

Повторіть |задану кількість разів

T`|`-`.{51,}

Але якщо вхід був принаймні 51, змініть їх на -s.

$
100$*#

Додайте 100 #с.

M!10`.{10}

Розділіть на 10 груп з 10, відкинувши все, що залишилося.

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

Якщо вхід був принаймні 51, перенесіть результат.

O`

Сортуйте результат.

Альтернативне рішення, також 62 байти:

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

Сортування перед транспозицією дозволяє зберегти байт на умові для транспозиції, але коштує байт, щоб отримати результат у правильному порядку.


Вам не потрібно #на першому Oетапі, тому що $.%`буде в кращому випадку 9. Ви також можете зберегти деякий байт, уникаючи циклу ціною іншого етапу сортування в кінці, наприклад, такий: tio.run/##K0otycxL/… Мабуть, існує навіть коротший спосіб переставити результат цього Mетапу у остаточну форму .
Мартін Ендер

Ага так, наприклад, ви можете перемістити звичайну Oсценку вправо після Mетапу, так що ви можете продовжувати використовувати lookahead замість огляду.
Мартін Ендер

@MartinEnder Дякую за підказки; Я зміг відіграти ще кілька байтів.
Ніл



0

Желе , 24 байти

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

Спробуйте в Інтернеті!

Як це працює

Я використовую занадто багато суперскриптів ...

³<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 байти

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

Спробуйте в Інтернеті!

Читає n від stdin і друкує сад до stdout.

Пояснення:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.