Esolang-Comment-Template-Generator


42

이 사이트의 많은 사람들이 난해한 언어를 사용 하며,이 언어는 독특하고 이해하기 어렵 기 때문에 종종 특정 형식으로 설명을 작성합니다. 예를 들어 코드가

abcdefghijklmnop

그리고이 언어는 #주석에 사용 하며 다음과 같은 설명을 작성합니다.

a                #Explanation of what 'a' does
 bc              #Bc
   d             #d
    e            #Explanation of e
     fgh         #foobar
        ij       #hello world
          k      #etc.
           l     #so on
            mn   #and
              op #so forth

나도 자주이 작업을 수행하지만이 작업을 수행 할 때마다 텍스트 레이아웃을 만드는 것이 정말 번거롭고 시간이 많이 걸리는 것 같습니다. 따라서 "Esolang-Comment-Template-Generator"를 작성해주세요. 예를 들어 주석을 무시하면 이전 코드에는 다음 템플릿이 있습니다.

a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

도전 과제 :

두 개의 문자열을 입력으로 사용하여이 "Esolang-Comment-Template"을 출력하는 프로그램 또는 함수를 작성해야합니다. 첫 번째 입력은 코드이지만 줄 |바꿈이있는 곳에 막대 ( )가 삽입됩니다. 두 번째 입력은 주석에 사용할 것입니다. 그래서 우리의 마지막 예제는 입력을 위해 이것을 가질 것입니다 :

"a|bc|d|e|fgh|ij|k|l|mn|op", "#"

불행히도 이것은 막대가 코드 입력의 일부가되는 것을 제외하지만 괜찮습니다. 주석 입력이 단일 문자라고 가정 할 수 있습니다. 간단히하기 위해 주석 문자는 막대가 아닙니다. 코드 입력에는 인쇄 가능한 ASCII 만 포함되며 줄 바꿈은 포함되지 않습니다.

바라건대 테스트 사례에서 수행 할 작업을 유추 할 수 있지만 몇 가지 사항을 명확하게 설명하려고합니다.

코드 입력을 모든 막대에서 "코드 섹션"으로 분할해야합니다. 그런 다음 각 코드 섹션이 자체 행에 출력되고 모든 이전 코드 길이 (막대 제외)로 왼쪽이 채워집니다. 그런 다음 각 줄의 오른쪽에 충분한 공백이 채워 지므로 모든 줄의 마지막 두 문자는 "한 개의 추가 공백"+ "주석 문자"가됩니다.

하나의 후행 줄 바꿈이 허용됩니다.

또 다른 예가 있습니다. 입력

"Hello|World", "/"

코드 의 첫 번째 섹션 은 "Hello"이고 두 번째 섹션 은 "World"입니다. 따라서 출력을 제공해야합니다.

Hello      /
     World /

다음은 더 많은 샘플입니다.

Input:
"a|b|c|d|e|f|g", ","

Output:
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

Input:
"abcdefg", ":"

Output:
abcdefg :

Input:
"4|8|15|16|23|42", "%"

Output:
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

Input:
"E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!", "!"

Output:
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

Input:
"This|Code|has||empty||sections", "@"

Output:
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

규칙 :

이러한 입력과 출력을 합리적인 형식으로 취할 수 있습니다. 예를 들어, 파일 읽기 / 쓰기, STDIN / STOUT, 함수 인수 / 반환 값 등. 평상시와 같이 이것은 이므로 가능한 짧은 코드를 작성하고 가장 짧은 솔루션을 얻을 수 있으면 승리하십시오. 당신의 언어로! 또한 가장 짧은 솔루션을 전체 우승자로 선택합니다. 표준 허점 은 금지되어 있습니다.



후행 공백이 허용됩니까?
Titus

30
다음 단계 : 2D 언어를위한 3D 표현
Aaron

3
보너스 당신은 사용하지 않고 그것을 할 관리하는 경우 |당신이 자신을 설명 할 수 있도록, 좋은 것 문자
WorldSEnder

주석 문자가 막대 ( |) 일 수 있습니까?
Ton Hospel

답변:



9

망막 , 35 34 바이트

바이트 수는 ISO 8859-1 인코딩을 가정합니다.

\|
·$'¶$`±
T0-2`·±|p`___ `.+±.|·.+

두 개의 입력 문자열은 공백으로 구분됩니다 (주석 구분 기호는 항상 단일 문자라는 것을 알기 때문에 명확하지 않습니다).

온라인으로 사용해보십시오!


1
문자열을 구분하기 위해 공백이 필요한 이유는 무엇입니까? 하나의 문자이므로 마지막 문자 일 수 있습니다.
Adám

1
@ Adám 최종 출력에서 ​​공백으로 분리하고 있습니다.
Martin Ender

9

자바 10 189 159 바이트

s->c->{var r="";int p=0,i;for(var a:s.split("\\|")){for(i=p;i-->0;r+=" ");r+=a;for(p+=a.length();i++<s.replace("|","").length()-p;r+=" ");r+=c+"\n";}return r;}

Java 7을 Java 10으로 변환하고 루프를 최적화하는 -30 바이트

온라인으로 사용해보십시오.

설명:

s->c->{                     // Method with String & char parameters and String return-type
  var r="";                 //  Result-String, starting empty
  int p=0,                  //  Position-integer, starting at 0
      i;                    //  Index integer
  for(var a:s.split("\\|")){//  Loop over the parts split by "|"
    for(i=p;i-->0;r+=" ");  //   Add `p` amount of spaces to the result-String
    r+=a;                   //   Add the current part to the result-String
    for(p+=a.length();      //   Add the length of the current part to the position-integer
        i++<s.replace("|","").length()-p;r+=" ");
                            //   Add the row's trailing spaces to the result-String
    r+=c+"\n";}             //   Add the character and a new-line to the result-String
  return r;}                //  Return the result-String


4

자바 스크립트 (ES6), 92 바이트

f=
(s,c)=>s.split`|`.map((_,i,a)=>a.map((e,j)=>i-j?e.replace(/./g,` `):e).join``+` `+c).join`
`
;
<div oninput=o.textContent=f(s.value,c.value)><input id=s placeholder=Code><input id=c size=1 maxlength=1 value=#><pre id=o>


4

GNU sed (-r의 경우 85 + 1) 86

:s;h;:;s,\|( *)[^ \|](.),|\1 \2,;t;s,\|,,g
p;g;:l;s,^( *)[^ \|],\1 ,;tl;s,\|,,;/\S/bs

입력은 공백으로 구분 된 문자열입니다.

테스트 :
input.txt :

a|b|c|d|e|f|g ,
abcdefg :
4|8|15|16|23|42 %
E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last! !
This|Code|has||empty||sections @

산출:

$ cat input.txt | sed -rf template
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

abcdefg :

4          %
 8         %
  15       %
    16     %
      23   %
        42 %

E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

이름없는 레이블 :은 GNU sed 기능 / 버그이며 \S확장이라고 생각하므로 제목은이어야합니다 GNU sed. 그 외에는 훌륭한 코드입니다.
seshoumara

@seshoumara 감사합니다!
Riley

3

하스켈, 139135 바이트

s#p=j$foldl g("",0)s where g(a,n)c|c=='|'=(j(a,n)++"\n"++q n,n)|1>0=(a++[c],n+1);q m=' '<$[1..m];j(a,n)=a++q(sum[1|c<-s,c/='|']-n+1)++p

정의를 인라인하여 4 바이트를 절약했습니다.

언 골프 드 :

template :: String -> String -> String
template code comment = format $ foldl g ("", 0) code
    where g (acc, n) c
            | c == '|' = (format (acc, n) ++ "\n" ++ spaces n, n)
            | otherwise = (acc ++ [c], n+1)
          l = length $ filter (/= '|') code
          spaces n = replicate n ' '
          format (acc, n) = acc ++ spaces (l-n+1) ++ comment

3

당연, 120 (113) 111 바이트

def m(s,c){s.split(/\|/).inject(0,{e,t->println((' '*e+t).padRight(s.replace('|','').size()+1)+c);e+t.size()})}

언 골프 *

def m(s,c){
  s.split(/\|/).inject(0, { e, t ->
    println((' '*e+t).padRight(s.replace('|','').size())+' '+c)
    e+t.size()
  })
}

(120 바이트의 초안)

def m(s,c){def l=0;s.split(/\|/).collect{l+=it.size();it.padLeft(l).padRight(s.replace('|','').size())+' '+c}.join('\n')}

언 골프 *

def m(s,c){
  def l=0 // minimized version needs a semicolon here
  s.split(/\|/).collect{
    l+=it.size() // minimized version needs a semicolon here
    it.padLeft(l).padRight(s.replace('|','').size())+' '+c
  }.join('\n')
}

테스트

%> m('a|bc|d|e|fgh|ij|k|l|mn|op', '#')
a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

%> m('Hello|World', '/')
Hello      /
     World /

%> m('a|b|c|d|e|f|g', ',')
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

%> m('abcdefg', ':')
abcdefg :

%> m('4|8|15|16|23|42', '%')
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

%> m('E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!', '!')
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

%> m('This|Code|has||empty||sections', '@')
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

어떻습니까.padRight(s.replace('|','').size()+1)+c)
AmazingDreams

좋은 생각! 감사합니다! 또 다른 2자를 구했습니다!
norganos

3

파이썬 2 125 124 132 바이트

-1 @TuukkaX에 바이트 덕분에 (의 공간을 골프 놓친 i, v)

def g(s,c):x=s.split('|');print((' '+c+'\n').join(' '*len(''.join(x[:i]))+v+' '*len(''.join(x[i+1:]))for i,v in enumerate(x))+' '+c)

이데온의 모든 테스트 사례


1
c주석이 아닌 주석 으로 사용해야 합니다 #.
Oliver Ni

@OliverNi-어, 그것은 현재 형태의 코드에 맞았습니다.
Jonathan Allan

3

파이썬 2 107 105 102 99 바이트

위의 모든 테스트 사례에서 테스트

EDIT d = a.split ( "|"); i = 0을 d, i = a.split ( "|"), 0으로 변경하여 2 바이트를 제거했습니다. 감사합니다 @Oliver Ni

또 다른 3 바이트가 사라졌습니다. 다시 감사합니다.

@Jonathan의 제안은 실제로 3 바이트를 절약하고 마술 99로 가져갑니다. 감사합니다.

def c(a,b):
 d,i=a.split("|"),0
 for e in d:j=i+len(e);print" "*i+e+" "*(len("".join(d))-j+1)+b;i=j

1
다른 바이트 아래를 Golfed
올리버 니켈

3
@OliverNi 님, 골프 용품 다운 팁을 제공하는 것은 높이 평가되지만이 사이트 ( source )에서는 편집 코드가 실제로 적합하지 않으므로 편집 내용을 롤백했습니다. 그래도 그 팁을 의견으로 게시하십시오! 나는 OP가 그것을 고맙게 생각할 것이지만, 그것을 테스트하고 그것을 사용할 것인지 선택하는 것은 그들에게 달려있다.
DJMcMayhem

1
둘 다 고마워 먼저 저의 겸손한 노력을 개선하기 위해 관심과 시간을내어 @Oliver에게, 두 번째로 제가 믿었지만 의견을 말할 기회가 없었던 점을 분명히 해준 DJMcMayhem에 관심을 가져 주셨습니다. 올리버-다시 한 번 감사 드리며 골프 경험을 통해 배울 수 있도록 변경 사항을 의견으로 게시하십시오.
ElPedro

1
괄호 " "*i를 2 바이트로 줄이십시오
Oliver Ni

1
당신은 또한에 변수를 설정할 수 있습니다 len(e)처럼 for e in d:z=len(e)....이 사용되기 때문에 두 번 바이트를 저장
올리버 니켈

3

05AB1E , 29 38 31 29 바이트

'|„ǝʒ:'ǝ¡'ʒмεD®>úsg®+©s}.Bεð²J,

확실히 golfed 수 있지만, 적어도 그 지금 일 수 ...
9 바이트를하기 때문에 ¡(분할) 자동으로 빈 항목을 제거, 내가 추가했다, 그래서 '|„ǝʒ:'ǝ¡'ʒм..
-2 덕분 바이트 @MagicOctopusUrn을 변경하여 '|„ǝʒ:'ǝ¡'ʒм'|¶:.BεðÜ}(현재 솔루션은 작동하지 않습니다 후행 공백이있는 항목이지만 테스트 사례에 따라 허용되는 것으로 가정합니다).

온라인으로 사용해보십시오.

설명:

'|¶:           # Take the first input, and replace every "|" with "¶"
               #  i.e. "abc|d|e||fg" → "abc¶d¶e¶¶fg" (¶ are new-lines in 05AB1E)
    .B         # Box all the items (appending trailing whitespace to make it a rectangle)
               #  i.e. "abc¶d¶e¶¶fg" → ['abc','d  ','e  ','   ','fg ']
      εðÜ}     # Remove all trailing spaces from each item
               #  i.e. ['abc','d  ','e  ','   ','fg '] → ['abc','d,'e','','fg']
               #  NOTE: `'|¡` would have resulted in ['abc','d','e','fd'], hence the use of
               #        Box which implicitly splits on new-lines to keep empty items
ε              # For-each:
 D             #  Duplicate the current item
  ®>ú          #  Prepend global_variable + 1 amount of spaces
               #  (+1 because the global_variable is -1 by default)
               #   i.e. "e" and 3+1 → "    e"
 sg            #  Swap so the duplicated item is at the top, and take its length
   ®+          #  Sum it with the global_variable
               #   i.e. "e" (→ 1) and 4 → 5
     ©         #  And store it as new global_variable
      s        #  Then swap so the space appended item is at the end again
       }       # And end the for-each loop
.B             # Box all the items (appending the appropriate amount of spaces)
               #  i.e. ['abc','   d','    e','     ','     fg']
               #   → ['abc    ','   d   ','    e  ','       ','     fg']
ε              # For-each again:
 ð             #  A space character
  I            #  The second input-character
   J           #  Join both together with the current item
    ,          #  And print the current row with trailing new-line

코드에 포함 된 경우에는 유효하지 않습니다 ǝʒ. '|¶:.Btho 작동 할 수 있습니다.
Magic Octopus Urn

@MagicOctopusUrn 도전 설명에는 " 코드 입력에는 인쇄 가능한 ASCII 만 포함되며 줄 바꿈은 포함되지 않습니다. "라고 표시 되어 있습니다. 또한 코드의 어떤 부분을 '|¶:.B?
Kevin Cruijssen 2016 년

나는 그것이 더 짧은 분할이라고 생각했지만, 현재 코드로 그냥 슬래 밍하면 작동하지 않을 것이므로 초과분을 잘라 내야합니다. 또는 .B선행 공백을 추가 한 후 초과분을 다시 무시 하십시오.
매직 문어 Urn

@MagicOctopusUrn 현재 해결 방법이 꽤 길기 때문에 실제로 바이트를 절약 할 수는 있지만 .B이미 존재 한 후에 공백이있는 선행 공백의 양을 계산하는 것이 더 어렵습니다 .
Kevin Cruijssen 2016 년

1
'|¶:.BεðÜ}εD®>úsg®+©s}.BεðIJ,? 29 바이트 반복 1 :)로 돌아갑니다. .B많은 사람들이 모르는 기능인 줄 바꿈으로 분할됩니다. 빈 요소를 유지하는 유일한 방법입니다. 이 기능을 요청했습니다. 분할을 의미하지만 빈 요소를 유지해야합니다.
Magic Octopus Urn

2

PowerShell v2 +, 103 99 바이트

param($a,$b)$a-split'\|'|%{" "*$l+$_+" "*(($a-replace'\|').length+1-$_.length-$l)+$b;$l+=$_.Length}

-splitsplit은 정규식 구문을 사용하기 때문에 첫 번째 리터럴 파이프의 두 문자열로 입력을 취하고 요소를 loop에 공급합니다 |%{...}.

각 반복마다 문자열을 $l현재 요소와 연결하여 정의 된 여러 공간으로 구성합니다. 첫 번째 루프의 경우로 $l초기화되며 $null여기서는로 평가됩니다 0.

이 문자열은 다른 수의 공백과 더 연결되어 있습니다. ( 모든 파이프에 아무것도없는 $a경우 길이 -replace1코드와 주석 사이의 추가 패딩을 제외 .length하고 현재 요소의 마이너스 $l를 빼고, 얼마나 많은 공백을 채웠는지에 의해 정의됩니다. 우리의 주석 캐릭터와 연결되어 $b있습니다. 그것은 파이프 라인에 남아 있습니다.

그런 다음 $l다음 반복을 위해 업데이트 합니다.

결과 문자열은 모두 파이프 라인에 남아 있으며 암시 Write-Output적을 통한 출력 은 프로그램 실행시 기본적으로 줄 바꿈과 함께 줄 바꿈이 이루어집니다.

PS C:\Tools\Scripts\golfing> .\esolang-comment-template-generator.ps1 "This|Code|has||empty||sections" "@"
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

PS C:\Tools\Scripts\golfing> .\esolang-comment-template-generator.ps1 "a|bc|def|ghi|h" "|"
a          |
 bc        |
   def     |
      ghi  |
         h |

2

Vim, 39 38 키 입력

DJMcMayhem 덕분에 -1 바이트

첫 문자가 주석 구분 기호 인 버퍼 (예 : 파일)를 입력 한 후 코드가 다음에 오는 것으로 예상됩니다 (예 :) #foo|bar|baz.

"cxqaf|m`Yp<Ctrl+o>v$r jv0r x@aq@a$p<Ctrl+v>gg$C <Ctrl+r>c<Esc>

설명

( " _"는 리터럴 공간을 나타냅니다.)

"cx          " Delete the first character (the comment delimiter) and store in register 'c'
qa           " Start recording macro 'a'
f|m`         " Advance to the first '|' on the line and set mark
Yp<Ctrl+o>   " Duplicate this line and return to mark
v$r_         " Replace everything after the cursor on this line (inclusive) with spaces
jv0r_x       " Go down a line and replace everything before the cursor on this line (inclusive) with
             "   spaces, then delete one space
@a           " Call macro recursively
q@a          " Stop recording and immediately call the macro
$p           " Paste the deleted space at the end of the last line
<Ctrl+v>gg$       " Highlight the column where the comment delimiters will go and all trailing spaces
C_<Ctrl+r>c<Esc>  " Replace the highlighted text on each line with a space and the contents of
                  "   register 'c' (the comment delimiter)

1
: DI는 항상 vim을 찬성합니다! 난 당신이 변경하는 경우 해제 한 바이트를 취할 수 있다고 생각 mmm`다음 변경 `m<C-o>
DJMcMayhem

@DJMcMayhem 감사합니다! 저는 매일 사용하는 도구에 대해 항상 배우기 때문에 Vim에서 골프를 좋아 합니다.
Jordan

2

플로 로이드 -94 바이트

Ah(a,b):c=a.fn("|");z(" "+b+"\n".y(' '*Z("".y(c[:j]))+l+" "*Z("".y(c[j+1:]))Kj,lIai(c))+' '+b)

@ JonathanAllan 의 Python 솔루션 과 유사한 접근 방식을 사용합니다 .

테스트 케이스

Call: h("a|bc|d|e|fgh|ij|k|l|mn|op", "#")
Output: 
a                #
 bc              #
   d             #
    e            #
     fgh         #
        ij       #
          k      #
           l     #
            mn   #
              op #

2

C 번호 176 167 154 바이트

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c)d+=b.PadLeft(i+=b.Length).PadRight(s.Length+2-c.Length)+x+"\n";return d;}

언 골프

string f(string s, char x)
{
    var c = s.Split('|');
    var d = "";
    int i = 0;
    foreach (var b in c)
        d += b.PadLeft(i += b.Length).PadRight(s.Length + 2 - c.Length) + x + "\n";
    return d;
}

LINQ 솔루션은 146 이었지만 using System.Linq;164로 다시 가져와야했습니다.

string f(string s,char x){var c=s.Split('|');int i=0;return c.Aggregate("",(g,b)=>g+b.PadLeft(i+=b.Length).PadRight(s.Length+2-c.Length)+x+"\n");}

오래된 솔루션 :

167 바이트 :

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c){d+=b.PadLeft(i+b.Length).PadRight(s.Length+2-c.Length)+x+"\n";i+=b.Length;}return d;}

문자열 보간을 사용하는 176 바이트

string f(string s,char x){var c=s.Split('|');var d="";int i=0;foreach(var b in c){d+=string.Format($"{{1,{i}}}{{0,-{s.Length+2-c.Length-i}}}{x}\n",b,"");i+=b.Length;}return d;}

1

PHP, 120 117 116 110 109 바이트

foreach($a=split('\|',$argv[1])as$i=>$t){$c=preg_replace('#.#',' ',$a);$c[$i]=$t;echo join($c)," $argv[2]
";}

또는

foreach($a=split('\|',$argv[1])as$t){$c=preg_replace('#.#',' ',$a);$c[$i++|0]=$t;echo join($c)," $argv[2]
";}

1

MATL , 33 31 바이트

'\|'0'|'hYXo8M&YbY:&YdtaZ)0ihYc

온라인으로 사용해보십시오!

설명

입력에서 블록 대각선 행렬을 만드는 내장 함수 Yd( blkdiag)는 대부분의 작업을 수행합니다. 행렬의 채우기 값은 0이며 char 0은 표시 목적을위한 공간으로 처리됩니다. 코드는 간단히 분리되고 |결과 블록에서 행렬을 작성하고 char로 변환하며 공백과 주석 기호가있는 두 개의 열을 추가합니다.

그러나, 입력 문자열에서 빈 섹션의 가능성을 복잡하게이 문제에 더 재미있는 : 결과 블록이 결과 매트릭스에 표시되지 것 때문에 비어와 것입니다.

이를 해결하기 위해 각 문자 앞에 char 0을 도입 |하므로 블록이 비어 있지 않습니다. 그런 다음 결과 char 행렬에서 char 0으로 만 구성된 열을 제거합니다. 비어 있지 않은 코드 섹션에는 인쇄 가능한 ASCII 문자가 포함되어 있으므로 해당 열이 유지됩니다. 빈 섹션은 행에 기여하지만 추가 열을 도입하지는 않습니다.

'\|'    % Push this string: source for regexp matching. It's just | escaped
0'|'h   % Push a string formed by char 0 followed by | (no escaping needed)
YX      % Input string implicitly. Replace first of the above string by the second
o       % Convert from chars to code points. Gives a numeric vector
8M      % Push '|' again
&Yb     % Split numeric vector at occurences of | (the latter is automatically
        % converted  to its code point). This gives a cell array of numeric vectors
Y:      % Unbox cell array: pushes the numeric vectors it contains
&Yd     % Form a block-diagonal matrix from those vectors
ta      % Duplicate. Compute vector that equals true for columns that have some
        % nonzero value
Z)      % Used that as a logical index (mask) for the columns of the matrix.
        % This removes columns that contain only zeros
0ih     % Input comment symbol and prepend char 0 (which will be displayed as space)
Yc      % Append that to each row of the matrix. The matrix is automatically 
        % converted from code points to chars
        % Display implicitly

1
OP가 언급 한 형식으로 설명을 넣지 않은 것에 대해 크게 실망했습니다.
Random832

1
@ Random832 나는 그 형식을 자주 사용하지 않습니다. 그것은 설명을위한 공간을 거의 남기지 않고 많은 공간을 사용합니다
Luis Mendo

첫 번째 문자열에서 이스케이프가 필요한 이유는 무엇입니까?
Conor O'Brien

@ ConorO'Brien 좋은 질문입니다. 나는 특별한 상징이 탈출해야 할 때와 그렇지 않을 때를 결코 모른다. 이 경우, |( 전 또는 후 일치하는 부분 식| )이, Matlab의 / 옥타브 정규 표현식 엔진 이상 필요하지 않습니다
루이스 Mendo

1

Pyth, 30 바이트

VJcE\|s[*ZdN*h--lsJZlNdQ)=+ZlN

또는

jm+dQ.t.t+MC,.u*l+NYdJc+Ed\|kJ

둘 다 주석 문자열의 STDIN에 입력 한 다음 줄 바꿈으로 구분 된 프로그램 문자열입니다.

첫 번째 버전을 온라인으로 사용해보십시오

온라인으로 두 번째 버전을 사용해보십시오

작동 방식

VJcE\|s[*ZdN*h--lsJZlNdQ)=+ZlN  Program. Inputs: E, Q
  cE\|                          Split E on "|"
 J                              Assign to J
                                Implicit Z=0
V                               For N in that:
       [                )        Create a list with elements:
        *Zd                       Z spaces
           N                      N
               -lsJZ              len(concatenate(J))-Z
              -     lN             -len(N)
             h                     +1
            *         d            spaces
                       Q          Q
      s                          Concatenate the list
                                 Implicitly print
                        =+ZlN    Z=Z+len(N)

jm+dQ.t.t+MC,.u*l+NYdJc+Ed\|kJ  Program. Inputs: E, Q
                       +Ed      Add a trailing space to E
                      c   \|    Split that on "|"
                     J          Assign to J
             .u                 Cumulatively reduce J with:
                            k    starting value empty string and
                                 function N, Y ->
                l+NY              len(N+Y)
               *    d             spaces
            ,                J  Two-element list of that and J
           C                    Transpose
         +M                     Map concatenation over that
       .t                       Transpose, padding with spaces
     .t                         Transpose again
 m+dQ                           Map concatenation with Q over that
j                               Join on newlines
                                Implicitly print

1

Dyalog APL 16.0 (비경쟁), 43 37 바이트

주석 문자를 입력 한 다음 코드를 입력하라는 메시지를 표시합니다.

↑(↓↑((-(⍸'|'∘=),≢)↑¨'|'∘≠⊆⊢)⍞),¨⊂¯2↑⍞

버전 16.0이이 문제보다 최신이기 때문에 비경쟁입니다.


dyalog APL은 어떻게 경쟁하지 않습니까? 아직 개발 중입니까?
DJMcMayhem

@DJMcMayhem 예. 나는 Dyalog에서 일하고 15.0이 출시되기 전에 16.0에 액세스했습니다. 16.0은 2017Q1에 출시 될 예정입니다.
Adám

어떻게 작동합니까?
Conor O'Brien

1

펄, 63 바이트

에 +5 포함 -Xpi

STDIN에서 입력으로 실행하고 -i 뒤에 주석 문자를 입력하십시오.

perl -Xpi% esolang.pl <<< "Ab|Cd||ef"

esolang.pl:

s/
/|/;s%(.*?)\|%$"x$`=~y/|//c.$1.$"x$'=~y/|//c." $^I
"%eg

완전히 지루한 간단한 솔루션


1

Turtlèd , 35 바이트 (비경쟁)

하나의 입력을 취하고 마지막 문자는 주석 문자입니다. 주석 문자는 공백으로 작동하지 않지만 필요하지 않다고 가정합니다.

!' [*.+(|' dl)r_]' r[*+.(|u)_][ .d]

설명:

!                                  take input into string variable
 '                                 write space over current cell
   [*           ]                  while cell is not *
     .+                            write pointed char of string, stringpointer+1 (starts 0)
       (|    )                     if current cell is |
         ' dl                      write space (over |), move down, left
              r_                   move right, write * if pointed char is
                                   last char, else space

                 ' r               write space, move right
                    [*       ]     while cell is not *
                      +.           increment pointer and write pointed char
                        (|u)       if cell is |, move up
                            _      write * if the pointed char is the last char

                              [   ] while cell is not space
                                .d  write the pointed char from string, move down 


0

스칼라, 123 바이트

def?(i:String,c:String)={var b=0
i.split('|').map{s=>println(" "*b+s+" "*(i.replace("|","").size-b-s.size+1)+c)
b+=s.size}}

테스트 코드 + 출력 :

?("a|b|c|d|e|f|g", ",")
a       ,
 b      ,
  c     ,
   d    ,
    e   ,
     f  ,
      g ,

?("abcdefg", ":")
abcdefg :

?("4|8|15|16|23|42", "%")
4          %
 8         %
  15       %
    16     %
      23   %
        42 %

?("E|ac|h s|ecti|on is| one c|haracte|r longer| than the| last!", "!")
E                                                   !
 ac                                                 !
   h s                                              !
      ecti                                          !
          on is                                     !
                one c                               !
                     haracte                        !
                            r longer                !
                                     than the       !
                                              last! !

?("This|Code|has||empty||sections", "@")
This                     @
    Code                 @
        has              @
                         @
           empty         @
                         @
                sections @

0

루비, 96 80 바이트

->s,c{s.gsub(/(^|\|)([^|]*)/){" "*$`.count(t="^|")+$2+" "*(1+$'.count(t))+c+$/}}

eval.in에서 참조하십시오 : https://eval.in/639012

정말 레티 나를 배워야합니다.


0

젤리 , 41 바이트

이것은 너무 많은 증분과 너무 많은 링크가있는 것처럼 보입니다 ...

ṫø⁹‘‘µFL‘⁶ẋ
‘ị
ḣFL⁶ẋ$;ç@;1ŀ
J’ç@€
ṣ”|Ç;€Y

TryItOnline 에서 테스트

어떻게?

ṫø⁹‘‘µFL‘⁶ẋ  - link 1: get the spaces for after the code, dyadic(split string, index)
 ø           - next chain as a nilad
  ⁹‘‘        - right argument incremented twice (the index we actually want)
ṫ            - tail (get the rest of the split string)
     µ       - next chain as a monad
      FL‘    - flatten, get its length and increment
         ⁶   - a space character " "
          ẋ  - repeat the space character that many times

‘ị           - Link 2: get the code for a line dyadic(index, split string)
‘            - increment the index
 ị           - retrieve the string at that index

ḣFL⁶ẋ$;ç@;1ŀ - Link 3: get the code and join with spaces, dyadic (index, split string)
ḣ            - head: split string[index:]
 FL          - flatten and get its length
     $       - previous two atoms as a monad
   ⁶         - a space character, " "
    ẋ        - repeat the space that many times
      ;      - concatenate with
       ç@    - the result of the previous link (the code) - reverse inputs
         ;   - concatenate with
          1ŀ - the result of Link 1 (the spaces after the code)

J’ç@€        - Link 3: a for loop, monadic(split string)
J’           - [0,...,Len(split string)-1]
  ç@€        - the result of the previous link, with revered inputs, for each

ṣ”|Ç;€Y      - Main Link: dyadic(code string, comment character)
ṣ”|          - split on "|"
   Ç         - the result of the previous link
    ;€       - concatenate each with the comment character
      Y      - join with line feeds
             - implicit print

0

CJam, 32 바이트

l'|/_s,)L@{1$,S*\+}%@f{Se]}lN+f+

설명

l                                  get code string
 '|/                               split into code parts
    _s,)                           length of all the parts +1
        L@{1$,S*\+}%               left pad spaces to every part for the length of the previous parts
                    @f{Se]}        right pad spaces
                           lN+f+   add comment character and newline

온라인으로 사용해보십시오


0

GolfScript, 85 바이트

{(;);}:r;", "%(r\(r n+:c;;.,\'|'%.,@\-)):l;0:m;{.,0>}{" "m*\(.,m+:m l\-" "\*+c@}while

온라인으로 사용해보십시오

2017 업데이트 -GolfScript -71 바이트

', '/~~:c;~1/.,\.{'|'=},,@\-):l;['|']/0:i;{.,i+:i l i-' '*c+\' '*"
"\}/

설명

', '/~~:c;~1/        # Parses input
.,\.{'|'=},,@\-):l;  # Computes string length without '|'
['|']/               # Splits the array
0:i;                 # Counter
{.,                  # Length of the substring
i+:i                 # Counter update
l i-' '*c+\          # Adds spaces after the substring 
' '*"\n"\            # Adds spaces before the next substring
}/                   # ...For each substring

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.