Генерация стека Обмен Фавикон


25

Вы узнаете логотип PPCG? это выглядит так, когда вы делаете это ascii art.

+---+
|PCG|
+---+
   v

Теперь, в этом Code Golf, Вы сделаете код, который делает логотипы для других сайтов, похожие на логотип PPCG.

Что ты должен делать

«Сокращенная» строка будет строкой со всеми заглавными буквами и цифрами во входной строке (что будет, PPCGесли входная строка Programming Puzzles & Code Golf).

Коробка" (

+---+
|   |
+---+
   v

) должен идеально подходить к укороченной струне (не больше и не меньше)

Также vчасть должна быть ровно на 1 вниз и 1 слева направо вниз +.

Затем выведите поле с укороченной строкой.

пример

Stack Overflow:

+--+
|SO|
+--+
  v

Area 51:

+---+
|A51|
+---+
   v

правила

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

Применяются стандартные правила .



@MartinEnder Да, очень тесно связаны, но не дублируют.

1
@MatthewRoh Целью ссылок является то, что вызовы отображаются на боковой панели, а не голословный обман. Тем не менее, я лично думаю, что удаление нежелательных персонажей, а также распечатка ^не добавляет много по сравнению со вторым вызовом, который я связал, но я не буду бросать на это двуручный молоток, но пусть коммунитц решит, считают ли они это обманом или не.
Мартин Эндер

4
Если бы это было 99 Bottles Of Beer, это было бы 99BOB.

1
@ MatthewRoh все еще глючит, дайте мне посмотреть, смогу ли я получить ответ от BF в конце концов
Рохан Jhunjhunwala

Ответы:


23

Вим, 42 удара

:s/[^A-Z0-9]//g
YPVr-i+<DOWN><LEFT>|<ESC><C-V>ky$pYjppVr $xrv

Заменить <DOWN>на , <LEFT>с , <ESC>с escи <C-V>на CTRL+ V.

Вот анимация запуска этого скрипта (старая версия, которая использует Vвместо v):

Анимация

Объяснение сценария:

:s/[^A-Z0-9]//g                               # Remove all the characters that are not uppercase or numbers using a Regex.
YPVr-                                         # Duplicate the current, and replace all the characters of the upper one with dashes.
     i+<DOWN><LEFT>|<ESC>                     # Insert a + on the upper line, and a | on the second line.
                         <C-V>ky$p            # Copy the + and | to the end of both lines.
                                  Yjpp        # Copy the upper line to the bottom two times.
                                      Vr $    # Replace the bottom most line with spaces and put the cursor on the last character.
                                          xrv # Remove the last character and replace the second last character with a v.

строчная буква V, а не прописная буква V

Еще один символ, но избегает специальных экранированных символов: r | y uP ​​$ pYPVr-r + $. YjppVr $ hrV
Брайс Вагнер

Вы можете заменить i+↓←|␛␖ky$pна, A+↓|␛␖ky0Pчтобы сохранить байт.
Линн

В качестве альтернативы, замените первые восемь ударов в подходе Брайса наI|<END>|␛
Линн

Интересно, если это имеет наибольшее количество голосов из-за крутой картины.
Джо

10

V 34 байта

Ó[^A-Z0-9]
ys$|ÄVr-r+$.YLppVr x$rv

Обратите внимание, что это работало в более старой версии, но не работает в текущей версии, попробуйте онлайн. Я изменил Äна YPчто функционально эквивалентно.

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

Объяснение:

Ó[^A-Z0-9]

Удалите все, кроме цифр и заглавных букв.

ys$|              "Surround this line with '|' characters.
    Ä             "Duplicate this line
     Vr-          "Replace this whole duplicated line with '-' characters
        r+        "replace the first character with '+'
          $       "Move to the end of the line, and
           .      "Repeat our last command. This is the same as 'r+'
            Y     "Yank the current line
              pp  "and paste it twice
             L    "At the end of our text

Теперь буфер выглядит так:

+---+
|A51|
+---+
+---+

И наш курсор находится в первом столбце последней строки.

Vr                 "Change the whole last line to spaces
   x               "Delete a character
    $rv            "And change the last character to a 'v'

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


Я только что заметил, что на входе выводится Programming Puzzles & Code Golfневерная строка PP&CG. &Должны быть удалены
Луис Mendo

@ LuisMendo Ой, черт возьми! Спасибо за указание на это, я исправлю это сегодня.
DJMcMayhem

@DrGreenEggsandIronMan Итак, вы исправили это, верно? [когда? воля? ты? Ну наконец то? исправить? это?]
Эрик Outgolfer

Я не получаю вывод на TIO?
Вниз

@Downgoat V совсем недавно получил огромное обновление, и, к сожалению, оно скрывало некоторые вещи, которые я изучаю , но я не уверен, сколько времени потребуется, чтобы это исправить.
DJMcMayhem

7

16-битный машинный код x86, 72 байта

В шестнадцатеричном виде:

565789F731C9FCAC84C074143C5A77F73C4173083C3977EF3C3072EBAA41EBE75F5EE81500B07CAA51F3A4AB59E80A00B020F3AAB076AA91AAC351B02BAAB02DF3AAB82B10AB59C3

Параметры: SI= строка ввода, DI- буфер вывода.

Выводит строку с нулевым символом в конце со строками, разделенными символом новой строки. Использует входную строку в качестве временного буфера.

56           push   si
57           push   di
89 f7        mov    di,si    ;Using source string as a buffer
31 c9        xor    cx,cx    ;Counter
fc           cld
_loop:
ac           lodsb
84 c0        test   al,al    ;Test for NULL
74 14        jz     _draw    ;Break
3c 5a        cmp    al,'z'   ;\
77 f7        ja     _loop    ; |
3c 41        cmp    al,'a'    ; \
73 08        jae    _stor    ;  >[A-Z0-9]?
3c 39        cmp    al,'9'   ; /
77 ef        ja     _loop    ; |
3c 30        cmp    al,'0'   ;/
72 eb        jb     _loop
_stor:
aa           stosb           ;Store char in the source buffer
41           inc    cx
eb e7        jmp    _loop
_draw:
5f           pop    di
5e           pop    si
e8 15 00     call   _line    ;Output the first line
b0 7c        mov    al,'|'   ;This proc upon return leaves '\n' in AH
aa           stosb           ;First char of the second line
51           push   cx
f3 a4        rep    movsb    ;Copy CX logo characters from the source buffer
ab           stosw           ;Outputs "|\n", which is still in AX
59           pop    cx
e8 0a 00     call   _line    ;Output the third line
b0 20        mov    al,0x20  ;Space
f3 aa        rep    stosb    ;Output it CX times
b0 76        mov    al,'v'
aa           stosb           ;Output the final 'v'
91           xchg   cx,ax    ;CX == 0
aa           stosb           ;NULL-terminate the string
c3           retn            ;Return to caller
_line:
51           push   cx
b0 2b        mov    al,'+'
aa           stosb
b0 2d        mov    al,'-'
f3 aa        rep    stosb     ;'-'*CX
b8 2b 10     mov    ax,0x102b ;"+\n"
ab           stosw
59           pop    cx
c3           retn

Э-э-э ... Я пока не сделал ассемблерный код.

3
Я тоже. Снова началась около недели назад только для игры в гольф
меден

3c 41 cmp al,a' не должно ли быть 3c 41 cmp al,'a' ?
rav_kr

@rav_kr, конечно, спасибо, что заметил. Пропустил цитату при замене шестнадцатеричных кодов на символы для удобства чтения.
Меден

4

Сетчатка , 43 байта

[^A-Z\d]

.+
+$.&$*-+¶|$&|¶+$.&$*-+¶$.&$* V

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

Это идеальная задача для демонстрации Retina, языка Мартина Эндера, играющего в гольф.

Это решение разделено на два этапа (так называемые этапы), причем оба этапа являются этапом замены.

Первый этап:

[^ AZ \ D]

Это соответствует подстрокам, которые соответствуют [^A-Z\d], то есть символам, которые не являются заглавными и не цифрами, и затем заменяют их ничем, означая удаление их.

Второй этап:

.+
+$.&$*-+¶|$&|¶+$.&$*-+¶$.&$* V

Соответствует .+всему результату, а затем заменяет его второй строкой.

Во второй строке:

  • $& относится ко всему матчу
  • $.& относится к длине всего матча
  • $*означает взять предыдущее целое число, повторить следующий символ много раз. Здесь $.&$*-означает повторить, как -долго матч.
  • относится к новой строке.

Хорошо, я попробовал это раньше, но в итоге получилось 54 байта. Альтернатива для первого этапа, T`dLp`dL_но, к сожалению, такой же длины.
Мартин Эндер

@MartinEnder Какими были ваши 54 байта?
Дрянная Монахиня


4

C #, 183 177 165 байтов

string h(string s){s=string.Concat(s.Where(n=>n>47&n<58|n>64 &n<91));int m=s.Length;var x=new string('-',m);return$"+{x}+\n|{s}|\n+{x}+\n{new string(' ', m + 1)}v";}

умножение символов ужасно в C #. предложения приветствуются

большое спасибо aloisdg за -18 байт


Вы можете заменить | |на|
aloisdg говорит Восстановить Монику

Вы можете использовать интерполяцию строкreturn$"+{x}+\n|{s}|\n+{x}+\n{new string(' ',m+1)}v";}
aloisdg говорит восстановить Monica

1
это сладкий метод!
downrep_nation

Вы можете заменить string.Join("", наstring.Concat(
aloisdg говорит Восстановить Монику

1
Вы можете удалить пробел после того, какreturn
aloisdg говорит Восстановить Монику

4

Excel VBA, 375 359 358 байт:

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

Редактировать: переключено на регистр с операторов if, -16 байт

Edit2: избавился от вас и заменен на Len (b), -1 байт

Function b(x)
For i = 1 To Len(x)
a = Mid(x, i, 1)
e = Asc(a)
If e > 64 And e < 91 Or e > 47 And e < 58 Then b = b & a
Next i
For Z = 1 To 4
y = ""
Select Case Z
Case 2
y = "|" & b & "|"
Case 4
For i = 1 To Len(b)
y = y & " "
Next i
y = y & "v"
Case Else
y = "+"
For i = 1 To Len(b)
y = y & "-"
Next i
y = y & "+"
End Select
Debug.Print y
Next Z
End Function

3
Это хорошо, хотя, учитывая, что VBA иногда мусор.

Я просто делаю это для испытания, я знаю, что не могу конкурировать с VBA. Как правило, в конце концов получается очень запутанным после изменения всех переменных с имен на отдельные буквы.
tjb1

Да, икр Так верно

Можете ли вы удалить пробелы вокруг операторов?
Морган Трепп

3
Смеялись над "
Избавился

4

Луа, 145 99 байт

Не много сказать, манипулирование строками всегда многословно в lua :). Принимает аргумент командной строки и выводит через STDOUT

Спасибо @LeakyNun за спасение мне 45 байт!

n=(...):gsub("[^%u%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V"

100 байтов, предложенных @LeakyNun

n=(...):gsub("[^A-Z%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V"

СТАРЫЙ 145 Байт

g="|"..(...):gsub("%a+",function(w)return w:sub(1,1)end):gsub("%s",'').."|"S="+"..g.rep("-",#g-2).."+"p=print
p(S)p(g)p(S)p(g.rep(" ",#g-2).."v")

Ungolfed

g="|"                            -- g is the second, and starts with a |
  ..(...):gsub("%a+",            -- append the string resulting of the iteration on each word
    function(w)                  -- in the input, applying an anonymous function
      return w:sub(1,1)          -- that return the first character of the word
    end):gsub("%s",'')           -- then remove all spaces
  .."|"                          -- and append a |
S="+"..g.rep("-",#g-2).."+"      -- construct the top and bot of the box
p=print                          -- alias for print
p(S)p(g)p(S)                     -- output the box
p(g.rep(" ",#g-2).."v")          -- output #g-2 spaces (size of the shortened name), then v

1
Ты имеешь в виду вывод через STDOUT? Но я не против, потому что его противоположный день!

1
@ MatthewRoh Я имел в виду вывод на STDIN вашего терминала! (исправлено ... позор ....)
Катенкё

n=(...):gsub("[^A-Z%d]","")s="+"..("-"):rep(#n).."+\n"return s.."|"..n.."|\n"..s..(" "):rep(#n).."V"составляет 100 байтов
Leaky Nun

@LeakyNun, используя шаблон, %uмы получаем еще несколько байтов. В любом случае, спасибо :) (позже обновлю некольфа)
Katenkyo

3

2sable , 36 34 33 32 31 байт

Представляем 2sable :). Хотя он имеет много общего с 05AB1E, на самом деле он автоматически присоединяется к стеку, а не выводит его верх. Код:

žKA-ég'-×'+DŠJDU„
|®sX¶®gð×'v

Использует кодировку CP-1252 .


2
ಠ_ಠ Больше не нужно играть в гольф или менять язык! Оставь это там, где сейчас! : P
DJMcMayhem

@DrGreenEggsandIronMan Хахаха, до твоего ответа еще 3 болезненных байта: P.
Аднан

1
Ха-ха, я праздновал, когда увидел его на 7 байт длиннее, а затем медленно наблюдал, как пропасть исчезает, один за другим ...
DJMcMayhem

3

JavaScript (ES6), 99 байт

(s,t=s.replace(/[^0-9A-Z]/g,``),g=c=>t.replace(/./g,c))=>`${s=`+${g(`-`)}+
`}|${t}|
${s}${g(` `))v`

3

Haskell, 107 байт

Этот ответ в значительной степени основан на ответе Зилвий и комментариях Ними . Я бы добавил больше комментариев к этому ответу, но, увы, мне не хватает представителя.

o n=t++'|':f++"|\n"++t++(f>>" ")++"v"where f=[c|c<-n,any(==c)$['0'..'9']++['A'..'Z']];t='+':(f>>"-")++"+\n"

Используются дополнительные приемы:

  • Заменены intersect его реализацией, поэтому импорт может быть отброшен. (Примечание: реализация почти дословно библиотечная, я не смог найти более короткую версию.)
  • Перемещены вспомогательные функции в whereпредложение, чтобы функции могли использоватьn параметр внутри.
  • После того, (#) был достаточно коротким, чтобы его можно было вставить.
  • Поместите все в одну строку, чтобы ограничить лишние пробелы.

2

Python 3.5, 114 93 112 байтов:

import re;Y=re.findall('[A-Z0-9]',input());I='+'+'-'*len(Y)+'+\n|';print(I+''.join(Y)+I[::-1]+'\n'+' '*len(Y)+'v')

Полная программа. В основном используется регулярное выражение для сопоставления всех вхождений прописных букв и цифр, затем создается поле точного размера на основе длины списка совпадений и, наконец, помещается объединенный список совпадений «внутри» него.

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


5
Здесь отсутствует нижняя буква «v».
Компания Карлес

@CarlesCompany Это исправлено, стоимостью еще 19 байтов.
Р. Кап

2

Python 3, 121 124 байта

Исправлена ​​глупая ошибка

s=''
for i in input():_=ord(i);s+=("",i)[91>_>64or 47<_<58]
x=len(s)
c='+'+"-"*x+'+'
print(c+"\n|"+s+"|\n"+c+"\n"+" "*x+"v")

не импортирует библиотеки, как другие ответы Python.


Не работает правильно. -1 Оповестить если исправишь.
Эрик Outgolfer

@ EʀɪᴋᴛʜᴇGᴏʟғᴇʀ Исправлено. Спасибо
Разрушаемый Лимон

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

2

Java 8, 149 байт

s->{s=s.replaceAll("[^A-Z0-9]","");String t="+",r;int l=s.length(),i=l;for(;i-->0;t+="-");for(r=(t+="+\n")+"|"+s+"|\n"+t;++i<l;r+=" ");return r+"v";}

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

Объяснение:

s->{                     // Method with String as both parameter and return-type
  s=s.replaceAll("[^A-Z0-9]","");
                         //  Leave only the uppercase letters and digits
  String t="+",          //  Temp-String, starting at "+"
         r;              //  Result-String
  int l=s.length(),      //  Amount of uppercase letters and digits `l`
  i=l;for(;i-->0;t+="-");//  Loop and append `l` amount of "-" to the temp-String
  for(r=(t+="+\n")       //  Append "+" and a new-line to the temp-String
        +"|"+s+"|\n"+t;  //  Set the result to `t`, "|", modified input, "|", new-line, `t`
                         //  all appended to each other
      ++i<l;r+=" ");     //  Loop and append `l` amount of spaces to the result
  return r+"v";}         //  Return the result-String with appended "v"



1

Python 2, 113 байт

def f(n):c=filter(lambda x:x.isupper()^x.isdigit(),n);L=len(c);h='+'+L*'-'+'+\n';return h+'|'+c+'|\n'+h+' '*L+'v'

Можете ли вы использовать ascii в Python? Если да, вы можете использовать 47<x<58|64<x<91:)
aloisdg говорит восстановить Monica

@aloisdg В отличие от C / C ++, Python не использует целочисленный charтип - все символы в строках Python сами являются строками и не могут напрямую сравниваться с целыми числами. Это должно быть 47<ord(x)<58or 64<ord(x)<91.
Мего

[x for x in n if x.isupper()^x.isdigit()]на один байт корочеfilter(lambda x:x.isupper()^x.isdigit(),n)
Leaky Nun

@LeakyNun: фильтр вернет строку, но понимание списка вернет список, который не будет использоваться в выражении возвращаемого значения.
Никита Борисов

Почему XOR? Вы не можете использовать вместо этого? XOR более сложный и, следовательно, медленнее AFAIK. x.isupper()^x.isdigit()->x.isupper()|x.isdigit()
Эрик Outgolfer

1

Джольф, 35 байт

Ά+,Alγ/x"[^A-Z0-9]"1'+'-'|γS*lγ" 'v

Мне нужен более короткий способ удалить все, кроме заглавных букв и цифр ...


1

С 171 163

Функция f()изменяет свой ввод и выводит результат.

l;f(char*n){char*p=n,*s=n,c[99];for(;*n;++n)isupper(*n)+isdigit(*n)?*p++=*n:0;*p=0;memset(c,45,l=strlen(s));c[l]=0;printf("+%s+\n|%s|\n+%s+\n%*.cv\n",c,s,c,l,32);}

Тестовая программа

Требуется один параметр, строка для использования в значке:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, const char **argv)
{
    char *input=malloc(strlen(argv[1])+1);
    strcpy(input,argv[1]);
    f(input);
    free(input);
    return 0;
}

Почему вы копируете элемент argv?
mame98

Потому что функция изменяет свой ввод. Я не уверен, что изменение параметров на месте - это определенное поведение.
owacoder

никогда не думал об этом ... в соответствии с этим SO ответом все должно быть хорошо: stackoverflow.com/a/963504/3700391
mame98

1

Хаскелл, 161

import Data.List
r=replicate
l=length
f n=intersect n$['0'..'9']++['A'..'Z']
t n='+':(r(l$f n)'-')++"+\n"
o n=(t n)++"|"++(f n)++"|\n"++(t n)++(r(l$f n)' ')++"V"

использование

o"Stack Overflow"
+--+
|SO|
+--+
  V

o"Area 51"
+---+
|A51|
+---+
   V

1
Вы используете replicate, lengthи fисключительно в этой комбинации, чтобы вы могли объединить их в одну функцию: r=replicate.length.fи вызывать ее как r n '-'. Вы можете сохранить еще больше байтов, используя инфиксный оператор: (#)=replicate.length.fи n#'-'/ n#' '. Дополнительно replicate.lengthесть >>(с одиночной строкой вместо символа), так что это: (#)=(>>).fи n#"-"/ n#" ", оба без ( )него.
Ними,

1
... также: нет необходимости в ( )вокруг t nи f n. "|"++есть '|':. В общем и целом: o n=t n++'|':f n++"|\n"++t n++n#" "++"V".
Ними,

1

Баш, 99 74 байта

s=$(sed s/[^A-Z0-9]//g);a=${s//?/-};echo -e "+$a+\n|$s|\n+$a+\n${s//?/ }v"

Использование: Запустите указанную выше команду, введите имя сайта, нажмите ввод, а затем Ctrl+D (отправьте «конец файла»).



1

R, 108 байт

cat(x<-gsub("(.*)","+\\1+\n",gsub(".","-",y<-gsub("[^A-Z0-9]","",s))),"|",y,"|\n",x,gsub("."," ",y),"v",sep="")

объяснение

Идти изнутри (потому что кто не любит присваивать глобальные переменные внутри регулярного выражения), предполагая s наша входная строка:

y<-gsub("[^A-Z0-9]","",s) сохраняет заглавные буквы и цифры, присваивает полученное значение y.

gsub(".","-",y<-...) заменяет все символы с дефисами в приведенном выше.

x<-gsub("(.*)","+\\1+\n",gsub(...))бросает a +на любом конце строки дефисов и новой строки, и мы сохраняем это как x.

Все остальное довольно просто, выведите в соответствующем порядке и используйте тот факт, что число пробелов перед vсимволом будет равно длине y.



1

APL, 52 49 байт

{x⍪2⌽'v'↑⍨≢⍉x←⍉z⍪⍨(z←'+|+')⍪'-','-',⍨⍪⍵/⍨⍵∊⎕D,⎕A}

(до 49 благодаря комментарию).


{x⍪2⌽'v'↑⍨≢⍉x←⍉z⍪⍨(z←'+|+')⍪'-','-',⍨⍪⍵/⍨⍵∊⎕D,⎕A}(Вы никогда не заключаете в скобки один из аргументов в функции обратного аргумента при игре в гольф. Это всегда может быть в обычном порядке, чтобы сохранить байт.)
Zacharý

1

Perl, 57 байт

56 байт код + 1 для -p.

y/a-z //d;$d="-"x y///c;$_="+$d+
|$_|
+$d+
".$"x y///c.v

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

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


1

MATL , 34 байта

t1Y24Y2hm)T45&Ya'+|+'!wy&h10M~'v'h

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

t        % Implicit input. Duplicate
1Y2      % Uppercase letters
4Y2      % Digit characters
h        % Concatenate horizontally: string with uppercase letters and digits
m        % True for input chars that are uppercase letters or digits
)        % Keep only those
T45&Ya   % Pad up and down with character 45, which is '-'. Gives three-row char array
'+|+'!   % Push this string and transpose into a column vector
wy       % Swap, duplicate the second array from the top. This places one copy of the
         % column vector below and one above the three-row char array
&h       % Contatenate all stack arrays horizontally. This gives the box with the text
10M      % Retrieve the string with selected letters
~        % Logical negate. Gives zeros, which will be displayes as spaces
'v'      % Push this character
h        % Concatenate horizontally with the zeros.
         % Implicitly display the box with the text followed by the string containing
         % the zero character repeated and the 'v'

1

JavaScript (ES6), 119 байт

h=a=>"+"+"-".repeat(a.length)+"+\n";j=a=>(a=a.replace(/[^A-Z0-9]/g,""),h(a)+"|"+a+"|\n"+h(a)+" ".repeat(a.length)+"v");

1

J , 52 байта

'v'(<3 _2)}4{.1":]<@#~2|'/9@Z'&I.[9!:7@'+++++++++|-'

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

   [9!:7@'+++++++++|-'            Set the box drawing characters.
        '/9@Z'&I.                 Interval index, 1 for numbers, 3 for 
                                  uppercase letters.
          ]  #~2|                 Mod 2, and filter
                                  the characters that correspond to 1s.
           <@                     Put them in a box.
           1":                    Convert to a character matrix, so we can do stuff to it.
           4{.                    Add a 4th line filled with spaces   
       'v'(<3 _2)}                Insert a “v” at 3,−2


0

Common Lisp (Lispworks), 159 байт

(defun f(s)(labels((p(c l)(dotimes(i l)(format t"~A"c))))(let((l(length s)))#1=(p"+"1)#2=(p"-"l)#3=(format t"+~%")(format t"|~A|~%"s)#1##2##3#(p" "l)(p"v"1))))

ungolfed:

(defun f (s)
  (labels ((p (c l)
             (dotimes (i l)
               (format t "~A" c))))
    (let ((l (length s)))
      #1=(p "+" 1)
      #2=(p "-" l)
      #3=(format t "+~%")
      (format t "|~A|~%" s)
      #1#
      #2#
      #3#
      (p " " l)
      (p "v" 1))))

Использование:

CL-USER 2 > (f "so")
+--+
|so|
+--+
  v
NIL

CL-USER 3 > (f "pcg")
+---+
|pcg|
+---+
   v
NIL
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.