Esolang-Comment-Template-Generator

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

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, 함수 인수 / 반환 값 등. 평상시와 같이 이것은 이므로 가능한 짧은 코드를 작성하고 가장 짧은 솔루션을 얻을 수 있으면 승리하십시오. 당신의 언어로! 또한 가장 짧은 솔루션을 전체 우승자로 선택합니다. 표준 허점 은 금지되어 있습니다.



답변

Pyth- 28 27 24 23 바이트

약간 골프를 칠 수 있습니다. 분명히 많이!

jt+R+;zC.t.u+*lNdYcQ\|k

여기에서 온라인으로 사용해보십시오 .


답변

망막 , 35 34 바이트

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

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

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

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


답변

자바 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

답변

파이크, 31 28 24 바이트

\|cDslF2l-hd*Q+Zi:il?+ZK

여기 사용해보십시오!


답변

자바 스크립트 (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>

답변

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 @

답변

하스켈, 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