একটি চিত্র দেওয়া হয়েছে, এক্স খুঁজুন


19

এক্স সন্ধান করুন

আমি গণিতের প্রশ্নগুলি দ্বারা অনুপ্রাণিত হয়েছি যার মধ্যে একটিকে একটি প্রদত্ত আকারের জন্য "এক্স এক্স" অনুসন্ধান করতে বলা হয়। মূলত, আমি কেবল একটি স্ট্রিংয়ে 'x' অক্ষরটির x এবং y অবস্থান মুদ্রণ করা চ্যালেঞ্জটি করতে যাচ্ছি। তবে আমার ধারণা ছিল খুব সহজ হবে। সুতরাং আমি সাধারণত তারা যে প্রসঙ্গে ছিলাম সেটিকে বিবেচনা করেছি এবং x এর পাশের একটি লাইনের দৈর্ঘ্য সন্ধান করা উপযুক্ত বলে মনে করেছি।

স্ট্রিং ইনপুটটি ascii 'রেখাগুলির একটি ডায়াগ্রাম পাশাপাশি একটি একক' x 'এবং সম্ভাব্য জাঙ্ক অক্ষরের সমন্বয়ে দেওয়া হয়েছে, কেবলমাত্র একমাত্র রেখার দৈর্ঘ্য মুদ্রণ করুন যার সাথে এটি' x 'সরাসরি সংযুক্ত থাকে has

উদাহরণ

ইনপুট:

|
|
|x
|
|

Ouput:

5

ইনপুট:

|\
| \x
|  \
|___\

আউটপুট:

4

ইনপুট:

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

আউটপুট:

3

ইনপুট:

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

আউটপুট:

5

মন্তব্য

  • বৈধ লাইন অক্ষর হয় \/_|
  • \ নিজের উপরের বাম এবং নীচে ডানদিকে সংযুক্ত করে।
  • / নিজের উপরের ডান এবং নীচে বামকে সংযুক্ত করে।
  • _ নিজের বাম এবং ডান সংযোগ করে
  • | নিজের উপরের এবং নীচে সংযুক্ত করে
  • একটি লাইন সর্বদা সরল থাকবে এবং কেবল রেখাংশের একটিতে এন বারবার পুনরাবৃত্তি থাকবে।
  • এক্স সর্বদা ছোট হাতের হবে এবং ডায়াগ্রামে এটি সর্বদা একমাত্র হবে।
  • অ্যাডজেন্ট এক্সকে উপরে, নীচে বা এর বাইরেও একরকম চরিত্র বলে বোঝায়।
  • এক্স সর্বদা এক লাইনের পাশে থাকবে।
  • ট্যাবগুলি কখনই ইনপুটটিতে উপস্থিত হবে না।
  • ইনপুট এবং আউটপুট যে কোনও গ্রহণযোগ্য বিন্যাস হতে পারে।
  • এটি কোড গল্ফ, তাই সংক্ষিপ্ততম কোড জয়!
  • আনন্দ কর. এটা কর. নিজেকে উপভোগ কর.

রেফারেন্স বাস্তবায়ন


দুর্দান্ত চ্যালেঞ্জ, তবে আমি মনে করি ইনপুটটিতে কোনও ট্যাব গ্যারান্টি দেওয়া ভাল। এটি হতে পারে বলে, আপনি কার্যকরভাবে প্রত্যেককে কোডটিকে 4 টি স্পেসে রূপান্তর করতে কোড যুক্ত করতে বাধ্য করছেন, যার মূল চ্যালেঞ্জের সাথে কোনও সম্পর্ক নেই।
স্তরের নদী সেন্ট '

হ্যাঁ, আপনি একটি ভাল পয়েন্ট পেয়েছি। আমি স্নিপ করব।
এটাকো

আপনার @স্ট্রেস-টেস্ট উত্তরের অনুরূপ একটি টেপকেস যুক্ত করা উচিত ।
orlp

খুব চতুর চ্যালেঞ্জ, আমি এর সমাধান করার জন্য ব্যবহৃত কিছু কৌশল দেখার অপেক্ষায়
ড্যারেন এইচ

উত্তর:


3

জাভাস্ক্রিপ্ট (ES6), 165, 155 বাইট

সম্পাদনা করুন: Inlined এক্স এবং W , আরো কিছু বাইট সংরক্ষণ করুন।

গল্ফযুক্ত (অনুমান করে যে ইনপুটটি একটি আয়তক্ষেত্র তৈরির জন্য ফাঁকা জায়গায় প্যাড করা আছে)

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(<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;
};

পরীক্ষা

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"
)
]

নমুনা আউটপুট (আপনি যদি এটি গুগল ক্রোম বিকাশকারী সরঞ্জামগুলির কনসোলটিতে চালান)

[৫, ৪, ৩, ৫]


8

পাইথন 3, 428 408 385 378 বাইট

কাজ করা, তবে গল্ফ হওয়ার সম্ভাবনা রয়েছে ton আমি কিছুটা মরিচা।

অনুমান ইনপুট একটি আয়তক্ষেত্র তৈরি করতে ফাঁকা স্থান দিয়ে প্যাড করা হয়।

সম্পাদনা: 23 বাইট সঞ্চয় করার জন্য @ আর্টিয়ারকে ধন্যবাদ!

সম্পাদনা 2: বাহ আমি একটি 6 বাইট সঞ্চয় পুরোপুরি মিস করেছি। সমান পরীক্ষার পক্ষের অদলবদল করে আরও 1 টি সংরক্ষণ করা হয়েছে।

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

ব্যাখ্যা সহ প্রসারিত সংস্করণ:

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

আমি পেস্টবিন . com/zKENQUeR এ কিছু গল্ফিং পরামর্শ দিয়েছি । আপনি চাইলে এগুলি নির্দ্বিধায় ব্যবহার করুন (মোট: -18 বাইট) এছাড়াও, আপনি <!-- language-all: lang-py -->সিনট্যাক্স হাইলাইট করার জন্য যুক্ত করতে চাইতে পারেন ।
আর্টিয়ার 21

@ আর্টিয়ার আপনাকে ধন্যবাদ! আমি সেগুলির বেশিরভাগটি না করার জন্য বোকা ছিলাম, তবে অ-পালানো ব্যাকস্ল্যাশ সম্পর্কে আমার কোনও ধারণা ছিল না। আমি বর্তমানে মোবাইলে রয়েছি, তবে আমি পরে আপনার পরামর্শগুলি অন্তর্ভুক্ত করে নেব!
নীল

ওহ, এবং আরও একটি: থেকে প্রথম লাইন *i,=map(list,inputtt.split('\n'))( *i,তোলে i(-6 আরো বাইট) একটি একটি মানচিত্রের পরিবর্তে তালিকা)
Artyer

বাহ ... পুরোপুরি গল্ফ
এরিক দি আউটগল্ফার

0

লুয়া, 480 বাইট

লুয়া, ভার্বোজ ভাষা হওয়ায় এটি পাইথন উত্তরটিকে হারাতে পারে না। তবে এর দরকার নেই।

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

আমার রেফারেন্স বাস্তবায়নের অনুরূপ, তবে গল্ফিংয়ে সত্যিকারের শট লাগে এবং কিছু কিছু আগের চেয়ে কিছুটা স্মার্টলি করে। তবুও সম্ভবত কিছুটা ভাল গল্ফ করা যেতে পারে।

মন্তব্য সহ।

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

জাভাস্ক্রিপ্ট (ES6), 175

অনুমান ইনপুট একটি আয়তক্ষেত্র তৈরি করতে ফাঁকা স্থান দিয়ে প্যাড করা হয়।

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

কম গল্ফড

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;
}

স্পষ্টতার জন্য ফাঁকা জায়গাগুলির পরিবর্তে ডটগুলি পরীক্ষা করুন

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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.