Codegolf — Нарисуй Лестницу И Скатись

  • Автор темы 13dizel
  • Обновлено
  • 23, Oct 2024
  • #1

Ваша задача — создать программу или функцию, которая принимает на вход натуральное число (

 
 >>1
/----/\

>>3

/----/\ 

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

>>4

/----/\ 

/----/  \ 

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

>>10

/----/\ 

/----/  \ 

/----/    \ 

/----/ \    \ 

/----/   \    \ 

/----/     \    \ 

/----/       \    \ 

/----/         \    \ 

/----/           \    \ 
/----/             \    \ 
 
) between 1 and 25 (inclusive) and prints an isometric representation of a slide and ladder with Slide Blank space count /----/\ 1234/----/\ /----/ \ 123/----/12\ /----/ \ 12/----/1234\ /----/ \ \ 1/----/1\1234\ /----/ \ \ /----/123\1234\ количество ступенек.

Характеристики лестниц и слайдов

Лестница всегда ориентирована слева, а слайд – справа. Мы смотрим на него со стороны лестницы, поэтому часть слайда на трех верхних уровнях скрыта. Ступени представлены четырьмя тире ( \ ) and the sides of the ladder and slide by slashes ( / и ---- ). The following is a diagram to represent the patterns of spaces needed for a slide with five rungs.

n

Примеры

n

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

Примечание. В выводе допустимы конечные пробелы, если они не превышают длину строки.

#код-гольф #ascii-art

13dizel


Рег
26 Nov, 2005

Тем
72

Постов
199

Баллов
569
  • 26, Oct 2024
  • #2

Сетчатка, 81 72 52 байта

Подсчет байтов предполагает кодировку ISO 8859-1.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 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
 

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

Объяснение

Программа состоит из четырех этапов, каждый из которых представляет собой замену регулярных выражений (с парой функций, специфичных для Retina). Я буду использовать ввод 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 as an example for the explanation.

Этап 1

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

Это превращает вход def l(n:Int)=for(i<- 0 to n-1){println(" "*(n-i-1)+"/----/"+(" "*i+"\\ \\").substring(5))} into 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?"":"\\");}; пробелы, за которыми следует @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% which will become the top of the ladder/slide:

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

Пока мы покажем слайд полностью и представим лестницу только ее левой рукой. warning: encountered \r in middle of line, treated as a mere space .

Этап 2

^M

К сожалению, '%*s\ \^M%*s----/' spaces are one more than we need, so we remove the first character again. We've now got:

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

Этап 3

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

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

n tells Retina to repeat this stage in a loop until the output stops changing (in this case, because the regex stops matching). As for the regex itself, we simply match the <input type=number min=0 oninput=o.textContent=f(this.value)><pre id=o> в последней строке и во всем, что после нее, а также мы сопоставляем один пробел перед ней, что означает, что это больше не может совпадать один раз f= n=>" ".repeat(n).replace(/./g,"$'/$`$`\\ \\\n").replace(/\/...../g,"/----/") ; has reached the first column.

Вот чем мы это заменим:

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

Таким образом, на каждой итерации к строке добавляется одна строка, пока мы не получим следующее:

^M

Этап 4

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

Осталось только правильно поставить лестницу. Это действительно просто, мы просто сопоставляем vim -s ladder.keys -u NONE ladder.txt and the next 5 characters and insert the correct ladder representation, thereby overriding the slide or spaces that are already there:

ladder.txt ||answer||

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

ladder.keys

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

я мощь догнать Осаби. На один байт короче Осаби. xxd -r Tied with 2sable! One byte shorter!

Что касается других новостей, это определенно самый длинный зачеркнутый заголовок, который я когда-либо делал.

Объяснение:

00000000: 4140 7179 7950 6767 1616 476b 4920 161b [email protected] .. 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 \\...

Это будет выполняться до тех пор, пока не возникнет ошибка, которая благодаря команде «переместить влево» ('h') будет равна 'arg1'.

Теперь нам просто нужно добавить внутреннюю ногу.

xxd

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

 

Kiroko


Рег
10 Mar, 2014

Тем
66

Постов
213

Баллов
583
  • 26, Oct 2024
  • #4

2 соболя, 40 36 32 30 байт

Хммм, Ви подходит очень близко...

<esc>

Использует CP-1252 кодировка. Попробуйте версию, совместимую с 05AB1E!.

 

Ozavgar


Рег
14 Oct, 2014

Тем
53

Постов
203

Баллов
478
  • 26, Oct 2024
  • #5

PowerShell v2+, 99 90 82 байта

<c-v>

Принимает ввод 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> , starts a loop from x=input() for i in range(x):print(x-i)*' '+'/----/'+(i*' '+'\\ \\')[5:] к PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 7 /----/\ /----/ \ /----/ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ PS C:\Tools\Scripts\golfing> .\draw-a-ladder-and-slide.ps1 15 /----/\ /----/ \ /----/ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ /----/ \ \ with "\ \" . На каждой итерации мы создаем строку. Начинаем с соответствующего количества пробелов " "*($_+$i++) and the ladder -join .

К этому мы добавляем еще одну строку, которая была нарезана [...] редактировать: переключаемый стиль управляющих символов по запросу "/----/" снова вместе. Вторая строка — это слайд, и мы предполагаем, что весь слайд всегда виден. Это количество пробелов до начала слайда. " "*($n-$_) , followed by the slide itself |%{...} . Он нарезается диапазоном, рассчитанным как часть «пробелов плюс слайд», которая частично скрыта лестницей.

Примеры

$n ||answer||

Python 2 — 79 76 75 байт

1

Спасибо Хуберту Гжесковяку за то, что он «дисквалифицировал» меня, поскольку вывод моей программы на печать фактически сэкономил 3 байта!

Также спасибо Eʀɪᴋ ᴛʜᴇ Gᴏʟғᴇʀ за сохранение еще 1 байта!

 

Gycb


Рег
20 Apr, 2014

Тем
61

Постов
194

Баллов
509
  • 26, Oct 2024
  • #6

Вим, 71 нажатие клавишиЭто такой глупый способ сделать это, но это немного весело. Входные данные предоставляются в виде текстового файла с одной строкой, содержащей целое число. Это, вероятно, вполне подходит для гольфа, но на данный момент сойдет ():

$n

param($n)1..$n|%{" "*($n-$_)+"/----/"+-join(" "*($_+$i++)+"\ \")[6..(6+$_+$i)]} , F¹N-<ð×…/--«ðð«N×…\ ««5F¦}¶ and 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 are all individual keystrokes; ctrl+v, escape, and carriage return (enter) respectively. For a simple to digest version with the correct literals, here is the file VQ++*dt-QN"/----/">+*+ddN"\ \\"5 и 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 '\' :

Àé "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.

хотя беги \o/ and put in the file Àé r\2é/4é-òhYpX$2P^ò3GEòjlr\ Чтобы попробовать (при условии, что у вас есть никс с соответствующими инструментами), возьмите вышеописанное и запустите его через /----/\ /----/ \ /----/ \ /----/ \ \ /----/ \ \ with an integer in it. Then do:

/ ||answer||

. Создать файл

/.{5} /----/

Баш, 61 /\ \ / \ \ / \ \ / \ \ / \ \ is a literal carriage return

$& 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. ||answer||

где

/ /

JavaScript (ES6), 79 байт + spaces, then doing some exotic substitution to get the slide with a support, then replacing the support with a ladder.

Работает, принимая строку

 

Nakza


Рег
08 Apr, 2011

Тем
77

Постов
199

Баллов
634
  • 26, Oct 2024
  • #7
+` /(.+)$ $&¶$%`/ $1

Рубин, 61 байт

/\ \

Негольфед n (where ^. Я мог бы сэкономить два байта, используя / ". ¯\_(ツ)_/¯

это буквальный возврат каретки) для строки формата, но затем Ruby печатает предупреждение "

/\ \ ||answer||

Предыдущее решение (64 байта)

/\ \

Пакетный, 194 байта

Оказалось, что это достаточно просто: сделайте отступ слайда, удалите первые 7 символов, отступ лестницы, удалите начальный пробел. Однако этот последний момент требует небольшой хитрости!

 

Акр


Рег
20 Apr, 2011

Тем
62

Постов
206

Баллов
556
  • 26, Oct 2024
  • #8
n

Ява, 116 байт

К сожалению, вы не можете [легко] дублировать строки в Java, поэтому в конечном итоге я злоупотребляю функцией форматирования.

 

Feory


Рег
11 Feb, 2016

Тем
82

Постов
182

Баллов
652
  • 26, Oct 2024
  • #9

n ||answer||

Скала, 95 байт

.+ $* /\ \ ||answer||

Хаскель, 81 байтчай

5

, неконкурирующий, 386 байт

Я официально сделал максимально многословный язык. Я написал комментарий в шутку и с сарказмом. Пожалуйста, успокойся. Инструкция по запуску в репозитории github, ссылка в шапке.

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

Donatas


Рег
09 Aug, 2005

Тем
93

Постов
217

Баллов
702
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно

Lumtu.com © 2024