ভবিষ্যদ্বাণী করুন লোকটি কোথায় যাবে


17

একজন লোক উত্তর-পশ্চিম কোণে বাস করে (0, 0)যার উচ্চতা hএবং প্রস্থ রয়েছে w। প্রতিদিন সে তার বাড়ি থেকে সীমান্তে (?, w)বা হেঁটে যায় (h, ?)। নিম্নলিখিত উদাহরণে, লোকটি (3, 3)আজ যায় ।

(0, 0) +--+  +  +  . (0, 4)
          |         
       +  +--+--+  .
                |   
       +  +  +  +  .
                |   
(3, 0) .  .  .  .  . (3, 4)

লোকটি প্রতিটি পয়েন্টে কিছুটা রেকর্ড করে ( +উপরের উদাহরণে)। প্রতিবার যখন তিনি একটি বিন্দুতে পৌঁছান, তিনি পূর্ব দিকে যান যদি কিছুটা 1দক্ষিণে থাকে এবং অন্যথায়। তিনি চলে যাওয়ার পরে বিটটি উল্টে যায়। উদাহরণ স্বরূপ:

Day 1: 1--0  1  1    Day 2: 0  1  1  1    Day 3: 1--1--1--1--  Day 4: 0  0  0  0  
          |                 |                                         |           
       0  1--0  0           0  0  1  0           1  0  1  0           1--0  1  0  
             |              |                                            |        
       1  0  1--0           1--0  0  1           0  1  0  1           0  1--0  1  
                |              |                                            |     
Destination: (3, 3)  Destination: (3, 1)  Destination: (0, 4)  Destination: (3, 2)

শহরের আকার এবং লোকটির রেকর্ড দেওয়া, কয়েক nদিন পরে লোকটির গন্তব্য গণনা করুন ।

ইনপুট:

প্রথম লাইন তিনটি পূর্ণসংখ্যার হয় h, wএবং n

নিম্নলিখিত hলাইনে wপূর্ণসংখ্যাগুলি রয়েছে, সেই ব্যক্তির রেকর্ডকে বোঝায়।

h <= 1000, w <= 1000, n <= 1000000000

আউটপুট:

দুটি পূর্ণসংখ্যার পরে লোকটির গন্তব্য চিহ্নিত করে n দিনের ।

নমুনা ইনপুট:

3 4 3
1 0 1 1
0 1 0 0
1 0 1 0

নমুনা আউটপুট:

0 4

কোডের উদাহরণ:

#include <iostream>
using namespace std;
bool d[1000][1000];
int main(){
    int h, w, n;
    cin >> h >> w >> n;
    for(int i = 0; i < h; i++)
        for(int j = 0; j < w; j++)
            cin >> d[i][j];
    int i, j;
    while(n--)
        for(i = 0, j = 0; i < h && j < w;){
            bool &b = d[i][j];
            d[i][j] ? j++ : i++;
            b = !b;
        }
    cout << i << " " << j << endl;
}

স্কোরিং:

  • ইউটিএফ -8 জিতে সর্বনিম্ন বাইট গণনা।
  • যদি আপনার কোডের চলমান সময়টি স্বতন্ত্র থাকে তবে nআপনার স্কোরটি 50% হ্রাস করুন।
    • এই সমস্ত বোনাস পেতে কেবল সমস্ত 1000000000 দিনের ফলাফল গণনা করবেন না বা অনুরূপ বোকা কিছু করবেন না । একটি কার্যকর অ্যালগরিদম খুঁজুন!

আমি বুঝতে পারি না 2 জিনিস। আউটপুট, কখনও কখনও আপনি 0 টি সূচক অন্যান্য সময় ব্যবহার করবেন না। ওটা কিভাবে কাজ করে? এটি কি সীমানা + 1 এর মতো হওয়া উচিত? দ্বিতীয় জিনিসটি স্কোরিং সহ দ্বিতীয় লাইন। কীভাবে বোঝাচ্ছেন?
টিউন প্রোঙ্ক

৪ র্থ দিন ঠিক ৩,২ আউটপুট করা উচিত?
টিউন প্রংক

2
যদি যাই হোক না কেন n, আমার কোডটি সমস্ত 1000000000 দিনের ফলাফল গণনা করে, তারপরে ফলাফলটি আউটপুট দেয় n, আমি কী এখনও -50% বোনাস পাব?
ব্যবহারকারী 12205

@ এখন আপনি এটি এর মতো রাখছেন, এটি কি তা বোঝায় না? এর জন্য ধন্যবাদ: পি
তেউন প্রোনক

পছন্দ করুন এটা আমার দোষ.
johnchen902

উত্তর:


7

গল্ফস্ক্রিপ্ট, 52.5 (50% বোনাস সহ 105 টি অক্ষর)

~](;(\((2$(1,*+\@/{]zip 0\{~@@+.2$!+2/\@+.2/\@[\1&]}%zip~@;}%\;[{.0=0=\1${{1>}%}{1>}if.{~}%}do;].1-,n@0-,

সংস্করণটি খুব কার্যকরী এবং বৃহত্তর মানগুলির জন্যও অনলাইনে পরীক্ষা করা যেতে পারে ।

এটি ব্যবহারকারীর 2357112 এর সমাধানের মতো একটি পন্থা ব্যবহার করে ।


1
দয়া করে কোনও ব্যাখ্যা জিজ্ঞাসা করবেন না ;-) আমি এই জন্তুটিকে ভেঙে এবং ডিবাগ করা ছাড়া এটিও পরিবর্তন করতে পারি না এটা ভয়াবহ।
হাওয়ার্ড

13

পাইথন 2, 192 বাইট * 0.5 বোনাস = 96

এই সমস্যাটি দক্ষতার সাথে সমাধান করার জন্য, মূল উপলব্ধিটি হ'ল উপরের এবং বাম দিকে কোষগুলি কতবার পরিদর্শন করা হয়েছে তার উপর ভিত্তি করে সঠিক পথগুলি নির্ধারণের প্রয়োজন ছাড়াই আমরা প্রতিটি সেল কতবার পরিদর্শন করেছি তা গণনা করতে পারি। কার্যকরভাবে, আমরা অনুকরণn একবারে ট্রিপস এবং প্রতিটি ঘর কতবার ব্যবহৃত হয় তার উপর নজর ।

জনচেন 902 এর সমাধান দ্বারা অনুপ্রাণিত পুশ-ভিত্তিক পদ্ধতির কারণে যথেষ্ট উন্নতি :

r=lambda:map(int,raw_input().split())
h,w,n=r()
v=[n]+w*[0]
x=y=0
for i in range(h):
 for j,b in enumerate(r()):
    if i-x==j-y==0:d=v[j]&1^b;x+=d;y+=1^d
    f=v[j]+b>>1;v[j]-=f;v[j+1]+=f
print x,y

পূর্ববর্তী, টান-ভিত্তিক বাস্তবায়ন:

r=lambda i:map(int,raw_input().split())
h,w,n=r(0)
x=range(h)
g=map(r,x)
v=[w*[0]for i in x]
v[0][0]=n-1
for i in x:
 for j in range(w):v[i][j]+=(i and(v[i-1][j]+(1^g[i-1][j]))/2)+(j and(v[i][j-1]+g[i][j-1])/2)
i=j=0
while i<h and j<w:f=g[i][j]^v[i][j]&1;j+=f;i+=1^f
print i,j

আসল, অবারিত সংস্করণ:

h, w, n = map(int, raw_input().split())
grid = [map(int, raw_input().split()) for i in xrange(h)]

# Determine the number of times each cell was visited in the first n-1 trips
visits = [[0]*w for i in xrange(h)]
visits[0][0] = n-1
for i in xrange(h):
    for j in xrange(w):
        if i:
            # Count visits from above cell
            visits[i][j] += (visits[i-1][j] + (not grid[i-1][j])) // 2
        if j:
            # Count visits from left cell
            visits[i][j] += (visits[i][j-1] + grid[i][j-1]) // 2

# Flip the bits corresponding to each cell visited an odd number of times
for i in xrange(h):
    for j in xrange(w):
        grid[i][j] ^= visits[i][j] & 1

# Figure out where the final trip ends
i = j = 0
while i < h and j < w:
    if grid[i][j]:
        j += 1
    else:
        i += 1

print i, j

1
আপনি খাটো করতে পারেন not করতে 1^এবং দীর্ঘ যদি শর্ত লেখা যেতে পারে f=g[i][j]^v[i][j]&1 j+=f i+=1^f
হাওয়ার্ড 14

@ হাওয়ার্ড: ধন্যবাদ সম্পাদনা প্রয়োগ করা হয়েছে।
ব্যবহারকারী 2357112 14-18 এ মনিকা

1
আপনি অনুমতি দিলে rএকটি প্যারামিটার (নেওয়া r = lambda x: ...), তারপর আপনি খাটো করতে পারেন g=[r()for i in x]থেকে g=map(r,x)
রবার্তো বনভোলেট

@ রবার্তো বনভোলেট: হ্যাঁ পরামর্শ কার্যকর করা হয়েছে।
ব্যবহারকারী 2357112

8

রুবি, 159 143

n,*l=$<.read.split$/
i=->a{a.split.map &:to_i}
x=y=l.map!{|k|i[k]}
(n=i[n])[-1].times{x=y=0
(x+=f=l[x][y]^=1;y+=f^1)while x<n[0]&&y<n[1]}
p x,y

প্রথম লাইনটি *একটি ভেরিয়েবলের ইনপুটটির প্রথম লাইনটি ধরতে অপারেটর এবং অন্যটিতে ইনপুটটি ব্যবহার করে। তারপর একটি iফাংশন রূপান্তর করতে সংজ্ঞায়িত করা হয় "1 2 3 4"মধ্যে [1, 2, 3, 4], যা উভয় প্রয়োগ করা হয় lএবং n। ( xএবং yপরে সংরক্ষণ করা হয়।)

n[-1]এর সর্বশেষ উপাদান n, সুতরাং নিম্নলিখিত ব্লকটি (সিমুলেশন) বেশ কয়েকবার কার্যকর করা হয়। প্রথমে xএবং yশূন্যে আদি করা হয় (এগুলি ব্লকের বাইরে ঘোষণা করা হয় যাতে তাদের পরিধি যথেষ্ট পরিমাণে বড় হয়), এবং তারপরে সিমুলেশন লাইনটি কার্যকর করা হয় যা বেশ স্ব-ব্যাখ্যামূলক, তবে যাইহোক এখানে কিছু মন্তব্য রয়েছে:

l[x][y]<1?            is it zero (less than one)?
x+=l[x][y]=1          if it's zero, set it to one, and (conveniently) we can add that to x
:y+=(l[x][y]=0)+1     otherwise, set it to zero, add one, and add that to y
 while x<n[0]&&y<n[1] keep doing this while we're still inside the array

সম্পাদনা করুন: হাওয়ার্ড দ্বারা সরবরাহ করা নতুন সিমুলেশন লাইন, ধন্যবাদ! আমি নিশ্চিত যে এটি কীভাবে কাজ করে তা আমি বুঝতে পেরেছি তবে আমার কাছে ব্যাখ্যা যুক্ত করার মতো সময় নেই, সুতরাং পরে যুক্ত করা হবে।

পরিশেষে, p x,yসংখ্যাগুলি আউটপুট করে, এবং আমরা শেষ!


কিছু মৌলিক জয়: নিউলাইনটি এতে পরিবর্তন করুন $/এবং লুপটি কমে যেতে পারে (x+=f=l[x][y]^=1;y+=f^1)while x<n[0]&&y<n[1]}
হাওয়ার্ড

4

ডেলফি এক্সই 3 (437 বাইট || 897 874 বোনাস গণনা ছাড়াই)

কীভাবে বোনাস দিয়ে এটি সমাধান করবেন সে সম্পর্কে চিন্তা করার সময় আমি নীচের বিষয়গুলি ভেবেছিলাম।
আপনি যদি 4 দিনের হাঁটা যান 0,0 4 বার পরিবর্তন করা হয়। এর ডানদিকে থাকা কোষটি এর নীচের ঘরের সাথে দু'বার পরিবর্তিত হয়।
যদি দিনগুলি অসম হয় এবং কক্ষের সংখ্যাটি 1 দিয়ে শুরু হয় ডানদিকে ঘরটি নীচের ঘরের চেয়ে আরও একটি পায় এবং ঘরটি 0 হয় তবে অন্যভাবে around

প্রতিটি কক্ষের জন্য এটি করে আপনি দেখতে পাবেন যে শেষ মানটি দ্বারা পরিবর্তন করা উচিত: সেলটি এক্স বার পরিবর্তন করা হয়েছিল। যদি এক্স মোড 2> 0 হয় তবে ঘরটি পরিবর্তন করুন।

নিম্নলিখিত কোডে ফলাফল:
John জনচেন 902 এ ফিসফিসার I আমি কি এখন আপনার আপভোটটি পাই? : P: P

uses SysUtils,Classes,idglobal;var a:TArray<TArray<byte>>;b:TArray<TArray<int64>>;h,w,x,y,t:int16;n:int64;s:string;r:TStringList;tra:byte;begin r:=TStringList.Create;readln(h,w,n);h:=h-1;w:=w-1;for y:=0to h do begin readln(s);r.Add(StringReplace(s,' ','',[rfReplaceAll]));end;SetLength(a,h);SetLength(b,h);for y:=0to h do begin SetLength(a[y],w);SetLength(b[y],w);for x:=1to Length(r[y])do a[y][x-1]:=Ord(r[y][x])-48;end;b[0][0]:=n-1;for Y:=0to h do for X:=0to w do begin t:=b[y][x];if x<w then b[y][x+1]:=b[y][x+1]+iif((t mod 2=1)and(a[y][x]=1),(t div 2)+1,t div 2);if y<h then b[y+1][x]:=b[y+1][x]+iif((b[y][x]mod 2=1)and(a[y][x]=0),(t div 2)+1,t div 2);end;for Y:=0to h do for X:=0to w do if b[y][x]mod 2=1then a[y][x]:=iif(a[y][x]=1,0,1);y:=0;x:=0;repeat a[y][x]:=iif(a[y][x]=1,0,1);if a[y][x]=1then inc(y) else inc(x);until(y>h)or(x>w);write(Format('%d %d',[y,x]));end.

Ungolfed

uses
  SysUtils,Classes,idglobal;
var
  a:TArray<TArray<byte>>;
  b:TArray<TArray<int64>>;
  h,w,x,y,t:int16;
  n:int64;
  s:string;
  r:TStringList;
  tra:byte;
begin
  r:=TStringList.Create;
  readln(h,w,n);
  h:=h-1;w:=w-1;
  for y:=0to h do
  begin
    readln(s);
    r.Add(StringReplace(s,' ','',[rfReplaceAll]));
  end;
  SetLength(a,h);
  SetLength(b,h);
  for y:=0to h do
  begin
    SetLength(a[y],w);
    SetLength(b[y],w);
    for x:=1to Length(r[y])do
      a[y][x-1]:=Ord(r[y][x])-48;
  end;
  b[0][0]:=n-1;
  for Y:=0to h do
    for X:=0to w do
    begin
      t:=b[y][x];
      if x<w then
        b[y][x+1]:=b[y][x+1]+iif((t mod 2=1)and(a[y][x]=1),(t div 2)+1,t div 2);
      if y<h then
        b[y+1][x]:=b[y+1][x]+iif((b[y][x]mod 2=1)and(a[y][x]=0),(t div 2)+1,t div 2);
    end;
  for Y:=0to h do
    for X:=0to w do
      if b[y][x]mod 2=1then
        a[y][x]:=iif(a[y][x]=1,0,1);
  y:=0;x:=0;
  repeat
    a[y][x]:=iif(a[y][x]=1,0,1);
    if a[y][x]=1then
      inc(y)
    else
      inc(x);
  until(y>h)or(x>w);
  write(Format('%d %d',[y,x]));
end.

আপনি আমার ভোট এখনও পান নি। আমি রাতের খাবার খাচ্ছিলাম. (উত্সাহিত)
johnchen902

4

সি ++ 213 বাইট * 0.5 = 106.5

এখানে আমার সমাধান। এটি ব্যবহারকারীর 2357112 এর সমাধানের মতো , তবে বিভিন্ন পার্থক্য রয়েছে:

  • প্রথমে আমি উপরে এবং বাম থেকে গণনা না করে ডান এবং নীচে দেখার সময়গুলি প্রেরণ করি ।
  • দ্বিতীয়ত, আমি একসাথে সবকিছু (ইনপুট পড়া, প্রেরণ, লোকের অবস্থান ট্র্যাকিং) করি।
  • তৃতীয়, আমি মেমরির এক সারি রাখি।
#include <iostream>
int o[1001],h,w,r,c,i,j,t,u;int main(){std::cin>>h>>w>>*o;for(;i<h;i++)for(j=0;j<w;)std::cin>>t,u=o[j],o[j]/=2,u%2&&o[j+t]++,r-i|c-j||((u+t)%2?r:c)++,o[++j]+=u/2;std::cout<<r<<" "<<c<<"\n";}

নিখরচায় সংস্করণটি এখানে:

#include <iostream>
using namespace std;
int o[1001];
int main(){
    int h, w, n;
    cin >> h >> w >> n;
    o[0] = n;
    int r = 0, c = 0;
    for(int i = 0; i < h; i++)
        for(int j = 0; j < w; j++){
            bool t;
            cin >> t;
            int u = o[j];
            o[j + 1] += u / 2;
            o[j] = u / 2;
            if(u % 2)
                (t ? o[j + 1] : o[j])++;
            if(r == i && c == j)
                ((u + t) % 2 ? r : c)++;
        }
    cout << r << " " << c << endl;
}

এই তিনটি পার্থক্য বিষয়গুলিকে অনেক পরিশ্রমী করে তোলে। আমরা ইনডেক্সিং সংক্ষিপ্ত করতে এবং বিভিন্ন রিডানড্যান্ট ডেটা স্ট্রাকচার একত্রিত করতে পারি। পূর্ববর্তী কক্ষগুলি থেকে পরিদর্শনগুলি টানানোর জন্য যুক্তিকে তুলনায় সামনের দিকে এগিয়ে যাওয়ার যুক্তিটি আরও কম সংক্ষিপ্ত আকার ধারণ করে। অনুভূমিক সীমানা শর্তগুলি ডানদিকে অতিরিক্ত কাঠামো প্রসারিত করে কেবল পরিচালনা করা হয়, এবং উল্লম্ব সীমানা শর্তগুলি কোনও সমস্যা নয়।
ব্যবহারকারী 2357112

আমি আপনার উত্তরটি উন্নত করেছি এবং ধারণাগুলি আমার নিজস্ব কোডে সংযুক্ত করেছি। এখনও অবধি, তারা আমার সমাধানের মধ্যে থেকে 84 বাইট নিয়েছে, 30% এর উন্নতি।
ব্যবহারকারী 2357112 5,50 এ মনিকা

আমার সন্দেহ হয় আপনি না করে কিছু বাইট বাঁচাতে পারবেন --*o;এবং পরিবর্তে কোন ক্ষেত্রে আপনি লোকটিকে নিচে নিয়ে যান এবং কোন ক্ষেত্রে আপনি লোকটিকে ডানদিকে নিয়ে যান।
ব্যবহারকারী 2357112

@ ব্যবহারকারী 2357112 প্রয়োগ করা হয়েছে, তবে আগের ভুলের কারণে কোড দৈর্ঘ্য বৃদ্ধি পেয়েছে (এটি 218 বাইট হওয়া উচিত ছিল)।
johnchen902

3

পাইথন, 177 বাইট

কোড গল্ফিংয়ে আমার প্রথম চেষ্টা, তাই আমি যদি এখানে কিছু ভুল হয়ে থাকি তবে দুঃখিত! ব্যবহারকারী 2357112 এর কোডের উপর ভিত্তি করে ইনপুট দখল করতে ব্যবহৃত কোড used

l=lambda:map(int,raw_input().split())
h,w,n=l()
m=[l() for i in[1]*h]
while n>0:
 n-=1;x=y=0
 while x!=w and y!=h:
  if m[y][x]>0:m[y][x]=0;x+=1
  else:m[y][x]=1;y+=1
print y,x

ইনপুট:

3 4 3
1 0 1 1
0 1 0 0
1 0 1 0

আউটপুট:

0 4

2

আর, 196 বাইট * 0.5 = 98

f=function(h,w,n,x){I=J=rep(1,n);for(i in 1:h)for(j in 1:w){M=which(I==i&J==j);N=length(M);if(N){z=seq(1,N,by=2);if(x[i,j])z=-z;f=M[-z];s=M[z];I[f]=i;J[f]=j+1;I[s]=i+1;J[s]=j}};cat(I[n]-1,J[n]-1)}

Ungolfed:

f=function(h,w,n,x) {
  I = J = rep(1,n)

  for(i in 1:h) for(j in 1:w) {
    M = which(I==i&J==j)
    N = length(M)
    if (N) {
      z = seq(1,N,by=2)
      if (x[i,j]) z = -z
      f = M[-z]
      s = M[z]
      I[f] = i
      J[f] = j+1
      I[s] = i+1
      J[s] = j
    }
  }
  cat(I[n]-1, J[n]-1)
}

ব্যবহার:

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