들여 쓰기


63

코드를 반대로 들여 쓰기하면 코드가 더 빨리 실행될 수 있으므로 컴파일러가 "분기"맨 위에서 트리 디자인 패턴처럼 코드를 처리 할 수 ​​있다고 들었습니다. 중력은 코드를 컴파일하는 데 걸리는 시간이 빨라지고 데이터 구조 효율성이 향상되기 때문에 도움이됩니다. 다음은 Java 스크립팅의 예입니다.

            function fib(n) {
        var a = 1, b = 1;
        while (--n > 0) {
    var tmp = a;
    a = b;
    b += tmp;
    if (a === Infinity) {
return "Error!";
    }
        }
        return a;
            }

그러나 어떤 이유로 메모장에는이 작업을 자동으로 수행 할 수있는 설정이 없으므로 나를 위해 프로그램이 필요합니다.

기술

제출물은 코드 스 니펫을 입력으로 사용하고 들여 쓰기를 되돌리고 결과 코드를 출력해야합니다.

이것은 다음 절차에 의해 수행됩니다.

  • 코드를 줄로 나눕니다. 각 줄은 0 개 이상의 공백으로 시작합니다 (탭이 없음).

  • 코드에서 고유 한 들여 쓰기 수준을 모두 찾으십시오. 예를 들어, 위 예제의 경우

    0
    4
    8
    12
    
  • 이 들여 쓰기 수준 목록의 순서를 반대로 바꾸고 반전 된 목록을 원래 목록에 매핑하십시오. 이것은 말로 설명하기 어렵지만 예를 들면 다음과 같습니다.

    0  — 12
    4  — 8
    8  — 4
    12 — 0
    
  • 이 매핑을 원래 코드에 적용하십시오. 예를 들어, 공백 들여 쓰기가 0 인 줄은 12 개의 공백으로 들여 쓰기되고, 4 개의 공백은 8 개의 공백이됩니다.

입출력

원하는대로 입력 및 출력을 제공 할 수 있습니다 (STDIN / STDOUT, 기능 매개 변수 / 반환 값 등). 언어가 여러 줄 입력을 지원하지 않는 경우 (또는 원하지 않는 경우) |대신 문자를 사용하여 줄을 구분할 수 있습니다 .

입력은 인쇄 가능한 ASCII + 줄 바꿈만으로 구성되며 빈 줄은 포함하지 않습니다.

테스트 사례

입력:

function fib(n) {
    var a = 1, b = 1;
        while (--n > 0) {
            var tmp = a;
            a = b;
            b += tmp;
            if (a === Infinity) {
                return "Error!";
            }
        }
    return a;
}

출력 : 위의 예제 코드.

입력:

a
  b
  c
d
   e
        f
  g
   h

산출:

        a
   b
   c
        d
  e
f
   g
  h

입력:

1
 2
  3
 2
1

산출:

  1
 2
3
 2
  1

입력:

  foo

산출:

  foo

21
"Java scripting"이 아닌 "JavaScript": /
Optimizer

75
@Optimizer 나는 처음 두 단락으로 가능한 많은 사람들을 화나게하는 나의 목표가 달성 된 것을 본다. ;)
Doorknob

7
1! = 가능한 많은 사람들.
Optimizer

23
@JanDvorak MLA 스타일의 인용문을 발명 한 사람은 이것이 좋은 생각이라고 생각합니다.
Rainbolt

6
아마도 더 빠릅니다. 위원회를 할당하고 그 목적을 잊어 버린 동안 몇 년을 기다리겠습니다.
Conor O'Brien

답변:


10

CJam, 43 39 36 35 바이트

qN/_{_Sm0=#}%___&$_W%er]z{~S*@+>N}%

이거 너무 오래 보입니다. 나는 충분히 최적화 하지 않고 있다고 확신합니다 !

작동 방식 :

기본 아이디어는 입력을 줄 바꿈으로 나누고 각 줄의 선행 공백 수를 계산하고 고유 한 숫자를 정렬하여 가져오고 해당 배열을 복사하고 사본을 뒤집은 다음이 두 배열로 원래 순서대로 숫자를 음역 한 다음 마지막으로 이 정보를 사용하는 최종 문자열.

가장 긴 부분은 CJam이 쉽게 할 수있는 방법이 없기 때문에 각 줄에 몇 개의 선행 공간이 있는지 알아내는 것입니다.

코드 확장 :

qN/_                                      "Split the string on newline and take copy";
    {_Sm0=#}%                             "Map this code block on the copy";
     _Sm                                  "Copy the string and remove spaces from the copy";
        0=                                "Get first non space character";
          #                               "Gets its index in original string";
             ___                          "Get 3 copies of the above array";
                &$_W%                     "Get unique elements, sort, copy and reverse";
                     er                   "Transliterate unique sorted elements with";
                                          "the unique reverse sorted in the copy";
                       ]z                 "Get array of [row,
                                          " original number of leading spaces,
                                          " required number of leading spaces]";
                         {~S*@+>N}%       "For each above combination";
                          ~S*             " unwrap and get leading space string";
                             @+           " prepend to the row";
                               >          " remove original spaces";
                                N         " put newline";

그리고 질문의 정신에서. 코드의 실제 확장 :

                                          qN/_                                      "Split the string on newline and take copy";
                                {_Sm0=#}%                             "Map this code block on the copy";
                               _Sm                                  "Copy the string and remove spaces from the copy";
                             0=                                "Get first non space character";
                          #                               "Gets its index in original string";
                         ___                          "Get 3 copies of the above array";
                       &$_W%                     "Get unique elements, sort, copy and reverse";
                     er                   "Transliterate unique sorted elements with";
"the unique reverse sorted in the copy";
                ]z                 "Get array of [row,
" original number of leading spaces,
" required number of leading spaces]";
             {~S*@+>N}%       "For each above combination";
          ~S*             " unwrap and get leading space string";
        @+           " prepend to the row";
     >          " remove original spaces";
    N         " put newline";

Martin 덕분에 7 바이트 절약, Dennis 덕분에 1 바이트 절약

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


1. {}#버그가 있습니다 : 정수를 반환하지만 Long을 반환해야합니다. 아이러니하게도 i(정수로 캐스트)이 문제를 해결합니다. 2. ""#같은 버그가 없기 때문에 _Sm0=#1 바이트가 짧습니다.
Dennis

@Dennis 그래, 버그는 이상하다. 해결 방법에 감사드립니다!
Optimizer

2
확장에서 들여 쓰기는 너무 읽기 쉽습니다! 당신은 그것을 뒤집어 야합니다!
DLeh December

13

파이썬 2 - 137 131 바이트

i=raw_input().split('|')
f=lambda s:len(s)-len(s.lstrip())
d=sorted(set(map(f,i)))
for l in i:print' '*d[~d.index(f(l))]+l.lstrip()

|대신 입력 을 \n받습니다.

설명

처음 세 줄은 매우 간단합니다. 입력의 모든 행 목록을 만들고 문자열의 선행 공백 수를 알려주는 함수를 정의하고 각 입력 행에 대해 기능을 수행하는 정렬 된 값 목록을 만듭니다.

마지막 줄은 더 재미있다.

                                 l               # string with the line
                               f(l)              # amount of leading whitespace
                       d.index(f(l))             # where it is in list of whitespace amounts
                      ~d.index(f(l))             # bitwise NOT (~n == -(n+1))
                    d[~d.index(f(l))]            # index into the list (negative = from end)
           print' '*d[~d.index(f(l))]            # print that many spaces...
           print' '*d[~d.index(f(l))]+l.lstrip() # plus everything after leading whitespace
for l in i:print' '*d[~d.index(f(l))]+l.lstrip() # do the above for every line


@frya thanks :)
undergroundmonorail

1
이 모두는 당신에게 2 바이트 (2를 지불 저장해야하는 파이썬 3에서 잘 보인다 ()4를 저장 raw_)
FryAmTheEggman

1
f(s)for s in i이어야합니다 map(f,i).
feersum

1
마술 : d=[];d+=set(L)은의 짧은 버전입니다 d=sorted(set(L)).
xnor

7

자바 스크립트, ES6, 113 103 101 바이트

나는 이것이 조금 더 골프를 칠 수 있다고 확신하지만 여기에 간다.

파이썬을 제치고 101 바이트의 JS 솔루션이있을 것이라고 생각하지 않았을 것입니다!

f=a=>(b=c=[...Set(a.match(r=/^ */gm).sort())],c.map((x,i)=>b[x]=c.slice(~i)[0]),a.replace(r,x=>b[x]))

f입력 문자열로 호출 할 수있는 이름 이 지정된 메소드가 작성 됩니다. 최신 Firefox를 사용하는 경우 템플릿 문자열이 있으며 다음과 같은 메소드를 호출 할 수 있습니다

f(`a
  b
  c
d
   e
        f
  g
   h`)

그렇지 않으면 다음과 같이 호출 할 수도 있습니다

f("a\n\
  b\n\
  c\n\
d\n\
   e\n\
        f\n\
  g\n\
   h")

또는 아래 스 니펫을 사용해보십시오.

g=_=>O.textContent=f(D.value)

f=a=>(b=c=[...Set(a.match(r=/^ */gm).sort())],c.map((x,i)=>b[x]=c.slice(~i)[0]),a.replace(r,x=>b[x]))
<textarea id=D></textarea><button id=B onclick=g()>Inverse!</button>
<pre id=O></pre>


정규 표현식을 변수로 두 번 ( \s공백 문자 로 바꿀 수 있어야 함 ) 저장 x하고 replace 함수에서 괄호를 제거하여 쿠데타 바이트를 저장할 수 있습니다.
NinjaBearMonkey

@ hsl gee, 감사합니다! 내가 쓴 이유조차 모르겠다 (x): /
Optimizer

둘 다 필요하지 않습니다 b그리고 c당신은 무엇입니까? 그들은 어쨌든 동일한 배열을 참조합니다.
Neil

5

루비, 63 바이트

->s{l=s.scan(r=/^ */).uniq.sort;s.gsub r,l.zip(l.reverse).to_h}

문자열을 가져 와서 반환하는 명명되지 않은 함수를 정의합니다. ["string here"]변수를 추가 하거나 변수에 할당 한 다음 해당 변수를 호출하여 호출 할 수 있습니다.

작동 방식 : 나중에 사용하기 위해 s.scan(r=/^ */)정규식으로 r사용 되는 모든 주요 공간 및 상점 목록을 제공합니다 . uniq중복을 제거합니다. sort... 정렬합니다.

이제 끝으로 건너 뛰고 l.zip(l.reverse)대체하려는 쌍의 배열을 제공하십시오. to_h쌍을 키-값 쌍으로 해석하여 해시로 변환합니다.

이제 s.gsub해당 해시를 룩업 테이블로 사용하여 대체를 찾기 위해 정규식 (모든 선행 공백)의 모든 일치 항목을 대체했습니다.



2

apt -R , 27 바이트

·
mâ\S
Vâ n
Ëx2 iSpWg~WbVgE

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

포장 풀기 및 작동 방식

Input: U = multiline string

qR    Split by newline and implicit assign to U

mâ\S
m     Map over U...
 â\S    .search(/\S/); first index of non-whitespace char
      Implicit assign to V (V = array of indentations)

Vâ n  Take unique elements of V, sort, and implicit assign to W

mDEF{Dx2 iSpWg~WbVgE
mDEF{                 Map over U...
     Dx2                Trim left
         iSp            Indent by this many spaces...
                 VgE      Find the current indentation stored in V
               Wb         Find its index on W
            Wg~           Take the opposite element on W

-R    Join with newline

그것이 실제로 작동 하는 방법

                 Input: U = multiline string

                 qR    Split by newline and implicit assign to U

                 mâ\S
                 m     Map over U...
               â\S    .search(/\S/); first index of non-whitespace char
         Implicit assign to V (V = array of indentations)

                 Vâ n  Take unique elements of V, sort, and implicit assign to W

                 mDEF{Dx2 iSpWg~WbVgE
                 mDEF{                 Map over U...
            Dx2                Trim left
      iSp            Indent by this many spaces...
VgE      Find the current indentation stored in V
 Wb         Find its index on W
     Wg~           Take the opposite element on W

                 -R    Join with newline

1

스칼라 176 171

def g(n:String)={val a=n.split('|').map(a=>a.prefixLength(' '==)->a)
(""/:a){case(s,(l,p))=>val b=a.unzip._1.distinct.sorted
s+" "*b.reverse(b.indexOf(l))+p.drop(l)+'\n'}}

끝에 줄 바꿈이 추가됩니다. 줄 끝에서 공백을 유지할 필요가 없으면 167까지 얻을 수 있습니다.

def t(n:String)={val a=n.split('|').map(a=>a.prefixLength(' '==)->a.trim)
(""/:a){(s,l)=>val b=a.unzip._1.distinct.sorted
s+" "*b.reverse(b.indexOf(l._1))+l._2+'\n'}}

언 골프 드 :

      def reverseIndent(inString: String): String = {
    val lines = inString.split('\n')
    val linesByPrefixLength = lines.map { line =>
  line.prefixLength(char => char == ' ') -> line
    }
    val distinctSortedPrefixLengths = linesByPrefixLength.map(_._1).distinct.sorted
    val reversedPrefixes = distinctSortedPrefixLengths.reverse
    linesByPrefixLength.foldLeft("") { case (string, (prefixLength, line)) =>
  val newPrefixLength = reversedPrefixes(distinctSortedPrefixLengths.indexOf(prefixLength))
  val nextLinePrefix = " " * newPrefixLength
  string + nextLinePrefix + line.substring(prefixLength) + '\n'
    }
      }

1

PowerShell , 112 바이트

$x=@($args|sls '(?m)^ *'-a|% m*|% v*|sort -u)
[regex]::Replace($args,'(?m)^ *',{$x[-1-$x.IndexOf($args.Value)]})

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

덜 골프 :

$xIdents=@($args|select-string '(?m)^ *'-AllMatches|% matches|% value|sort -unique) # get a sorted set of indentations
[regex]::Replace($args,'(?m)^ *',{$xIdents[-1-$xIdents.IndexOf($args.Value)]})    # replace each indentation with opposite one

0

하스켈, 116

import Data.List
f s|l<-map(span(==' '))$lines s=unlines[k++b|(a,b)<-l,(k,r)<-reverse>>=zip$sort$nub$map fst l,r==a]

0

PHP-173 바이트

최적화되지 않은 코드는 $v변수에 저장해야 합니다.

<?php $f='preg_replace';$f($p='#^ *#me','$i[]='.$s='strlen("$0")',$v);$a=$b=array_unique($i);sort($a);rsort($b);echo$f($p,'str_repeat(" ",array_combine($a,$b)['.$s.'])',$v);

ungolfed 및 주석이 달린 버전은 다음과 같습니다.

<?php
// Get the level of indentation for each line
$preg_replace = 'preg_replace';
$pattern = '#^ *#me';
$strlen = 'strlen("$0")';
$preg_replace($pattern, '$indentationLevelsOldList[] = '. $strlen, $value);

// Create an array associating the old level of indentation with the new expected one
$sortedArray = array_unique($indentationLevelsOldList);
$reverseSortedArray = $sortedArray;

sort($sortedArray);
rsort($reverseSortedArray);

$indentationLevelsNewList = array_combine($sortedArray, $reverseSortedArray);

// Print the correctly indented code
echo $preg_replace($pattern, 'str_repeat(" ", $indentationLevelsNewList['. $strlen .'])', $value);

아마 너무 더러운 것을 쓴 적이 없습니다. 나는 부끄러워 해요.


0

자바 스크립트, 351

var i=0;var a=$("#i").html().split("\n");var b=[];for(;i<a.length;i++){j=a[i].match(/\s*/)[0];if(b.indexOf(j)<0){b.push(j);}}b.sort(function(a,b){return a - b;});var c=b.slice().reverse();var d="";for(i=0;i<a.length;i++){d+=a[i].replace(/\s*/,c[b.indexOf(a[i].match(/\s*/)[0])])+"\n";j=a[i].search(/\S/);if(b.indexOf(j)<0){b.push(j);}}$("#i").html(d);

언 골프 버전 :

var i = 0;
var a = $("#i").html().split("\n");
var b = [];
for (; i < a.length; i++) {
  j = a[i].match(/\s*/)[0];
  if (b.indexOf(j) < 0) {
    b.push(j);
  }
}
b.sort(function(a, b) {
  return a - b;
});
var c = b.slice().reverse();
var d = "";
for (i = 0; i < a.length; i++) {
  d += a[i].replace(/\s*/, c[b.indexOf(a[i].match(/\s*/)[0])]) + "\n";
  j = a[i].search(/\S/);
  if (b.indexOf(j) < 0) {
    b.push(j);
  }
}
$("#i").html(d);

테스팅


0

펄 5, 112

111 + 1 -n( -E무료)

@{$.[$.]}=/( *)(.*)/;++$_{$1}}{map$_{$_[$#_-$_]}=$_[$_],0..(@_=sort keys%_);say$_{$.[$_][0]}.$.[$_][1]for 0..$.

더 적은 스트로크로 수행 할 수 있다고 확신하지만 현재는 잘 모르겠습니다.

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