Супер квадратний дощ


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

З невеликою оцінкою короткого замикання ви можете
звести

Вибачте, я прихильнив вас випадково. Я можу його скасувати, якщо ви редагуєте.
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"
 ----- 
  ...  
 | - | 
 |   | 
 | - | 
  ...  
 ----- 

Безголівки:

                         # 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.