X Noktayı İşaretler


18

X Noktayı işaretler

Amacınız başkent X'in çevresine artı işareti eklemektir:

Örnek Giriş / Çıkış

Giriş:

                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                    

Çıktı:

                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               

Giriş:

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

Çıktı:

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

Giriş:

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

Çıktı:

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

Artı işaretiniz 3 boyunda ve 5 boyunda olmalıdır:

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

Giriş

Giriş en az 12x12 karakter olacak ve yalnızca ASCII karakterlerden oluşacaktır. STDIN veya işlev bağımsız değişkeni ile alınabilir. Giriş her zaman bir X içermeyecektir. Giriş herhangi bir şekilde olacaktır ve keyfi bir boşluk alanına sahip olacaktır. Girdi herhangi içermez: +, -, #, ve|

Çıktı

Çıktı STDOUT veya bir fonksiyonun dönüş değeri üzerinden olabilir. Çıktı, artı işareti çizilmiş olarak giriş görüntüsü olmalıdır. Artı işaretini çizmek için yeterli alan yoksa, çizmek için çizgiler / boşluklar eklemelisiniz. Üst üste binen noktalar a ile değiştirilmelidir +. Eğer |veya -kursör bir örtüşür X, yerine ait +bir #görünmelidir.

Sondaki tek bir satırsonu hariç sondaki boşluklara izin verilmez .


Bu kod golf bayt en kısa kodu kazanır!


1
1. giriş bir argüman ise, satırsonu satırları ile ayrılmış bir dize mi olmalı, yoksa bir dizi olabilir mi? 2. gerekli olmasa bile tasarımın etrafına boşluk eklemek kabul edilebilir mi (yani her zaman soldan / sağdan 3 satır ve sol / sağdan 5 sütun ekleyin)? 3. 3. test durumu için giriş eksik.
Level River St

@steveverrill 1. Bu, dizelerden oluşan bir dizi değil, yeni satırdan ayrılmış bir dize olacaktır. Hayır, buna izin verilmez. Kodunuzda kullanabilirsiniz, ancak çıktıda görünmemelidir
Downgoat

3
Does +örtüşen için -ve |bu karakterler Crosshair'i parçası olan yalnızca uygulamak veya edebi etkiler -ve |aynı zamanda girdi bulundu?
DLosc

1
@DLosc bunlar girişte olmayacak. Soruyu güncelledim
Downgoat

1
Girdideki bir değişmez #işarete artı işareti ile karşılaşılırsa ne olur ? Üzerine yazılacak mı?
Kodos Johnson

Yanıtlar:


3

CoffeeScript, 345 336   327 bayt

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ğrılacak işlevdir.

Açıklaması:

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

çalıştırılabilir:


1
345 çok iyi! Yaklaşmaya çalışıyorum, ama şu ana kadar yoldasın! Yaklaşımımı tamamen değiştirmeden daha fazlasını yapabilir miyim bilmiyorum ... Hmm :)
Dom Hastings

Birisi CJam / Pyth / GolfScript ile gelene ve 100 altını alana kadar. Ama teşekkür ederim.
metalim

Hah .. Çok doğru ... Pyth'i öğrenmem gereken teşvik bu mu diye merak ediyorum ...
Dom Hastings

4

Python 3, 577 519 515 490 475 467 454 bayt

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)

Bunu ne kadar uzağa golf oynayabileceğimden emin değilim.

Kullanımı:

c(g, d)

gGiriş ızgarası ve dartı işaretleme karakteri nerede .


3

Perl, 370 bayt

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

Kullanımı, yukarıda kaydedin xmarks.pl:

perl xmarks.pl <<< 'X'

Bunu ne kadar küçük yapabileceğimden emin değilim, ama eminim daha sonra geri döneceğim! Ben de ilgilenen varsa bir açıklama gönderebilir.

Kulplar giriş Xve de artık kare olmayan girişleri.


2

Python 2, 7555706996946768626 Bayt

Sondaki satırsonu ile stdin girdisini bekler. Giriş sonu ile tetiklenir 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)

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

Eminim bu konuda çok daha fazla golf yapılabilir (python öğrenmeye devam ettiğim için), bu yüzden herhangi bir yardım takdir edilir.

Düzenlemeler

  1. findXAnlama için kullanarak yaklaşık 50 bayt tıraş
  2. @ Mbomb007'nin rangedeğişmez bir dizi yerine kullanma önerisi sayesinde 7 bayt kaydedildi
  3. findXLambda olarak değiştirilerek 5 bayt kaldırıldı
  4. xs4 genişleterek ve try-exceptbloğu ortadan kaldırarak 15 bayt tasarrufu
  5. Boşluk yerine sekmeler kullanarak 2 tıraş daha
  6. Kullanarak 5 bayt kaldırıldı h=i=j=k=l=0yerineh,j,k,l=0,0,0,0
  7. @ Mbomb007 sayesinde, yaklaşık 40 bayt kaldı chooseChar

1
R=rangeAralıkları kısaltmayı tanımlamalısınız . Sonra da değiştirebilir for i in[5,4,3,2,1,-1,-2,-3,-4,-5]:içinfor i in R(5,0,-1)+R(-1,-6,-1):
mbomb007

Teşekkürler! Bunu yapmayı düşünmüştüm ama daha uzun gibi görünüyordu.
J Atkin

Kırpmak için iyi iş! Bahşiş konularını gördünüz mü emin değilim, ancak buradan alabileceğiniz birkaç kısaltıcı olabilir: codegolf.stackexchange.com/questions/54/…
Dom Hastings

Birkaç gün önce yaptım, ama bazı şeyleri unuttum.
J Atkin

Ayrıca, qlambda'nız benim için çok verimsiz görünüyor. Bu hiç kısaltılabilir mi? En azından, parantezlerin gerekli olduğunu düşünmüyorum, ancak bence mantıksal mantık ve dize karşılaştırmaları da kısaltılabilir.
mbomb007
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.