공백 골퍼 구현


15

Forked 와 같은 일부 2 차원 esolang 과 Python 과 같은 비등 어 (non-esolang )는 때때로 코드 행 앞에 공백이 필요할 수 있습니다. 이것은 골프가 아닙니다. 또한, 나는 게으르고 코드 전에 많은 공간이 필요한 2d lang을 작성합니다. 당신의 임무는 이러한 언어를 골퍼하게 만드는 도구를 작성하는 것입니다.

물론 이것은 완벽하지는 않습니다. 예를 들어 숫자가 소스 행의 첫 번째 문자 인 경우에는 사용할 수 없습니다. 그러나 일반적으로 유용합니다.

도전

당신은 프로그램이나 함수를 작성합니다 ...

  • ... 하나의 인수, 파일 이름 또는 문자열을 취합니다.
  • ... 표준 입력에서 읽습니다.

다음을 cat제외하고 프로그램은 다음과 같이 작동합니다 .

  • 한 줄의 첫 번째 문자가 숫자이면 코드에서 x 공백 을 인쇄 합니다. 여기서 x 는 해당 숫자입니다.
  • 그렇지 않으면 간단하게 인쇄됩니다.
  • 입력의 다른 모든 문자와 마찬가지로.

테스트 사례

입력:

foo bar foo bar
1foo bar foo bar foo bar
2foo bar foo bar foo bar foo bar

산출:

foo bar foo bar
 foo bar foo bar foo bar
  foo bar foo bar foo bar foo bar

입력:

--------v
8|
8|
80
8,
7&

산출:

--------v
        |
        |
        0
        ,
       &

입력:

foo bar
bar foo
foo bar

산출:

foo bar
bar foo
foo bar

입력:

0123456789
1234567890
2345678901
3456789012
4567890123

산출:

123456789
 234567890
  345678901
   456789012
    567890123

규칙

  • 첫 문자가 숫자 인 행을 제외하고 출력은 정확히 입력과 같아야합니다.
  • 프로그램은 원하는 경우 후행 줄 바꿈을 제외하고 파일에 아무것도 추가하거나 추가 할 수 없습니다.
  • 프로그램이 입력에 대해 가정하지 않을 수 있습니다. 빈 줄, 숫자 없음, 유니 코드 문자 등을 포함 할 수 있습니다.
  • 두 자리 이상의 숫자가 줄 (예 :)을 시작 523abcdefg하면 첫 번째 숫자 (예 : 5) 만 공백으로 바뀌어야합니다.

우승자

각 언어에서 가장 짧은 코드가 승리합니다. 재미와 행운을 빕니다!



6
Of course, this will not be perfect; it cannot be used, for instance, when a number is the first character on a line of source.사실이 아닙니다. 첫 번째 문자를 0으로 만드십시오 (ahem, 마지막 테스트 사례)
HyperNeutrino

우리는 (표준 입력 문자열 목록을 읽을 수 이 유효 )?
Riley

답변:



10

큐빅 으로 69 바이트

R1B1R3B1~(+50<7?6{+54>7?6{-002+7~?6{(@5*1-1/1)6}}}(-6>7?6&@7+70-4~)6)

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

설명:

먼저이 초기화를 수행합니다.

R1B1R3B1

이 큐브를 설정하려면

   533
   004
   000
411223455441
311222331440
311222331440
   555
   555
   200

이 큐브에서 가장 중요한 점은면의 5합계가 32로, 공간을 인쇄하는 데 필요한 값입니다. 우연히도, 그것은 다른 모든 계산에는 상당히 짧습니다. 그 후 :

~( . . . )                                    Takes the first input, then loops indefinitely

  +50<7?6{+54>7?6{-002+7~?6{(@5*1-1/1)6}}}    Handle leading digit:
  +50<7?6{                               }    If input is greater than 47 ('0' is 48)
          +54>7?6{                      }     And input is less than 58 ('9' is 57)
                                              Then input is a digit
                  -002+7                      Set notepad equal to value of input digit
                        ~                     Take next input (only convenient place for it)
                         ?6{           }      If the notepad isn't 0
                            (        )6       While the notepad isn't 0:
                             @5                 Print a space
                               *1-1/1           Decrement the notepad by one
                                              Leading digit handled

     (-6>7?6&@7+70-4~)6                       Handle rest of line:
     (               )6                       While the notepad isn't 0:
      -6>7?6&                                   Exit if End of Input
             @7                                 Print the next character
               +70-4                            Set notepad to 0 if it was a newline
                    ~                           Take the next character

1
와우, 그것은 중첩 된 ... 모든 것을 잘 사용합니다. +1
MD XF

6

껍질 , 15 13 바이트

@Zgarb 덕분에 -2 바이트

mΓo+?oR' i;±¶

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

@Jonathan Allan과 동일한 기술을 사용합니다.

설명

             ¶  -- split input into a list of lines
m               -- apply the following function to each line
 Γ              --   deconstruct the string into a head and a tail
  o+            --   prepend to the tail of the string ...
    ?      ±    --     if the head is a digit (n)
     oR' i      --       the string of n spaces
                --     else
          ;     --       the head of the string
                -- implicitly print list of strings line-by-line

2
사용하여 13 바이트Γ .
Zgarb

5

자바 스크립트 (ES8), 38 37 바이트

a=>a.replace(/^\d/gm,a=>''.padEnd(a))

나는 그것이 훨씬 더 향상 될 수 있다고 생각하지 않습니다. Shaggy
덕분에 1 바이트 절약-ES8 기능 사용.


" 더 많이 개선 될 수는 없다고 생각합니다. "-ES8을 사용하여 바이트를 절약 할 수 있습니다 padEnd.s=>s.replace(/^\d/gm,m=>"".padEnd(m))
Shaggy

@얽히고 설킨. ES8이 이미 허용되는지 몰랐습니다. 감사.

1
기능을 지원하는 단일 인터프리터 (예 : 브라우저)가있는 경우 해당 기능은 여기에 공정한 게임입니다 :)
Shaggy

4

파이썬 2 , 98 74 67 65 바이트

Jonathan Allan 덕분에 -24 바이트 Mr. Xcoder 덕분에 -7 바이트.

for i in open('f'):print' '*int(i[0])+i[1:]if'/'<i[:1]<':'else i,

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

파일 이름을 입력합니다 f.


또한 행의 첫 문자에 숫자가 없을 때 오류가 발생합니다 (목록을 사용하여 항목을 선택하는 방법으로 모든 요소가 평가됨)
Jonathan Allan


87 바이트 -TIO 링크의 헤더가 조롱 중입니다 open. 코드는 'f'라는 파일을 예상하고 있습니다. 괜찮아요?
Jonathan Allan

아, 사실 ' '*0은 거짓입니다. [:1]그래도 사용 은 여전히 ​​저축입니다. 의 기본 동작은 줄을 반복 read하는 것이므로 믿지 않아도 됩니다. 또한 기본값 이므로 모드가 필요하지 않습니다 . 내가 맞다면 그건 73입니다 ! readlinesopen'r'
Jonathan Allan


4

루비 , 24 21 + 1 = 25 22 바이트

-p플래그를 사용합니다 . GB에서 -3 바이트

sub(/^\d/){"%#$&s"%p}

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


{ "% # $ & s"% ""}는 1 바이트를 절약합니다
GB

그리고 gsub 대신 sub를 사용하는 경우 또 다른 바이트
GB

@GB %p대신에 다른 바이트를 넣어 다른 바이트 %"". 당신의 도움을 주셔서 감사합니다!
Value Ink

3

05AB1E , 10 바이트

v0y¬dićú},

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


1
빈 줄이있는 입력은 어떻게합니까?
Jonathan Allan

어떤 아이디어 LOL은 ... 나는 그것을 들여다 보지 것
올리버 니켈에게

|vy¬dićú},10 바이트 작동합니다.
Riley

빈 줄을 입력 할 수는 없습니다. 빈 줄에 대해 코드 가 작동하지 않는다는 것입니다 . 하나의 0을 사용하면 작동하지 않으므로 존재하지 않는 머리에 관한 것이어야합니다 (@Riley의 제안 10과 동일) 그건 그렇고).
Jonathan Allan

@JonathanAllan |작동 방식과 관련이 있습니다. 예정 push the rest of input as an array with strings이지만 빈 줄 ( TIO ) 에서 멈 춥니 다 . 더 알고 싶다면 05AB1E 대화방 에서 이것을 가져 왔습니다 .
Riley


2

젤리 , 19 바이트

V⁶ẋ
Ḣǹe?ØD;
ỴÇ€Yḟ0

문자 목록을 가져오고 리턴하는 모나드 링크 또는 결과를 인쇄하는 전체 프로그램.

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

어떻게?

V⁶ẋ - Link 1, make spaces: character (a digit)
V   - evaluate as Jelly code (get the number the character represents)
 ⁶  - a space character
  ẋ - repeat

Ḣǹe?ØD; - Link 2, process a line: list of characters
Ḣ        - head (get the first character and modify the line)
         -   Note: yields zero for empty lines
     ØD  - digit characters = "0123456789"
    ?    - if:
   e     - ...condition: exists in? (is the head a digit?)
 Ç       - ...then: call the last link as a monad (with the head as an argument)
  ¹      - ...else: identity (do nothing; yields the head)
       ; - concatenate with the beheaded line

ỴÇ€Yḟ0 - Main link: list of characters
Ỵ      - split at newlines
 Ç€    - call the last link (1) as a monad for €ach
   Y   - join with newlines
    ḟ0 - filter out any zeros (the results of empty lines)

beheaded line이것이 실제 용어입니까? xD
HyperNeutrino

1
글쎄, 지금이다 :)
Jonathan Allan

Ahahaha 나는 당신을 outgolfing 시도하고 본질적으로 당신의 xD와 동일한 솔루션으로 끝났다
HyperNeutrino


2

하스켈 , 63 바이트

unlines.map g.lines
g(x:r)|x<';',x>'/'=(' '<$['1'..x])++r
g s=s

온라인으로 사용해보십시오! 첫 번째 줄은 주어진 문자열을 여러 줄로 나누고 g각 줄에 함수 를 적용 하고 결과 줄을 줄 바꿈과 결합 하는 익명 함수입니다 . 에서는 g그 첫 문자 여부를 판정 x선의가 숫자이다. 이 경우, 다음 ['1'..x]길이의 문자열이 디지트의 값과 동일하게 산출 x하고 ' '<$많은 공간과 같은 문자열로 변환한다. 마지막으로 나머지 줄 r이 추가됩니다. x숫자가 아닌 경우 두 번째 방정식에 g s=s있고 수정되지 않은 행을 반환합니다.


2

파이썬 2 , 76 72 68 바이트

@ovs 덕분에 -4 바이트 !

@DeadPossum은 Python 2로 전환 할 것을 제안했는데, 이는 4 바이트도 절약했습니다.

첫 번째 문자가 숫자인지 여부를 명시 적으로 확인 하지 않는 Python 2의 경쟁력있는 전체 프로그램을 보유하는 것이 좋다고 생각했습니다 . 파일에서 입력을 읽습니다 f.

for i in open('f'):
 try:r=int(i[0])*" "+i[1:]
 except:r=i
 print r,

온라인으로 사용해보십시오! ( @ovs 제공 )


@ovs 감사합니다
Mr. Xcoder

@ovs 무엇을 변경 했습니까 (수동으로 할 것입니까)? 퍼머 링크를 해독 할 수 없다고 알려줍니다
Mr. Xcoder

모든 반복에서 인쇄하는 대신 출력에 변수를 할당하고 마지막에 모두 인쇄했습니다.
ovs

@ovs 변수 아이디어 덕분에 모든 반복을 인쇄하여 72 바이트를 얻을 수있었습니다!
Mr. Xcoder

파이썬 2 버전은 68 바이트print 를 줄 것입니다
Dead Possum

2

자바 8 , 105 99 97 93 바이트

Nevay의 제안으로 몇 바이트를 더 절약했습니다.

s->{int i=s.charAt(0);if(i>47&i<58)s=s.substring(1);while(i-->48)s=" "+s;System.out.print(s);}

1
골프 버전에는 두 가지 버그가 있습니다. 숫자 검사는 또는 대신에를 사용해야합니다. 숫자 확인 후 괄호가 없습니다. 그 외에도 s->{int i=s.charAt(0);if(i>47&i<58)for(s=s.substring(1);i-->48;s=" "+s);System.out.print(s);}(93 바이트)를 사용하여 몇 바이트를 저장할 수 있습니다 .
Nevay

@Nevay 당신이 맞아요. 감사. 답변을 업데이트하겠습니다.
CoderCroc

2

R , 138128 바이트

CriminallyVulgar 덕분에 -9 바이트

n=readLines();for(d in grep("^[0-9]",n))n[d]=gsub('^.?',paste0(rep(' ',eval(substr(n[d],1,1))),collapse=''),n[d]);cat(n,sep='
')

이것은 꽤 나쁘지만 지금은 조금 나아졌습니다 ... R은 다시 한 번 문자열이 끔찍합니다.

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


2
나는 CriminallyVulgar 를 대표하여 129 바이트 버전 을 제안 하지만 의견을 말할 만큼 평판이 좋지 않습니다.
Mr. Xcoder

@ Mr.Xcoder 감사합니다 @CriminallyVulgar!
주세페

123 바이트 분명히 rep는 두 번째 인수에 대해 int 문자열을 사용할 수 있습니까 ???
CriminallyVulgar

@CriminallyVulgar 허. rep 문서에 바로 있습니다 . 이제 다른 입력을 정수 또는 이중 벡터로 강제 변환합니다.
주세페

2

Japt (v2.0a0), 11 10 바이트

젤리 05AB1E를 치는 Japt? 맞지 않는 것 같습니다!

r/^\d/m_°ç

그것을 테스트


설명

문자열의 암시 적 입력 U

r/^\d/m

r줄의 시작 부분에 모든 숫자가 나오는 정규식 바꾸기 ( )를 사용하십시오 ( 여러 줄 m플래그입니다- g플래그는 기본적으로 Japt에서 활성화되어 있습니다).

_

Z현재 요소가 있는 함수를 통해 각 일치 항목을 전달하십시오 .

°

접미사 증가 연산자 ( ++). Z다음 연산을 위해 정수를 늘리지 않고 정수 로 변환 합니다.

ç

공백 문자를 Z반복하십시오.

결과 문자열을 내재적으로 출력합니다.


m@단축 할 수 있습니까 ?
Oliver

이 경우에는 아닙니다. @Oliver; 다음 m은 map 메소드가 아닌 정규식에 대한 여러 줄 플래그입니다.
Shaggy

1
@Oliver : r/^\d/m_î(또는 r/^\d/m_ç) 2 바이트가 짧지 만 Z문자열이므로 안타깝게도 작동하지 않습니다. r/^\d/m_°ç, 1 바이트 절약을 위해, 수행 업무, :)하지만
얽히고 설킨

°ç놀라운 트릭입니다 :-) 난 그냥 제안 것 \d정규식에 대한,하지만 플래그 밖으로 그 잎이 ... 아마도 내가 같은 단일 클래스 정규 표현식에,에 플래그에 대한 지원을 추가해야합니다 \dm아웃 오, 그래, 그 (잎을 ^너무 ...)
ETH 프로덕션

@ETHproductions, RegExes에서 오프닝을 /선택적 으로 만드는 것이 가능 합니까?
Shaggy

1

젤리 , 19 바이트

Ḣ⁶ẋ;µ¹µḣ1ẇØDµ?
ỴÇ€Y

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

Jonathan Allan의 의견과 그의 게시물을 보면 총 5 바이트

설명

Ḣ⁶ẋ;µ¹µḣ1ẇØDµ?  Main link
             ?  Ternary if
                if:
       ḣ1       the first 1 element(s) (`Head` would modify the list which is not wanted)
         ẇ      is a sublist of (essentially "is an element of")
          ØD    "0123456789"
                then:
  ẋ             repeat
 ⁶              ' '
Ḣ               n times where n is the first character of the line (head)
   ;            concatenate the "beheaded" string (wording choice credited to Jonathan Allan)
                else:
     ¹          Identity (do nothing)
    µ µ     µ   Link separators
ỴÇ€Y            Executed Link
Ỵ               Split by newlines
  €             For each element,
 Ç              call the last link on it
   Y            Join by newlines

인수를 교환 할 필요가 없습니다 :Ḣ⁶ẋ;
Jonathan Allan

단 하나의 숫자 문자 만 포함하는 줄이 있으면 팝 트릭이 작동하지 않습니다. (-1 ;0Ḣ바이트에 대해 작동 할 것입니다. 아마도 단일 원자가있을 수도 있습니다. 또한 시도했지만 ¹기쁨은 없습니다.
Jonathan Allan

1
@JonathanAllan 아 맞아. 감사. ḣ1ẇØD같은
바이트 수에

ṚṪ작동합니다 :)
Jonathan Allan

@JonathanAllan 그것도 작동합니다 :) 그러나 나는 이미 내 방법에 대한 설명을 했으므로 그것을 바꾸기에는 너무 게으르다 : P 그러나 어쨌든 고마워 :)
HyperNeutrino

1

Pyth ,  16  15 바이트

jm.x+*;shdtdd.z

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


설명

jm.x + *; shdtdd.z-STDIN에서 모든 것을 읽음으로써 작동하는 전체 프로그램.

             .z-모든 STDIN을 읽고 줄 바꿈으로 나눕니다.
 m-변수가있는 맵 d.
  .x-시도 :
     *; shd-첫 문자를 정수로 변환하고 공백을 곱합니다.
    + td-첫 번째 문자를 제외한 모든 것을 추가하십시오
            d-위의 방법이 실패하면 전체 문자열을 추가하십시오.
j-줄 바꿈으로 가입하십시오.

처리하기 쉬운 예를 들어 봅시다. 입력 내용이 다음과 같습니다.

foo bar foo bar
1foo bar foo bar foo bar
2foo bar foo bar foo bar foo bar

위의 프로그램은 다음을 수행합니다.

  • .z-모든 것을 읽고 줄 바꿈으로 나눕니다 ['foo bar foo bar', '1foo bar foo bar foo bar', '2foo bar foo bar foo bar foo bar'].

  • 우리는 각각의 첫 문자를 얻는다 : ['f', '1', '2'].

  • 정수로 변환 할 수 있으면 정수 번 공백을 반복하고 나머지 문자열을 추가합니다. 그렇지 않으면 전체 문자열을 배치합니다. 따라서 우리는 ['foo bar foo bar', ' foo bar foo bar foo bar', ' foo bar foo bar foo bar foo bar'].

  • 마지막으로, 우리는 줄 바꿈으로 결합하므로 결과는 다음과 같습니다.

    foo bar foo bar
     foo bar foo bar foo bar
      foo bar foo bar foo bar foo bar
    

1
하하, 우리는 젤리를 이겼다 :)
Mr. Xcoder

1

입방체 , 82 바이트

R3D1R1D1+0(?6{?7@7~:1+2<7?6{+35>7?6{:7-120?6{(B3@5B1-0)6}:0}}}?6!@7~-60=7&6+4-3=7)

참고 :이 작동하지 않습니다 TIO . 이를 테스트하려면 실험 플래그가 true로 설정된 Lua 인터프리터 를 사용하십시오 (조건을 활성화하십시오). 현재 TIO 인터프리터에 조건부 블록에 버그가 있습니다. 산화 티타늄 인터프리터를 사용하는 경우, 당신은 교체해야 ?6!!6&6?6&바이트가 동일한 계산하는 유지.

R3D1R1D1          Set the cube so that face 0 has value 1 and the rest of the values are easy to calculate

+0                Set the notepad to 1 so that it enters the conditional below
(                 Do
  ?6{               If the notepad is 1 (last character was \n or start of input)
    ?7@7              Output the current character if it's \n
    ~                 Get the next character
    :1+2<7?6{         If the input is >= '0'
      +35>7?6{          If the input is <= '9'
        :7-120            Set the notepad to the input - '0'
        ?6{               If the notepad isn't 0
          (                 Do
            B3@5              Output a space
            B1-0              Subtract 1 from notepad
          )6                While notepad > 0
        }                 End if
        :0              Set notepad to 1
      }                 End if
    }                 End if
  }                 End if

  ?6!@7             If the notepad is 0 (did not attempt to print spaces), print current character

  ~                 Get next character
  -60=7&6           If there is no more input, exit the program
  +4-3=7            Check if current character is \n, setting notepad to result
)                 Repeat forever

이것은 다른 Cubically 답변만큼 짧지는 않지만 어쨌든 시도해 볼 것이라고 생각했습니다.


TIO 인터프리터에서 루프는 어떻게 되나요?
MD XF

@MDXF는 내가 생각하는 것과 일치하는 것이 아니라 )가장 최근으로 점프합니다 (. 편집 : 나는 채팅에있어.
TehPers

@MDXF 실제로는 조건부 블록 일 수 있습니다. 나는 대답을 업데이트 할 것을 잊었다. 어쨌든, 그들은 일치하지 않았습니다.
TehPers

1
좋아, 나중에 살펴볼 게 저는 현재 큐빅 2를 마무리하고 있습니다.
MD XF

@MDXF 저것은 .. 실제로 o_O를 듣는 것은 정말로 흥미로워 요
TehPers

1

> <> , 60 바이트

!^i:0(?;::"/")$":"(*0$.
v"0"-
>:?!v1-" "o
;>:o>a=&10&?.i:0(?

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

작동 방식 :

..i:0(?;... Gets input and ends if it is EOF
...
...
...

.^......::"/")$":"(*0$. If the inputted character is a digit go to the second line
...                     Else go to the fourth
...
...

....        If it was a digit
v"0"-       Subtract the character "0" from it to turn it into the corresponding integer
>:?!v1-" "o And print that many spaces before rejoining the fourth line
...

.^..               On the fourth line,
....               Copy and print the input (skip this if it was a digit)
....v              If the input is a newline, go back to the first line.
;>:o>a=&10&?.i:0(? Else get the input, ending on EOF


0

21 자

\N<D1>=@repeat{$1;\ }

샘플 실행 :

bash-4.4$ gema '\N<D1>=@repeat{$1;\ }' <<< 'foo bar foo bar
> 1foo bar foo bar foo bar
> 2foo bar foo bar foo bar foo bar
> 
> --------v
> 8|
> 8|
> 80
> 8,
> 7&'
foo bar foo bar
 foo bar foo bar foo bar
  foo bar foo bar foo bar foo bar

--------v
        |
        |
        0
        ,
       &

0

PHP, 83 자

preg_replace_callback('/^\d/m',function($m){return str_repeat(' ',$m[0]);},$argv);

귀하의 코드 가이 도전의 입력 규칙을 준수하지 않는다고 생각합니다 $s .이를 arg 함수로 묶 거나 입력으로 채워야합니다. 그리고 아무것도 인쇄하지 않습니다
LP154

@ LP154가 사용 argv가능합니까?
Petah

@Petah argv명령 줄 인수 라고 가정하면 정확 합니다. 그렇습니다.
완전히 인간적인
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.