O x marca o lugar

18

O x marca o lugar

Seu objetivo é adicionar uma mira ao redor da capital X:

Exemplo de entrada / saída

Entrada:

                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                    

Resultado:

                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               

Entrada:

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

Resultado:

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

Entrada:

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

Resultado:

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

Crosshair

Sua mira deve ter 3 e 5 de largura:

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

Entrada

A entrada terá pelo menos 12x12 caracteres e será composta apenas por caracteres ASCII. Pode ser captado através de STDIN ou argumento de função. A entrada nem sempre conterá um X. A entrada terá qualquer forma e terá uma quantidade arbitrária de espaço em branco. A entrada não irá conter qualquer um: +,- , #, e|

Resultado

A saída pode ser através de STDOUT ou do valor de retorno de uma função. A saída deve ser a imagem de entrada com a mira desenhada. Se não houver espaço suficiente para desenhar a mira, você deverá adicionar linhas / espaços para desenhá-la. Os pontos sobrepostos devem ser substituídos por a +. Se o |ou -da mira se sobrepuser a um X, em vez de a +, um# deve aparecer.

O espaço em branco à direita não é permitido, exceto por uma nova linha no final.


Este é o código-golfe, pelo que o código mais curto em bytes vence!

Downgoat
fonte
1
1. se a entrada for um argumento, ela precisa ser uma sequência com linhas separadas por novas linhas ou pode ser uma matriz de seqüências? 2. é aceitável adicionar espaços em branco ao redor do design, mesmo que não seja necessário (ou seja, sempre adicione 3 linhas acima / abaixo e 5 colunas à esquerda / direita)? 3. A entrada está ausente para o terceiro caso de teste.
Level River St
@steveverrill 1. Será uma sequência separada por nova linha, não uma matriz de sequências 2. Não, isso não é permitido. Você pode usar isso em seu código, mas não deve aparecer na saída
Downgoat
3
Isso se +sobrepõe -e se |aplica somente quando esses caracteres fazem parte da mira, ou afeta literalmente -e também é |encontrado na entrada?
DLosc
1
@DLosc esses não estarão na entrada. Eu atualizei a pergunta
Downgoat
1
E se um literal #na entrada for encontrado por uma mira? Será substituído?
Kodos Johnson

Respostas:

3

CoffeeScript, 345 336   327 bytes

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 é a função a ser chamada.

Explicado:

# 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'

Executável:

metalim
fonte
1
345 é bom demais! Estou tentando chegar perto, mas você está muito à frente até agora! Eu não sei se eu posso fazer muito mais sem mudar minha abordagem totalmente ... Hmm :)
Dom Hastings
Até que alguém venha com CJam / Pyth / GolfScript e faça sub-100. Mas obrigada.
metalim 8/08/2015
Hah .. Too verdade ... Eu estou querendo saber se este deve ser o incentivo que eu preciso aprender Pyth ...
Dom Hastings
4

Python 3, 577 519 515 490 475 467 454 bytes

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)

Não sei o quanto mais posso jogar isso.

Uso:

c(g, d)

Onde gestá a grade de entrada e do caractere de marcação de retículo.

Zach Gates
fonte
3

Perl, 370 bytes

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@=,$,=$/

Uso, salve acima como xmarks.pl:

perl xmarks.pl <<< 'X'

Não tenho certeza de quanto menor posso fazer isso, mas tenho certeza de que voltarei mais tarde! Posso postar uma explicação se alguém também estiver interessado.

Manipula entradas de entrada Xe não quadradas também agora.

Dom Hastings
fonte
2

Python 2, 755706999946678 bytes

Espera entrada no stdin, com uma nova linha à direita. O final da entrada é acionado com 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)

Programa completo:

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))

Tenho certeza de que muito mais golfe poderia ser feito nisso (já que ainda estou aprendendo python), então qualquer ajuda é apreciada.

Editar% s

  1. Raspou cerca de 50 bytes findXusando para compreender
  2. Economizou 7 bytes graças à sugestão de @ mbomb007 sobre o uso em rangevez de uma matriz literal
  3. Removidos 5 bytes mudando findXpara um lambda
  4. Economizou 15 bytes estendendo xspor 4 e eliminando o try-exceptbloco
  5. Raspou mais 2 usando guias em vez de espaços
  6. Removidos 5 bytes usando em h=i=j=k=l=0vez deh,j,k,l=0,0,0,0
  7. Graças a @ mbomb007, removi mais 40 bytes de chooseChar
J Atkin
fonte
1
Você deve definir R=rangepara diminuir os intervalos. Então você também pode mudar for i in[5,4,3,2,1,-1,-2,-3,-4,-5]:parafor i in R(5,0,-1)+R(-1,-6,-1):
mbomb007
Obrigado! Eu tinha pensado em fazer isso, mas parecia que demoraria mais.
J Atkin
Bom trabalho para aparar! Eu não tenho certeza se você já viu os fios de ponta, mas pode haver algumas shorteners pode receber a partir daqui: codegolf.stackexchange.com/questions/54/...
Dom Hastings
Eu fiz alguns dias atrás, mas eu esqueci algumas coisas.
precisa
Além disso, sua qlambda parece muito ineficiente para mim. Isso pode ser reduzido? No mínimo, não acho que os parênteses sejam necessários, mas acho que a lógica booleana e as comparações de strings também podem ser reduzidas.
mbomb007