Đánh dấu tại chỗ


18

Đánh dấu tại chỗ

Mục tiêu của bạn là thêm một sợi tóc quanh thủ đô X:

Ví dụ đầu vào / đầu ra

Đầu vào:

                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                    

Đầu ra:

                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               

Đầu vào:

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

Đầu ra:

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

Đầu vào:

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

Đầu ra:

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

Tóc chéo của bạn nên cao 3 và 5 chiều:

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

Đầu vào

Đầu vào sẽ có kích thước tối thiểu 12x12 ký tự và sẽ chỉ bao gồm các ký tự ASCII. Nó có thể được thực hiện thông qua STDIN hoặc đối số chức năng. Đầu vào sẽ không luôn luôn chứa X. Đầu vào sẽ ở bất kỳ hình dạng nào và có một khoảng trắng tùy ý. Các đầu vào sẽ không chứa bất kỳ: +, -, #, và|

Đầu ra

Đầu ra có thể thông qua STDOUT hoặc giá trị trả về của hàm. Đầu ra phải là hình ảnh đầu vào với hình vẽ chéo. Nếu không có đủ không gian để vẽ dấu thập, bạn phải thêm các dòng / khoảng trắng để vẽ nó. Các điểm chồng chéo nên được thay thế bằng a +. Nếu |hoặc -của hình chữ thập chồng lên nhau X, thay vì một +, #sẽ xuất hiện.

Không được phép lưu lại khoảng trắng ngoại trừ một dòng mới ở cuối.


Đây là mã golf để mã ngắn nhất tính theo byte thắng!


1
1. nếu đầu vào là một đối số, nó có phải là một chuỗi với các dòng được phân tách bằng dòng mới hay nó có thể là một chuỗi các chuỗi không? 2. có thể chấp nhận thêm khoảng trắng xung quanh thiết kế ngay cả khi không cần thiết (nghĩa là luôn luôn thêm 3 hàng trên / dưới và 5 cột ở bên trái / phải)? 3. Đầu vào bị thiếu cho trường hợp thử nghiệm thứ 3.
Cấp sông St

@steveverrill 1. Đây sẽ là một chuỗi phân tách dòng mới, không phải là một chuỗi các chuỗi 2. Không, điều đó không được phép. Bạn có thể sử dụng mã đó trong mã của mình nhưng nó không xuất hiện ở đầu ra
Downgoat

3
Có phải sự +chồng chéo -|chỉ áp dụng khi những ký tự đó là một phần của dấu thập, hoặc nó có ảnh hưởng đến nghĩa đen -|được tìm thấy trong đầu vào không?
DLosc

1
@DLosc những cái đó sẽ không có trong đầu vào. Tôi đã cập nhật câu hỏi
Downgoat

1
Điều gì xảy ra nếu một chữ #trong đầu vào gặp phải bởi một dấu thập? Nó sẽ được ghi đè?
Kodos Johnson

Câu trả lời:


3

CoffeeScript, 345 336   327 byte

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 là chức năng để gọi.

Giải thích:

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

Thực thi:


1
345 là quá tốt! Tôi đang cố gắng để đến gần, nhưng bạn đang tiến về phía trước! Tôi không biết liệu mình có thể làm được nhiều hơn mà không thay đổi hoàn toàn cách tiếp cận của mình không ... Hmm :)
Dom Hastings

Cho đến khi ai đó đi kèm với CJam / Pyth / GolfScript và tạo ra 100 phụ. Nhưng cảm ơn bạn.
metalim

Hah .. Quá đúng ... Tôi tự hỏi liệu đây có phải là sự khích lệ mà tôi cần để học Pyth không ...
Dom Hastings

4

Python 3, 577 519 515 490 475 467 454 byte

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)

Tôi không chắc mình có thể chơi golf này xa hơn bao nhiêu.

Sử dụng:

c(g, d)

Trong trường hợp glà lưới đầu vào và dlà nhân vật crosshair đánh dấu.


3

Perl, 370 byte

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

Cách sử dụng, lưu ở trên là xmarks.pl:

perl xmarks.pl <<< 'X'

Tôi không chắc mình có thể làm cái này nhỏ hơn bao nhiêu, nhưng tôi chắc chắn tôi sẽ quay lại sau! Tôi có thể gửi một lời giải thích nếu bất cứ ai cũng quan tâm.

Xử lý đầu vào Xvà đầu vào không vuông cũng như bây giờ.


2

Python 2, 755 706 699 694 678 626 byte

Yêu cầu đầu vào trên stdin, với một dòng mới. Sự kết thúc của đầu vào được kích hoạt với 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)

Chương trình đầy đủ:

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

Tôi chắc chắn rằng có thể chơi golf nhiều hơn nữa trong việc này (vì tôi vẫn đang học trăn), vì vậy mọi sự giúp đỡ đều được đánh giá cao.

Chỉnh sửa

  1. Cạo khoảng 50 byte từ findXbằng cách sử dụng để hiểu
  2. Đã lưu 7 byte nhờ đề xuất của @ mbomb007 về việc sử dụng rangethay vì một mảng bằng chữ
  3. Đã xóa 5 byte bằng cách thay đổi findXthành lambda
  4. Đã lưu 15 byte bằng cách mở rộng xsthêm 4 và loại bỏ try-exceptkhối
  5. Cạo thêm 2 lần nữa bằng cách sử dụng các tab thay vì dấu cách
  6. Đã xóa 5 byte bằng cách sử dụng h=i=j=k=l=0thay vìh,j,k,l=0,0,0,0
  7. Nhờ @ mbomb007, tôi đã xóa thêm khoảng 40 byte từ chooseChar

1
Bạn nên xác định R=rangeđể rút ngắn phạm vi. Sau đó, bạn cũng có thể đổi for i in[5,4,3,2,1,-1,-2,-3,-4,-5]:thànhfor i in R(5,0,-1)+R(-1,-6,-1):
mbomb007

Cảm ơn! Tôi đã nghĩ về việc đó nhưng dường như nó sẽ dài hơn.
J Atkin

Làm tốt công việc cắt tỉa! Tôi không chắc liệu bạn đã xem các chủ đề mẹo hay chưa, nhưng có thể có một vài công cụ rút ngắn bạn có thể nhận được từ đây: codegolf.stackexchange.com/questions/54/iêu
Dom Hastings

Tôi đã làm một vài ngày trước, nhưng tôi quên một số điều.
J Atkin

Ngoài ra, qlambda của bạn có vẻ rất không hiệu quả với tôi. Điều đó có thể được rút ngắn ở tất cả? Ít nhất, tôi không nghĩ các dấu ngoặc đơn là cần thiết, nhưng tôi nghĩ rằng logic boolean và so sánh chuỗi cũng có thể được rút ngắn.
mbomb007
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.