Đưa ra một sơ đồ, Tìm X


19

Tìm X

Tôi đã được truyền cảm hứng bởi các câu hỏi toán học trong đó một người được yêu cầu "Tìm X" cho một hình dạng nhất định. Ban đầu, tôi chỉ có một thách thức là in vị trí x và y của ký tự 'x' trong Chuỗi. Nhưng tôi cho rằng điều đó sẽ quá đơn giản. Vì vậy, tôi đã xem xét bối cảnh họ thường ở và quyết định tìm độ dài của Đường bên cạnh x có vẻ phù hợp.

Đưa ra một đầu vào chuỗi có chứa Sơ đồ các dòng 'ascii' cũng như một ký tự 'x' và có khả năng là rác, in độ dài của dòng duy nhất có 'x' trực tiếp với nó.

Ví dụ

Đầu vào:

|
|
|x
|
|

Ouput:

5

Đầu vào:

|\
| \x
|  \
|___\

Đầu ra:

4

Đầu vào:

Diagram of a Wobbly Line:
IRRELEVANTTEXT____
____     ____/
    \___/ X ;)   
      x

Đầu ra:

3

Đầu vào:

  ______________
 / ____________ \
 |/ __________ \|
 ||/ ________ \||
 |||/ ______ \|||
 ||||/      \||||
 |||||/  x  |||||
 |||||\_____/||||
 ||||\_______/|||
 |||\_________/||
 ||\___________/|
  \_____________/

Đầu ra:

5

Ghi chú

  • Các ký tự dòng hợp lệ là \/_|
  • \ kết nối trên cùng bên trái và dưới cùng bên phải của chính nó.
  • / kết nối trên cùng bên phải và dưới cùng bên trái của chính nó.
  • _ kết nối bên trái và bên phải của chính nó
  • | kết nối đỉnh và đáy của chính nó
  • Một dòng sẽ luôn luôn thẳng và chỉ bao gồm một trong các ký tự dòng được lặp lại n lần.
  • Chữ x sẽ luôn là chữ thường và nó sẽ luôn là số duy nhất trong sơ đồ.
  • Adjecent đề cập đến x là chính xác một ký tự ở trên, bên dưới hoặc bên cạnh.
  • X sẽ luôn ở bên cạnh chính xác một Line.
  • Tab sẽ không bao giờ xuất hiện trong đầu vào.
  • Đầu vào và đầu ra có thể là bất kỳ định dạng chấp nhận được.
  • Đây là Code Golf, vì vậy, Code Code ngắn nhất!
  • CHÚC VUI VẺ. LÀM ĐI. THƯỞNG THỨC CỦA BẠN.

Thực hiện tham khảo


Thử thách thú vị, nhưng tôi nghĩ sẽ tốt hơn nếu đảm bảo không có tab nào trong đầu vào. Bằng cách nói rằng chúng có thể xảy ra, bạn rất hiệu quả khi buộc mọi người thêm mã để chuyển đổi tab thành 4 khoảng trắng, điều này không liên quan gì đến thử thách chính.
Cấp sông St

Vâng, bạn đã có một điểm tốt. Tôi sẽ bắn nó.
ATaco

Bạn nên thêm một testcase có hình dạng tương tự như @câu trả lời kiểm tra căng thẳng.
orlp

Thử thách rất thông minh, tôi mong muốn được thấy một số chiến thuật được sử dụng để giải quyết nó
Darren H

Câu trả lời:


3

JavaScript (ES6), 165, 155 byte

EDIT: nội tuyến xw , để lưu thêm một số byte.

Golfed (giả sử đầu vào được đệm bằng khoảng trắng để tạo hình chữ nhật)

t=>([k=e=o=1,v=t.search`\n`+2,-1,-v].some(h=>i=({"|":v-1,"_":1,"/":v,"\\":v})[d=t[r=l=t.search`x`+h]]),[...t].map(_=>o+=(k&=t[l-=i]==d)+(e&=t[r+=i]==d)),o)

Mở rộng

/*
   G(<input string,space padded>) => line length
*/
G=t=> {

    /*
     ! Note that these two are inlined, in the "golfed" version !
     "w" - line "width"
     "x" - index of "x"
    */
    x=t.search`x`;
    w=t.search`\n`+1;

    /*
    Locate the "line"    
     l,r - left cursor, right cursor (for navigating along the line)
     k - left stop flag, e - right stop flag
     i - increment
     d - direction (char)
    */
    [k=e=o=1,v=w+1,-1,-w-1].some(h=>i=({"|":w,"_":1,"/":v,"\\":v})[d=t[r=l=x+h]]);

    /* 
     Travel along the line axis in both directions

     Note, the stop condition should rather be: while(k|e), 
     but we iterate over all the chars with map instead (as o is guaranteed to be < # chars),
     to save some space
    */
    [...t].map(_=>o+=(k&=t[l-=i]==d)+(e&=t[r+=i]==d));

    /* 
      Resulting line length
    */
    return o;
};

Kiểm tra

G= 
t=>([k=e=o=1,v=t.search`\n`+2,-1,-v].some(h=>i=({"|":v-1,"_":1,"/":v,"\\":v})[d=t[r=l=t.search`x`+h]]),[...t].map(_=>o+=(k&=t[l-=i]==d)+(e&=t[r+=i]==d)),o);

[
G( 
 "| \n" +
 "| \n" +
 "|x\n" +
 "| \n" +
 "| \n"
),

G(
"|\\   \n" +
"| \\x \n" +
"|  \\ \n" +
"|___\\\n"
),

G(
"Diagram of a Wobbly Line:\n" +
"IRRELEVANTTEXT____       \n" +
"____     ____\/           \n" +
"    \___\/ X ;)           \n" +    
"      x                  \n"
),

G(
" ______________ \n"  +
"/ ____________ \\\n" +
"|/ __________ \\|\n" +
"||/ ________ \\||\n" + 
"|||/ ______ \\|||\n" +
"||||/      \\||||\n" +
"|||||/  x  |||||\n"  +
"|||||\_____\/||||\n" +
"||||\_______\/|||\n" +
"|||\_________\/||\n" +
"||\___________\/|\n" +
" \_____________\/\n"
)
]

Đầu ra mẫu (nếu bạn chạy cái này trong bảng điều khiển Công cụ dành cho nhà phát triển của Google Chrome)

[5, 4, 3, 5]


8

Con trăn 3, 428 408 385 378 byte

Làm việc, nhưng có rất nhiều tiềm năng để được chơi golf. Tôi hơi gỉ.

Giả sử đầu vào được đệm bằng khoảng trắng để tạo hình chữ nhật.

EDIT: Cảm ơn @Artyer vì đã tiết kiệm 23 byte!

EDIT2: Wow Tôi đã hoàn toàn bỏ lỡ khoản tiết kiệm 6 byte. Đã lưu thêm 1 bằng cách hoán đổi các mặt của một kiểm tra bằng.

*i,=map(list,input().split('\n'))
r=c=s=q=e=w=0
o=lambda y,x:len(i[0])>x>=0<=y<len(i)
d='\/_|'
for l in i:
 if'x'in l:r=i.index(l);c=l.index('x')
for a,b in(1,0),(0,1),(-1,0),(0,-1):
 y,x=r+a,c+b;f=o(y,x)and i[y][x]
 if f in d:s=f;w=d.index(f);q,e=y,x
k=lambda y,x,g=[1,1,0,1][w],v=[1,-1,1,0][w]:o(y,x)and s==i[y][x]and(exec('i[y][x]=0')or 1+k(y+g,x+v)+k(y-g,x-v))
print(k(q,e))

Phiên bản mở rộng với lời giải thích:

inputtt='''  ______________.
 / ____________ \
 |/ __________ \|
 ||/ ________ \||
 |||/ ______ \|||
 ||||/      \||||
 |||||/  x  |||||
 |||||\_____/||||
 ||||\_______/|||
 |||\_________/||
 ||\___________/|
  \_____________/'''

# First, we get the input from STDIN and make it
# into a doubly-nested array

*input_text,=map(list,inputtt.split('\n'))

# A pretty cool Python trick to assign 0 to
# mulitple variables at once.

row=col=line_letter=line_row=line_col=line_char_index=0

# A function to check if a certian row and col is
# in bounds or not. Uses python's comparator chaining

in_bounds=lambda y,x:len(input_text[0])>x>=0<=y<len(input_text)

# A string to store all the line characters.
chars='\/_|'

# Search for the x
for line in input_text:

 # If this line contains the x...
 if'x'in line:

     # Mark the row and column
     row=input_text.index(line);col=line.index('x')

# For each direction...
for down,right in(1,0),(0,1),(-1,0),(0,-1):

 # Move in that direction
 y,x=row+down,col+right

 # If the position is in bounds, mark the char at that position
 line_found=in_bounds(y,x)and input_text[y][x]

 # If the char is a line char, set all the variables saying we found it
 if line_found in chars:
  line_letter=line_found
  line_char_index=chars.index(line_found)
  line_row,line_col=y,x

recur=lambda y,x,\
       # Find which directions we are supposed to recur in based on the line char
       g=[1,1,0,1][line_char_index],v=[1,-1,1,0][line_char_index]:\
       # If the char is in bounds and we are still on the line...
       in_bounds(y,x)and input_text[y][x]==line_letter and\
       # Set the spot to a 0, so we won't go back, increment,
       # and recur in both directions
       (exec('i[y][x]=0')or 1+recur(y+g,x+v)+recur(y-g,x-v))

# Finally, print the answer
print(recur(line_row,line_col))

Tôi đã thực hiện một số đề xuất chơi gôn tại pastebin.com/zKENQUeR . Hãy sử dụng chúng nếu bạn muốn (Tổng cộng: -18 byte). Ngoài ra, bạn có thể muốn thêm <!-- language-all: lang-py -->để tô sáng cú pháp.
Artyer

@Artyer Cảm ơn bạn! Tôi thật ngu ngốc khi không làm hầu hết những thứ đó, nhưng tôi không biết gì về dấu gạch chéo ngược không thoát. Tôi hiện đang sử dụng điện thoại di động, nhưng tôi chắc chắn sẽ kết hợp các đề xuất của bạn sau!
Màu xanh

Ồ, và một điều nữa: Dòng đầu tiên *i,=map(list,inputtt.split('\n'))( *i,tạo idanh sách thay vì bản đồ) (-6 byte nữa)
Artyer

Wow ... chơi golf trong toàn bộ.
Erik the Outgolfer 8/11/2016

0

Lua, 480 byte

Lua, là ngôn ngữ Verbose, không đánh bại Câu trả lời của Python. Nhưng nó không cần.

a=...s={}for _ in a:gmatch"[^\n]*"do s[#s+1]={}for S in _:gmatch"."do if S=="x"then x=#s[#s]+1y=#s end s[#s][#s[#s]+1]=S end end c="\\/_|"X={-1,1,1,0}Y={-1,-1,0,-1}for _,d in pairs({{x-1,y},{x,y-1},{x+1,y},{x,y+1}})do K=d[2]k=d[1]h=s[K]w=h and h[k]C=w and c:find(w)if C then n=1 j=k J=K while true do j=j+X[C]J=J+Y[C]if s[J]and s[J][j]==w then n=n+1 else break end end j=k J=K while true do j=j-X[C]J=J-Y[C]if s[J]and s[J][j]==w then n=n+1 else break end end print(n)break end end

Tương tự như việc thực hiện tham chiếu của tôi, nhưng thực hiện một cú đánh thực tế khi chơi golf và thực hiện một số điều thông minh hơn một chút so với trước đây. Vẫn có thể có thể được chơi golf tốt hơn một chút mặc dù.

Với nhận xét.

a=... -- Take the input from the command line.
s={}  -- Store the string as a 2D Table, instead of a multiline string.
for _ in a:gmatch"[^\n]*"do -- For each new row.
    s[#s+1] = {}            -- Make a new sub-table. This is our line.
    for S in _:gmatch"."do  -- For every character.
        if S=="x"then x=#s[#s]+1y=#s end -- If it's an x, mark down the X and Y position of it.
        s[#s][#s[#s]+1]=S                -- Push the character. This could probably be better golfed.
    end
end
c="\\/_|"   -- The ascii line characters.
X={-1,1,1,0}    -- Their X Directionals.
Y={-1,-1,0,-1}  -- Their Y Directionals.
                -- These are inversed to get their opposite direction.
for _,d in pairs({{x-1,y},{x,y-1},{x+1,y},{x,y+1}}) do -- For each up down left and right.
    K=d[2]  -- K = y
    k=d[1]  -- k = x
    h=s[K]  -- h = the yth row
    w=h and h[k]    -- w = the xth character of the yth row, if the yth row exists.
    C=w and c:find(w) -- C = the id of the ascii line character, if w existed.
    if C then
        n=1 -- n = the length of the line.
        j=k -- Temp x
        J=K -- Temp y
        while true do
            j=j+X[C] -- Increment j by the directional of the ascii.
            J=J+Y[C] -- Ditto. for J
            if s[J]and s[J][j]==w then -- if it's still the same.
                n=n+1 -- Add 1 to the length.
            else
                break -- Or stop.
            end
        end
        j=k -- Re-assign the temps as their original.
        J=K
        while true do
            j=j-X[C] -- Search in the other direction.
            J=J-Y[C]
            if s[J]and s[J][j]==w then
                n=n+1
            else
                break
            end
        end
        print(n) -- Print the length.
        break
    end
end

-1

JavaScript (ES6), 175

Giả sử đầu vào được đệm bằng khoảng trắng để tạo hình chữ nhật.

s=>(o=>{s.replace(/[_|\\/]/g,(c,p)=>[o,-o,1,-1].map(d=>s[p+d]=='x'?[q,k]=[p,c]:c));for(n=z=k>'_'?o:k>'\\'?-1:k>'/'?o-1:o+1;s[q+=z]==k||z<0&&(n=-1,z=-z);)n++})(~s.search`
`)||n

Ít chơi gôn

s=>{
  o = ~s.search`\n`; // offset between rows (negated)
  // look for a line character near an 'x'
  s.replace(/[_|\\/]/g, 
     (c,p)=> // for each line char 'c' in position 'p'
     [o,-o,1,-1].map(d=>s[p+d]=='x' // found a near 'x' ?
                        ?[q,k]=[p,c] // remember char and position
                        :c)
  );
  n=0;
  z=k>'_'?o:k>'\\'?-1:k>'/'?o-1:o+1; // offset to prev char of line
  while (s[q+=z]==k // move to left/top first
         || z<0 && (n=0,z=-z) // at left/top, go back and start counting
        )
    n++;
  return n-1;
}

Kiểm tra Dots thay vì không gian cho rõ ràng

f=
s=>(o=>{s.replace(/[_|\\/]/g,(c,p)=>[o,-o,1,-1].map(d=>s[p+d]=='x'?[q,k]=[p,c]:c));for(n=z=k>'_'?o:k>'\\'?-1:k>'/'?o-1:o+1;s[q+=z]==k||z<0&&(n=-1,z=-z);)n++})(~s.search`
`)||n

out=x=>O.textContent+=x

;["|.\n|.\n|x\n|.\n|.\n", "|\\...\n|.\\x.\n|..\\.\n|___\\\n"
,"Diagram of a Wobbly Line:\nIRRELEVANTTEXT...........\n____.....____/...........\n....\\___/.X.;)...........\n......x..................\n"
,"./ ____________ \\\n.|/ __________ \|\n.||/ ________ \\||\n.|||/ ______ \\|||\n.||||/      \\||||\n.|||||/  x  |||||\n.|||||\\_____/||||\n.||||\\_______/|||\n.|||\\_________/||\n.||\\___________/|\n. \\_____________/\n"].forEach(s=>out(s+f(s)+'\n\n'))
<pre id=O></pre>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.