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    

crosshair

ขนไขว้ของคุณควรมีความสูง 3 และกว้าง 5:

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

อินพุต

ข้อมูลที่ป้อนต้องมีขนาดอย่างน้อย 12x12 ตัวและจะประกอบด้วยอักขระ ASCII เท่านั้น สามารถใช้ผ่าน STDIN หรืออาร์กิวเมนต์ของฟังก์ชัน อินพุตจะไม่ประกอบด้วย X. อินพุตจะอยู่ในรูปแบบใด ๆ และมีพื้นที่ว่างตามอำเภอใจ การป้อนข้อมูลจะไม่ได้มีการใด ๆ ของ: +, -, #และ|

เอาท์พุต

เอาต์พุตสามารถผ่าน STDOUT หรือค่าส่งคืนของฟังก์ชัน ผลลัพธ์ควรเป็นภาพอินพุทที่มีการวาดขนไขว้ หากมีพื้นที่ไม่เพียงพอในการวาดเส้นเล็งคุณต้องเพิ่มเส้น / ช่องว่างเพื่อวาด +จุดที่ทับซ้อนกันควรถูกแทนที่ด้วย หาก|หรือ-ของกากบาททับซ้อนXแทน+การ#ควรจะปรากฏขึ้น

ไม่อนุญาตให้ใช้ช่องว่างต่อท้ายยกเว้นขึ้นบรรทัดใหม่เดียวที่ส่วนท้ายสุด


นี่คือโค้ดกอล์ฟที่สั้นที่สุดในหน่วยไบต์!


1
1. ถ้าอินพุตเป็นอาร์กิวเมนต์ต้องเป็นสตริงที่มีบรรทัดคั่นด้วยการขึ้นบรรทัดใหม่หรือเป็นอาร์เรย์ของสตริงได้หรือไม่ 2. เป็นที่ยอมรับหรือไม่ที่จะเพิ่มช่องว่างรอบ ๆ การออกแบบแม้ว่าจะไม่จำเป็น (เช่นเพิ่มแถวด้านบน / ล่างและคอลัมน์ 5 คอลัมน์ทางซ้าย / ขวาเสมอ) 3. อินพุตขาดหายไปสำหรับกรณีทดสอบครั้งที่ 3
เลเวลริเวอร์เซนต์

@steveverrill 1. มันจะเป็นสตริงที่คั่นด้วยบรรทัดใหม่ไม่ใช่อาร์เรย์ของสตริง 2 ไม่ใช่นั่นคือไม่ได้รับอนุญาต คุณสามารถใช้มันในรหัสของคุณ แต่ไม่ควรปรากฏในผลลัพธ์
Downgoat

3
ไม่+สำหรับการทับซ้อนกัน-และ|ใช้เฉพาะเมื่อตัวอักษรเหล่านั้นเป็นส่วนหนึ่งของกากบาทหรือไม่ได้ส่งผลกระทบต่อตัวอักษร-และ|พบในการป้อนข้อมูลเช่นกัน?
DLosc

1
@DLosc เหล่านั้นจะไม่อยู่ในอินพุต ฉันได้อัปเดตคำถามแล้ว
Downgoat

1
จะเกิดอะไรขึ้นถ้า#crosshair เกิดขึ้นตามตัวอักษร มันจะถูกเขียนทับหรือไม่
Kodos Johnson

คำตอบ:


3

CoffeeScript, 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 เฮสติ้งส์

จนกว่าจะมีใครบางคนมาพร้อมกับ CJam / Pyth / GolfScript และทำ sub-100 แต่ขอบคุณ.
metalim

ฮะ .. จริงเกินไป ... ฉันสงสัยว่านี่ควรจะเป็นกำลังใจที่ฉันต้องเรียนรู้ Pyth หรือไม่ ...
Dom Hastings

4

Python 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

Perl, 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

Python 2, 755 706 699 694 678 626 ไบต์

ต้องการอินพุตบน 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. บันทึกแล้ว 7 ไบต์ด้วยคำแนะนำของ @ mbomb007 เกี่ยวกับการใช้งานrangeแทนที่จะเป็นอาร์เรย์ตัวอักษร
  3. ลบ 5 bytes โดยเปลี่ยนfindXเป็น lambda
  4. บันทึก 15 ไบต์โดยขยายxsโดย 4 และกำจัดtry-exceptบล็อก
  5. โกน 2 อีกโดยใช้แท็บแทนช่องว่าง
  6. ลบ 5 ไบต์โดยใช้h=i=j=k=l=0แทน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

ทำงานได้ดีในการตัดแต่ง! ฉันไม่แน่ใจว่าคุณได้เห็นหัวข้อเคล็ดลับ แต่อาจมีตัวย่อบางตัวที่คุณสามารถรับได้จากที่นี่: codegolf.stackexchange.com/questions/54/…
Dom Hastings

ฉันทำไปเมื่อสองสามวันก่อน แต่ฉันลืมบางสิ่ง
J Atkin

นอกจากนี้qแลมบ์ดาของคุณก็ดูไร้ประสิทธิภาพเช่นกัน จะสั้นลงได้ไหม? อย่างน้อยที่สุดฉันไม่คิดว่าวงเล็บเป็นสิ่งจำเป็น แต่ฉันคิดว่าตรรกะแบบบูลีนและการเปรียบเทียบสตริงสามารถย่อให้สั้นได้เช่นกัน
mbomb007
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.