Намалюйте сходи і гірку


24

Ваше завдання - створити програму або функцію, яка приймає в якості введення натуральне число ( n) від 1 до 25 (включно) і друкує ізометричне зображення слайда та драбини з nкількістю стрічок.

Характеристики сходів і слайдів

Сходи завжди орієнтовані зліва, а гірка - праворуч. Ми переглядаємо його з боку сходів, тому частина слайда затьмарена на трьох верхніх рівнях. Штани представлені чотирма штрихами ( ----), а сторони драбини і ковзають косою рисою ( /і \). Далі наведена схема для представлення шаблонів просторів, необхідних для слайда з п’ятьма стулками.

Slide              Blank space count
    /----/\        1234/----/\ 
   /----/  \       123/----/12\ 
  /----/    \      12/----/1234\ 
 /----/ \    \     1/----/1\1234\ 
/----/   \    \    /----/123\1234\

Приклади

>>1
/----/\

>>3
  /----/\ 
 /----/  \ 
/----/    \ 

>>4
   /----/\ 
  /----/  \ 
 /----/    \ 
/----/ \    \ 

>>10
         /----/\ 
        /----/  \ 
       /----/    \ 
      /----/ \    \ 
     /----/   \    \ 
    /----/     \    \ 
   /----/       \    \ 
  /----/         \    \ 
 /----/           \    \ 
/----/             \    \ 

Це код-гольф, тому відповідь з найменшим числом байтів виграє.

Примітка: пробіл білого кольору є прийнятним на виході, доки він не перевищує довжину рядка.


14
Ви б зламали ноги в кінці цього слайда!
Фаталізувати

13
@ Фаталізувати це було б ... Фатально.
Вен

7
@Fatalize бонусні бали для вас, якщо ви намалюєте басейн на дні;)
атласолог

8
@atlasologist Басейн крові?
Ніл

Вибачте, якщо це німе питання, але пара нижче відповідей (Python, JavaScript) визначає функцію, яка повертає рядок, а не друкує її. Це кошер?
Йорданія

Відповіді:


17

Сітківка , 81 72 52 байт

Кількість байтів передбачає кодування ISO 8859-1.

.+
$* /\    \
^.

+` /(.+)$
$&¶$%`/  $1
/.{5}
/----/

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

Пояснення

Програма складається з чотирьох етапів, кожен з яких є заміною регулярних виразів (з парою особливостей Retina). Я буду використовувати 5приклад для пояснення.

1 етап

.+
$* /\    \

Це перетворює вхід nу nпробіли, за /\ \якими стане вершиною драбини / слайда:

     /\    \

Поки ми просто покажемо слайд в повному обсязі і будемо представляти сходи лише лівою лівою рукою /.

2 етап

^.

На жаль, nпробілів на один більше, ніж нам потрібно, тому ми знову видаляємо перший символ. Зараз у нас є:

    /\    \

3 етап

+` /(.+)$
$&¶$%`/  $1

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

+Каже Retina повторити цей етап в циклі , поки на виході не перестає змінюватися (в даному випадку, так як регулярний вираз зупиняє узгодження). Що стосується самого регулярного виразів, ми просто співпадаємо з /останнім рядком і всім після нього, і ми також співпадаємо з одним пробілом перед ним, а це означає, що це вже не може відповідати, коли /вже досяг першої колонки.

Ось що ми замінюємо цим:

 $&    The match itself. We don't want to remove the line we already have.
 ¶     A linefeed, because we want to append a new line.
 $%`   This is a very recent addition to Retina: it's like the normal $` but
      is bounded by linefeeds. That means this inserts everything in front
      of the match which is on the same line. In particular this one space
      less than the indentation of the matched line, hence we are shifting
      the / one column left.
 /     A literal /, representing the left edge of the ladder.
>  <   Two spaces, so that we can shift the slide one column right.
 $1    Capturing group 1 which contains the slide and its separation from
      the ladder.

Отже, при кожній ітерації це додає один рядок до рядка, поки ми не закінчимо це:

    /\    \
   /  \    \
  /    \    \
 /      \    \
/        \    \

Етап 4

/.{5}
/----/

Все, що залишилося, - це сходи праворуч. Це дійсно просто, ми просто узгоджуємо наступні /та 5 наступних символів і вставляємо правильне представлення сходів, тим самим переосмислюючи слайд або пробіли, які вже є:

    /----/\
   /----/  \
  /----/    \
 /----/ \    \
/----/   \    \

9

V , 38, 37, 36, 34, 33, 32, 31, 30 29 байт

Àé r\2é/4é-òhYpX$2P^ò3GEòjlr\

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

Я можу наздогнати Осабі. На один байт коротше, ніж Осабі. \o/Зв'язали з 2-х! На один байт коротше!

Іншими новинами, це, безумовно, найдовший закреслений заголовок, який я коли-небудь робив.

Пояснення:

Àé              "Insert 'arg1' spaces
   r\           "Turn the last one into a '\'
     2é/        "Insert 2 '/'
        4é-     "Insert 4 '-'

ò        ò      "Recursivly:
 h              "  Move one to the left
  Yp            "  Duplicate this line
    X           "  Delete one space from the left
     $2P        "  Paste two spaces at the end of this line
        ^       "  Move back to the beginning of this line.

Це триватиме до тих пір, поки не з’явиться помилка, яка завдяки команді "перемістити ліворуч" ("h") буде "arg1" разів.

Тепер нам просто потрібно додати внутрішню ніжку

3GE             "Move to the second slash of line 3
   ò    ò       "Recursively: (The second 'ò' is implicit)
    jl          "  Move down and to the right
      r\        "  And replace the character under the cursor with a '\'

Неконкурентна версія (28 байт)


8

Pyth, 39 35 байт

VQ++*dt-QN"/----/">+*+ddN"\    \\"5

Пояснення:

VQ                                  # Interate over 0 -> Q-1 (Q is the input)
  +                                 # Concatenate the 2 halfs of the slide
   +                                # Concatenate the whitespace block and the ladder
    *d                              # Multiply d (whitespace) by this number \/
      t-QN                          # Calculate the amount of spaces before : input - step of the iterarion -1
          "/----/"                  # Ladder
                  >               5 # Remove the first 5 chars  from the string generated in the following lines 
                   +                # Concatenate the whitespace block and the slide
                    *+ddN           # Multiply "+dd" (2 whitespace) by the step of the iterarion to generate the space between the ladder and the slide
                         "\    \\"  # Slide

Тестуйте тут


8

2able , 40 36 32 30 байт

Гммм, V підходить надзвичайно близько ...

F¹N-<ð×…/--«ðð«N×…\  ««5F¦}¶

Використовує кодування CP-1252 . Спробуйте сумісну з 05AB1E версію! .


І бій вирує на: codegolf.stackexchange.com/a/85985/31716 :P
DJMcMayhem

@DrGreenEggsandIronMan Hmmm !!?!?!
Аднан

Є ще один, і ще один раз я повернуся додому. Також я не перемикаю мови. : P
DJMcMayhem

7

PowerShell v2 +, 99 90 82 байт

param($n)1..$n|%{" "*($n-$_)+"/----/"+-join(" "*($_+$i++)+"\    \")[6..(6+$_+$i)]}

Приймає вхідний сигнал $n, починається цикл від 1до $nз |%{...}. Кожну ітерацію ми будуємо рядок. Починаємо з відповідної кількості просторів " "*($n-$_)і драбини "/----/".

До цього ми додаємо ще один рядок, який був нарізаний [...]та -joinпідключений назад. Другий рядок - слайд, і ми припускаємо, що весь слайд завжди видно. Це кількість пробілів до запуску слайда " "*($_+$i++), а за ним - сам слайд "\ \". Це нарізається діапазоном, обчисленим як частина "пробілів плюс слайд", яка частково прихована драбиною.

Приклади

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 7
      /----/\
     /----/  \
    /----/    \
   /----/ \    \
  /----/   \    \
 /----/     \    \
/----/       \    \

PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 15
              /----/\
             /----/  \
            /----/    \
           /----/ \    \
          /----/   \    \
         /----/     \    \
        /----/       \    \
       /----/         \    \
      /----/           \    \
     /----/             \    \
    /----/               \    \
   /----/                 \    \
  /----/                   \    \
 /----/                     \    \
/----/                       \    \

7
+1, тому що косої риски у вашому каталозі співпадають із косою рисою тестового виводу. :D
DJMcMayhem

Ваша \golfingпапка має бути дуже організованою._.
Conor O'Brien

6

Python 2 - 79 76 75 байт

x=input()
for i in range(x):print(x-i)*' '+'/----/'+(i*'  '+'\\    \\')[5:]

Дякую Hubert Grzeskowiak за те, що "дискваліфікував" мене з моменту, коли моя програма надрукувала насправді, зберегла 3 байти! Дякуємо також Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ за збереження ще 1 байта!


Приємно! До речі, лямбда гадав, я думаю, оскільки строго кажучи це якась функція. Використовуючи лямбда, ви можете зберегти нову лінію та пробіл :-)
Hubert Grzeskowiak

Зачекайте, я насправді спробував це з лямбда і не зміг його працювати. Думаю, це копія друку?
Hubert Grzeskowiak

@HubertGrzeskowiak Ну, це залежить від специфікацій виклику. Якщо питання запитав програму / функцію, яка повертає рядкове представлення слайда, будь-який із моїх відповідей був би дійсним. Оскільки він вказує «друкувати», як ви вказали, мені було б або потрібно назвати функцію лямбда і надрукувати виклик до неї, або зробити те, що я робив вище, що було коротше.
Cowabunghole

Технічні характеристики не говорять про те, що функцію потрібно називати, або називати ;-)
Технічні

Перетворіть його у повну програму: замініть def f(x):на x=input()та видаліть відступ у другому рядку. Це заощадить 1 байт.
Ерік Аутгольфер

6

Vim, 71 натискання клавіш

Це такий дурний спосіб зробити це, але це трохи весело. Введення подається у вигляді текстового файлу з єдиним рядком, що містить ціле число. Це, ймовірно, досить головоломно, але це буде робити зараз ( редагувати: переключений стиль контрольних символів на запит ):

A@qyyPgg<c-v><c-v>GkI <c-v><esc>G$i  <c-v><esc><esc>
Tq"qDI/----/\^[lD@"ddh<c-v>god:%s/     \\/\\    \\<cr>

<c-v>, <esc>і <cr>всі це окремі натискання клавіш; ctrl + v, втеча та повернення каретки (введення) відповідно. Для простої для засвоєння версії з правильними літералами, ось ось ladder.keysзапуск файлу xxd:

00000000: 4140 7179 7950 6767 1616 476b 4920 161b  A@qyyPgg..GkI ..
00000010: 4724 6920 2016 1b1b 5471 2271 4449 2f2d  G$i  ...Tq"qDI/-
00000020: 2d2d 2d2f 5c1b 6c44 4022 6464 6816 676f  ---/\.lD@"ddh.go
00000030: 643a 2573 2f20 2020 2020 5c5c 2f5c 5c20  d:%s/     \\/\\
00000040: 2020 205c 5c0d 0d0a                         \\...

Щоб спробувати його (припустивши, що нікс з відповідними інструментами), зробіть вищесказане, запустіть його xxd -r та покладіть у файл ladder.keys. Створіть файл ladder.txtіз цілим числом. Потім зробіть:

vim -s ladder.keys -u NONE ladder.txt

Ми зазвичай пишемо, ^Vяк <c-v>тут.
Leaky Nun

@Jordan Це один натискання клавіш кожен, рахуючи модифіковані клавіші (shift, ctrl або alt з іншою клавішею) як один натиск клавіші. Клавіші натискання клавіш - Ctrl + v, втеча та вхід.
algmyr

@algmyr Моя помилка. Я неправильно прочитав вашу відповідь раніше.
Йорданія

6

баш, 61

for((;i<$1;)){ printf "%$[$1+i]s\    \^M%$[$1-++i]s/----/\n";}

де ^Mбуквальне повернення вагона

$ ./ladder 1
/----/\
$ ./ladder 4
   /----/\
  /----/  \
 /----/    \
/----/ \    \
$ ./ladder 10
         /----/\
        /----/  \
       /----/    \
      /----/ \    \
     /----/   \    \
    /----/     \    \
   /----/       \    \
  /----/         \    \
 /----/           \    \
/----/             \    \

Я думаю, у вас повинно бути один пробіл між /і "\" у 4-му ряду, а також менше місця між краями слайдів.
Лейбруг

Це повинно бути 4 тире, а не 5.
algmyr

@algmyr дякую, що економить 2 байти
izabera

5

JavaScript (ES6), 79 байт

f=
n=>" ".repeat(n).replace(/./g,"$'/$`$`\\    \\\n").replace(/\/...../g,"/----/")
;
<input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o>

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


4

Рубін, 61 байт

->n{n.times{|i|puts"%*s\\    \\\r%*s----/"% [n+i,"",n-i,?/]}}

Безумовно

->(num_rows) {
  num_rows.times {|row_idx|
    puts "%*s\\    \\\r%*s----/" % [ num_rows + row_idx, "", num_rows - row_idx, "/" ]
  }
}

Я міг би зберегти два байти, використовуючи '%*s\ \^M%*s----/'(де ^Mбуквальне повернення каретки) для рядка формату, але потім Ruby друкує попередження " warning: encountered \r in middle of line, treated as a mere space". ¯ \ _ (ツ) _ / ¯

Попереднє рішення (64 байти)

->n{n.times{|i|puts" "*(n+i)+"\\    \\\r"+" "*(n-i-1)+"/----/"}}

3

Пакет, 194 байт

@echo off
for /l %%i in (1,1,%1)do call:l %1 %%i
exit/b
:l
set s=\    \
for /l %%j in (1,1,%2)do call set s=  %%s%%
set s=/----/%s:~7%
for /l %%j in (%2,1,%1)do call set s= %%s%%
echo%s%

Виявилося досить просто: відступіть слайд, видаліть перші 7 символів, відступіть сходи, видаліть провідний пробіл. Цей останній біт має на увазі невелику хитрість!


2

Java, 116 байт

c->{for(int i=0;i<c;i++)System.out.format("%"+(5+c-i)+"s%"+(i<3?i*2+1:2*(i-2))+"s%5s\n","/----/","\\",i<3?"":"\\");};

На жаль, ви не можете [легко] дублювати рядки на Java, тому я в кінцевому підсумку зловживаю функцією форматування.


2

Скала, 95 байт

def l(n:Int)=for(i<- 0 to n-1){println(" "*(n-i-1)+"/----/"+("  "*i+"\\    \\").substring(5))}

2

Haskell, 81 байт

a n=[1..n]>>" "
f n=[1..n]>>=(\i->a(n-i)++"/----/"++drop 7(a(2*i)++"\\    \\\n"))

do i<-[1..n];a(n-i)++"/----/"++drop 7(a(2*i)++"\\ \\\n")економить два байти.
Лінн

0

вузький , неконкурентний, 386 байт

init .
define @ curry push .
define ~ curry exec .--func
alias $ strap
alias ' string
set n set m cast number arg number 0
set s empty string
label l
@ get n
set n ~ dec
@ space
@ get n
$ ~ repeat
$ ' /----/
@ space
@ get m
@ get n
@ ~ sub
@ ~ dec
@ number 2
@ ~ mul
$ ~ repeat
$ ' \
$ newline
@ get n
@ number 0
if ~ more
goto l
@ $
@ regex gm '   ( {4})(?=.$)
@ '  \$1
print ~ replace

Я офіційно зробив найголовнішу можливу мову. Я зробив коментар жартома та сарказмом. Будь ласка, заспокойтесь. Інструкції про те, як запустити репортаж github, пов'язаний у заголовку.

Безумовно

init .
set n set m cast number arg number 0
set s empty string
label loop
    push . get n
    set n exec .--func dec
    push . space
    push . get n
    strap exec .--func repeat
    strap string /----/
    push . space
    push . get m
    push . get n
    push . exec .--func sub
    push . exec .--func dec
    push . number 2
    push . exec .--func mul
    strap exec .--func repeat
    strap string \
    strap newline
    push . get n
    push . number 0
    if exec .--func more
        goto loop

push . strap
push . regex gm string   ( {4})(?=.$)
push . string  \$1
print exec .--func replace

1
" Я офіційно зробив наймовнішу можливу мову ". Вибачте, ви чули про AppleScript?
Аддісон Кримп

@VTCAKAVSMoACE Добре, давайте зробимо угоду. Ви відповідаєте на це запитання в яблучному скрипті. Тоді я скажу вам, що це більш багатослівно.
Конор О'Браєн

4
Це недостатньо багатослівно, якщо ви можете скасувати його.
Ніл

@VTC, TimmyD та Neil: Geez. Ви щасливі зараз?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Ми, очевидно, жартуємо, лол
Addison Crump
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.