X oznacza miejsce

18

X Zaznacza miejsce

Twoim celem jest dodanie krzyżyka wokół stolicy X:

Przykład wejścia / wyjścia

Wejście:

                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                    

Wynik:

                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               

Wejście:

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

Wynik:

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

Wejście:

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

Wynik:

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

Celownik

Twój celownik powinien być 3-wysoki i 5-szeroki:

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

Wejście

Dane wejściowe będą miały rozmiar co najmniej 12 x 12 znaków i będą się składały wyłącznie ze znaków ASCII. Może być przejęty przez STDIN lub argument funkcji. Dane wejściowe nie zawsze będą zawierać X. Dane wejściowe będą miały dowolny kształt i będą miały dowolną ilość białych znaków. Wejście nie będzie zawierać żadnego z: +, -, #, i|

Wynik

Dane wyjściowe mogą być przesyłane przez STDOUT lub wartość zwracaną przez funkcję. Wyjściem powinien być obraz wejściowy z narysowanym krzyżykiem. Jeśli nie ma wystarczająco dużo miejsca, aby narysować celownik, musisz dodać linie / spacje, aby go narysować. Nakładające się miejsca należy zastąpić symbolem +. Jeżeli |ani -z krzyżyka nakładała się X, zamiast +, #powinien pojawić.

Końcowe białe znaki nie są dozwolone, z wyjątkiem jednej nowej linii na samym końcu.


To jest golf golfowy, więc wygrywa najkrótszy kod w bajtach!

Downgoat
źródło
1
1. jeśli dane wejściowe są argumentem, to czy musi to być ciąg znaków z liniami oddzielonymi znakami nowej linii, czy może to być ciąg znaków? 2. Czy dopuszczalne jest dodawanie białych znaków wokół projektu, nawet jeśli nie jest to konieczne (tj. Zawsze należy dodać 3 wiersze powyżej / poniżej i 5 kolumn po lewej / prawej stronie)? 3. Brak danych wejściowych dla 3. przypadku testowego.
Level River St
@steveverrill 1. Będzie to ciąg oddzielony znakiem nowej linii, a nie tablica ciągów 2. Nie, to niedozwolone. Możesz użyć tego w swoim kodzie, ale nie powinien pojawić się na wyjściu
Downgoat
3
Czy +dla nakładających się -i |stosuje się tylko wtedy, gdy te znaki są częścią celowniku, czy to wpływa na dosłowne -i |znaleźć na wejściu, jak również?
DLosc
1
@DLosc nie będzie ich na wejściu. Zaktualizowałem pytanie
Downgoat
1
Co się stanie, jeśli dosłowny #tekst wejdzie w celownik? Czy to zostanie nadpisane?
Kodos Johnson,

Odpowiedzi:

3

CoffeeScript, 345 336   327 bajtów

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 to funkcja do wywołania.

Wyjaśniono:

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

Plik wykonywalny:

metalim
źródło
1
345 jest za dobry! Próbuję się zbliżyć, ale do tej pory jesteś daleko! Nie wiem, czy mogę zrobić znacznie więcej, nie zmieniając całkowicie mojego podejścia ... Hmm :)
Dom Hastings
Aż ktoś przyjdzie z CJam / Pyth / GolfScript i stworzy sub-100. Ale dziękuję.
metalim
Hah .. To prawda ... Zastanawiam się, czy to powinna być zachęta do nauki Pyth ...
Dom Hastings
4

Python 3, 577 519 515 490 475 467 454 bajtów

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)

Nie jestem pewien, jak daleko mogę grać w golfa.

Stosowanie:

c(g, d)

Gdzie gjest siatka wejściowa i dznak krzyżyka.

Zach Gates
źródło
3

Perl, 370 bajtów

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

Użycie, zapisz powyżej jako xmarks.pl:

perl xmarks.pl <<< 'X'

Nie jestem pewien, jak bardzo mogę to zrobić, ale na pewno wrócę do tego później! Mogę opublikować wyjaśnienie, jeśli ktoś też jest zainteresowany.

Obsługuje teraz dane wejściowe Xi dane niekwadratowe.

Dom Hastings
źródło
2

Python 2, 755 706 699 694 678 626 bajtów

Oczekuje wejścia na standardowe wejście, z końcowym znakiem nowej linii. Koniec wejścia jest uruchamiany za pomocą 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)

Pełny program:

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

Jestem pewien, że można by na tym zrobić znacznie więcej gry w golfa (ponieważ wciąż uczę się języka Python), więc każda pomoc jest mile widziana.

Edycje

  1. Ogolono około 50 bajtów findX, używając do zrozumienia
  2. Oszczędność 7 bajtów dzięki sugestii @ mbomb007 dotyczącej używania rangezamiast literalnej tablicy
  3. Usunięto 5 bajtów, zmieniając findXna lambda
  4. Zaoszczędzono 15 bajtów, zwiększając xso 4 i eliminując try-exceptblok
  5. Ogoliłem jeszcze 2, używając tabulatorów zamiast spacji
  6. Usunięto 5 bajtów za pomocą h=i=j=k=l=0zamiasth,j,k,l=0,0,0,0
  7. Dzięki @ mbomb007 usunąłem około 40 bajtów więcej chooseChar
J Atkin
źródło
1
Powinieneś zdefiniować, R=rangeaby skrócić zakresy. Następnie możesz również zmienić for i in[5,4,3,2,1,-1,-2,-3,-4,-5]:nafor i in R(5,0,-1)+R(-1,-6,-1):
mbomb007
Dzięki! Myślałem o tym, ale wydawało się, że będzie to dłużej.
J Atkin,
Dobra praca przy przycinaniu! Nie jestem pewien, czy widziałeś wątki wskazujące
Dom Hastings
Zrobiłem to kilka dni temu, ale zapomniałem o niektórych rzeczach.
J Atkin,
Również twoja qlambda wydaje mi się bardzo nieefektywna. Czy można to w ogóle skrócić? Przynajmniej nie uważam, że nawiasy są konieczne, ale myślę, że logikę logiczną i porównania łańcuchów również można skrócić.
mbomb007,