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


18

У нас есть квадратный сад 10х10 метров за пределами нашего дома. Мы хотим посадить траву и сделать террасу. Мы решили, как разделить сад, но не определили соотношение количества травы и террасы.

Нам нужна помощь, чтобы визуализировать это, и ASCII-art, несомненно, является лучшим способом сделать это.


Вызов:

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

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

  • Если количество террасы меньше или равно 50%, то сад должен быть покрыт решетками, начиная с нижнего левого угла, и заполнять вертикально, а затем горизонтально.
  • Если количество террас составляет более 50%, то мы хотим, чтобы настил был другим способом (штрихи вместо столбцов), и начинался в нижнем левом углу, а затем заливался горизонтально, а затем вертикально.

Примеры:

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

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

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

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

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

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

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

Это поэтому выигрывает самый короткий код в байтах. Стандартные правила, касающиеся ввода / вывода. Это ASCII-арт, поэтому вывод должен выглядеть как в приведенных выше примерах. Т.е. вывод ["|", "|" ...]не в порядке.

Пояснения приветствуются как всегда :)


2
Мое первое впечатление состояло в том, что эти два случая означали бы решение двух отдельных задач игры в гольф, но есть общая структура, которая делает целесообразным разделение кода между ними.
xnor

Ответы:


7

APL (Dyalog) , 34 байта

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

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

Попробуйте онлайн!

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

'#-|[] Индексировать строку следующим массивом:

50≥⍵ 1, если 50 больше или равно аргументу, иначе 0

s← хранить в S (для S Молл)

1+ приращение

⍵⍴ циклический г eshape к аргументу длине

100↑ возьми первую сотню из этого, дополнив нулями

10 10⍴г eshape до десяти строк и столбцов десяти

 дать это (отделяется sот 10 10)

⍉⍣s транспонировать, если маленький

 перевернуть вверх дном


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

1
Очень близко к моему подходу:{⊖⍉⍣c⊢10 10⍴(⍵/'-|'⊃⍨c←⍵≤50),100/'#'}
Эрик Outgolfer

@EriktheOutgolfer вам нужно только99/'#'
нгн

@ngn, верно,
Эрик Аутгольфер

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 - Отличный код!
Гален Иванов

@Джона - Да, иногда это очень удобно. Я также попробовал, _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-> ³)
Mr. Xcoder

Мне тоже удалось получить 24 байта , но я подумал, что это может быть источником вдохновения и здесь.
г-н Xcoder

@ Mr.Xcoder Я действительно думал об этом, но я не совсем уверен, могу ли я предположить такую ​​вещь (будет работать только в ниладных программах? Хмм ...)
Эрик Outgolfer

Посмотрите эту дискуссию, которую я имел с Деннисом.
г-н Xcoder

3

SWI Пролог, 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После ввода и после он пропускает строку.
Эрик Outgolfer

@EriktheOutgolfer Эти крайние случаи.
xnor

@EriktheOutgolfer Спасибо, я думаю, это исправит это?
xnor

Похоже, это исправлено.
Эрик Outgolfer

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 Charcoal использует свою собственную кодовую страницу .
Нил

А ну понятно! Спасибо за объяснение. :)
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

Retina , 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сценой, чтобы вы могли продолжать смотреть вперед, а не смотреть назад.
Мартин Эндер

@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 из стандартного ввода и печатает сад в стандартный вывод.

Объяснение:

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.