Подсчет байтов предполагает кодировку 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 байт)