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    

Перехрестя

Ваша поперечна зачіска повинна бути висотою 3 і 5:

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

Вхідні дані

Вхід буде розміром не менше 12х12 символів і буде складатися лише з символів ASCII. Його можна взяти через STDIN або аргумент функції. Вхід не завжди містить X. Вхід буде в будь-якій формі і матиме довільну кількість пробілів. Вхід не буде містити будь - яких: +, -, #, і|

Вихід

Вихід може бути через STDOUT або зворотне значення функції. Виходом має бути вхідне зображення із накресленим хрестиком. Якщо не вистачає місця для малювання перехрестя, потрібно додати лінії / пробіли, щоб намалювати його. Плями, що перекриваються, слід замінити на +. Якщо перехрестя |або -перехрестя перекриває ан X, то замість а повинно з’явитися +знак #.

Пробіл пробілів не допускається, за винятком однієї нової лінії в самому кінці.


Це код-гольф, тому найкоротший код у байтах виграє!


1
1. якщо вхід є аргументом, чи повинен це бути рядок з рядками, розділеними новими рядками, чи це може бути масив рядків? 2. Чи допустимо додавати пробіли навколо дизайну, навіть якщо це не потрібно (тобто завжди додайте 3 ряди вгору / внизу та 5 стовпчиків зліва / справа)? 3. Для 3-го тестового випадку вхід відсутній.
Рівень річки Св.

@steveverrill 1. Це буде рядок, розділений для нового рядка, а не масив рядків 2. Ні, це не дозволено. Ви можете використовувати це у своєму коді, але він не повинен з’являтися у висновку
Downgoat

3
Чи застосовується +перекриття -та |застосовується лише тоді, коли ці символи є частиною перехрестя, чи це впливає на буквальне значення -і воно також |є вхідним?
DLosc

1
@DLosc це не буде на вході. Я оновив питання
Пуховик

1
Що робити, якщо у прямому значенні #у введенні зустрічається перехрестя? Чи буде це переписано?
Кодос Джонсон

Відповіді:


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 - це занадто добре! Я намагаюся наблизитись, але ти поки що попереду! Я не знаю, чи зможу я зробити набагато більше, не змінивши повністю свого підходу ... Хм :)
Дом Гастінгс

Поки хтось не прийде зі CJam / Pyth / GolfScript і не зробить суб-100. Але дякую
металлім

Ага .. Занадто правдиво ... Мені цікаво, чи повинно це бути заохочення, яке мені потрібно вивчити Піту ...
Дом Гастінгс

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

Пітон 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 байт, змінивши findXна лямбда
  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

Спасибі! Я думав про це, але здавалося, що це буде довше.
Дж. Аткін

Гарна робота по обрізці! Я не впевнений, чи бачили ви наконечники, але може бути декілька укорочувачів, які ви можете отримати тут: codegolf.stackexchange.com/questions/54/…
Dom Hastings

Я робив кілька днів тому, але про деякі речі я забув.
Дж. Аткін

Також ваша qлямбда здається мені дуже неефективною. Чи можна це взагалі скоротити? Принаймні, я не вважаю, що дужки потрібні, але я думаю, що булева логіка та порівняння рядків також можуть бути скорочені.
mbomb007
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.