Супер Квадратный Дождь


11

Зимняя распродажа Scream ™ открыта, и вы просто захватили себя интенсивной минималистической игрой в жанре Super Square . Поиграв в нее, вы приходите к осознанию того, что либо игра просто смехотворно сложна, либо вы просто очень плохи в этом. В частности, есть такая «дождевая» модель, которая, кажется, заставляет вас каждый раз ...

введите описание изображения здесь

Разочаровавшись, вы решаете поставить себе другую задачу: нарисуйте рисунок дождя в искусстве ASCII!

вход

Входные данные - это одно положительное целое число, указывающее размер шаблона n, заданное через STDIN или аргумент функции.

Выход

Выходные данные - это шаблон дождя в указанном размере, возвращенный в виде строки или напечатанный через STDOUT. Впереди или после пробела до или после всего изображения все в порядке. Кроме того, изображение не обязательно должно находиться на одном уровне слева от экрана, но должно быть четко различимым.

Вот n = 10:

 ...................
| ----------------- |
|  ...............  |
| | ------------- | |
| |  ...........  | |
| | | --------- | | |
| | |  .......  | | |
| | | | ----- | | | |
| | | |  ...  | | | |
| | | | | - | | | | |
| | | | |   | | | | |
| | | | | - | | | | |
| | | |  ...  | | | |
| | | | ----- | | | |
| | |  .......  | | |
| | | --------- | | |
| |  ...........  | |
| | ------------- | |
|  ...............  |
| ----------------- |
 ...................

Вот n = 5:

 --------- 
  .......  
 | ----- | 
 |  ...  | 
 | | - | | 
 | |   | | 
 | | - | | 
 |  ...  | 
 | ----- | 
  .......  
 --------- 

И, наконец, вот n = 1(только две самые внутренние стены):

 - 

 - 

Конструкция (для большей ясности)

Игровая зона разделена на две пары квадрантов следующим образом:

 AAAAAAAAA
B AAAAAAA B
BB AAAAA BB
BBB AAA BBB
BBBB A BBBB
BBBBB BBBBB
BBBB A BBBB
BBB AAA BBB
BB AAAAA BB
B AAAAAAA B
 AAAAAAAAA

Верхний / нижний квадранты должны чередоваться между горизонтальными стенками, представленными дефисами -, и промежутками, заштрихованными точками .. Левый / правый квадранты должны чередоваться между пространствами и вертикальными стенами, представленными трубами |. Основные диагонали пусты и всегда должны быть заполнены пробелами.

Размер дождевого рисунка nимеет 2nстены со стенами из верхнего / нижнего квадрантов, ближайшими к центру, и стены, чередующиеся между квадрантами, когда мы удаляемся от центра.

счет

Это код-гольф, поэтому выигрывает код в наименьшем количестве байтов.


4
Эта игра ... Я знаю, о чем ты говоришь. Он украл как 40 часов моей жизни, пока я не победил. ^^
ThreeFx

Ответы:


3

CJam, 93 87 78 61 59 байт

ri:K_+){K" |"*KKI-z:I-I2%:L+<SL>\+_W%L'-'.?I2*Ig-*@I0=>N}fI

Принимает значение nчерез STDIN

Несколько примеров:

1
 - 

 - 
2
 ... 
| - |
|   |
| - |
 ... 
5
 --------- 
  .......  
 | ----- | 
 |  ...  | 
 | | - | | 
 | |   | | 
 | | - | | 
 |  ...  | 
 | ----- | 
  .......  
 --------- 
10
 ................... 
| ----------------- |
|  ...............  |
| | ------------- | |
| |  ...........  | |
| | | --------- | | |
| | |  .......  | | |
| | | | ----- | | | |
| | | |  ...  | | | |
| | | | | - | | | | |
| | | | |   | | | | |
| | | | | - | | | | |
| | | |  ...  | | | |
| | | | ----- | | | |
| | |  .......  | | |
| | | --------- | | |
| |  ...........  | |
| | ------------- | |
|  ...............  |
| ----------------- |
 ................... 

Это может быть много в гольфе, что я сделаю первым делом завтра.

Попробуйте онлайн здесь


5

Haskell 150 байт

Я понимаю, что это не победит, просто хотел опубликовать мой первый Codegolf: D

q n=putStr$unlines$iterate(\l->let[a,b]=if l!!0!!1=='-'then"|."else" -";c=[a:s++[a]|s<-l];t=' ':[b|x<-l!!0]++" "in t:c++[t])[" - ","   "," - "]!!(n-1)

Используйте, загрузив в GHCi и позвонив, q nгде nразмер.

Несколько примеров:

*Main> q 1
 - 

 - 
*Main> q 2
 ... 
| - |
|   |
| - |
 ... 
*Main> q 5
 --------- 
  .......  
 | ----- | 
 |  ...  | 
 | | - | | 
 | |   | | 
 | | - | | 
 |  ...  | 
 | ----- | 
  .......  
 --------- 
*Main> q 10
 ................... 
| ----------------- |
|  ...............  |
| | ------------- | |
| |  ...........  | |
| | | --------- | | |
| | |  .......  | | |
| | | | ----- | | | |
| | | |  ...  | | | |
| | | | | - | | | | |
| | | | |   | | | | |
| | | | | - | | | | |
| | | |  ...  | | | |
| | | | ----- | | | |
| | |  .......  | | |
| | | --------- | | |
| |  ...........  | |
| | ------------- | |
|  ...............  |
| ----------------- |
 ................... 

Кто-то может, вероятно, сделать лучше, я довольно плохо знаком с Haskell.


6
Не волнуйся о победе. ;) Победа для CJam и Pyth. Игра в гольф на других языках - это то, что нужно отбивать заявки в той же «весовой категории» и изучать некоторые новые неясные особенности вашего языка. Добро пожаловать в PPCG!
Мартин Эндер

3

Python, 204 , 198 , 191 байт

r=lambda a,b,d=' ':d.join((a,b,a[::-1]))
def f(s,i,n):d=[r(s[:i],'.-'[(n-i)%2]*((n-i)*2-1))];return i==n and[r(s,' '*(2*(i%2)+1),'')]or d+f(s,i+1,n)+d
g=lambda n:'\n'.join(f('| '*(n/2),0,n))

«r» - это служебная функция, которая записывает «b» в окружении отраженного «a» с необязательным разделителем (да, параметры лямбды могут иметь значения по умолчанию). «f» является рекурсивным, генерируя стороны и средние части для каждого уровня «g» - это функция дождя, которая может быть вызвана с целым числом для возврата запрошенного текста.


Я только что понял, что забыл разрешить функции, которые возвращают строки, которые я обычно разрешаю (редактировал это в). Вы все еще можете сэкономить на нескольких символах, удалив пробелы и поместив строки 4, 5 в одну строку :)
Sp3000

С небольшим количеством оценки короткого замыкания вы можете получить это до 190 :) ссылка
Sp3000

Извините, я случайно проголосовал за вас. Я могу отменить это, если вы редактируете.
nutki

1

Perl 5: 74 байта (код 73 + -p)

#!perl -p
s/.*/ /;$a=qw(- .)[$|--]x
s/.+/$"$&$"/g,s/^|\z/ $a 
/g,$"^="\\"for($_)x$&

Принимает параметр на входе (символ конца строки требуется для правильной функции):

$ perl rain.pl <<<"3"
 ----- 
  ...  
 | - | 
 |   | 
 | - | 
  ...  
 ----- 

Ungolfed:

                         # Read the input line into $_ (-p)
s/.*/ /;                 # Replace the input with a space (plus the original eol), saves the parameter in $&
for(($_)x$&) {           # Iterate $& times without affecting $_
  $c=s/.+/$"$&$"/g;      # Add $" (initially space) at the start and the end of each line, stores number of lines in $c
  $a=("-",".")[$|--]x$c; # Set $a to $c times minus or dot using magic $| (which iterates over 1 and 0 on decrement)
  s/^|\z/ $a \n/g;       # Equivalent to $_=" $a \n$_ $a \n"
  $"^="\\";              # Alternate $" between space and bar using the string xor 
}
                         # Print $_ (-p)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.