হ্রদগুলি পূরণ করুন, 2 ডি


22

এই সমস্যার এক-মাত্রিক সংস্করণটি বেশ সহজ ছিল, সুতরাং এখানে একটি শক্ত 2D সংস্করণ।

আপনাকে স্ট্যান্ডার্ড ইনপুটটিতে 2 ডি অ্যারে ল্যান্ড হাইট দেওয়া হবে এবং বৃষ্টি হলে হ্রদগুলি কোথায় তৈরি হবে তা আপনাকে খুঁজে বের করতে হবে। উচ্চতার মানচিত্রটি 0-9 সংখ্যার সমেত একটি আয়তক্ষেত্রাকার অ্যারে।

8888888888
5664303498
6485322898
5675373666
7875555787

আপনার অবশ্যই একই অ্যারে আউটপুট করতে হবে, এমন সমস্ত অবস্থানের পরিবর্তে যা পানির নীচে থাকবে *

8888888888
566*****98
6*85***898
5675*7*666
7875555787

জল তির্যকভাবে পালাতে পারে, সুতরাং এই কনফিগারেশনে কোনও হ্রদ থাকবে না:

888
838
388

সংক্ষিপ্ততম কোড জয় আপনার কোডটি অবশ্যই 80 টি প্রশস্ত এবং 24 উচ্চতর আকারের হ্যান্ডেলগুলি পরিচালনা করতে হবে।

আরও তিনটি উদাহরণ:

77777    77777
75657    7*6*7
75757 => 7*7*7
77677    77677
77477    77477

599999    599999
933339    9****9
936639 => 9*66*9
935539    9*55*9
932109    9****9
999999    999999

88888888    88888888
84482288    8**8**88
84452233 => 8**5**33
84482288    8**8**88
88888888    88888888

4
আরও কিছু টেস্টকেসগুলি সুন্দর হবে, যদি সম্ভব হয় (বিশেষত ইনপুটটি আপনি একটি প্রান্তের ক্ষেত্রে বিবেচনা করবেন)।
ভেন্টোরো

আউটপুট লাইনে শ্বেত স্পেস অনুসরণ করা কি অনুমোদিত?
হলভাবো

@হালভাবো: না। তুমি কেন চাইবে?
কিথ র্যান্ডাল

কিথ: আমার আর একটি সমাধান ছিল যেখানে আমি ইনপুট লাইনগুলিকে একটি নির্দিষ্ট প্রস্থে প্যাড করেছি এবং অ্যালগরিদমের কিছু বাইট সংরক্ষণ করেছি। যদি আমাকে আউটপুটটির জন্য প্যাডিং সরিয়ে ফেলতে হয় তবে এই পদ্ধতির আমার বর্তমানে সেরা সমাধানের চেয়ে বেশি বাইট লাগবে।
হলভাবো

উত্তর:


7

হাস্কেল, 258 টি অক্ষর

a§b|a<b='*'|1<3=a
z=[-1..1]
l m=zipWith(§)m$(iterate(b.q)$b(\_ _->'9'))!!(w*h)where
 w=length m`div`h
 h=length$lines m
 q d i=max$minimum[d!!(i+x+w*y)|x<-z,y<-z]
 b f=zipWith(\n->n`divMod`w¶f n)[0..]m
 (j,i)¶g|0<i&&i<w-2&&0<j&&j<h-1=g|1<3=id
main=interact l

উদাহরণ রান:

$> runhaskell 2638-Lakes2D.hs <<TEST
> 8888888888
> 5664303498
> 6485322898
> 5675373666
> 7875555787
> TEST
8888888888
566*****98
6*85***898
5675*7*666
7875555787

সমস্ত ইউনিট পরীক্ষা পাস। আকারে স্বেচ্ছাচারিতার সীমা নেই।


  • সম্পাদনা (281 → 258): স্থিতিশীলতার জন্য পরীক্ষা করবেন না, কেবল উপরের সীমানায় পুনরাবৃত্তি করুন; অবিচ্ছিন্ন যুক্তি পাস করা বন্ধ করুনm

5

পাইথন, 483 491 টি অক্ষর

a=dict()
def s(n,x,y,R):
 R.add((x,y))
 r=range(-1,2)
 m=set([(x+i,y+j)for i in r for j in r if(i,j)!=(0,0)and(x+i,y+j)not in R])
 z=m-set(a.keys())
 if len(z)>0:return 1
 else:return sum(s(n,k[0],k[1],R)for k in[d for d in m-z if a[(d[0],d[1])]<=n])
i=[list(x)for x in input().strip().split('\n')]
h=len(i)
w=len(i[0])
e=range(0,w)
j=range(0,h)
for c in[(x,y)for x in e for y in j]:a[c]=int(i[c[1]][c[0]])
for y in j:print(''.join([('*',str(a[(x,y)]))[s(a[(x,y)],x,y,set())>0] for x in e]))

আমি নিশ্চিত যে এটি করার একটি আরও ভাল (এবং খাটো) উপায় আছে way


বেশিরভাগ ক্ষেত্রেই কাজ করে তবে আমার নমুনা ইনপুটগুলি থেকে আমার স্থান পরিবর্তন input()করতে sys.stdin.read()এবং লেজটি সরিয়ে ফেলতে হয়েছিল \n
কিথ র্যান্ডাল

@ কিথ র্যান্ডাল - sys.stdin.read()ঠিক কোন ফাইল থেকে পড়েছেন? পাইথনে আমি এখনও নতুন
সিস্টেম ডাউন

sys.stdin.read()ইওএফ পর্যন্ত স্ট্যানার্ডার্ড ইনপুট পড়ে। input()স্ট্যান্ডার্ড ইনপুটটির এক লাইনটি পড়ে এবং মূল্যায়ন করে।
কীথ র্যান্ডাল

4

পাইথন, 478 471 টি অক্ষর

(মন্তব্য সহ নয়। 452 450 টি অক্ষর আমদানি সহ নয়।)

import sys,itertools
i=[list(x)for x in sys.stdin.read().strip().split('\n')]
h=len(i)
w=len(i[0])
n=h*w
b=n+1
e=range(h)
d=range(w)
# j is, at first, the adjancency matrix of the graph.
# The last vertex in j is the "drain" vertex.
j=[[[b,1][(t-r)**2+(v-c)**2<=1 and i[r][c]>=i[t][v]] for t in e for v in d]+[[b,1][max([r==0,r>h-2,c==0,c>w-2])]]for r in e for c in d]+[[0]*b]
r=range(b)
for k,l,m in itertools.product(r,repeat=3):
    # This is the Floyd-Warshall algorithm
    if j[l][k]+j[k][m]<j[l][m]:
        j[l][m]=j[l][k]+j[k][m]
# j is now the distance matrix for the graph.
for k in r:
    if j[k][-1]>n:
        # This means that vertex k is not connected to the "drain" vertex, and is therefore flooded.
        i[k/w][k-w*(k/w)]='*'
for r in e:print(''.join(i[r]))

এখানে ধারণাটি হ'ল আমি একটি নির্দেশিত গ্রাফ তৈরি করি যেখানে প্রতিটি গ্রিড কোষের নিজস্ব ভার্টেক্স (প্লাস একটি অতিরিক্ত "ড্রেন" ভার্টেক্স) থাকে। প্রতি উচ্চতর কক্ষ থেকে প্রতিবেশী নিম্নতর মূল্যবান কক্ষগুলিতে গ্রাফের একটি প্রান্ত রয়েছে, এবং সাথে সাথে সমস্ত বাহ্যিক কোষ থেকে "ড্রেন" শীর্ষবিন্দুতে একটি প্রান্ত রয়েছে। এরপরে কোন ডানাগুলি "ড্রেন" ভার্টেক্সের সাথে সংযুক্ত রয়েছে তা গণনা করতে আমি ফ্লয়েড-ওয়ারশাল ব্যবহার করি ; সংযুক্ত নয় এমন কোনও উল্লম্বগুলি প্লাবিত হবে এবং একটি নক্ষত্রের সাথে আঁকা হবে।

পাইথন কোডটি ঘনীভূত করার ক্ষেত্রে আমার খুব বেশি অভিজ্ঞতা নেই, সুতরাং সম্ভবত আমি আরও এই পদ্ধতিটি প্রয়োগ করতে পারতাম suc


3

কমন লিস্প, 833

(defun drains (terr dm a b)
  (cond
    ((= (aref dm a b) 1) t)
    ((= (aref dm a b) -1) nil)
    ((or (= a 0) (= b 0)
     (= a (1- (array-dimension terr 0)))
     (= b (1- (array-dimension terr 1)))) t)
    (t (loop for x from -1 to 1
       do (loop for y from 0 to 1
           do (if (and (or (> x 0) (> y 0))
                   (drains terr dm (+ a x) (+ b y))
                   (<= (aref terr (+ a x) (+ b y))
                   (aref terr a b)))
              (progn
                (setf (aref dm a b) 1)
                (return-from drains t)))))
    (setf (aref dm a b) -1)
    nil)))

(defun doit (terr)
  (let ((dm (make-array (array-dimensions terr))))
    (loop for x from 0 to (- (array-dimension terr 0) 1)
       do (loop for y from 0 to (- (array-dimension terr 1) 1)
         do (format t "~a"
            (if (drains terr dm x y)
                (aref terr x y)
                "*"))
         finally (format t "~%")))))

এটি গল্ফ করার চেষ্টা করা হয়নি, আমি সমস্যাটি আকর্ষণীয় মনে করেছি। ইনপুট হ'ল মানচিত্রের 2D অ্যারে। সমাধানটি প্রতিটি বর্গক্ষেত্রটি পরীক্ষা করে এটি "ড্রেনস" করে কিনা তা পরীক্ষা করে দেখায় - বাহ্য প্রান্তে থাকলে বা এটি সমান বা নিম্ন উচ্চতা বর্গক্ষেত্রের সাথে সংলগ্ন যদি একটি বর্গাকার ড্রেনগুলি প্রবাহিত করে। অবিরাম পুনরাবৃত্তি থেকে বাঁচতে কোডটি একটি "ড্রেন ম্যাপ" (ডিএম) রাখে যেখানে এটি স্কয়ারগুলির নিষ্কাশন স্থিতি সংরক্ষণ করে যা ইতিমধ্যে নির্ধারিত হয়ে গেছে।


আপনার বর্ণিত যুক্তিটি ঠিক সঠিক নয়, কারণ এটি দ্বীপের ক্ষেত্রে সঠিকভাবে পরিচালনা করে না।
কিথ র্যান্ডাল 19

1

পাইথন, 246 অক্ষর

import os
a=list(os.read(0,2e3))
w=a.index('\n')+1
a+=' '*w
def f(p,t):
    if e<a[p]or p in t:return
    t[p]=1
    return'*'>a[p]or any(f(p+d,t)for d in(~w,-w,-w+1,-1,1,w-1,w,w+1))
z=0
for e in a:
    if(' '<e)*~-f(z,{}):a[z]='*'
    z+=1
print''.join(a[:~w])

সমাধানটি পূরণ করতে হবে কি না তা নির্ধারণ করতে প্রতিটি অবস্থান থেকে ডিএফএস করে কাজ করে।

যদি প্রতিটি লাইনে শ্বেত স্পেস অনুসরণ করার অনুমতি দেওয়া হয়, তবে এটি ডাব্লু = 80 ব্যবহার করে এবং হোয়াইটস্পেসের সাথে ইনপুট লাইনগুলি 80 চরগুলিতে প্যাডিং দ্বারা সংক্ষিপ্ত করা যেতে পারে।

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