X는 그 자리를 표시합니다


18

X 그 자리를 표시합니다

당신의 목표는 수도 X에 십자선을 추가하는 것입니다.

입력 / 출력 예

입력:

                mdhyyyyyyyhhhddmmm                
            mdyyssoo  oooosyyyhhhdmm              
          hsso     oossoooooyyhhdhhdmmm           
        yoooooo     oo ssysssyhhdyyyhmmmm         
      myso oso  o  oyo    hhhdhhyhyhhm mm m       
     mhsyhhys  oss      yyyhhhsosyhhmmmmdmmm
    mhyhhhy y         ssyhoho o shhdmmmmdmmmm        
    hhyyyh   s   oo syysyyhhdysso oyhdhhhmmmmm     
   dhysyys      sdysoXoyyyyhhso     syshm  mmm    
   hhyhyo       o      osss y   shhyyhd mmmmmm    
   yyhyyyss           o  oyyyydmmdmmmmmmmmm mm    
   ysyhyhhho   s     osy  sdm m  mddmmddhydmmm   
   h  oshhhyyyddhoo  ooyysshdmdohdmmdmddsshmmm    
    y   oyhhhdhhsyhsssshdddsss    hdddyyyhddm     
    dyyshyyhssyyhyyyyddhhmmdmmmdy syssoosyhdm     
     hsyyhhhhsoo sooyyhhdoohdhhyhyysoo  osdm      
      doyhhhyyyyhhhysyyy oossyyssso   osydm       
        soyhyyhhhhhhyhyyyooos       ohdddm        
         msoyyyyyyyhyyyyo ooo       syyd          
            ho oyyysooo    osso   osyd            
               dhyyysssyyyyyysoosdm               
                    mmdddddmmm                    

산출:

                mdhyyyyyyyhhhddmmm                
            mdyyssoo  oooosyyyhhhdmm              
          hsso     oossoooooyyhhdhhdmmm           
        yoooooo     oo ssysssyhhdyyyhmmmm         
      myso oso  o  oyo    hhhdhhyhyhhm mm m       
     mhsyhhys  oss   |  yyyhhhsosyhhmmmmdmmm
    mhyhhhy y        |ssyhoho o shhdmmmmdmmmm        
    hhyyyh   s   oo s|ysyyhhdysso oyhdhhhmmmmm     
   dhysyys      -----X-----hhso     syshm  mmm    
   hhyhyo       o    | osss y   shhyyhd mmmmmm    
   yyhyyyss          |o  oyyyydmmdmmmmmmmmm mm    
   ysyhyhhho   s     |sy  sdm m  mddmmddhydmmm   
   h  oshhhyyyddhoo  ooyysshdmdohdmmdmddsshmmm    
    y   oyhhhdhhsyhsssshdddsss    hdddyyyhddm     
    dyyshyyhssyyhyyyyddhhmmdmmmdy syssoosyhdm     
     hsyyhhhhsoo sooyyhhdoohdhhyhyysoo  osdm      
      doyhhhyyyyhhhysyyy oossyyssso   osydm       
        soyhyyhhhhhhyhyyyooos       ohdddm        
         msoyyyyyyyhyyyyo ooo       syyd          
            ho oyyysooo    osso   osyd            
               dhyyysssyyyyyysoosdm               
                    mmdddddmmm               

입력:

000000000000
000000000000
0000X0000000
0000000X0000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000
000000000000

산출:

     |
 0000|00|0000
 0000|00|0000
-----X--+--00
 00--+--X-----
 0000|00|0000
 0000|00|0000
 0000000|0000
 000000000000
 000000000000
 000000000000
 000000000000
 000000000000

입력:

00000000000000000
00000000000000000
00000000000000000
00000X000X0000000
00000000000000000
00000000000000000
00000000000000000
00000000000000000
00000000000000000
00000000000000000
00000000000000000
00000000000000000   

산출:

00000|000|0000000
00000|000|0000000
00000|000|0000000
----+#+++#+----00
00000|000|0000000
00000|000|0000000
00000|000|0000000
00000000000000000
00000000000000000
00000000000000000
00000000000000000
00000000000000000    

십자선

십자선은 키가 크고 키가 5이어야합니다.

     |
     |
     |
-----X-----
     |
     |
     |

입력

입력 크기는 12x12 자 이상이며 ASCII 문자로만 구성됩니다. STDIN 또는 함수 인수를 통해 가져올 수 있습니다. 입력에 항상 X가 포함되는 것은 아닙니다. 입력의 모양은 임의이며 공백이 있습니다. 입력 +-,,# , 및|

산출

STDOUT 또는 함수의 반환 값을 통해 출력 할 수 있습니다. 십자선이 그려진 입력 이미지가 출력되어야합니다. 십자선을 그릴 공간이 충분하지 않으면이를 그릴 선 / 공간을 추가해야합니다. 겹치는 지점은로 교체해야합니다 +. 는 IF |또는 -십자선의는 중복 X하는 대신 +,# 나타납니다.

맨 끝에 하나의 줄 바꿈을 제외하고 후행 공백은 허용되지 않습니다 .


이것은 코드 골프이므로 바이트 단위의 가장 짧은 코드가 승리합니다!


1
1. 입력이 인수 인 경우, 줄 바꿈으로 구분 된 줄이있는 문자열이어야합니까, 아니면 문자열 배열 일 수 있습니까? 2. 필요하지 않은 경우에도 디자인 주위에 공백을 추가 할 수 있습니까 (즉, 항상 왼쪽 / 오른쪽에 3 행, 5 열을 추가)? 3. 세 번째 테스트 사례에 대한 입력이 없습니다.
Level River St

@steveverrill 1. 문자열 배열이 아닌 개행으로 구분 된 문자열입니다. 2. 허용되지 않습니다. 코드에서 사용할 수 있지만 출력에는 나타나지 않아야합니다.
Downgoat

3
합니까 +중복에 대한 -그리고 |그 문자가 십자선의 일부에만 적용하거나, 그것은 문자 그대로 영향을 미치는가 -|뿐만 아니라 입력에서 발견?
DLosc

1
@DLosc는 입력되지 않습니다. 질문을 업데이트했습니다
Downgoat

1
#입력 의 리터럴 에 십자선이 있으면 어떻게 됩니까? 덮어 쓰겠습니까?
Kodos Johnson

답변:


3

커피 스크립트, 345 (336)   327 바이트

Z=(s,c)->s in'X#'&&'#'||s in'-|+'&&'+'||c
X=(s)->l=u=0;o=(r.split ''for r in s.split '\n');c in'X#'&&(i-x&&(o[y][i]=Z o[y][i],'-';i<l&&l=i)for i in[x-5..x+5];i-y&&((o[i]?=[])[x]=Z o[i][x],'|';i<u&&u=i)for i in[y-3..y+3])for c,x in r for r,y in o;((o[y][x]||' 'for x in[l...o[y].length]).join ''for y in[u...o.length]).join '\n'

X 호출 할 함수입니다.

설명 :

# get new char. s - old char. c - '|' or '-'
Z=(s,c)->s in'X#'&&'#'||s in'-|+'&&'+'||c

X=(s)->

  # leftmost and upmost positions
  l=u=0

  # split input into 2D array
  o=(r.split ''for r in s.split '\n')

  # for every 'X' or '#'
  c in'X#'&&(

    # for positions to left and right
    i-x&&(

        # draw horisontal line
      o[y][i]=Z o[y][i],'-'

      # update leftmost position
      i<l&&l=i

    )for i in[x-5..x+5]

    # for positions above and below
    i-y&&(

      # add row if necessary and draw vertical line
      (o[i]?=[])[x]=Z o[i][x],'|'

      # update upmost position
      i<u&&u=i

    )for i in[y-3..y+3]

  )for c,x in r for r,y in o

  # concatenate into string, replacing empty chars with spaces
  ((o[y][x]||' 'for x in[l...o[y].length]).join ''for y in[u...o.length]).join '\n'

실행 가능 :


1
345가 너무 좋다! 나는 가까워 지려고 노력하고 있지만, 당신은 지금까지 나아 간다! 접근 방식을 완전히 바꾸지 않고 더 많은 일을 할 수 있을지 모르겠습니다 ... 흠 :)
Dom Hastings

누군가가 CJam / Pyth / GolfScript와 함께 와서 100 이하를 만들 때까지. 하지만 고마워
metalim

Hah .. 너무 사실입니다 ... 이것이 Pyth를 배우기 위해 격려가되어야하는지 궁금합니다.
Dom Hastings

4

파이썬 3, 577 519 515 490 475 467 454 바이트

def c(g,d):
 R,L,V,e,b=range,list,len,'-|+','#';t,g=(lambda g,d:sum([[(i,j)for j in R(V(L(g.split('\n')[i])))if g.split('\n')[i][j]==d]for i in R(V(g.split('\n')))],[]))(g,d),[L(i)for i in g.split('\n')]
 for a,r in t:
  for j in R(a-3,a+4):
   if V(g)>j>-1:n=g[j][r];g[j][r]='+'if n in e else'#'if n in(d,b)else'|'
  for j in R(r-5,r+6):
   if V(g[a])>j>-1:n=g[a][j];g[a][j]='+'if n in e else'#'if n in(d,b)else'-'
 return'\n'.join(''.join(l)for l in g)

골프를 얼마나 멀리 할 수 ​​있는지 잘 모르겠습니다.

용법:

c(g, d)

g입력 그리드는 어디에 d있고 십자 표시 문자입니다.


3

펄, 370 바이트

sub r{$h=pop;($=[$n=pop].=$"x(1+"@_"-length$=[$n]))=~s!(.{@_})(.)!"$1".($2=~/[-|+]/?'+':$2=~/[X#]/?'#':$h)!e}map{chop;push@c,[$-,pos]while/X/g;$-++}@==<>;($x,$y)=@$_,3-$x>$a?$a=3-$x:0,$x+5-@=>$b?$b=$x+5-@=:0,6-$y>$c?$c=6-$y:0 for@c;@==($",@=)for 1..$a;$_=$"x$c.$_ for@=;map{($x,$y)=@$_;$_&&r$y+$c+$_-1,$x+$a,'-'for-5..5;$_&&r$y+$c-1,$x+$_+$a,'|'for-3..3}@c;print@=,$,=$/

사용법, 위에 저장 xmarks.pl 다음 .

perl xmarks.pl <<< 'X'

이걸 얼마나 작게 만들 수 있을지는 모르겠지만 나중에 다시 올 것이라고 확신합니다! 관심있는 사람이 있으면 설명을 게시 할 수 있습니다.

X현재 입력과 비 사각 입력을 처리합니다 .


2

파이썬 2, 755706 699 694678626 바이트

후행 줄 바꿈으로 stdin에 대한 입력을 예상합니다. 입력 끝이로 트리거됩니다 cmd+d.

import sys;a=sys.stdin.readlines();b=max;c=len;d=enumerate;e=c(b(a,key=lambda x:c(x)))-1;a=[list(line.replace('\n','').ljust(e))for line in a];R=range;f=lambda:[[i for i,x in d(h)if x=='X']for h in a+[[]]*4];q=lambda y,z:'#'if z=='X'else'+'if z in'|-+'else y;g=f();h=j=k=l=0
for m,n in d(g):
 if n:h=b(3-m,h);l=b(abs(n[0]-5),l);j=b(m-c(a)+4,j);k=b(n[-1]-e+6,k)
o=[' ']*(l+k+e);a=[o for _ in R(h)]+[[' ']*l+p+[' ']*k for p in a]+[o for _ in R(j)];g=f()
for m,x in d(a):
 for i in[3,2,1,-1,-2,-3]:
    for r in g[m+i]:x[r]=q('|',x[r])
 for r in g[m]:
    for i in R(5,0,-1)+R(-1,-6,-1):x[r+i]=q('-',x[r+i])
for s in a:print''.join(s)

전체 프로그램 :

import sys

lines = sys.stdin.readlines()

# pad all lines with spaces on the right
maxLength = len(max(lines, key=lambda x:len(x))) - 1 # Subtract the newline
lines = [list(line.replace('\n', '').ljust(maxLength)) for line in lines]


def findX():
    global xs
    xs = [[i for i, ltr in enumerate(line) if ltr == 'X'] for line in lines+[[]]*4]

# add sufficient padding to the edges to prevent wrap
findX()
top,bottom,right,left=0,0,0,0
for ind, item in enumerate(xs):
    if item:
        top = max(3-ind, top)
        left = max(abs(item[0]-5), left)
        bottom = max(ind-len(lines)+4, bottom)
        right = max(item[-1]-maxLength+6, right)
clear = [' '] * (left+right+maxLength)
lines = [clear for _ in range(top)] + [[' ']*left + line + [' ']*right for line in lines] + [clear for _ in range(bottom)]



findX()
def chooseChar(expected, curr):
    return '#' if curr == 'X' else ('+' if curr in '|-+' else expected)

for ind, x in enumerate(lines):
    # try:
        for i in [3, 2, 1, -1, -2, -3]:
            for elem in xs[ind+i]:
                x[elem] = chooseChar('|', x[elem])
        for elem in xs[ind]:
            for i in [5, 4, 3, 2, 1, -1, -2, -3, -4, -5]:
                x[elem+i] = chooseChar('-', x[elem+i])
    # except:f



for line in lines: print(''.join(line))

나는 아직도 파이썬을 배우고 있기 때문에 훨씬 더 많은 골프를 할 수 있다고 확신하므로 도움을 주시면 감사하겠습니다.

편집

  1. 에서 약 50 바이트 면도 findX이해력을 사용하여 를 줄였습니다.
  2. @ mbomb007의 사용에 대한 제안 덕분에 7 바이트가 절약되었습니다. range리터럴 배열 대신
  3. 변경하여 5 바이트 제거 findX람다 하여
  4. xs4 를 늘려서 15 바이트를 절약 하고try-except 블록을
  5. 공백 대신 탭을 사용하여 2 개 더 면도
  6. h=i=j=k=l=0대신에 5 바이트를 제거했습니다.h,j,k,l=0,0,0,0
  7. @ mbomb007 덕분에 약 40 바이트를 더 제거했습니다. chooseChar

1
R=range범위를 짧게 정의해야 합니다. 그럼 당신도 변경할 수 있습니다 for i in[5,4,3,2,1,-1,-2,-3,-4,-5]:for i in R(5,0,-1)+R(-1,-6,-1):
mbomb007

감사! 나는 그렇게하는 것에 대해 생각했지만 더 길 것 같았습니다.
J Atkin

다듬기에 좋은 일! 팁 스레드를 보았는지 확실하지 않지만 여기에서 얻을 수있는 몇 가지 단축 기가
Dom Hastings

며칠 전에했지만 몇 가지를 잊었습니다.
J Atkin

또한, 당신의 q람다는 나에게 매우 비효율적 인 것 같습니다. 전혀 단축 될 수 있습니까? 적어도 괄호가 필요하다고 생각하지는 않지만 부울 논리와 문자열 비교도 단축 될 수 있다고 생각합니다.
mbomb007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.