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. допустимо ли добавлять пробелы вокруг дизайна, даже если в этом нет необходимости (т.е. всегда добавляйте 3 строки выше / ниже и 5 столбцов слева / справа)? 3. Вход отсутствует для 3-го теста.
Уровень Река St

@steveverrill 1. Это будет строка, разделенная символом новой строки, а не массив строк 2. Нет, это недопустимо. Вы можете использовать это в своем коде, но оно не должно появляться в выходных данных
Downgoat

3
Применяется ли +перекрытие -и |применяется только тогда, когда эти символы являются частью перекрестия, или оно влияет на литерал -и также |присутствует во входных данных?
DLosc

1
@DLosc тех, кто не будет на входе. Я обновил вопрос
Downgoat

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

Python 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. Побрился около 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/…
Дом Гастингс,

Я сделал несколько дней назад, но я забыл о некоторых вещах.
Дж Аткин

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