एक्स स्थान अंक


18

एक्स स्थान अंक

आपका लक्ष्य राजधानी एक्स के चारों ओर एक क्रॉस-बाल जोड़ना है:

उदाहरण इनपुट / आउटपुट

इनपुट:

                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    

क्रॉसहेयर

आपके क्रॉस-बाल 3-लम्बे और 5-चौड़े होने चाहिए:

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

इनपुट

इनपुट आकार में कम से कम 12x12 अक्षर का होगा और इसमें केवल ASCII अक्षर होंगे। इसे STDIN या फ़ंक्शन तर्क के माध्यम से लिया जा सकता है। इनपुट में हमेशा एक एक्स नहीं होगा। इनपुट किसी भी आकार में होगा और इसमें व्हाट्सएप की मनमानी मात्रा होगी। इनपुट के किसी भी शामिल नहीं होंगे: +, -,# , और|

उत्पादन

आउटपुट STDOUT या फ़ंक्शन के रिटर्न मान के माध्यम से हो सकता है। आउटपुट क्रॉस-बाल खींचे जाने के साथ इनपुट छवि होनी चाहिए। यदि क्रॉसहेयर को खींचने के लिए पर्याप्त जगह नहीं है, तो आपको इसे खींचने के लिए लाइनें / रिक्त स्थान जोड़ना होगा। ओवरलैपिंग स्पॉट को ए से बदला जाना चाहिए +। तो |या -क्रॉसहेयर के overlaps X, एक के बजाय +, एक #दिखाई देनी चाहिए।

पिछली श्वेत रिक्ति को अनुमति नहीं है सिवाय इसके अंत में एक भी नई पंक्ति के लिए।


यह बाइट्स जीत में कोड-गोल्फ इतना छोटा कोड है!


1
1. यदि इनपुट एक तर्क है, तो क्या इसे न्यूलाइन द्वारा अलग की गई लाइनों के साथ एक स्ट्रिंग होना चाहिए, या यह स्ट्रिंग्स की एक सरणी हो सकती है? 2. क्या यह आवश्यक है कि डिजाइन के चारों ओर व्हाट्सएप भी जोड़ा जा सकता है, भले ही आवश्यक न हो (यानी हमेशा 3 पंक्तियों को ऊपर / नीचे और 5 कॉलमों को बाईं / दाईं ओर जोड़ें)? 3. इनपुट 3 टेस्ट केस के लिए गायब है।
लेवल रिवर सेंट

@steveverrill 1. यह एक नई लाइन से अलग स्ट्रिंग होगी, न कि स्ट्रिंग्स की एक सरणी। 2. नहीं, इसकी अनुमति नहीं है। आप इसे अपने कोड में उपयोग कर सकते हैं, लेकिन यह आउटपुट में नहीं दिखाई दे रहा है
डाउनगोट

3
क्या +ओवरलैपिंग के लिए -और |केवल तभी लागू होता है जब वे वर्ण क्रॉसहेयर का हिस्सा होते हैं, या क्या यह शाब्दिक -और |इनपुट में भी पाया जाता है?
DLosc

1
@ डॉल्स उन इनपुट में नहीं होंगे। मैंने सवाल अपडेट किया है
डाउनगोट

1
क्या होगा यदि #इनपुट में एक शाब्दिक एक क्रॉसहेयर द्वारा सामना किया जाता है? क्या इसे ओवरराइट किया जाएगा?
कोडोस जॉनसन

जवाबों:


3

कॉफीस्क्रिप्ट, 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 बहुत अच्छा है! मैं पास होने की कोशिश कर रहा हूं, लेकिन आप अभी तक आगे हैं! मुझे नहीं पता कि क्या मैं पूरी तरह से अपना दृष्टिकोण बदले बिना बहुत कुछ कर सकता हूं ... हम्म :)
डोम हेस्टिंग्स

जब तक कोई CJam / Pyth / GolfScript के साथ आता है और सब -100 बनाता है। लेकिन आपका शुक्रिया।
21

हाह .. बहुत सच ... मैं सोच रहा हूं कि क्या यह प्रोत्साहन मुझे पाइथ सीखने की जरूरत है ...
डोम हेस्टिंग्स

4

पायथन 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

पर्ल, 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

पायथन 2, 755 706 699 694 678 626 बाइट्स

अनुगामी न्यूलाइन के साथ स्टड पर इनपुट की उम्मीद है। इनपुट के अंत के साथ शुरू हो रहा है 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. findXसमझ के लिए उपयोग करके लगभग 50 बाइट्स का शेव किया
  2. सहेजे गए 7 बाइट्स @ mbomb007 के सुझाव rangeके लिए शाब्दिक सरणी के बजाय उपयोग करने के बारे में
  3. findXएक मेमने को बदलकर 5 बाइट्स निकाले
  4. 15 बाइट्स को xs4 से बढ़ाकर और try-exceptब्लॉक को हटाकर बचा लिया
  5. रिक्त स्थान के बजाय टैब का उपयोग करके 2 और मुंडा
  6. के h=i=j=k=l=0बजाय का उपयोग करके 5 बाइट्स निकाले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

नीचे ट्रिमिंग पर अच्छा काम! मुझे यकीन नहीं है कि अगर आपने टिप थ्रेड्स को देखा है, लेकिन हो सकता है कि आप यहाँ से कुछ शोर्टर्स पा सकें
डोम हेस्टिंग्स

मैंने कुछ दिन पहले किया था, लेकिन मैं कुछ चीजों के बारे में भूल गया था।
J Atkin

साथ ही, आपका qलंबोदर मुझे बहुत अक्षम लगता है। क्या वह छोटा हो सकता है? बहुत कम से कम, मुझे नहीं लगता कि कोष्ठक आवश्यक हैं, लेकिन मुझे लगता है कि बूलियन तर्क और स्ट्रिंग तुलना को छोटा किया जा सकता है, भी।
mbomb007
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.