X markiert die Stelle

18

X markiert die Stelle

Ihr Ziel ist es, ein Fadenkreuz um die Hauptstadt X hinzuzufügen:

Beispiel Eingabe / Ausgabe

Eingang:

                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                    

Ausgabe:

                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               

Eingang:

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

Ausgabe:

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

Eingang:

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

Ausgabe:

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

Fadenkreuz

Dein Fadenkreuz sollte 3 groß und 5 breit sein:

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

Eingang

Die Eingabe hat eine Größe von mindestens 12 x 12 Zeichen und besteht nur aus ASCII-Zeichen. Es kann durch STDIN oder Funktionsargument übernommen werden. Die Eingabe enthält nicht immer ein X. Die Eingabe hat eine beliebige Form und ein beliebiges Leerzeichen. Die Eingabe wird nicht enthalten alle: +, -, #, und|

Ausgabe

Die Ausgabe kann über STDOUT oder den Rückgabewert einer Funktion erfolgen. Die Ausgabe sollte das Eingabebild mit dem Fadenkreuz sein. Wenn nicht genügend Platz zum Zeichnen des Fadenkreuzes vorhanden ist, müssen Sie Linien / Leerzeichen hinzufügen, um es zu zeichnen. Überlappende Stellen sollten durch a ersetzt werden +. Wenn sich das |oder -des Fadenkreuzes mit einem überschneidet X, sollte anstelle von einem +ein #angezeigt werden.

Leerzeichen dürfen nicht nachgestellt werden, mit Ausnahme einer einzelnen Zeile am Ende.


Das ist Code-Golf, also gewinnt der kürzeste Code in Bytes!

Downgoat
quelle
1
1. Handelt es sich bei der Eingabe um ein Argument, muss es sich um eine Zeichenfolge mit durch Zeilenumbrüche getrennten Zeilen handeln, oder kann es sich um ein Array von Zeichenfolgen handeln? 2. Ist es akzeptabel, Leerzeichen um das Design herum einzufügen, auch wenn dies nicht erforderlich ist (dh fügen Sie immer 3 Zeilen über / unter und 5 Spalten links / rechts hinzu)? 3. Die Eingabe für den 3. Testfall fehlt.
Level River St
@steveverrill 1. Es handelt sich um eine durch Zeilenumbrüche getrennte Zeichenfolge, nicht um ein Array von Zeichenfolgen. 2. Nein, das ist nicht zulässig. Sie können das in Ihrem Code verwenden, aber es sollte nicht in der Ausgabe erscheinen
Downgoat
3
Gilt das +für Überlappungen -und |nur, wenn diese Zeichen Teil eines Fadenkreuzes sind, oder wirkt es sich auf das Literal aus -und wird |auch in der Eingabe gefunden?
DLosc
1
@ DLosc diese werden nicht in der Eingabe sein. Ich habe die Frage aktualisiert
Downgoat
1
Was ist, wenn #ein Fadenkreuz auf ein Literal in der Eingabe stößt? Wird es überschrieben?
Kodos Johnson

Antworten:

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 ist die aufzurufende Funktion.

Erklärt:

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

Ausführbar:

metalim
quelle
1
345 ist zu gut! Ich versuche näher zu kommen, aber du bist so weit voraus! Ich weiß nicht, ob ich viel mehr tun kann, ohne meinen Ansatz komplett zu ändern ... Hmm :)
Dom Hastings
Bis jemand mit CJam / Pyth / GolfScript kommt und Sub-100 macht. Aber danke.
Metalim
Hah ... zu wahr ... ich frage mich, ob dies die Ermutigung sein sollte, die ich brauche, um Pyth zu lernen ...
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)

Ich bin mir nicht sicher, wie weit ich damit Golf spielen kann.

Verwendung:

c(g, d)

Wo gist das Eingaberaster und dist das Fadenkreuz-Zeichen.

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

Verwendung, oben speichern als xmarks.pl:

perl xmarks.pl <<< 'X'

Ich bin nicht sicher, wie viel kleiner ich das machen kann, aber ich bin sicher, ich werde später darauf zurückkommen! Ich könnte eine Erklärung posten, wenn sich auch jemand dafür interessiert.

Behandelt Xjetzt auch die Eingabe von und nicht-quadratischen Eingaben.

Dom Hastings
quelle
2

Python 2, 755 706 699 694 678 626 Bytes

Erwartet eine Eingabe in stdin mit einer nachgestellten Newline. Das Ende der Eingabe wird mit ausgelöst 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)

Volles Programm:

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

Ich bin mir sicher, dass diesbezüglich viel mehr Golf gespielt werden könnte (da ich noch Python lerne), daher ist jede Hilfe willkommen.

Bearbeitungen

  1. Rasiert ca. 50 Bytes ab, findXindem zum Verständnis verwendet wird
  2. Dank des Vorschlags von @ mbomb007, rangeanstelle eines wörtlichen Arrays ein Array zu verwenden, wurden 7 Byte eingespart
  3. 5 Bytes wurden entfernt, indem findXzu einem Lambda gewechselt wurde
  4. 15 Bytes gespart, indem xsum 4 erweitert und der try-exceptBlock entfernt wurde
  5. Rasiert 2 mehr durch Tabulatoren anstelle von Leerzeichen
  6. Entfernte 5 Bytes mit h=i=j=k=l=0anstelle vonh,j,k,l=0,0,0,0
  7. Dank @ mbomb007 habe ich ungefähr 40 weitere Bytes von entfernt chooseChar
J Atkin
quelle
1
Sie sollten definieren R=range, um Bereiche zu verkürzen. Dann können Sie auch for i in[5,4,3,2,1,-1,-2,-3,-4,-5]:zufor i in R(5,0,-1)+R(-1,-6,-1):
mbomb007
Vielen Dank! Ich hatte darüber nachgedacht, aber es schien länger zu dauern.
J Atkin
Gute Arbeit beim Beschneiden! Ich bin nicht sicher, ob Sie die Spitzengewinde gesehen haben, aber es gibt möglicherweise ein paar Kürzungen, die
Dom Hastings
Ich habe es vor ein paar Tagen getan, aber ich habe einige Dinge vergessen.
J Atkin
Außerdem qscheint mir Ihr Lambda sehr ineffizient zu sein. Kann das überhaupt gekürzt werden? Zumindest glaube ich nicht, dass die Klammern notwendig sind, aber ich denke, dass die boolesche Logik und die Zeichenfolgenvergleiche auch verkürzt werden können.
mbomb007